我有cython模块base.pyx和derived.pyx.base.pyx并定义其导入定义base.pxd文件,并在derived.pyx文件中使用cimport.文件放在这里.
在我的Python应用程序中使用cython生成的共享对象时,模块正确导入,但ImportError: No module named 'base'在Cpp应用程序中使用库时总会出现错误.
我还在我的Cpp应用程序中添加了当前路径
PyObject* path = PySys_GetObject("path");
PyObject* result = PyObject_CallMethod(path,"append","(s)",".");
Py_XDECREF(result);
Run Code Online (Sandbox Code Playgroud)
即使这样,应用程序也看不到cython模块.请让我知道这种路径不匹配的原因是什么.
这里的混乱,部分是关于行为cimport- OP试图用一个文件derived.pyx是cimport编base.pyx,并试图做到这一点从C++.
cimport 做两件事:
cdef在另一个.pyx或.pxd文件中定义的函数,以便它可以访问这些函数.这发生在编译时.这import是那个模块.这在运行时发生,可以通过检查生成的C代码来查看.这import是" import蚂蚁"有两个原因:
使用的函数base.pyx可能需要在base中初始化全局变量或类,这在导入时完成.
它导致base共享对象物理加载到内存中,并初始化一些函数指针(in derived)到cdef函数中base.
请注意,import实际上并没有添加base到derived模块字典中,因此它与Python导入不完全相同.
我相信OP的一部分令人困惑,这有些出乎意料import.
第二个问题只是在提问时才显露出来,因为它涉及一个未写在问题中的关键细节.我设法通过以下方式获得提供的代码:
python3 setup.py build_ext --inplace
g++ test.cpp -o test `python3-config --libs --includes` ./derived.cpython-36m-x86_64-linux-gnu.so
./test
Run Code Online (Sandbox Code Playgroud)
(第二行可能需要更改以匹配已编译的派生模块的确切名称).@PierredeBuyl做了一些稍微不同的事情,但同样发现代码没有任何变化.
这个问题实际上变成了是OP被重新命名derived.cpython-36m-x86_64-linux-gnu.so,并base.cpython-36m-x86_64-linux-gnu.so以libderived.so和libbase.so.这不是一个derived直接与test程序链接的问题,但意味着Python导入机制无法找到base(因为它已重命名).
作为社区维基发布,以尽可能地消除自己与声誉的关联,因为我认为这是一个共同努力的事情,有点令人不满意的解决方案.