我尝试实现的是将我的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或其他(我这样做是为了使源代码不可访问)。
编辑:
使用Mykola Shchetinin提供的文档,我已设法为我的脚本生成API头文件。我基本上在我的main函数中添加了一个cdef api关键字。虽然这确实帮助我将方法名称导出到c ++,但我仍然需要一种方法来传递一些参数到我的脚本。由于我传递字符串参数,我希望有类似的方式,比如使用PyRun设置argv并解析脚本中的参数(因为我希望尽可能避免将字符串从c转换为python编码)是否有任何简单的方法可以通过那些字符串参数?
编辑2:
我搞定了!按照Mykola提供的示例并直接编译c文件输出而不是使用.lib,我得到了它的工作。
答案 0 :(得分:1)
我自己试图这样做。所以我在cython中将char *
转换为bytes
。 (根据docs)
这就是我想出来的。我有以下设置(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']
然后你可以使用std::system或其他(更好的)方法从C ++中调用它。