Python 3.x Python 3:使用exec()设置环境变量
我试图在脚本调用的函数中使用环境变量。 我看到的问题是第一次设置变量,但下次调用脚本时,它使用旧的变量值。 我正在使用exec()调用python脚本 以下是最起码的例子: 文件:test_run.pyPython 3.x Python 3:使用exec()设置环境变量,python-3.x,environment-variables,exec,Python 3.x,Environment Variables,Exec,我试图在脚本调用的函数中使用环境变量。 我看到的问题是第一次设置变量,但下次调用脚本时,它使用旧的变量值。 我正在使用exec()调用python脚本 以下是最起码的例子: 文件:test_run.py import os import sys from io import StringIO sigmas = [2.,20.] for sigma in sigmas: os.environ['SIGMA'] = str(sigma)
import os
import sys
from io import StringIO
sigmas = [2.,20.]
for sigma in sigmas:
os.environ['SIGMA'] = str(sigma)
buffer = StringIO()
sys.stdout = buffer
exec(open("parent.py").read())
sys.stdout = sys.__stdout__
result = buffer.getvalue()
print (result)
#print('SIGMA', os.environ['SIGMA'])
buffer.close()
文件:parent.py
import child
sigma_parent = float(os.environ['SIGMA'])
print (' Parent Function Sigma = ', sigma_parent)
child.my_func();
文件:child.py
import os
sigma_child = float(os.environ['SIGMA'])
def my_func():
print (' Child Function Sigma = ', sigma_child)
输出:
Parent Function Sigma = 2.0
Child Function Sigma = 2.0
Parent Function Sigma = 20.0
Child Function Sigma = 2.0
您的代码甚至没有编译,因为您导入了子项,但执行了test.my_func()。然而,真正的问题是使用
exec()
。想一想当它被执行时会发生什么。将执行parent.py中的代码,它将获取当前值os.environ['SIGMA']
。但是请注意,import子项
只执行一次——第一次执行parent.py的内容时。这意味着循环第二次执行此语句时将不会再次运行:
sigma_child = float(os.environ['SIGMA'])
这意味着child.py中的my_func()
只有在第一次导入模块时才会看到分配给其模块级sigma_child
var的值
为什么要使用
exec()
?使用exec()
几乎是不正确的,因为您导入子项,而执行test.my_func()
,所以您的代码甚至不会编译。然而,真正的问题是使用exec()
。想一想当它被执行时会发生什么。将执行parent.py中的代码,它将获取当前值os.environ['SIGMA']
。但是请注意,import子项
只执行一次——第一次执行parent.py的内容时。这意味着循环第二次执行此语句时将不会再次运行:
sigma_child = float(os.environ['SIGMA'])
这意味着child.py中的my_func()
只有在第一次导入模块时才会看到分配给其模块级sigma_child
var的值
为什么要使用exec()
?使用exec()。我使用exec()的原因是能够在循环中运行多个sigma值(和其他变量)。类似于网格搜索的东西,感谢您指出编译错误,我已经纠正了它。我使用exec()的原因是能够在循环中运行多个sigma值(和其他变量)。类似于网格搜索,