解決,請參閱編輯#3用Cython cimport找不到.pxd模塊
假設一個包的結構爲:
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
搜索路徑。所以我也試圖改變cimport
語句helper.pxd
爲:
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
頭。內聯函數。
等一下,你叫你包'src'?我建議先使用不同的名字,因爲這只是尖叫命名衝突。 – MSeifert
@MSeifert謝謝! 'src'是爲了說明目的(因爲我發現它很常見)。實際上,'src'被命名爲'some_package',並放在名爲'Some_Package'的根目錄中。 –
是的,它是'src'文件的目錄。最後,你從那裏獲取代碼,但是在你的實際包中將其作爲擴展。如果概念發生了變化,這有點令人困惑。 : - ] – MSeifert