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

在第一个文件中导入第二个文件时,如何将全局变量从第一个python文件访问到第二个python文件,python,Python,我有两个python脚本。我试图将全局变量的值从1.py访问到2.py 这是我的密码 1.py import two myvar = False def fun(): global myvar myvar = True two.use_me() 2.py import one print "from two: ", one.myvar def use_me(): print "This is used in one.py" 我得到这个错误: $ python t

我有两个python脚本。我试图将全局变量的值从1.py访问到2.py

这是我的密码

1.py

import two

myvar = False

def fun():
    global myvar
    myvar = True

two.use_me()
2.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'
$python two.py
从二开始:
回溯(最近一次呼叫最后一次):
文件“two.py”,第1行,在
导入一个
文件“one.py”,第1行,在
进口二
文件“two.py”,第2行,在
打印“from two:”,one.myvar
AttributeError:“模块”对象没有属性“myvar”

不知道我在这里错过了什么。有人能帮忙吗?

您有一个循环输入。运行
two.py
时,它执行
importone
,然后执行
importtwo
。现在,
import one
立即返回,模块对象已经创建,但它是空的!因此,在下一行中,您会得到一个
属性错误

这就是回溯告诉你的:

  • 运行
    two.py
    的语句
    importone
  • 运行
    one.py
    的语句
    importtwo
  • 在文件
    two.py
    中,我得到了一个
    AttributeError
    正在执行
    打印“two.py”,一个.myvar
您的
one.py
模块根本不需要
two
,因此您应该删除
importtwo
语句

循环导入通常是一种非常强烈的信号,表明您的设计/架构中存在错误。尝试移动函数/类/变量以避免它们,最终合并这两个模块

有一些方法可以让它们工作,但它们很脆弱,应该避免


如果您在
two.py
中有一个函数,它需要
one.py
中的内容,那么您真的应该将该函数移到
one.py

Yoo也可以考虑创建<代码>三。Py < /C> >同时导入<代码>两个。P< <代码> >代码>一。P< <代码> < /P>


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

您有一个循环输入。运行
two.py
时,它执行
importone
,然后执行
importtwo
。现在,
import one
立即返回,模块对象已经创建,但它是空的!因此,在下一行中,您会得到一个
属性错误

这就是回溯告诉你的:

  • 运行
    two.py
    的语句
    importone
  • 运行
    one.py
    的语句
    importtwo
  • 在文件
    two.py
    中,我得到了一个
    AttributeError
    正在执行
    打印“two.py”,一个.myvar
您的
one.py
模块根本不需要
two
,因此您应该删除
importtwo
语句

循环导入通常是一种非常强烈的信号,表明您的设计/架构中存在错误。尝试移动函数/类/变量以避免它们,最终合并这两个模块

有一些方法可以让它们工作,但它们很脆弱,应该避免


如果您在
two.py
中有一个函数,它需要
one.py
中的内容,那么您真的应该将该函数移到
one.py

Yoo也可以考虑创建<代码>三。Py < /C> >同时导入<代码>两个。P< <代码> >代码>一。P< <代码> < /P>


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

编辑代码以清除一点,我确实需要导入两个
one.py
,因为
one.py
使用了
two.py
中的两个函数,这在某种程度上是正确的<代码>导入一个
不会立即返回。它导入了两条语句,这会跳过importone语句,因为已经导入了一条语句。然后,它继续执行这两个命令。因为在执行导入2的位置,myvar不存在,所以它抛出这个错误。我不建议这样做,但将导入行移到one.py的底部“修复”了此错误。@npatel我认为您不应该使用这种设计。打破循环依赖的方法有很多,但它们取决于确切的代码。现在我要说的是:只需删除
打印“two.py”,one.myvar
one
中所需的
two
中定义的功能是否依赖于
one
以及
two
中定义的内容?如果没有:只需将它们移动到
一个
@马特奥,我看不出我的描述有什么不同。导入不会“跳过”,因为模块对象会立即创建并立即插入到系统模块中,导入成功。当我说
import one
立即返回时,我的意思是它返回它在
sys.modules
中找到的值,而无需重新执行
one.py
(并以无限循环结束)@npatel很清楚:如果您可以将
使用
移动到
one.py
中,您就解决了问题。如果
use\u me
使用
two.f
只需将
f
移动到
one.py
。如果
f
使用
g
只需将
g
也移动到
one.py
。继续这样做,直到您的
two.py
不再需要
one.py
,或者
two.py
完全为空。编辑代码以清除我确实需要导入两个
作为的一点