Set Umwelt-Variablen in Python mit Popen
Will ich setzen einer Umgebungsvariablen in linux-terminal durch ein python-Skript. Ich scheine in der Lage sein, Umwelt-Variablen bei der Verwendung von os.environ['BLASTDB'] = '/path/to/directory'
.
Allerdings war ich zunächst versuchen, diese variable mit subprocess.Popen
ohne Erfolg.
import subprocess
import shlex
cmd1 = 'export BLASTDB=/path/to/directory'
args = shlex.split(cmd1)
p = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
Warum subprocess.Popen
fehlschlagen, setzen Sie die Umgebungsvariable BLASTDB zu '/Pfad/zu/Verzeichnis'?
HINWEIS:
Auch dies nicht zum Erfolg, wenn Sie verwenden:
import os
os.system('export BLASTDB=/path/to/directory')
- Hinweis:
Popen
nicht eine shell ausführen.export
ist ein shell-built-in, so dass Sie bekommen würde, eine "Datei nicht gefunden "- Fehler" wenn Sie versuchen zum ausführen dieses Befehls. Verwendenshell=True
zum ausführen von shell-Kommandos (und sich bewusst sein, die security-Risiken!!!) - Von meinen Tests scheint es, dass auch beim hinzufügen
shell=True
dem Befehl es nicht wirklich ändern Sie die Umgebungsvariable aus, die mein python-Skript ausgeführt wurde, noch ändert es die Umgebungsvariablen für python subshell erstellt wurde, bei der Ausführung. Dies kann nur die Umgebung ändern, für diesen einen bestimmten Teilprozess, die (ohne dieenv
hinaus) wird mir nicht erlauben, einen Befehl ausführen, um das terminal mit einer modifizierten Umgebung für diesen Teilprozess. - Ich habe nie angegeben, dass
shell=True
lösen würde Ihr problem (sonst würde ich ja gepostet, dass da eine Antwort). Mitshell=True
wäre eine Voraussetzung, um der Lage sein, shell-Befehle ausführen. Ohne es werden Sie Fehler erhalten, weilPopen
ist nicht in der Lage, finden Sie die ausführbare Datei. - Vereinbart, ich war versuchen zu klären, für zukünftige Besucher in Bezug auf mein Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die
env
parameter zum festlegen von Umgebungsvariablen, die für einen Teilprozess:Pro die docs:
os.environ
kann verwendet für Zugriff auf aktuellen Umgebungsvariablen des python-Prozess. Wenn Ihr system unterstützt auch putenv, dannos.environ
können auch verwendet werden, für Einstellung environment-Variablen (und somit verwendet werden könnte, statt des Popen istenv
parameter siehe oben). Jedoch, für einige Betriebssysteme wie z.B. FreeBSD und MacOS Einstellungos.environ
kann Speicherverluste verursachen, sodass die Einstellungos.environ
ist keine robuste Lösung.os.system('export BLASTDB=/path/to/directory')
läuft ein Teilprozess stellt dieBLASTDB
Umgebungsvariable nur für diesen Teilprozess. Seit dieser Teilprozess endet, hat es keine Wirkung auf die nachfolgendensubprocess.Popen
Anrufe.env
ist die Antwort.env
Super funktioniert und zeitweise setzt die UmgebungsvariableBLASTDB
für das jeweilige Teilprozess, und alles bewegt sich entlang geschmiert. Danke! Für meine Zwecke ist dies ausreichend. os.environ ist schön, weil es scheint, um die Umgebungsvariablen für die gesamte python-subshell, und die Angabeenv
in jedemsubprocess.Popen
ist nicht erforderlich.os.environ
, ist es kann verwendet werden, um die Umgebung ändern des aktuellen Prozesses (wenn die OS bietet eineputenv
syscall).Soweit ich weiß, kann man nicht wirklich ändern, die Ausführung von Prozess " Umwelt aus einem Unterprozess oder subshell, sei es Python oder bash selbst. Environment-Variablen sind spezifisch für den jeweiligen Prozess Sie sind auf (zumindest auf Unix, was Sie zu sein scheinen mit).
Jeder Kind-Prozess erzeugt wird, in der Regel Erben diese Umgebung, aber nur eine Kopie davon. Zum Beispiel, wenn Sie laufen
bash
aus in Ihrem terminal-session und exportieren Sie eine neue Umgebungsvariable, sobald Sie verlassen, dass subshell, Ihre ursprüngliche Schale wird unberührt sein. Ausführen von Python ist das nicht anders.