То, что я пытаюсь достичь, это компиляция моего скрипта 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, я получил его работающим.
Я пытался сделать это сам. Поэтому я конвертирую 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 ++, используя станд :: система или другие (лучшие) методы.
Других решений пока нет …