Python:环境变量未更新

Python: Environment Variables not updating

提问人:RayJ_inSJ 提问时间:2/23/2020 更新时间:2/27/2020 访问量:7095

问:

我正在尝试覆盖 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

python shell 环境变量

评论

0赞 mrEvgenX 2/23/2020
这回答了你的问题吗?在 Python 脚本中设置环境变量
0赞 mrEvgenX 2/23/2020
或者更有可能 stackoverflow.com/questions/1178094/......
0赞 AMC 2/23/2020
这回答了你的问题吗?更改当前流程环境的LD_LIBRARY_PATH
0赞 RayJ_inSJ 2/23/2020
@mrEvgenX在写我的问题之前,我看到了这些链接。了解脚本在单独的进程中运行(如答案中所述)现在对我来说是有意义的。
0赞 gelonida 2/27/2020
@RayJ_inSJ给定的答案有什么问题。如果你对他们不满意,那么至少解释一下你还在寻找什么。

答:

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