Python:环境变量未更新

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

gel*_*ida 5

精简版:

python 脚本改变了它的环境。但是这不会影响父进程的环境(外壳)

长版:

嗯,这是一个众所周知但非常令人困惑的问题。

你必须知道的是,没有环境,每个进程都有自己的环境。

所以在你上面的例子中,shell(你输入代码的地方)有一个环境。当您调用 时./myvar.py,会创建当前环境的副本并将其传递给您的 Python 脚本。您的代码“仅”更改此环境副本。一旦 python 脚本完成,这个副本就会被销毁,shell 将看到它的初始未修改环境。

这适用于大多数操作系统(Windows、Linux、MS-DOS 等)

换句话说:没有子进程可以改变调用它的进程的环境。

在 bash 中有一个技巧,您可以在其中获取脚本而不是将其作为进程调用。

但是,如果您的 Python 脚本启动另一个进程(例如/bin/bash),则子进程将看到修改后的环境。

  • 如果您确实想更改当前 shell 的环境并且只想更改一个变量,则可以使用以下方法。您不必输入“./myvar.py”,而必须输入“$(./myvar.py)”,并且 python 脚本不会更改环境,只需打印出以下文本:“export MYVAR=new_val” (2认同)