[英]Python Imports, Paths, Directories & Modules
首先讓我說我已經對過去一周的過程進行了廣泛的研究,但還沒有找到這些問題的實際答案 - 只是一些模糊的答案並沒有真正解釋發生了什么。 如果這只是因為我錯過了我想要的東西,我很抱歉 - 請指出我正確的方向。
我的目錄結構是:
TestProject/
runtest*
testpackage/
__init__.py
testmod.py
testmod2.py
testsubs/
testsubmod.py
幾個筆記:
我觀察到的事情:
問題是:
提前致謝。
首先,您將在The Python Tutorial的第6部分找到所需的所有信息。
(1)python路徑中存在的包和模塊上的python與您嘗試從當前目錄導入時的處理方式不同嗎?
不,它沒有。 實際上,Python在導入模塊時總是搜索sys.path
。 僅找到當前目錄中的模塊,因為sys.path
包含帶有空字符串的條目,表示當前目錄。
(2)為什么不
import testpackage
讓我訪問testpackage.testmod
? 當我導入os
,我可以訪問os.path
(etc)。
為了提高效率, import testpackage
只加載testpackage/__init__.py
。 如果你需要testpackage.testmod
,你必須明確地導入它:
import testpackage # Just imports testpackage, not testpackage.testmod!
import testpackage.testmod # Import *both* testpackage and testpackage.testmod!
如果你總是想導出testmod
,在__init__.py
導入它,這就是os
( os/__init__.py
)所做的。 這樣,如果導入testpackage
, testpackage.testmod
總是隱含可用。
由於Python是跨平台的,因此實際上無法在目錄中一致地自動加載模塊,因為某些文件系統不區分大小寫(Windows!)。 Python不知道是否將os/path.py
加載為os.path
或os.Path
等。
(3)對於一個包,我應該堅持在基目錄中使用單個
__init__.py
,還是應該將它們嵌套在后續目錄中?
每個子包總是需要__init__.py
。 有關於放棄這一要求的討論,但決定保持原樣。
(4)如何導入指定包名稱的模塊? 來自
testmod.py
IE,我想導入testpackage.testmod2
而不僅僅是testmod2
。
這應該工作。 只需確保從頂級目錄運行代碼。 如果當前目錄是testpackage
,則testmod
不知道它在包中。
但首選的方法是使用相對的包內導入:
from . import testmod2
如果存在名為testmod2
的全局模塊,則可以防止名稱沖突,並且可以使用包中的已知模塊的名稱而不會出現問題。
(5)從subsubs目錄導入子模塊的正確方法是什么? 我看到的唯一解決方案是將該目錄從
__init__.py
附加到pythonpath,但我不知道這是否正確。
不,不要那樣做! 永遠不要把一個目錄下sys.path
當它的一個父目錄已經在sys.path
! 這可能導致您的模塊加載兩次,這是一件壞事!
通常,您應該能夠使用絕對或相對導入從子包加載模塊:
import testpackage.testsubs.testsubmod
from testpackage.testsubs import testsubmod
from .testsubs import testsubmod
只需確保在testsubs/
創建__init__.py
!
testpackage
目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.