簡體   English   中英

python模塊和導入

[英]python module and imports

如果這是我的目錄樹

temp
├── __init__.py
└── __main__.py

0 directories, 2 files

我在__init__.py__main__.py有以下代碼

__init__.py

"""Initializes the module"""

CONSTANT = 1
sys.exit("what is happening here")

__main__.py

# 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 CONSTANTfrom 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM