![](/img/trans.png)
[英]Make python3 subpackage module available for import in main package namespace
[英]Python Import Statement and Recursion- need function available in module namespace
我在main.py中有函數foo()。 在main.py中,我導入create.py。 但是create.py中有一個函數需要來自main的foo()。 我無法將main.py導入到create.py中,因為main.py出錯...我認為這是某種競爭條件。
如何在create.py命名空間中使foo()可用? 將foo()作為模塊並由main.py和create.py導入僅用於一個函數似乎效率低下。
簡單的答案是將foo()移動到foo.py並從那里導入或將其移動到create.py並將其從那里導入main.py - 如果main.py中有東西它也需要移動。 您的另一個選擇是將foo從main傳遞到create作為需要它的函數參數。
只是一個簡單的黑客,但這在一般情況下無濟於事。
在main.py進口create.py當它不通過導入調用。
# in main.py
if __name__ == '__main__':
from create import *
因此,當你通過python main.py
將導入create並且將導入create並且它將再次導入main,但這次,它將看到它被導入,因此__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
),並從腳本底部調用main函數。 這樣,在執行任何其他操作之前,所有模塊都將完成導入。 import create
語句向下移動到您需要訪問的函數下方,因此在執行create.py
的代碼之前定義它(這有點傻,但可以作為最后的手段使用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.