Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python 3:使用exec()设置环境变量_Python 3.x_Environment Variables_Exec - Fatal编程技术网

Python 3.x Python 3:使用exec()设置环境变量

Python 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)

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

您的代码甚至没有编译,因为您导入了子项,但执行了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值(和其他变量)。类似于网格搜索,