Pythons Zugriff auf Umgebungsvariablen spiegelt nicht genau die Sicht des Betriebssystems auf die Prozessumgebung wider.Umgebungsvariablen in Python unter Linux
os.getenv und os.environ funktionieren in bestimmten Fällen nicht wie erwartet.
Gibt es eine Möglichkeit, die Umgebung des laufenden Prozesses ordnungsgemäß zu erhalten?
Um zu zeigen, was ich meine, nehmen die beiden in etwa gleichwertige Programme (die erste in C, die andere in 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);
}
}
import os
import time
while True:
env = os.getenv("SOME_VARIABLE")
if env is not None:
print env
time.sleep(5)
Nun, wenn wir führen das C-Programm aus und hängen es an den laufenden Prozess mit gdb an und ändern gewaltsam die Umgebung unter der Haube, indem wir etwas tun:
(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"
dann beginnt das oben erwähnte C-Programm alle 5 Sekunden "my value" auszuspucken. Das oben erwähnte Python-Programm wird dies jedoch nicht tun.
Gibt es eine Möglichkeit, das Python-Programm in diesem Fall wie das C-Programm zu funktionieren?
(Ja, ich weiß, das ist eine sehr dunkel ist und potentiell schädigende Wirkung auf einem laufenden Prozess auszuführen)
Auch bin ich zur Zeit mit Python 2.4, dies in einer späteren Version von Python festgelegt worden sein .
Für was es wert ist, ist dies nicht unerwartet: die Bibliothek Referenz für das os-Modul unterstreicht das Problem. – bobince