已解决,请参阅编辑#3
假设包的结构如下:
Some_Package/
some_package/
__init__.py
core/
__init__.py
definition.pxd
helper/
__init__.py
helper.pxd
helper.pyx
setup.py
在哪里definition.pxd
I have:
import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t
And in helper.pxd
I have:
cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...
In helper.pyx
我没有cimport
任何事物。我配置了setup.py
as:
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
,但仍然不起作用。
Edit #1
根据文档 http://cython.readthedocs.io/en/latest/src/userguide/sharing_declarations.html#search-paths-for-definition-files, include_dirs
添加到*.pxd
搜索路径。所以我也尝试改变cimport
中的陈述helper.pxd
as:
cimport definition
from definition cimport INT_t
这次,cython
无法编译:"definition.pxd" not found
。但是,它应该位于搜索路径中。
Edit #2
一个快速的锻炼是添加一个空的definition.pyx
in core/
,然后将扩展配置为:
extensions = [
Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]
Then in setup.py
:
ext_modules=cythonize(extensions)
Now cimport some_package.core.definition
正在工作helper.pxd
.
然而,这并不优雅。
Edit 3
我终于发现我忽略了一些行,例如:
cdef INT_t some_int = 1
然而,在.pxd
文件,不能有任何可执行文件代码。在这种情况下,似乎Cython
将其视为一个包,这与现有的不同.pyx
file.
可能有两种方法可以解决:
cdef extern
from a C
header.
内联函数的总结。