2017-03-24 2 views
1

Was ich versuche zu erreichen ist - die Ausgabe einiger Automatisierungsskripte auszuführen und zurückzugeben, aber ich verstehe nicht, warum ich ENV vars nicht in meinen Skripten verwenden kann?Verwendung von ENV VARS während der Ausführung von Befehl mit Subprozess in Python 3?

Ein einfaches Beispiel I

import os 
import subprocess as sp 

cmd = [ 'echo', '$_TEST' ] 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate()) 

Was ich tue, falsch zu implementieren bin zu kämpfen?

Update: nach der richtigen Antwort erhalten.

import os 
import subprocess as sp 

cmd = [ '/bin/echo', '$_TEST' ] 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(" ".join(cmd), stdout=sp.PIPE, shell=True, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate() ) 
  1. Need shell=True ein Shell-Argument, um (oder einen Pfad zu anderen Shell zur Verfügung stellen), Shell müssen wir unsere Variablen bewerten.

  2. list von Befehlen sollte durch string (z '/ bin/echo $ _test')

Antwort

0

Die Substitution von Umgebungsvariablen durchgeführt, durch Shell ersetzt werden, so dass Ihre Lösung druckt nur Originaltextes. Der richtige Weg, um diese Aufgabe zu lösen:

import os 
import subprocess as sp 

cmd = 'echo $_TEST' 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(cmd, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate()) 
+0

Oh! Vielen Dank! Ich war ein bisschen verwirrt, als ich 'shell = True' gesetzt habe, es gab überhaupt keine Ausgabe, aber als ich' list' in 'string' als erstes Argument änderte, begann es sofort zu arbeiten. Ich denke, ich muss mehr über Subprozess Interna und wie es funktioniert lesen. – Butuzov

+0

@OlegButuzov Ja, es ist ein wenig verwirrend, dass Sie den Cmd-Typ ändern müssen. – CaptainTrunky

Verwandte Themen