# a.py
from b import f2
def f1:
print('我是a.f1')
# b.py
from a import f1
def f2:
print('我是b.f2')
以上是编写的程序代码;操作过程中执行a.py,会有异常报错,如下:
============== RESTART: D:/Ksoftware/Python38/pyworkstations/a.py ==============
Traceback (most recent call last):
File "D:/Ksoftware/Python38/pyworkstations/a.py", line 2, in <module>
from b import f2
File "D:/Ksoftware/Python38/pyworkstations\b.py", line 2, in <module>
from a import f1
File "D:/Ksoftware/Python38/pyworkstations\a.py", line 2, in <module>
from b import f2
ImportError: cannot import name 'f2' from partially initialized module 'b' (most likely due to a circular import) (D:/Ksoftware/Python38/pyworkstations\b.py)
>>>
报错中也有明显的指出:导入错误,不能再半初始化的b中导入f2(极有可能是出现了循环嵌套)
这个是循环嵌套导入问题。无论运行 a.py 或 b.py 哪一个文件都会抛出 ImportError 异常。这是因为在执行其中某一个文件(a.py)的加载过程中,会创建模块对象并执行对应的字节码。但当执行第一个语句的时候需要导入另一个文件(from b import y),因此 CPU 会转而去加载另一个文件(b.py)。同理,执行另一个文件的第一个语句(from a import x)恰好也是需要导入之前的文件(a.py)。此时,之前的文件处于仅导入第一条语句的阶段,因此其对应的字典中并不存在 x,故抛出“ImportError: cannot import name 'x'”异常。(from https://fishc.com.cn/thread-60578-1-3.html)
如果非要这样来回调用的话,可以尝试使用如下方法:
# a.py
import b
def f1:
print('我是a.f1')
# b.py
import a
def f2:
print('我是b.f2')
这样就不会出现上面的报错了;