我制作了一个程序,通过导入我拥有的不同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
如果有人能帮助我完成脚本而不会抛出错误,我将不胜感激。
答案 0 :(得分:0)
我已经在包set ""="Community"
中为彼此创建了两个脚本X
和Y
,它们相互引用。
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())
需要注意的两件事:
def Y(remoteX1):
return remoteX1()
仍从X
导入,但是将函数名称注入Y
Y()
不会导入任何内容,但仍然可以在自身外部调用函数。