Запустите скомпилированный скрипт на Python с аргументами в C ++ (Cython)

То, что я пытаюсь достичь, это компиляция моего скрипта Python в lib / dll и вызов его с аргументами.

Это мое setup.py файл для скрипта:

from distutils.core import setup
from Cython.Build import cythonize

setup(
ext_modules = cythonize("nu3k2nu4k.py")
)

Использовал эту команду для вывода результатов компиляции:

python setup.py build_ext --inplace

создаются следующие файлы:

nu3k2nu4k.c
nu3k2nu4k.cp36-win_amd64.pyd
nu3k2nu4k.pyx

и подкаталог с именем build, который содержит:

nu3k2nu4k.cp36-win_amd64.exp
nu3k2nu4k.cp36-win_amd64.lib
nu3k2nu4k.obj

Как я могу вызвать скомпилированный скрипт из кода C ++ с аргументами?

Я использовал Cython для этой задачи, но это не обязательно, можно использовать boost или другие (я делаю это, чтобы сделать исходный код недоступным).

Редактировать:

Используя документацию, предоставленную Николаем Щетининым, мне удалось создать заголовочный файл API для моего скрипта. Я в основном добавил ключевое слово api cdef в свою основную функцию. Хотя это помогает мне экспортировать имя метода в c ++, мне все же нужен способ передать некоторые аргументы в мой скрипт. Так как я передаю строковые аргументы, я надеялся на подобный способ, например использование PyRun для установки argv и парсинга аргументов из скрипта (так как я хотел бы избежать преобразования строк из c в кодировку python, если это возможно) Есть ли простой способ передать эти строковые аргументы?

РЕДАКТИРОВАТЬ 2:

Я получил это работает! следуя примеру, предоставленному Mykola, и непосредственно компилируя вывод файла c вместо использования .lib, я получил его работающим.

1

Решение

Я пытался сделать это сам. Поэтому я конвертирую char * в bytes в Cython. (в соответствии с документы)

Это то, что я придумал. У меня есть следующие настройки (gcc и centos7.2):

setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(
ext_modules = cythonize("func.pyx")
)

main.c

#include "Python.h"#include "func.h"
int main() {
Py_Initialize();
initfunc();
func("0123hello jorghy!!");
Py_Finalize();
return 0;
}

func.pyx

cdef public func(char * arg):
cdef bytes py_bytes = arg
print(str(py_bytes));

Я строю все это с помощью следующих команд:

python setup.py build_ext --inplace

gcc -I/usr/include/python2.7 -lpython2.7 -Wall -Wextra -O2 -g -o test main.c func.c

Затем при запуске исполняемого файла тестовое задание Я получаю следующие результаты:

0123hello jorghy!!

Есть еще один способ решения этой проблемы:

Я создал файл Cython test.pyx:

import sys

if __name__ == "__main__":
print("hei")
print(sys.argv)

И скомпилирован как исполняемый файл с помощью команд:

cython test.pyx --embed
gcc -I/usr/include/python2.7 -lpython2.7 -Wall -Wextra -O2 -g -o test test.c

Затем вы можете вызвать этот код в виде исполняемого файла:

$ ./test 1 2 3
hei
['./test', '1', '2', '3']

Затем вы можете вызвать его из C ++, используя станд :: система или другие (лучшие) методы.

1

Другие решения

Других решений пока нет …