Antworten:
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 gesamte subprocess
Modul zu verwenden, aber diesen Ansatz
import os
os.system(command)
ist einer der einfachsten.
subprocess
Sie Eingabe- / Ausgabe- / Fehlerleitungen verwalten. Es ist auch besser, wenn Sie viele Argumente haben - mit müssen os.command()
Sie eine ganze Befehlszeile mit Escapezeichen für Sonderzeichen erstellen, mit einer subprocess
einfachen Liste von Argumenten. Aber für einfache Aufgaben os.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 :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
mit test.sh
im selben Ordner:
#!/bin/sh
echo $1
echo $2
exit 0
Ausgänge:
$ python test.py
param1
param2
import os
import sys
Angenommen, test.sh ist das Shell-Skript, das Sie ausführen möchten
os.system("sh test.sh")
Verwenden Sie das Unterprozessmodul wie oben erwähnt.
Ich benutze es so:
subprocess.call(["notepad"])
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.
import subprocess
output = subprocess.call(['test.sh'])
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.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - Rufen Sie das Skript auf und sichern Sie die Echo-Befehle von temp.txt in temp_file
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Vergessen Sie nicht, sich den doc-Unterprozess anzusehen
Das Unterprozessmodul ist ein gutes Modul zum Starten von Unterprozessen. Sie können es verwenden, um Shell-Befehle wie folgt aufzurufen:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
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:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Dieser Befehl führt das Skript einmal vollständig aus und blockiert es, bis es beendet wird.
Falls das Skript mehrere Argumente hat
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Die Ausgabe gibt den Statuscode aus. Wenn das Skript erfolgreich ausgeführt wird, gibt es 0, andernfalls eine Ganzzahl ungleich Null.
podname=xyz serial=1234
0
Unten finden Sie das Shell-Skript test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
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:
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.
import subprocess
subprocess.run(['./test.sh'])