2016-05-27 23 views
2

SzenarioWie eine vorhandene Umgebungsvariable in subprocess.Popen() verwenden

In meinem Python-Skript, ich brauche eine ausführbare Datei als Unterprozess mit x Anzahl der Befehlszeilenparameter ausführen, die die ausführbaren Datei erwartet.

Beispiel:

  • EG 1: myexec.sh param1 param2
  • EG 2: myexec.sh param1 $ MYPARAMVAL

die ausführbare Datei und Parameter werden nicht, da diese bekannt sind konfiguriert und zur Laufzeit aus einer externen Quelle (xml config) abgerufen.

Mein Code funktioniert, wenn der Parameter ein bekannter Wert (EG 1) und konfiguriert ist, jedoch erwartet man, dass ein Parameter eine Umgebungsvariable sein kann und als solche konfiguriert werden kann, die zur Laufzeit interpretiert werden sollte)

Im folgenden Beispiel verwende ich Echo als Ersatz für myexec.sh, um das Szenario zu demonstrieren. Dies wird vereinfacht, um das Problem zu demonstrieren. 'cmdlst' wird aus einer Konfigurationsdatei erstellt, bei der es sich um ein beliebiges Skript mit einer beliebigen Anzahl von Parametern und Werten handeln kann, das eine Wert- oder Umgebungsvariable sein kann.

test1.py

import subprocess 
import os 

cmdlst = ['echo','param1','param2'] 

try: 
    proc = subprocess.Popen(cmdlst,stdout=subprocess.PIPE) 
    jobpid = proc.pid 
    stdout_value, stderr_value = proc.communicate() 
except (OSError, subprocess.CalledProcessError) as err: 
    raise 

print stdout_value 

ERGEBNIS TEST 1

Python test1.py

-> param1 param2

test2.py

import subprocess 
import os 

cmdlst = ['echo','param1','$PARAM'] 

try: 
    proc = subprocess.Popen(cmdlst,stdout=subprocess.PIPE) 
    jobpid = proc.pid 
    stdout_value, stderr_value = proc.communicate() 
except (OSError, subprocess.CalledProcessError) as err: 
    raise 

print stdout_value 

ERGEBNIS TEST 2

Export PARAM = param2 echo $ PARAM

-> param2 Python test2.py

- > param1 $ PARAM

Ich benötige Test 2, um das gleiche Ergebnis wie Test 1 zu erzielen, wenn man bedenkt, dass $ PARAM nur zur Laufzeit bekannt ist und aus der aktuellen Umgebung abgerufen werden muss.

Ich begrüße Ihren Rat.

+0

tut 'param2 = os.environ [„PARAM“]' tun, was Sie wollen, oder nicht ganz? Ich erinnere mich nie, welche Argumente an "Popen" übergeben werden müssen, um das Zitat korrekt zu machen - das Problem ist, dass es Ihre Argumente so zitiert, dass sie sich nicht erweitern. – dwanderson

Antwort

1

Sie könnten tun:

cmdlist = ['echo','param',os.environ["PARAM"] 

Oder: Sie os.environ[..] stattdessen verwenden würde

cmdlist = ['echo','param1','$PARAM'] 
proc = subprocess.Popen(cmdlist,stdout=subprocess.PIPE, env={'PARAM':os.environ['PARAM']) 
+0

Was ist, wenn der Name der Umgebungsvariable 'PARAM' in einer str-Variablen ist? Also muss bewertet werden. – user3927078

+0

@ user3927078 Sie können 'env = {'PARAM': 'String'}' auch geben – noteness

0

Sie können nicht auf die Umgebungsvariable zugreifen, indem Sie $VAR verwenden.

cmdlst = ['echo','param1',os.environ['PARAM']] 
2

Wenn Sie die Shell erweitern Umgebungsvariablen haben wollen, müssen Sie shell=True einstellen

subprocess.Popen('echo param1 $PARAM', shell=True, stdout=subprocess.PIPE) 

Alternativ können Sie die Umgebungsvariable abfragen nur sich selbst, wenn Sie den Befehl konstruieren, und dann gibt es keine Notwendigkeit für Shell Expansion

subprocess.Popen(['echo', 'param1', os.environ['PARAM']], stdout=subprocess.PIPE) 
Verwandte Themen