2012-09-11 34 views
7

Ich habe eine komplexe Software, die ich nicht posten kann, noch habe ich ein konkretes Arbeitsbeispiel. Ich werde versuchen, das Problem zu erklären, vielleicht ist mir jemand schon einmal begegnet.os.getenv gibt keine zurück, stattdessen korrekter Wert

Auf der Linux-Shell ich eine Umgebungsvariable definiert haben:

> export MY_TEST_ENV=4711 
> echo $MY_TEST_ENV 
> 4711 

Innerhalb des Komplexes Code, den ich mit dieser Variablen erhalten, wollen

print os.getenv('MY_TEST_ENV') 

die immer None zurückgibt. Wenn ich ein Testskript zum Testen dieses Verhaltens selbst mit Klassen in verschiedenen Dateien erzeuge, bekomme ich immer das gewünschte Verhalten (d. H. os.getenv('MY_TEST_ENV') gibt den korrekten Wert 4711 zurück).

Der Code wird als 'sudo' gestartet.

Irgendwelche Ideen, was könnte der Grund sein?

+1

Wie läuft dieser "komplexe Code"? – geoffspear

+4

Sind die restlichen Umgebungsvariablen noch vorhanden? Wie wird der Python-Prozess gestartet? Wenn Sie einen Prozess mit dem Systemaufruf 'execve' starten und die Umgebungsvariable _not_ nicht ausfüllen, wird die Umgebung des untergeordneten Objekts auf Null gesetzt. – alexis

+0

Ich wusste, die Lösung für mein Problem ist trivial - weil ich den Python-Prozess als Sudo ausführen! Aber ich habe diese Lösung erst gesehen, als ich gefragt wurde, wie ich den Code ausführen soll. Ohne Sudo sehe ich die Variable (aber der Rest des Codes wird nicht funktionieren). – Alex

Antwort

4

Wahrscheinlich führt die Art, wie Sie den Python-Prozess aufrufen, dazu, dass Sie die Umgebung verlieren. Wenn Sie die Variable innerhalb einer laufenden Shell exportieren und direkt danach den betreffenden Python-Prozess in derselben Shell aufrufen, sollte diese Umgebungsvariable definitiv für diesen Python-Prozess verfügbar sein. Um Ihnen bei der Fehlersuche zu helfen: Drucken Sie statt des betreffenden Codes (print os.getenv('my...')) die gesamte Umgebung über print os.environ. Aus dem Ergebnis sollten Sie ableiten können, was mit Ihrer Umgebung passiert ist.