Python3-在函数

时间:2017-09-08 09:01:09

标签: python python-3.x file exec

我遇到了在python脚本中运行python脚本的问题,我根本不理解:

假设我们在同一目录中有2个文件:' init.py'和' text.py'

init.py:

X = 5
print("init.py was run")

test.py:

exec(open("./init.py").read())
print("X = %s" %X)

如果我现在运行test.py,我会

  

运行了init.py

     

X = 5

但是,如果我将test.py更改为:

def func_call( filename):
  exec(open(filename).read())
  print("X = %s" %X)

func_call("./init.py")

我明白了:

  

运行了init.py

     

追踪(最近一次呼叫最后一次):

     

文件" test.py",第5行,

func_call("./init.py")   
     

文件" test.py",第3行,在func_call

print("X = %s" %X) 
     

NameError:name' X'未定义

有人可以向我解释为什么会导致不同的结果吗? 这有解决方法吗? 我的目标是通过运行python脚本并访问在该python脚本中设置的变量来初始化我的大多数变量。

1 个答案:

答案 0 :(得分:4)

根据exec_documentation

  

如果exec获得两个单独的对象作为全局变量和局部变量,则代码将被执行,就好像它嵌入在类定义中一样。

内部方法globals()和locals()是不同的对象:

def method():
    print(globals() == locals())
    exec('X=10')
    print('Method execution =', X)

method()

输出:

False
NameError: name 'X' is not defined

在全球范围内,这些对象是相同的:

print(globals() == locals())
exec('X=99')
print('Global exec =', X)

输出:

True
Global exec = 99

所以如果你想通过方法来做,你需要将同一个对象传递给exec。对于您的代码,它看起来像这样:

def func_call(filename):
  exec(open(filename).read(), globals(), globals())
  print("X = %s" %X)

func_call("./init.py")

然而,正如我在评论中提到的,创建带有consts的文件并导入它。尽量避免不惜一切代价使用exec / eval,除非你100%确定自己在做什么。