我正在尝试从C ++主程序调用经过Cythonized的python代码。 当python代码包含导入行时,由于找不到导入的程序包,运行时将失败。
下面的简化示例包括6个文件:
- quacker.py-一个文件化为pyd格式的文件(这是Windows dll)
- setup.py-用于对quacker.py进行细胞化的文件-即将其转换为pyd文件。
- caller.pyx-一个文件,它将转换为标头和一个cpp文件,该文件在c ++应用程序中进行编译和链接。
- main.cpp-C ++应用程序的主文件
- Quack.vcxproj-应用程序的Visual-Studio-2019项目文件
- main.py-cythonized文件可以正常运行的python文件。
文件quacker.py
import jpeg
def quack():
print("\n\n############## Quack! ###############\n\n")
通过运行以下命令将该文件细胞化:
python setup.py build_ext --force --inplace
具有以下setup.py文件:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('quacker.py',compiler_directives={'language_level' : "3"}))
caller.pyx文件为:
from quacker import quack
cdef public void call_quack():
quack()
使用以下命令将该文件转换为cpp和h文件:
cython --cplus caller.pyx -3
最后是C ++应用程序主文件main.cpp:
#ifdef _DEBUG
#undef _DEBUG
#include <python.h>
#define _DEBUG
#else
#include <python.h>
#endif
#include "caller.h"
int main()
{
int status = PyImport_AppendInittab("caller",PyInit_caller);
Py_Initialize();
PyObject* module = PyImport_ImportModule("caller");
call_quack();
Py_Finalize();
return 0;
}
运行已编译的C ++应用程序结果会出现以下错误:
回溯(最近一次通话最后一次):文件“ caller.pyx”,行1,在 初始化调用者 从quacker导入quack文件,在init quacker的第2行中 def quack():ModuleNotFoundError:没有名为“ jpeg”的模块忽略以下异常:“ caller.call_quack” Traceback(最近一次通话):
初始化调用程序中的文件“ caller.pyx”,第1行 从quacker导入quack文件,在init quacker的第2行中 def quack():ModuleNotFoundError:没有名为“ jpeg”的模块
从以下main.py python脚本运行quacker。*。pyd会成功执行。
from quacker import quack
quack()
从quacker.py删除jpeg导入后,也可以从C ++应用程序运行它。
那我该如何运行从C ++应用程序导入库的细胞化文件?
谢谢