python - 为什么当我加载模块太多次时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
如果有人可以帮助我完成脚本而不抛出错误,我将不胜感激。
解决方案
我为自己创建了几个脚本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 module
orfrom package import module
不会受到递归导入的影响。
这些问题的真正解决方案是使进口只流向一个方向。
在下面重新设计的示例中,依赖关系仅从 流向X
,Y
即X
依赖于 中的某些内容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()
有两点需要注意:
- 包
X
仍然从 导入Y
,但将函数名注入Y()
- 包
Y
不导入任何内容,但仍然能够调用自身外部的函数。
推荐阅读
- javascript - 我如何使用数组在 Javascript 中绘制直方图
- machine-learning - Sklearn 模型:roc 曲线的决策函数与 predict_proba
- reactjs - React Router 中的多个参数
- bash - 为列的重复值写入相同的结果
- java - 使用 String.split 中的值时出现问题
- ios - Firebase 社交登录登录到上次使用的邮件帐户
- javascript - 不读取 props 变量属性的原因是什么?
- sql - 解释 SQL 查询
- django - 在运行 redis-CLI 时,我的连接每次都被取消
- python - 在 docker 容器上运行时,Flask App 无法正常工作