我最近將我的Python項目移植到了Python 3.1上運行。爲此,我不得不在我的項目的子模塊和子包中採用相對導入策略。我不這樣做,現在項目本身工作,但我注意到我不能執行其中的任何子包或子模塊。如果我嘗試,我會得到「builtins.ValueError:嘗試在非包裝中的相對導入」。我只能導入整個項目。Python:相對進口意味着你不能自己執行一個子包嗎?
這是正常的嗎?
我最近將我的Python項目移植到了Python 3.1上運行。爲此,我不得不在我的項目的子模塊和子包中採用相對導入策略。我不這樣做,現在項目本身工作,但我注意到我不能執行其中的任何子包或子模塊。如果我嘗試,我會得到「builtins.ValueError:嘗試在非包裝中的相對導入」。我只能導入整個項目。Python:相對進口意味着你不能自己執行一個子包嗎?
這是正常的嗎?
您可以使用python解釋器的-m標誌運行子包(甚至包中的3.1)中的模塊。
是的,這是正常的。如果你想執行一個也是包的一部分的模塊(本身就是一件很奇怪的事),你需要有絕對的導入。從執行模塊的角度來看,它不是從解釋器的角度來看,而是模塊的一部分,但不是模塊。所以它不知道相關軟件包在哪裏。
標準的方式來做到這一點是必須在包裝,並調用該函數獨立可執行腳本的功能,因爲這使您可以把可執行的腳本模塊外,例如在/ usr/bin中
哇,我覺得這個理念怪異。例如,我在我的項目中有一個「生命」包。它的絕對路徑是'garlicsim.bundled.simulation_packages.life'。我本來希望能夠自己運行它,因爲它不依賴於'蒜薹'中的任何東西。爲什麼我不能自己運行它? – 2009-10-18 19:55:53
1.如果它不依賴大蒜中的任何東西,那麼爲什麼它在大蒜中? 2.爲什麼你不能自己運行它?你可以自己運行它,但你需要有絕對的導入,也就是'from garlicsim.bundled.simulation_packages.life import'。 3.你覺得奇怪的哲學是什麼?我沒有提到任何哲學,所以我不知道這個哲學是什麼。 – 2009-10-18 20:16:24
1.它只是捆綁在一起。但我可以再舉一個'garlicsim.asynchronous_crunching.crunchers'的例子,這是蒜素依賴的一個子包裝,但它不依賴大蒜素。 (2)說如果有一天我想將它移動到另一個包,爲什麼我不能在沒有編輯導入行的大驚小怪的情況下? (3)也許我應該說「政策」而不是「哲學」。這種態度,能夠(a)獨立執行包,或(b)容易地將其移植到其他包,但不是兩者兼而有之。 – 2009-10-18 20:40:26
我有same problem,我認爲-m
切換太難了。
相反,我用這個:
try:
from . import bar
except ValueError:
import bar
if __name__ == "__main__":
pass
我會說你*有*使用'-m'開關;這不是你*可以*。我喜歡直接調用python文件,因爲我不需要記住開關,而且我的shell很好地自動完成。 – 2016-06-24 14:37:48
如果您對從子模塊運行可執行的python腳本感興趣,請參閱此答案:http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin 2016-11-29 13:59:05