在 python 中共享全局变量
Sharing Global variables in python
我有 2 个文件 a.py 和 b.py 如下:
a.py
import b.py
Test="abc"
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
args = parser.parse_args()
main(args)
b.py
import a
print a.Test
编辑:输出:
python a.py
abc
所以基本上我的问题是为什么 Test 变量没有在 b.py 中更新,我怎样才能让它工作?谢谢
import a
a.main()
print a.Test
a.Test = "new Value"
print a.Text
您永远不会调用主函数。当您导入模块时,__name__
不是 "__main__"
,因此您的 main() 永远不会 运行。当你直接 运行 a.py 它会 运行 main()
由于问题编辑而添加:
您需要考虑导入执行的顺序。考虑这些工作文件。
a.py
print("Entering a")
import argparse
import b
Test="abc"
print("Id of Test: ", id(Test))
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
print('Entering main')
parser = argparse.ArgumentParser()
parser.add_argument('--target', dest='target', type=str)
args = parser.parse_args()
main(args)
b.py
print("Entering b")
import a
print a.Test
def fun():
pass
控制台生成以下内容:
$ python a.py
Entering a
Entering b
Entering a
('Id of Test: ', 40012016L)
abc
('Id of Test: ', 40012016L)
Entering main
问题是,当你导入一个pythonmodule/file时,你会立即执行那个模块中的所有语句。因此,您的依赖项(也称为导入)存在问题,因为 b 在 Test 的值为 'corrected' 之前导入 a,然后立即对此采取行动。
考虑两个变化。首先引入第三个文件config.py
,里面包含这个配置信息,b不导入a。其次,将 b 中需要此配置的所有语句移动到 called/bootstrapped by a 的函数中,这显然是有意的。
上一个回答:
我有一个证明该问题的解决方案,只需修改 b.py
def fun(): # Added because your main calls this. An error?
pass
from a import Test, main
import a
print Test # prints 'abc'
print a.Test # prints 'abc'
main()
print Test # prints 'abc'
print a.Test # prints 'klm'
在 python 解释器中,我可以生成以下内容:
>>> import b
abc
abc
abc
klm
在您的代码中,您使用指向原始字符串对象的命令 from a import Test
创建了一个名为 Test
的新变量。您实际上想要访问模块 a
.
拥有的 Test
变量
在a.py你运行主要在if语句中:
if __name__ == "__main__":
main()
只有当它是主脚本时才执行 main()。当您导入模块时,if 块中的所有代码都不是 运行,因为它不是主脚本。要调用 main 方法,请删除 if 语句或仅在 b.py.
中调用 main
我有 2 个文件 a.py 和 b.py 如下:
a.py
import b.py
Test="abc"
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
args = parser.parse_args()
main(args)
b.py
import a
print a.Test
编辑:输出:
python a.py
abc
所以基本上我的问题是为什么 Test 变量没有在 b.py 中更新,我怎样才能让它工作?谢谢
import a
a.main()
print a.Test
a.Test = "new Value"
print a.Text
您永远不会调用主函数。当您导入模块时,__name__
不是 "__main__"
,因此您的 main() 永远不会 运行。当你直接 运行 a.py 它会 运行 main()
由于问题编辑而添加:
您需要考虑导入执行的顺序。考虑这些工作文件。
a.py
print("Entering a")
import argparse
import b
Test="abc"
print("Id of Test: ", id(Test))
def main(args):
global Test
if args.target=="this":
Test="klm"
b.fun()
#rest of the body which I intend to execute only once
#hence I cannot call main() again
if __name__ == "__main__":
#some arguments are parsed
print('Entering main')
parser = argparse.ArgumentParser()
parser.add_argument('--target', dest='target', type=str)
args = parser.parse_args()
main(args)
b.py
print("Entering b")
import a
print a.Test
def fun():
pass
控制台生成以下内容:
$ python a.py
Entering a
Entering b
Entering a
('Id of Test: ', 40012016L)
abc
('Id of Test: ', 40012016L)
Entering main
问题是,当你导入一个pythonmodule/file时,你会立即执行那个模块中的所有语句。因此,您的依赖项(也称为导入)存在问题,因为 b 在 Test 的值为 'corrected' 之前导入 a,然后立即对此采取行动。
考虑两个变化。首先引入第三个文件config.py
,里面包含这个配置信息,b不导入a。其次,将 b 中需要此配置的所有语句移动到 called/bootstrapped by a 的函数中,这显然是有意的。
上一个回答:
我有一个证明该问题的解决方案,只需修改 b.py
def fun(): # Added because your main calls this. An error?
pass
from a import Test, main
import a
print Test # prints 'abc'
print a.Test # prints 'abc'
main()
print Test # prints 'abc'
print a.Test # prints 'klm'
在 python 解释器中,我可以生成以下内容:
>>> import b
abc
abc
abc
klm
在您的代码中,您使用指向原始字符串对象的命令 from a import Test
创建了一个名为 Test
的新变量。您实际上想要访问模块 a
.
Test
变量
在a.py你运行主要在if语句中:
if __name__ == "__main__":
main()
只有当它是主脚本时才执行 main()。当您导入模块时,if 块中的所有代码都不是 运行,因为它不是主脚本。要调用 main 方法,请删除 if 语句或仅在 b.py.
中调用 main