提问人:RayJ_inSJ 提问时间:2/23/2020 更新时间:2/27/2020 访问量:7095
Python:环境变量未更新
Python: Environment Variables not updating
问:
我正在尝试覆盖 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
答:
2赞
Mark Setchell
2/23/2020
#1
您启动了一个新进程,该进程更改了其环境并退出。真的就是这样。
你不应该指望这会影响你启动它的过程(你的shell)。
11赞
gelonida
2/23/2020
#2
短版:
python 脚本更改其环境。但是,这不会影响父进程(shell )的环境
长版:
嗯,这是一个众所周知但相当令人困惑的问题。
你要知道的是,没有环境,每个过程都有自己的环境。
因此,在上面的示例中,shell(键入代码的位置)具有一个环境。
调用 时,将创建当前环境的副本并将其传递给 python 脚本。
您的代码“仅”更改了环境的此副本。
一旦 python 脚本完成,此副本就会被销毁,并且 shell 将看到其初始未修改的环境。./myvar.py
对于大多数操作系统(Windows、Linux、MS-DOS 等)来说都是如此
换句话说:任何子进程都不能改变进程的环境,即调用它。
在 bash 中有一个技巧,您可以获取脚本而不是将其作为进程调用。
但是,如果您的 python 脚本启动了另一个进程(例如),则子进程将看到修改后的环境。/bin/bash
评论
2赞
gelonida
2/23/2020
如果您确实想更改当前 shell 的环境,并且只想更改一个变量,那么以下操作将起作用。您必须键入,而不是键入,而 python 脚本不会更改环境,只需打印出以下文本:./myvar.py
$(./myvar.py)
export MYVAR=new_val
评论