簡體   English   中英

如何導入導入父模塊的子模塊?

[英]How to import child module which imports parent module?

我的模塊結構如下:

/parent
-- __init__.py
-- /child
---- __init__.py

我想在parent中導入child ,反之亦然,IE:

/父/初始化.py:

import child

/父/子/初始化.py:

import parent

但是當我這樣做時,我收到錯誤No module named 'parent' in parent/child/__init__.py

由於代碼中模塊的循環依賴性,您會收到該錯誤。

當 python 嘗試初始化您的parent模塊時,它會看到import child語句,該語句將解釋器引導到child模塊,(注意parent模塊尚未初始化)現在在子模塊中遇到import parent行,但由於父模塊尚未初始化,解釋器將因找不到parent模塊的錯誤而失敗。

理想情況下,您應該修復循環導入來解決此問題,但是可以將導入移到稍后階段而不是將其添加到文件頂部來克服它。 (例如:您可以在實際使用子模塊的方法中添加 import 語句。)但不建議這樣做。

在child中導入之前添加父路徑,這樣可以找到父模塊

sys.path.append(os.path.abspath('..'))

不良設計警報

循環進口問題可能表明設計不佳

解決方案

您的導入不能都在頂層。

# /parent/child/init.py:

import parent  # <-- top level

# /parent/init.py:

import .child  # <-- also top level

常見的模式是將其中一個導入移動到使用它的地方(但不是在頂層,lul),例如:

# /parent/child/init.py:

def dupa():
    import parent  # <-- not top level
    parent.foo()

也可以看看

Python循環進口?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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