我在main.py中有函數foo()。在main.py中,我導入了create.py。但是create.py中有一個函數需要main的foo()。我無法將main.py導入到create.py中,因爲main.py出錯......我認爲這是某種競爭條件。模塊命名空間中的Python導入語句和遞歸需要函數
如何在create.py命名空間中創建foo()?使用foo()模塊並且僅爲一個函數使用main.py和create.py導入它似乎效率低下。
我在main.py中有函數foo()。在main.py中,我導入了create.py。但是create.py中有一個函數需要main的foo()。我無法將main.py導入到create.py中,因爲main.py出錯......我認爲這是某種競爭條件。模塊命名空間中的Python導入語句和遞歸需要函數
如何在create.py命名空間中創建foo()?使用foo()模塊並且僅爲一個函數使用main.py和create.py導入它似乎效率低下。
最簡單的答案是從那裏移動FOO()來foo.py改爲進口或將它移動到create.py,並從那裏將它導入到main.py - 如果有東西在main.py,它需要移動也是。你的另一個選擇是將foo從main傳入到需要的地方作爲函數參數創建。
只是一個簡單的黑客攻擊,但這在一般情況下無濟於事。
在main.py中導入create.py時,它是不是通過導入調用。
# in main.py
if __name__ == '__main__':
from create import *
因此,這將導入當您通過python main.py
EXCUTE main.py創建和將導入創建,它會再次導入主,但這個時候,它會看到它正在導入這樣__name__ == '__main__'
將返回False
。所以導入的循環鏈將停止。
記住,它不會工作當您嘗試在其他腳本中導入main.py時,因爲create.py不會被導入。
因此,爲了使這個東西的工作,你必須執行main.py,您不能導入它。
當導入模塊,Python的import
機器執行的代碼,該模塊來填充它,但只有一次。如果多次導入相同的模塊,則會從sys.modules
緩存中取而代之。沒有辦法結束無限的導入循環。
但是,Python在爲其執行代碼之前將該模塊添加到sys.modules
,因此在整個模塊執行完畢之前它不會被完全填充。因此,如果模塊A導入模塊B,並且模塊B再次導入模塊A,它將看到一個部分初始化的模塊。這似乎是在這裏發生的事情; main
進口create
它完全填充之前,所以當create
試圖在main
訪問的東西,它還不存在。
一些解決方案:
import name
無處不在(無from name import
),並從腳本的底部打電話給你的主要功能。這樣,所有模塊將在執行其他任何事情之前完成導入。import create
語句向下移動到您需要訪問的函數的下方,因此它在執行create.py
代碼之前定義(這是一種愚蠢的行爲,但可用作最後的手段)。
人,即開始導入主。py,create.py無限次。我敢打賭,爲foo()創建一個額外的模塊並通過main.py和create.py導入它是唯一的解決方案。 – rnbcoder