如何导入导入父模块的子模块?

问题描述

我的模块结构如下:

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

我想在child中导入parent,反之亦然,即:

/ parent / init .py:

import child

/ parent / child / init .py:

import parent

但是当我这样做的时候我得到了错误No module named 'parent' in parent/child/__init__.py

解决方法

由于代码中模块的循环依赖性,您遇到了该错误。

当python尝试初始化parent模块时,它会看到import child语句,该语句将解释器引导至child模块,(请注意,parent模块未初始化现在)在子模块import parent中遇到了行,但是由于父模块尚未初始化,解释器将因找不到parent模块的错误而失败。

理想情况下,您应该修复循环导入以解决此问题,但是可以克服将导入移至后期而不是将其添加到文件顶部的问题。 (例如:您可以在实际使用子模块的方法中添加import语句。)但不建议这样做。

,

在将其导入子级之前添加父级路径,这样可以找到父级模块

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 circular importing?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...