gpt4 book ai didi

c++ - cython cmake 模块运行时错误

转载 作者:行者123 更新时间:2023-11-28 01:43:06 25 4
gpt4 key购买 nike

为了接近 MWE,我有一个例子 project这说明了我的问题。该项目尝试对包装的 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]:

顺便说一句,如果这在某种程度上是错误的,如果有人能引导我做出更好的设计,我将不胜感激。例如,我无法理解为什么 this line根据我的设置导致编译错误。

最佳答案

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 doesn't support compiling multiple modules into a single .so file 。 (虽然你偶尔可以摆脱看起来相似的东西,只要它们只使用 C 接口(interface)——即使它看起来可行,它仍然不是一个好主意)。您需要做的是将 test_cython.pyx 编译为一个模块,将 common.pyx 编译为第二个模块:

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

关于c++ - cython cmake 模块运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46376267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com