我有2个python脚本。我正在尝试从one.py到two.py访问全局变量的值。
这是我的代码。
one.py
import two
myvar = False
def fun():
global myvar
myvar = True
two.use_me()
two.py
import one
print "from two: ", one.myvar
def use_me():
print "This is used in one.py"
我收到此错误:
$ python two.py
from two:
Traceback (most recent call last):
File "two.py", line 1, in <module>
import one
File "one.py", line 1, in <module>
import two
File "two.py", line 2, in <module>
print "from two: ", one.myvar
AttributeError: 'module' object has no attribute 'myvar'
不确定我在这里缺少什么。有人可以帮忙吗?
答案 0 :(得分:4)
您有一个循环输入。运行two.py
时,它将执行import one
,然后执行import two
。现在import one
立即返回,模块对象已经创建,但是为空!因此在下一行您会得到一个AttributeError
。
这就是回溯告诉你的:
two.py
的语句import one
one.py
的语句import two
two.py
中,我有一个AttributeError
正在执行print "two.py", one.myvar
您的one.py
模块根本不需要two
,因此您应该删除import two
语句。
圆形导入通常是非常强的信号,表明您的设计/体系结构中存在问题。尝试四处移动函数/类/变量以避免它们,最终将两个模块组合在一起。
有多种方法可以使它们工作,但是它们很脆,应该避免。
如果您在two.py
中有一个函数需要one.py
中的内容,则应该将函数移至one.py
中。
Yuo还可以考虑创建同时导入three.py
和two.py
的{{1}}。
如何精确地中断循环导入取决于您拥有的确切代码,因此仅举玩具示例,我们就可以连续几天说“您可以删除它”或“您可以移动它”。如果您想要更精确的答案,我们需要查看非常精确的代码,它们代表两个模块中涉及的定义。