Ray*_*nSJ 3 python shell environment-variables
我正在尝试覆盖 Python 中的环境变量。我可以读取该值,然后写入该值并打印更新后的值。但是,如果我检查命令行中的值,它仍然是原始值。这是为什么?
首先,我创建变量
export MYVAR=old_val
Run Code Online (Sandbox Code Playgroud)
我的测试脚本 myvar.py
#!/usr/bin/env python3
import os
print (os.environ['MYVAR'])
os.environ['MYVAR'] = "new_val"
print (os.environ['MYVAR'])
Run Code Online (Sandbox Code Playgroud)
输出
$ ./myvar.py
old_val
new_val
$ echo $MYVAR
old_val
Run Code Online (Sandbox Code Playgroud)
如您所见,输出的最后一行仍然显示 old_val
精简版:
python 脚本改变了它的环境。但是这不会影响父进程的环境(外壳)
长版:
嗯,这是一个众所周知但非常令人困惑的问题。
你必须知道的是,没有环境,每个进程都有自己的环境。
所以在你上面的例子中,shell(你输入代码的地方)有一个环境。当您调用 时./myvar.py,会创建当前环境的副本并将其传递给您的 Python 脚本。您的代码“仅”更改此环境副本。一旦 python 脚本完成,这个副本就会被销毁,shell 将看到它的初始未修改环境。
这适用于大多数操作系统(Windows、Linux、MS-DOS 等)
换句话说:没有子进程可以改变调用它的进程的环境。
在 bash 中有一个技巧,您可以在其中获取脚本而不是将其作为进程调用。
但是,如果您的 Python 脚本启动另一个进程(例如/bin/bash),则子进程将看到修改后的环境。