2017-03-07 107 views
0

所以我對Python 2.7項目這樣想。這將是由需要一個通用類(模塊)的文件中第三包兩個獨立的部分:Python 2相對導入:兩個不同的包需要一個普通的類

SomeRootFolder/Package1Folder/manyPythonModuleFiles.py 
SomeRootFolder/Package2Folder/manyPythonModuleFiles.py 
SomeRootFolder/SharedPackageFolder/OneCommonClassNeedsToBeShared.py 

我想要做的是導入從兩個包共享包的通用類。兩個第一包不需要一起交互,但需要一個類。蟒蛇程序可能會從內部兩包文件夾本身打開控制檯拼命地跑,如:

cd Package1Folder 
python SomeMainFile.py 

如果是比較容易,Python的通話也能像python Package1Folder/SomeMainFile.py但我需要計劃這一點。

您能否提供如何從第一個包或第二個包中獲取第三個共享包中的文件的相對導入?我需要在SomeRootFolder文件夾中輸入__init__.py文件嗎?我總是對相關導入以及Python 2和3之間的導入標準和語法感到困惑。您是否也可以向我證實這是一種可以接受的方式?任何其他想法?

謝謝大家!

回答

2

如果你想使用相對導入,你需要在SharedPackageFolder文件夾__init__.py,你可以用它來導入OneCommonClassNeedsToBeShared.py

from ..SharedPackageFolder import OneCommonClassNeedsToBeShared 

查看有關Rationale for Relative Imports更多細節。

隨着絕對進口的轉變,出現了問題是否應允許 相對進口。提出了幾種使用案例 ,其中最重要的是能夠重新排列大包裝的結構而不必編輯子包裝。另外, 另外,如果沒有 相對導入,包內的模塊不能輕易導入。你

也可以使用絕對進口,相對進口不再極力勸阻,使用absolute_import在某些情況下,強烈建議。

您需要確保SomeRootFolder位於您的PYTHONPATH中,或者將此文件夾設置爲sources root,您可以更輕鬆地在大型項目中導入包或腳本,但有時您應該小心絕對導入。

from SharedPackageFolder import OneCommonClassNeedsToBeShared.py 

絕對進口。來自PEP 8:

對於包裝內進口的相對進口非常不鼓勵。對所有導入始終使用絕對包路徑。即使在Python 2.5中完全實現了 PEP 328 [7],它的樣式顯式 相對導入也被阻止;絕對進口更便攜,通常更具可讀性。

順便說一下,Python 3中的相對導入可能會返回SystemError,看看問題:Relative imports in Python 3。 @vaultah提供了一些解決方案,它們可能會有所幫助。

希望這會有所幫助。

相關問題