从modulename.main()方法访问时,如何从另一个python脚本访问变量

时间:2014-02-28 00:43:42

标签: python

我有一个简单的python脚本,它调用另一个python脚本的主要功能。像这样:

invoker_code.py

import os
invoked_code = '/tmp/invoked_code.py'
import sys
if os.path.exists(invoked_code):
    sys.append(invoked_code)
else:
    sys.exit(1)
import invoked_code
__data_bag = { 'var' : 'value' }
invoked_code.main()

/tmp/invoked_code.py

def main():
    print '%s' %(__data_bag['var'])

我希望invoked_code能够从其代码库中访问变量__dict_bag。这应该通过invoked_code.py脚本上的最小代码或零代码更改来实现,因为这是第三方脚本,并且我没有对此脚本的写入权限。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

模块可以访问和修改彼此的全局变量:

<强> module1.py

foobar = [1, 2, 3]
def main():
    print foobar[0]
def printx():
    print x

<强> module2.py

import module1
print module1.foobar
module1.main()
module1.foobar[0] = 100
module1.main()
module1.x = "exex"
module1.printx()

正在运行module2.py

[1, 2, 3]
1
100
exex

请注意,您既可以修改其他模块中的全局变量,也可以创建一个全局变量。但是,我会建议做poke说并将变量传递给调用函数。

答案 1 :(得分:0)

main中的invoked_code功能会在自己的范围内查找__data_bag名称。因此,它将首先尝试在函数本身内部找到它,然后进入模块级别,即invoked_code.py中定义的内容。

由于__data_bag在任何一个地方都不存在,因此该功能将无法找到它。因此,要在不更改invoked_code的情况下解决此问题,您需要将数据提供给函数将要查看的位置。你可以访问的唯一地方是模块,所以这是你唯一可以做的事情:

import invoked_code
invoked_code.__data_bag = { 'var' : 'value' }
invoked_code.main()

请注意,这实际上不是解决此问题的好方法。解决这个问题的正确方法是让main函数为此接受一个参数:

def main(data_bag):
    print '%s' %(data_bag['var'])

然后你可以简单地在你的调用脚本中传递值:

invoked_code.main(__data_bag)