2016-06-14 33 views
0

我有一個Python項目,我想利用我通過Cython公開的C++類(實際上,我只需要該類的特定實例,如以下代碼所示)。因爲有一大堆與這個類相關的文件,我決定把它放在它自己的包裏。從另一個目錄導入Cython公開的類

__init__.py文件這個包,我有什麼相當於下面的代碼:

from foo import Foo # import the class 

bar = Foo(some_parameters) 
__all__ = ["bar"] 

,當我在自己獨立運行__init__.py這工作得很好。然而,當我試圖從目錄以外訪問:

from qux import bar # inside main.py in the parent directory 

我得到追溯到相同__init__.py錯誤:

File "D:\path\to\qux\\__init__.py", line 2, in <module> 
from foo import Foo 
ImportError: No module named 'foo' 

回想foo是用Cython文件,而不是純粹的Python代碼。

的目錄結構如下所示:

main_project\ 
    main.py 
    (more supporting files here) 
    qux\ 
    __init__.py 
    cy_foo.cpp 
    cy_foo.pyx 
    foo.cpp 
    foo.h 
    foo.cp35-win_amd64.pyd 
    (more supporting files here) 

這是怎麼回事?

回答

1

我不認爲這有什麼關係Cython本身,而不是,這個問題是由於這樣的事實,當你在頂級目錄執行main.pyPython將執行__init__.py並在同一目錄下搜索失敗找到位於qux內的foo模塊。

作爲一個解決方案,在__init__.py改變import聲明:

from qux.foo import Foo 

如果由於某種原因,你仍然需要運行__init__.py__main__腳本,您可以使用哦,這麼熟悉if條款檢查__name__

if __name__ == "__main__": 
    from foo import Foo 
else: 
    from qux.foo import Foo 

bar = Foo("arguments") 
__all__ = ["bar"] 

現在,如果運行的__main__模塊,__init__.py會發現foo,如果不是,它允許別人找到它。

+0

這確實解決了它!我想我正在嘗試做類似於'import scipy'的東西;從優化導入brentq'沒有資格'優化'屬於'scipy'。我只是沒有想到Python在子目錄中運行腳本時仍然會在頂級目錄中進行搜索。 –