2013-10-11 6 views
12

ich einen Shell-Skript auszuführen versuchen (nicht-Befehl) aus Python:Python: mit Argumenten Shell-Skript ausgeführt wird (variabel), aber Argument ist nicht in Shell-Skript liest

main.py 
------- 
from subprocess import Popen 

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True) 

execute.sh 
---------- 

echo $1 //does not print anything 
echo $2 //does not print anything 

var1 und var2 sind einige Zeichenfolge das verwende ich als Eingabe für Shell-Skript. Fehle ich etwas oder gibt es einen anderen Weg, es zu tun?

Geworben: How to use subprocess popen Python

Antwort

12

Das Problem ist mit shell=True. Entweder entfernen Sie dieses Argument, oder alle Argumente als String übergeben, wie folgt:

Process=Popen('./childdir/execute.sh %s %s' % (str(var1),str(var2),), shell=True) 

Die Schale wird nur die Argumente übergeben Sie im ersten Argument liefern von Popen dem Verfahren, wie es die Interpretation der Argumente tut sich . Eine ähnliche Frage beantwortet here. Was tatsächlich passiert, ist, dass Ihr Shell-Skript keine Argumente bekommt, also sind $ 1 und $ 2 leer.

Popen wird stdout und stderr aus dem Python-Skript erben, so in der Regel gibt es keine Notwendigkeit, die stdin= und stderr= Argumente Popen zu liefern (sofern Sie das Skript mit Ausgabeumleitung, wie > laufen). Sie sollten dies nur tun, wenn Sie die Ausgabe im Python-Skript lesen und irgendwie manipulieren müssen.

Wenn alles, was Sie brauchen, um die Ausgabe zu bekommen ist (und nicht dagegen synchron ausgeführt wird), würde ich empfehlen check_output versuchen, da es einfacher ist, ausgegeben zu bekommen, als Popen:

output = subprocess.check_output(['./childdir/execute.sh',str(var1),str(var2)]) 
print(output) 

Beachten Sie, dass check_output und check_call haben die gleichen Regeln für das shell= Argument wie Popen.

+0

Ja ... das war nützlich es gelöst mein Problem. – creativeDrive

+0

@ user2837135 Wenn es Ihr Problem gelöst hat, sollten Sie es akzeptieren (klicken Sie auf das Häkchen) und vielleicht auch Upvoting in Betracht ziehen. – SethMMorton

+0

'shell = True' sollte * nicht * in diesem Fall verwendet werden, aber wenn Sie es verwenden, sollten Sie' var1', 'var2' mit [' shlex.quote() '] (http: //docs.python. org/3/library/shlex.html # shlex.quote): 'output = check_output (" ./ childdir/execute.sh "+" ".join (pipes.quote (str (v)) für v in [var1, var2]), shell = True) ' – jfs

3

Sie die Argumente tatsächlich senden ... wenn Ihr Shell-Skript Sie es sehen würde eine Datei statt Druck geschrieben. Sie müssen kommunizieren gedruckten Ausgabe des Skripts zu sehen ...

from subprocess import Popen,PIPE 

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True,stdin=PIPE,stderr=PIPE) 
print Process.communicate() #now you should see your output 
+1

Sie könnten auch 'subprocess.call (['./Childdir/execute.sh', str (var1), str (var2)], shell = True)' wenn sie nur die Ausgabe sehen wollen . – SethMMorton

+0

@Joran: Ich konnte die Ausgabe des Shell-Skripts mit shell = True sehen, ich kann $ 0 ('./ childdir/execute.sh') sehen, dh das Skript, das ausgeführt wird, aber nicht die Argumente var1, var2. – creativeDrive

+0

vielleicht fügen Sie einen Shebang an den Anfang des Shell-Skripts ... es läuft möglicherweise nicht in bash, aber ich garantiere, dass Sie die Argumente senden (vielleicht sind die Argumente nicht das, was Sie denken, sie sind) –

Verwandte Themen