【问题标题】:Python 3 : Environment Variable setting using exec()Python 3:使用 exec() 设置环境变量
【发布时间】:2023-08-16 08:30:01
【问题描述】:

我正在尝试在脚本调用的函数中使用环境变量。 我看到的问题是第一次设置变量,但是下次调用脚本时,它使用旧变量值。 我正在使用 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)
            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

【问题讨论】:

    标签: python-3.x environment-variables exec


    【解决方案1】:

    你的代码甚至没有编译,因为你 import child 而是执行 test.my_func()。然而,真正的问题是您对exec() 的使用。想想当它被执行时会发生什么。 parent.py 中的代码将被执行并获取os.environ['SIGMA'] 的当前值。但请注意,import child 只执行一次——第一次执行 parent.py 的内容。这意味着您的循环第二次执行此语句将不会再次运行:

    sigma_child = float(os.environ['SIGMA'])
    

    这意味着 child.py 中的 my_func() 只会在第一次导入模块时看到分配给其模块级别 sigma_child var 的值。

    您为什么使用exec()?使用exec() 几乎是不正确的。

    【讨论】:

    • 感谢指出编译错误,我已更正。我使用 exec() 的原因是能够在循环中运行多个 sigma 值(和其他变量)。类似于网格搜索,