2017-08-28 210 views
2

解決,請參閱編輯#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

按照documentationinclude_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文件那樣。

可能有兩種方法來解決:

  1. cdef externC頭。

  2. 內聯函數。

+0

等一下,你叫你包'src'?我建議先使用不同的名字,因爲這只是尖叫命名衝突。 – MSeifert

+0

@MSeifert謝謝! 'src'是爲了說明目的(因爲我發現它很常見)。實際上,'src'被命名爲'some_package',並放在名爲'Some_Package'的根目錄中。 –

+0

是的,它是'src'文件的目錄。最後,你從那裏獲取代碼,但是在你的實際包中將其作爲擴展。如果概念發生了變化,這有點令人困惑。 : - ] – MSeifert

回答

0

我忽視的是,我有一些線路爲:

cdef INT_t some_int = 1 

然而,在.pxd文件,不能有任何可執行代碼。在這種情況下,似乎Cython將其視爲一個包,而不是像.pyx文件那樣。

可能有兩種方法來解決:

  1. cdef externC頭。

  2. 內聯函數。