[英]python module and imports
如果這是我的目錄樹
temp
├── __init__.py
└── __main__.py
0 directories, 2 files
我在__init__.py
和__main__.py
有以下代碼
"""Initializes the module"""
CONSTANT = 1
sys.exit("what is happening here")
# from . import CONSTANT
# from temp import CONSTANT
if __name__ == "__main__":
print "This should never run"
我在這里遇到兩個問題,我想弄明白
在運行python .
在temp
目錄中我得到輸出This should never run
,不應該先用__init__.py
文件初始化模塊導致中止?
第二,我如何在python模塊中進行導入? 我上面提到的兩個選項都沒有用。 我做不到from . import CONSTANT
在上面的代碼中from . import CONSTANT
或from temp import CONSTANT
。 做相對進口的正確方法是什么?
我在Python 2.7.5上運行它,如果之前已經問過這個,請道歉。
您應該從temp
目錄中運行它。 如果someDir
包含您的temp
目錄,則:
someDir $ python -m temp #someDir/temp/__init__.py is your file.
在運行python。 在臨時目錄中我得到輸出這應該永遠不會運行,不應該先使用init .py文件初始化模塊導致中止?
如果從外部運行它,將調用__init__.py
。 並且還將調用sys.exit
。
第二,我如何在python模塊中進行導入? 我上面提到的兩個選項都沒有用。 我做不到。 在上面的代碼中導入CONSTANT或臨時導入CONSTANT。 做相對進口的正確方法是什么?
你做得很好。 只需在__init__.py
文件中導入sys即可。 並修復CONSTANT
的拼寫。
另外為什么我需要-m標志? 從temp的父目錄中執行python temp是不是可以的?
你需要-m
標志來告訴你正在使用包。 如果你不使用它,你將無法進行相對進口。
你在 temp
運行; 這不被視為包,並且未加載__init__.py
。 僅當當前目錄的父級位於模塊加載路徑上並且您顯式加載temp
作為模塊時,才會加載__init__.py
。
因為temp
不是包,所以你不能在這里使用相對導入。 相反,目錄中的每個Python文件都被視為頂層模塊。
你已經移動到temp
目錄的父目錄,然后運行:
python -m temp
用於Python將temp
作為包導入,然后在該包中運行__main__
模塊。
當您告訴Python運行目錄時, Python不會將該目錄視為包 。 相反,Python 將該目錄添加到sys.path
並運行其__main__.py
。 __init__.py
未執行,相對導入不會將目錄作為包查看。
如果你想運行一個包的__main__.py
並將其視為包的一部分,並執行了__init__.py
,那么轉到包含該包的目錄並運行
python -m packagename
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.