2017-03-20 99 views
0

導入模塊我有一個Python庫,看起來像這樣(含包裝):歧義蟒蛇

|-- python_lib/ 
    |-- plotting.py 
    |-- verification.py 
    |-- io.py 
    | 
    |-- ensemble/ 
     | -- plotting.py 
     | -- verification.py 

與曖昧模塊導入不過,我有問題。在ensemble.plotting.py我想導入從頂層verification.py模塊(python_lib):

# ensemble/plotting.py 
import verification.obs as verobs 

不過,我得到一個導入錯誤,因爲這將嘗試從合奏目錄中導入verification.py模塊,而不是最高級別圖書館。

我認爲「abslute進口」功能將解決這個問題:

from ..verification import obs 

,但我得到這個錯誤:

ValueError: Attempted relative import beyond toplevel package 

如何定位python_lib/verification.pypython_lib/ensemble/*.py進口,但不嘗試導入本地包版本?

我正在使用Python版本2.7。

+3

'from python_lib.verification import obs'? – leovp

+0

@leovp python_lib不是包,它只發生在源代碼所在的基目錄中。 – ccbunney

+0

嘗試添加名爲__init__.py的每個子目錄空文件。 看看這個https://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py?rq=1也 – nivhanin

回答

0

這是一個hacky解決方案,將工作,但一般不鼓勵。

當您必須忽略衝突時,您可以修改python路徑。這樣的:

import sys # needed to make it work 

tmp = sys.path[0] 
sys.path = sys.path[1:] # ugly and hacky thingy 

# import stuff you need (would work with __init__.py in a base dir) 
from python_lib import verification 
from ..verification.obs import obs 

# fix path back 
sys.path.insert(0, tmp) 

我只是測試這種模式,它似乎工作(Python的3.6.0)

1
  1. 您的所有目錄應該包含文件__init__.py,否則將不被認定爲包。

  2. 您的目錄python_lib必須是已知路徑。你在評論中說,你的PYTHONPATH包含一條到python_lib的路徑,所以看起來不錯。

  3. 如果您從例如python_lib/ensemble/verification.py作爲您的主要入口點,那麼目錄python_lib/ensemble會影響您的目錄python_lib,您必須手動告訴Python您的腳本屬於該包。

像這樣:

if __name__ == "__main__" and __package__ is None: 
    __package__ = "pythonlib.ensemble" 
    import pythonlib 

之後做到這一點,這應該工作:

from ..verification import obs 
0

有跡象表明,有在創建包和模塊應遵循的一些規則。

  1. 確保文件是__init__.py作爲您的軟件包的一部分。每個python軟件包都應該有這個文件
  2. 模塊看起來有三種方式。

一個很好的文檔可Module-search-path

通常在建設項目它的一個練習,創建一個lib包,並添加基於不同類別的子目錄,並添加主目錄PYTHONPATH變量。這使得該模塊可用於其他程序。