在python中共享全局变量

时间:2016-08-03 21:25:54

标签: python python-2.7 variables global-variables global

我有两个文件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

所以基本上我的问题是为什么测试变量没有在b.py中更新,我怎么能让它工作?感谢。

3 个答案:

答案 0 :(得分:1)

import a
a.main()
print a.Test
a.Test = "new Value"
print a.Text

您永远不会调用main函数。导入模块时,__name__不是"__main__",因此您的main()永远不会运行。当你直接运行a.py时,它将运行main()

答案 1 :(得分:0)

由于问题编辑而添加:

您需要考虑导入执行的顺序。考虑这些工作文件。

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

问题是,当你导入python模块/文件时,你将立即执行该模块中的所有语句。因此,您的依赖项(也称为导入)存在问题,因为b正在导入“测试”的值之前已经更正了#39;然后立即采取行动。

考虑两个变化。首先,引入包含此配置信息的第三个文件config.py,并且b不导入。其次,将所有需要b中需要此配置的语句移动到由a调用/ bootstrapped的函数中,显然是这样。

上一个答案:

我有一个解决方案,只通过修改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

在您的代码中,您创建一个名为Test的新变量,其命令from a import Test指向原始字符串对象。您实际上想要访问模块Test拥有的a变量。

答案 2 :(得分:0)

在a.py中,你在if语句中运行main:

$scope.$watch('fieldcontainer', 
  function(newValue, oldValue) {
    if (newValue && oldValue && newValue != oldValue) {
      // here what to do
    }
  }), true;

如果是主脚本,则只执行main()。导入模块时,if块中的所有代码都不会运行,因为它不是主脚本。要调用main方法,请删除if语句或只在b.py中调用main。