Cython Cmake模块运行时错误

cython cmake module runtime error

本文关键字:运行时错误 模块 Cmake Cython      更新时间:2023-10-16

要接近MWE,我有一个示例项目来说明我的问题。该项目试图在包装的C 类上执行简单的操作,在这种情况下,PCLHeader对象。

我很确定问题在于我的cmake调用包含两个.pyx文件。 cython_add_module(test_cython common.pyx test_cython.pyx)

基于UseCython.cmake中的文档(该项目的一部分),据我所知,此调用应该可以。

当我构建此项目时,然后尝试导入所得库,Python仅首次仅导入

In [1]: import test_cython
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-158d7481838a> in <module>()
----> 1 import test_cython
common.pxd in init test_cython (/Users/phil/devel/test_cython/build/test_cython.cxx:1424)()
ImportError: No module named common
In [2]: import test_cython
In [3]: 

顺便说一句,如果有人可以使我走向更好的设计,如果这是错误的,我会很感激。例如,我不明白为什么这一行会根据我的设置导致编译错误。

cython_add_module(test_cython common.pyx test_cython.pyx)

这将commontest_cython编译为单个模块(test_cython.so或类似的东西)。但是,当您导入时,它将运行test_cython的初始化,但不能运行common的初始化。(当Python加载一个编译的模块时,它会运行一个称为PyInit_<modulename>init_<modulename>的函数,具体取决于您是否正在运行Python 2或3。尽管存在PyInit_common,但它并没有调用,但由于您正在导入test_cython

test_cython中的某个时刻,您然后尝试从common导入。Python导入机制基于每个模块是一个单独的文件 - 它首先通过不同文件类型(common.pycommon.pyccommon.so等)的列表进行搜索,并没有找到它们。因此,ImportError升高了。

Cython不支持将多个模块编译到一个.so文件中。(但是,您偶尔可以摆脱看起来相似的东西,只要它们只使用C界面 - 即使它似乎有效,这仍然不是一个好主意)。您需要做的是将test_cython.pyx汇编为一个模块,然后将common.pyx汇编为第二个模块:

cython_add_module(test_cython test_cython.pyx)
cython_add_module(common common.pyx)