在第一个文件中导入第二个文件时,如何将全局变量从第一个python文件访问到第二个python文件
我有两个python脚本。我试图将全局变量的值从1.py访问到2.py 这是我的密码 1.py在第一个文件中导入第二个文件时,如何将全局变量从第一个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
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
完全为空。编辑代码以清除我确实需要导入两个作为的一点