我正在尝试覆盖Python中的环境变量。我可以读取值,然后写入值并打印更新的值。但是,如果我在命令行中检查该值,则它仍然是原始值。为什么呢?
首先,我创建变量
export MYVAR=old_val
我的测试脚本myvar.py
#!/usr/bin/env python3
import os
print (os.environ['MYVAR'])
os.environ['MYVAR'] = "new_val"
print (os.environ['MYVAR'])
输出
$ ./myvar.py
old_val
new_val
$ echo $MYVAR
old_val
如您所见,输出的最后一行仍然显示old_val
答案 0 :(得分:5)
简短版本:
python脚本更改其环境。但这不会影响父进程(shell)的环境
长版:
这是一个众所周知的问题,但很令人困惑。
您要知道的是,没有环境,每个进程都有自己的环境。
因此,在上面的示例中,shell(您在其中键入代码)具有一个环境。
调用./myvar.py
时,将创建当前环境的副本并将其传递到python脚本。
您的代码“仅”更改此环境副本。
python脚本完成后,此副本将被销毁,并且外壳程序将看到其初始的未修改环境。
对于大多数操作系统(Windows,Linux,MS-DOS等),这都是正确的
换句话说:没有子进程可以更改称为它的进程的环境。
在bash中有一个窍门,您可以获取脚本而不是将其称为进程。
但是,如果您的python脚本启动了另一个进程(例如/bin/bash
),则子进程将看到修改后的环境。
答案 1 :(得分:2)
您启动了一个新进程,该进程更改了环境并退出。真的是全部。
您不应指望这会影响从(您的Shell)启动它的过程。