Wie rufe ich ein Shell-Skript aus Python-Code auf?
210
Das Unterprozessmodul hilft Ihnen dabei.
Offensichtlich triviales Beispiel:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Wo test.sh
ist ein einfaches Shell-Skript und 0
ist sein Rückgabewert für diesen Lauf.
chmod +x script.sh
. Hinweis: script.sh ist ein Platzhalter für Ihr Skript. Ersetzen Sie ihn entsprechend.Es gibt einige Möglichkeiten,
os.popen()
(veraltet) oder das gesamtesubprocess
Modul zu verwenden, aber diesen Ansatzist einer der einfachsten.
quelle
subprocess
Sie Eingabe- / Ausgabe- / Fehlerleitungen verwalten. Es ist auch besser, wenn Sie viele Argumente haben - mit müssenos.command()
Sie eine ganze Befehlszeile mit Escapezeichen für Sonderzeichen erstellen, mit einersubprocess
einfachen Liste von Argumenten. Aber für einfache Aufgabenos.command()
kann gerade noch ausreichen.The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Wenn Sie einige Parameter an Ihr Shell-Skript übergeben möchten, können Sie die Methode shlex.split () verwenden :
mit
test.sh
im selben Ordner:Ausgänge:
quelle
Angenommen, test.sh ist das Shell-Skript, das Sie ausführen möchten
quelle
Verwenden Sie das Unterprozessmodul wie oben erwähnt.
Ich benutze es so:
quelle
Ich verwende Python 3.5 und subprocess.call (['./ test.sh']) funktioniert bei mir nicht.
Ich gebe Ihnen drei Lösungen, die davon abhängen, was Sie mit der Ausgabe machen möchten.
1 - Skript aufrufen. Sie sehen die Ausgabe in Ihrem Terminal. Ausgabe ist eine Zahl.
2 - Aufruf und Dump-Ausführung und Fehler in Zeichenfolge. Sie sehen die Ausführung in Ihrem Terminal nur, wenn Sie drucken (stdout). Shell = True, da das Argument in Popen bei mir nicht funktioniert.
3 - Rufen Sie das Skript auf und sichern Sie die Echo-Befehle von temp.txt in temp_file
Vergessen Sie nicht, sich den doc-Unterprozess anzusehen
quelle
subprocess.call
. Der untergeordnete Prozess wird blockiert, wenn er genügend Ausgabe für eine Pipe generiert, um den OS-Pipe-Puffer zu füllen, da die Pipes nicht gelesen werden.Das Unterprozessmodul ist ein gutes Modul zum Starten von Unterprozessen. Sie können es verwenden, um Shell-Befehle wie folgt aufzurufen:
Die Dokumentation finden Sie hier.
Wenn Sie Ihr Skript in eine .sh-Datei oder eine lange Zeichenfolge geschrieben haben, können Sie das Modul os.system verwenden. Es ist ziemlich einfach und leicht anzurufen:
Dieser Befehl führt das Skript einmal vollständig aus und blockiert es, bis es beendet wird.
quelle
Falls das Skript mehrere Argumente hat
Die Ausgabe gibt den Statuscode aus. Wenn das Skript erfolgreich ausgeführt wird, gibt es 0, andernfalls eine Ganzzahl ungleich Null.
Unten finden Sie das Shell-Skript test.sh.
quelle
Der Unterprozess ist gut, aber einige Leute mögen Scriptine vielleicht besser. Scriptine verfügt über mehr Methoden auf hoher Ebene wie shell.call (args) , path.rename (neuer_name) und path.move (src, dst) . Scriptine basiert auf Unterprozessen und anderen.
Zwei Nachteile von Scriptine:
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich bin kürzlich darauf gestoßen, und sie hat mich seit der Subprozess- API, die seit Python 3.5 geändert wurde , irregeführt .
Die neue Methode zum Ausführen externer Skripte ist die
run
Funktion, mit der der von args beschriebene Befehl ausgeführt wird. Wartet auf den Abschluss des Befehls und gibt dann eine CompletedProcess-Instanz zurück.quelle
Wenn Ihre Shell-Skriptdatei keine Ausführungsberechtigungen hat, gehen Sie folgendermaßen vor.
quelle
Bitte versuchen Sie die folgenden Codes:
quelle