将第二个文件导入第一个文件时,如何从第一个python文件访问全局变量

时间:2018-10-04 19:37:12

标签: python

我有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'

不确定我在这里缺少什么。有人可以帮忙吗?

1 个答案:

答案 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.pytwo.py的{​​{1}}。

如何精确地中断循环导入取决于您拥有的确切代码,因此仅举玩具示例,我们就可以连续几天说“您可以删除它”或“您可以移动它”。如果您想要更精确的答案,我们需要查看非常精确的代码,它们代表两个模块中涉及的定义。