在 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