Python: Ausführung von shell-Skript mit Argumenten(Variablen), aber das argument ist nicht zu Lesen, im shell-Skript
Ich versuche das ausführen einer shell-Skript(nicht-Befehl) von python:
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 Strings, die ich verwende als input für die shell-Skript. Übersehe ich etwas oder gibt es einen anderen Weg, es zu tun?
Bezeichnet: Wie zu verwenden subprocess popen Python
InformationsquelleAutor creativeDrive | 2013-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem mit
shell=True
. Entfernen Sie entweder das argument oder pass alle Argumente als string, wie folgt:Die shell übergibt nur die Argumente, die Sie in der 1. argument von
Popen
um den Prozess, wie es die interpretation der Argumente selbst.Siehe eine ähnliche Frage beantwortet hier., Was tatsächlich passiert, ist Ihre shell-Skript bekommt keine Argumente, also $1 und $2 leer sind.
Popen Erben stdout und stderr aus dem python-Skript, also in der Regel gibt es keine Notwendigkeit, um die
stdin=
undstderr=
Argumente zu Popen (es sei denn, Sie führen Sie das Skript mit der Ausgabe-Umleitung, wie>
). Dies sollten Sie nur tun, wenn Sie benötigen zum Lesen der Ausgabe im python-Skript, und manipulieren Sie irgendwie.Wenn alles, was Sie brauchen, ist die Ausgabe (und nicht dagegen synchron laufen), würde ich empfehlen, versuchen
check_output
, da es einfacher ist, bekommen die Ausgabe alsPopen
:Beachten Sie, dass
check_output
undcheck_call
haben die gleichen Regeln für dieshell=
argument alsPopen
.Wenn es dein problem gelöst hat, sollten Sie es akzeptieren (klicken Sie auf das Häkchen), und vielleicht überlegen upvoting als gut.
shell=True
sollte nicht verwendet werden, in diesem Fall, aber wenn Sie es verwenden, dann sollten Sie entkommenvar1
,var2
mitshlex.quote()
:output = check_output("./childdir/execute.sh " + " ".join(pipes.quote(str(v)) for v in [var1, var2]), shell=True)
Beachten Sie, dass die Art der Ausgabe ist
bytes
und vielleicht müssen umgewandelt werden in einstr
bevor Sie es verwenden, wie zum Beispiel so:output.decode("utf-8")
InformationsquelleAutor micromoses
Sie eigentlich senden die Argumente ... wenn Sie Ihre shell-Skript geschrieben eine Datei, anstatt drucken Sie ihn sehen würde. Sie kommunizieren müssen, um zu sehen, die gedruckte Ausgabe von dem script ...
subprocess.call(['./childdir/execute.sh',str(var1),str(var2)],shell=True)
wenn alles, was Sie tun möchten ist, finden Sie in der Ausgabe.Ich war in der Lage, um zu sehen, die shell-Skript-Ausgabe mit shell=True, ich bin in der Lage, um zu sehen, $0('./childdir/execute.sh') D. H. das Skript, das ausgeführt wird, aber nicht die Argumente var1, var2..
vielleicht fügen Sie eine shebang an die Spitze des shell-script ... könnte es nicht sein, läuft in der bash, aber ich garantiere, die Sie senden die Argumente (vielleicht die Argumente nicht, was Sie denken, Sie sind)
Ich habe sowohl die option und ich bin immer der Fehler (./execute.sh: premission denied). Obwohl ich gegeben habe, ausführen prev.(chmod +x execute.sh)
Ich habe versucht, mit shebang zu...zu Debuggen, habe ich 2 kleine Skripte, um dies zu überprüfen, aber wenn ich drucken Prozess.kommunizieren() druckt (Keine.[])
InformationsquelleAutor Joran Beasley