Cython cimport 找不到 .pxd 模块
Cython cimport cannot find .pxd module
已解决,请参阅编辑 #3
假设包的结构为:
Some_Package/
some_package/
__init__.py
core/
__init__.py
definition.pxd
helper/
__init__.py
helper.pxd
helper.pyx
setup.py
在 definition.pxd
我有:
import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t
在 helper.pxd
我有:
cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...
在 helper.pyx
我没有 cimport
任何东西。我将 setup.py
配置为:
ext_modules=cythonize('./some_package/helper/helper.pyx', include_dirs=['.', './some_package/core'])
现在我的问题是 python setup.py build_ext --inplace
我可以成功构建到 .so
,但是当我尝试 import some_package.helper.helper
时我得到了一个 ImportError
:
ImportError: No module named "some_package.helper.helper"
我查看了 helper.cpp
并发现了一些类似的行:
__pyx_t_1 = __Pyx_ImportModule("some_package.core.definition"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)
我想这可能与导入路径有关,但我无法找出问题所在。所有 __init__.py
都是空的,我在每个文件中都导入了 absolute_import
。我也更改了 include_dirs
,但仍然无法正常工作。
编辑 #1
根据 documentation,include_dirs
添加到 *.pxd
搜索路径。所以我也尝试将 helper.pxd
中的 cimport
语句更改为:
cimport definition
from definition cimport INT_t
这一次,cython
无法编译:"definition.pxd" not found
。但是,它应该在搜索路径中。
编辑 #2
快速训练是在 core/
中添加一个空的 definition.pyx
,然后将扩展配置为:
extensions = [
Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]
然后在 setup.py
:
ext_modules=cythonize(extensions)
现在 cimport some_package.core.definition
在 helper.pxd
工作。
然而,这并不优雅。
编辑 3
我终于发现我忽略了一些行,例如:
cdef INT_t some_int = 1
但是,在.pxd
文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython
将其视为一个包,而不是 .pyx
文件。
可能有两种解决方法:
cdef extern
来自 C
header.
Wrap-up 内联函数。
我忽略了一些行:
cdef INT_t some_int = 1
但是,在.pxd
文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython
将其视为一个包,而不是 .pyx
文件。
可能有两种解决方法:
cdef extern
来自 C
header.
Wrap-up 内联函数。
已解决,请参阅编辑 #3
假设包的结构为:
Some_Package/
some_package/
__init__.py
core/
__init__.py
definition.pxd
helper/
__init__.py
helper.pxd
helper.pyx
setup.py
在 definition.pxd
我有:
import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t
在 helper.pxd
我有:
cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...
在 helper.pyx
我没有 cimport
任何东西。我将 setup.py
配置为:
ext_modules=cythonize('./some_package/helper/helper.pyx', include_dirs=['.', './some_package/core'])
现在我的问题是 python setup.py build_ext --inplace
我可以成功构建到 .so
,但是当我尝试 import some_package.helper.helper
时我得到了一个 ImportError
:
ImportError: No module named "some_package.helper.helper"
我查看了 helper.cpp
并发现了一些类似的行:
__pyx_t_1 = __Pyx_ImportModule("some_package.core.definition"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)
我想这可能与导入路径有关,但我无法找出问题所在。所有 __init__.py
都是空的,我在每个文件中都导入了 absolute_import
。我也更改了 include_dirs
,但仍然无法正常工作。
编辑 #1
根据 documentation,include_dirs
添加到 *.pxd
搜索路径。所以我也尝试将 helper.pxd
中的 cimport
语句更改为:
cimport definition
from definition cimport INT_t
这一次,cython
无法编译:"definition.pxd" not found
。但是,它应该在搜索路径中。
编辑 #2
快速训练是在 core/
中添加一个空的 definition.pyx
,然后将扩展配置为:
extensions = [
Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]
然后在 setup.py
:
ext_modules=cythonize(extensions)
现在 cimport some_package.core.definition
在 helper.pxd
工作。
然而,这并不优雅。
编辑 3
我终于发现我忽略了一些行,例如:
cdef INT_t some_int = 1
但是,在.pxd
文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython
将其视为一个包,而不是 .pyx
文件。
可能有两种解决方法:
cdef extern
来自C
header.Wrap-up 内联函数。
我忽略了一些行:
cdef INT_t some_int = 1
但是,在.pxd
文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython
将其视为一个包,而不是 .pyx
文件。
可能有两种解决方法:
cdef extern
来自C
header.Wrap-up 内联函数。