首页 > 解决方案 > 为什么当我加载模块太多次时python会抛出错误以及如何修复?

问题描述

我制作了一个程序,通过导入我拥有的不同 python 脚本来管理程序的不同模式。问题是,如果从 script1.py 转到 script2.py,然后从 script2.py 返回 script1.py,然后与第一个相同,则会引发错误,提示“未找到名为 script2.py 的模块。 script2 不是一个包”。

当然是谷歌了。

#We are at script1
import script2.py

#We are at script2
import script1.py

#We are at script1
import script2.py

ModuleNotFoundError: No module named 'script2.py'; 'script' is not a package

如果有人可以帮助我完成脚本而不抛出错误,我将不胜感激。

标签: pythonpython-3.x

解决方案


我为自己创建了几个脚本X,并Y在一个包P中相互引用。

py

#from P.Y import Y
from P import Y

def usefulX3():
    return 3

def usefulX2():
    return 2

def X1():
    return usefulX2() + usefulX3()

def X():
    #return Y()
    return Y.Y()

if __name__ == '__main__':
    print(X())

py

#from P.X import X1
from P import X

def Y():
    #return X1()
    return X.X1()

照原样,运行脚本 X.py 会产生输出:5.

这是因为 import like:from P import Y只是让编译器检查文件 Y.py 是否存在并且不要求查看内部。

但是,如果您在两个文件中交换注释掉的行:即在 Y.py 中:

from P.X import X1
#from Pimport X

def Y():
    return X1()
    #return X.X1()

并再次运行 X.py,我得到一个 Traceback:

Traceback (most recent call last):
  File "C:/Expt/P/X.py", line 1, in <module>
    from P.Y import Y
  File "C:/Expt/P\Y.py", line 1, in <module>
    from P.X import X1
  File "C:/Expt/P\X.py", line 1, in <module>
    from P.Y import Y
ImportError: cannot import name 'Y'

从中可以看出,编译器只从每个文件的第一行获取不到更多内容并卡住了。

因此,您可以看到执行import moduleorfrom package import module不会受到递归导入的影响。

这些问题的真正解决方案是使进口只流向一个方向。

在下面重新设计的示例中,依赖关系仅从 流向XYX依赖于 中的某些内容Y,反之则不然:

py

from P.Y import Y

def usefulX3():
    return 3

def usefulX2():
    return 2

def X1():
    return usefulX2() + usefulX3()

def X():
    return Y(X1)

if __name__ == '__main__':
    print(X())

和 Y.py

def Y(remoteX1):
    return remoteX1()

有两点需要注意:

  1. X仍然从 导入Y,但将函数名注入Y()
  2. Y不导入任何内容,但仍然能够调用自身外部的函数。

推荐阅读