为什么在我多次加载模块时python会引发错误,以及如何解决?

时间:2019-05-03 16:27:52

标签: python python-3.x

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

当然用Google搜索了。

#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

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

1 个答案:

答案 0 :(得分:0)

我已经在包set ""="Community" 中为彼此创建了两个脚本XY,它们相互引用。

X.py

P

Y.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())

就这样,运行脚本X.py会产生输出:#from P.X import X1 from P import X def Y(): #return X1() return X.X1()

这是因为像5这样的导入仅使编译器检查文件Y.py 是否存在,并且不要求查看内部。

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

from P import Y

再次运行X.py,我得到了回溯:

from P.X import X1
#from Pimport X

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

您可以从中看到,编译器从每个文件的第一行开始就停留不动。

因此您可以看到执行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不会受到递归导入的影响。

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

在下面的示例中,依赖项仅从from package import module流到X,即Y依赖于X中的某些内容,反之亦然:

X.py

Y

和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())

需要注意的两件事:

  1. 软件包def Y(remoteX1): return remoteX1() 仍从X导入,但是将函数名称注入Y
  2. 软件包Y()不会导入任何内容,但仍然可以在自身外部调用函数。