从C ++主程序调用包含导入功能的细胞化python代码

我正在尝试从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 ++应用程序导入库的细胞化文件?

谢谢

myidgy 回答:从C ++主程序调用包含导入功能的细胞化python代码

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3086552.html

大家都在问