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
.
Ja ... das war nützlich es gelöst mein Problem. – creativeDrive
@ 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
'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