根据我的阅读,Python实例中对环境变量的任何更改仅在该实例中可用,并在实例关闭后消失.是否有任何方法可以通过将它们提交给系统来使它们坚持下去?
我需要这样做的原因是因为在我工作的工作室,像Maya这样的工具在很大程度上依赖于环境变量来配置跨多个平台的路径.
我的测试代码是
import os
os.environ['FAKE'] = 'C:\\'
Run Code Online (Sandbox Code Playgroud)
打开另一个Python实例并请求os.environ['FAKE']产生一个KeyError.
注意:可移植性将是一个问题,但我正在编写的小API将能够检查操作系统版本并在必要时触发不同的命令.
也就是说,我已经走了使用Windows注册表技术的路线,只会编写替代方法,在其他平台上调用shell脚本,因为它们成为需求.
Python对环境变量的访问并不能准确反映操作系统对进程环境的看法.
在特定情况下,os.getenv和os.environ没有按预期运行.
有没有办法正确地获得正在运行的进程环境?
为了证明我的意思,拿两个大致相同的程序(第一个在C中,另一个在python中):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
char *env;
for(;;){
env = getenv("SOME_VARIABLE");
if(env)
puts(env);
sleep(5);
}
}
Run Code Online (Sandbox Code Playgroud)
import os
import time
while True:
env = os.getenv("SOME_VARIABLE")
if env is not None:
print env
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
现在,如果我们运行C程序并使用gdb附加到正在运行的进程并通过执行以下操作强制更改引擎环境:
(gdb) print setenv("SOME_VARIABLE", "my value", 1)
[Switching to Thread -1208600896 (LWP 16163)]
$1 = 0
(gdb) print (char *)getenv("SOME_VARIABLE")
$2 = 0x8293126 "my value"
Run Code Online (Sandbox Code Playgroud)
那么前面提到的C程序将每5秒开始喷出一次"我的价值".然而,前面提到的python程序不会.
在这种情况下,有没有办法让python程序像C程序一样运行?
(是的,我意识到这是一个在运行过程中执行的非常模糊且可能具有破坏性的操作)
此外,我目前正在使用python 2.4,这可能已在更高版本的python中修复.