Cython - 共享Cython模块

Bha*_*waj 5 c++ cython

我有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模块.请让我知道这种路径不匹配的原因是什么.

Dav*_*idW 5

这里的混乱,部分是关于行为cimport- OP试图用一个文件derived.pyxcimportbase.pyx,并试图做到这一点从C++.

cimport 做两件事:

  1. 它允许Cython知道cdef在另一个.pyx.pxd文件中定义的函数,以便它可以访问这些函数.这发生在编译时.
  2. import是那个模块.这在运行时发生,可以通过检查生成的C代码来查看.这import是" import蚂蚁"有两个原因:

    1. 使用的函数base.pyx可能需要在base中初始化全局变量或类,这在导入时完成.

    2. 它导致base共享对象物理加载到内存中,并初始化一些函数指针(in derived)到cdef函数中base.

    请注意,import实际上并没有添加basederived模块字典中,因此它与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.solibderived.solibbase.so.这不是一个derived直接与test程序链接的问题,但意味着Python导入机制无法找到base(因为它已重命名).


作为社区维基发布,以尽可能地消除自己与声誉的关联,因为我认为这是一个共同努力的事情,有点令人不满意的解决方案.