2015-06-29 10 views
6

ich eine Datei mit einigen Umgebungsvariablen, die ich in einem Python-Skript verwenden möchtenladen Umgebungsvariablen aus einem Shell-Skript

Die folgenden Arbeiten in der Befehlszeile bilden

$ source myFile.sh 
$ python ./myScript.py 

und aus dem Inneren des Python Skript kann ich die Variablen zugreifen wie

import os 
os.getenv('myvariable') 

Wie kann ich das Shell-Script beziehen, dann die Variablen zugreifen, von dem python-Skript?

+0

Was meinst du? Meinst du, wie * setzen * Umgebungsvariablen? – jonrsharpe

+0

Ich möchte 'Quelle myFile.sh' aus dem Python-Skript aufrufen und dann auf die Variablen zugreifen – lafferc

+0

Sie möchten nur wissen, wie Sie einen Befehl von Python ausführen? Hast du versucht nach * dem * zu suchen? * "Umgebungsvariablen laden" * scheint ** völlig nebensächlich ** zu dem, was Sie erreichen wollen. – jonrsharpe

Antwort

9

Wenn Sie rückwärts Ausbreitung der Umwelt sagen, tut mir leid, können Sie nicht. Es ist ein Sicherheitsproblem. Die direkte Quellenumgebung von Python ist jedoch definitiv gültig. Aber es ist mehr oder weniger ein manueller Prozess.

import subprocess as sp 

SOURCE = 'your_file_path' 
proc = sp.Popen(['bash', '-c', 'source {} && env'.format(SOURCE)], stdout=sp.PIPE) 

source_env = {tup[0].strip(): tup[1].strip() for tup in map(lambda s: s.strip().split('=', 1), proc.stdout)} 

Dann haben Sie alles, was Sie brauchen in source_env.

Wenn Sie es zurück zu Ihrer lokalen Umgebung schreiben müssen (was nicht zu empfehlen ist, da source_env Sie sauber hält):

import os 

for k, v in source_env.items(): 
    os.environ[k] = v 

Eine weitere kleine Aufmerksamkeit hier bezahlt werden muss, da ich ist genannt bash Hier sollten Sie erwarten, dass die Regeln auch hier angewendet werden. Wenn Sie also Ihre Variable sehen wollen, müssen Sie sie exportieren.

export VAR1='see me' 
VAR2='but not me' 
+1

Das wird nicht richtig funktionieren für alle möglichen Umgebungsvariablen Werte - die Ausgabe von 'env' soll nicht eindeutig geparst werden. –

+1

@CharlesDuffy wahr. Es gibt Eckfälle. Ein möglicher Weg, um damit umzugehen, wird ein anderes Skript benötigen, das 'k = v', abgegrenzt durch '\ 0', druckt. – HuStmpHrrr

+0

In der Tat. Man könnte sogar "cat/proc/self/environ", das genau dieses Format ausgibt, wenn das einzige Betriebssystem, das unterstützt werden muss, Linux ist. :) –

Verwandte Themen