2009-10-18 47 views
7

我最近將我的Python項目移植到了Python 3.1上運行。爲此,我不得不在我的項目的子模塊和子包中採用相對導入策略。我不這樣做,現在項目本身工作,但我注意到我不能執行其中的任何子包或子模塊。如果我嘗試,我會得到「builtins.ValueError:嘗試在非包裝中的相對導入」。我只能導入整個項目。Python:相對進口意味着你不能自己執行一個子包嗎?

這是正常的嗎?

回答

3

您可以使用python解釋器的-m標誌運行子包(甚至包中的3.1)中的模塊。

+0

我會說你*有*使用'-m'開關;這不是你*可以*。我喜歡直接調用python文件,因爲我不需要記住開關,而且我的shell很好地自動完成。 – 2016-06-24 14:37:48

+0

如果您對從子模塊運行可執行的python腳本感興趣,請參閱此答案:http://stackoverflow.com/a/11537218/730150 – krumpelstiltskin 2016-11-29 13:59:05

4

是的,這是正常的。如果你想執行一個也是包的一部分的模塊(本身就是一件很奇怪的事),你需要有絕對的導入。從執行模塊的角度來看,它不是從解釋器的角度來看,而是模塊的一部分,但不是模塊。所以它不知道相關軟件包在哪裏。

標準的方式來做到這一點是必須在包裝,並調用該函數獨立可執行腳本的功能,因爲這使您可以把可執行的腳本模塊外,例如在/ usr/bin中

+1

哇,我覺得這個理念怪異。例如,我在我的項目中有一個「生命」包。它的絕對路徑是'garlicsim.bundled.simulation_packages.life'。我本來希望能夠自己運行它,因爲它不依賴於'蒜薹'中的任何東西。爲什麼我不能自己運行它? – 2009-10-18 19:55:53

+0

1.如果它不依賴大蒜中的任何東西,那麼爲什麼它在大蒜中? 2.爲什麼你不能自己運行它?你可以自己運行它,但你需要有絕對的導入,也就是'from garlicsim.bundled.simulation_packages.life import'。 3.你覺得奇怪的哲學是什麼?我沒有提到任何哲學,所以我不知道這個哲學是什麼。 – 2009-10-18 20:16:24

+3

1.它只是捆綁在一起。但我可以再舉一個'garlicsim.asynchronous_crunching.crunchers'的例子,這是蒜素依賴的一個子包裝,但它不依賴大蒜素。 (2)說如果有一天我想將它移動到另一個包,爲什麼我不能在沒有編輯導入行的大驚小怪的情況下? (3)也許我應該說「政策」而不是「哲學」。這種態度,能夠(a)獨立執行包,或(b)容易地將其移植到其他包,但不是兩者兼而有之。 – 2009-10-18 20:40:26

-1

我有same problem,我認爲-m切換太難了。

相反,我用這個:

try: 
    from . import bar 
except ValueError: 
    import bar 

if __name__ == "__main__": 
    pass 
+0

隱式相對導入在python 2.7中被棄用和刪除。 – habnabit 2010-09-13 16:05:02

+0

阿龍,你是對的,但我不明白這是如何改變我的解決方案。這適用於任何python 2.5-3.1。 – sorin 2010-09-13 18:27:40

+0

不,這在3.x中不起作用。它在2.7+中被刪除,其中包括3.0-3.1。 – habnabit 2010-09-14 08:19:57