Dostęp Pythona do zmiennych środowiskowych nie odzwierciedla dokładnie widoku systemu operacyjnego na środowisko procesów.Zmienne środowiskowe w języku Python w systemie Linux
Os.getenv i os.environ nie działają zgodnie z oczekiwaniami w określonych przypadkach.
Czy istnieje sposób, aby prawidłowo uzyskać działające środowisko procesowe?
Aby wykazać, co mam na myśli, weź dwie w przybliżeniu równoważne programy (pierwszy w C, drugi w Pythonie):
#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)
Teraz, jeśli uruchamiamy program C i dołączamy do działającego procesu z gdb i wymuszamy zmianę środowiska pod maską, wykonując coś takiego:
(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"
następnie wspomniany program C zacznie wypluwać "moją wartość" co 5 sekund. Wspomniany wcześniej program Pythona nie będzie.
Czy istnieje sposób, aby program Pythona działał jak program C w tym przypadku?
(Tak, zdaję sobie sprawę, że jest to bardzo niejasne i potencjalnie szkodliwe działanie do wykonania na uruchomionego procesu)
Również obecnie używam Pythona 2.4, może to zostały ustalone w nowszej wersji Pythona .
Na co warto, to nie jest nieoczekiwany: punktem odniesienia dla modułu biblioteki os podkreśla problem. – bobince