Manchmal ist es unvermeidlich, Shell-Befehle direkt aufzurufen, um einige relativ einfache Vorgänge abzuschließen, wie zum Beispiel das Mounten eines Dateisystems. Wie rufen wir also Linux-Shell-Befehle mit Python auf? Hier sind einige häufig verwendete Methoden:
1. Betriebssystemmodul
1.1. Exec-Methodenfamilie des Betriebssystemmoduls
Pythons Exec-Systemmethode Es ist konsistent mit dem Unix-Exec-Systemaufruf. Diese Methoden eignen sich zum Aufruf externer Programme im untergeordneten Prozess, da das externe Programm den Code des aktuellen Prozesses ersetzt und nicht zurückkehrt. (Ich habe help(os) gelesen --> suche nach „exec“, verstehe aber nicht ganz, wie man es verwendet)
Systemmethode des Betriebssystemmoduls
Die Systemmethode erstellt einen untergeordneten Prozess zum Ausführen des externen Programms und die Methode gibt nur das Ausführungsergebnis des externen Programms zurück. Diese Methode eignet sich besser für Situationen, in denen das externe Programm keine Ergebnisse ausgibt.
[python] view plaincopy
>>> import os
>>> Verwenden Sie os.system direkt, um einen Echo-Befehl aufzurufen.
Hello World —————> Befehlsergebnis drucken
0 —————>
>>> val = os.system("ls -al | grep "log" ") # Verwenden Sie val, um den Rückgabewert
-rw-r--r zu erhalten -- 1 root 6030829 31. Dezember 15:14 log —————> Zu diesem Zeitpunkt werden nur die Befehlsergebnisse gedruckt
>>> ——> Beachten Sie, dass bei normaler Ausführung des Befehls zu diesem Zeitpunkt der Rückgabewert 0 ist
>>>
>>> print val
256 ——————> Verwenden Sie os.system, um einen Befehl aufzurufen, der kein Ergebnis zurückgibt, und der Rückgabewert ist 256 ~
> >>
Hinweis: Wie oben erwähnt, speichert diese Methode das Ergebnis des externen Programms, also wenn Sie möchten den Rückgabewert des Befehls erhalten, dann schauen Sie nach unten ~
1.3 Die Popen-Methode des OS-Moduls
Diese Methode ist sehr nützlich, wenn Sie sie benötigen um die Ausgabeergebnisse eines externen Programms abzurufen. Es gibt ein dateiähnliches Objekt zurück und ruft das Objekt auf. Die Methode read() oder readlines() kann den Ausgabeinhalt lesen. Wenn Sie beispielsweise urllib zum Aufrufen der Web-API verwenden, müssen die erhaltenen Daten verarbeitet werden. os.popen(cmd) Um die Ausgabe des Befehls zu erhalten, rufen Sie einfach read() oder readlines() auf, z. B. a=os.popen(cmd).read()
[python] Klartext anzeigen
>>> os.popen('ls -lt')
insgesamt 6064
erhalten -rwxr-xr-x 1 long long 23. Jan. 21:00 hello.sh
-rw-r--r -- 1 long long 147 5. Jan. 20:26 Makefile
drwxr-xr-x 3 long long 4096 2. Jan. 19:37 test
-rw-r--r-- 1 root root 6030829 31. Dez. 15:14 log
drwxr -xr-x 2 long 4096 28. Dezember 09:36 pip_build_long
drwx------ 2 Debian-gdm Debian-gdm 4096 23. Dezember 19:08 puls-gylJ5EL24GU9
drwx - ----- 2 long long 4096 1. Jan. 1970 orbit-long
>>> val = os.popen('ls -lt').read() # Variablen zum Empfangen von Befehlen verwenden Return Wert
>>> if "log" in val: Da ist das Protokoll“
... sonst:
... print „Nein, nicht glücklich"
...
Haha, da ist das Protokoll
2. Das Befehlsmodul
verwendet die getoutput-Methode des Befehlsmoduls. Diese Methode Der Unterschied zu popend besteht darin, dass popen ein dateiähnliches Objekt zurückgibt, während diese Methode die Ausgabe des externen Programms als Zeichenfolge zurückgibt. was in vielen Fällen bequemer zu verwenden ist.
* commands.getstatusoutput(cmd) Rückgabe (Status, Ausgabe)
* commands.getstatus(file) Rückgabe: Die Ausführungsergebniszeichenfolge von ls -ld file ruft getoutput auf. Diese Methode wird nicht empfohlen 🎜>
Python 2.7.3 (Standard, 2. Januar 2013, 16:53:07)
[GCC 4.7.2] unter Linux2
Geben Sie „help“, „copyright“ ein. , „Credits“ oder „Lizenz“ für weitere Informationen
>>> Importbefehle
>>> commands.getstatusoutput('ls -lt') # Return (Status, Ausgabe)
(0, 'total 5900n-rwxr-xr-x 1 long long 23. Jan. 5 21:34 hello.shn-rw-r--r-- 1 long long 147 Jan. 5 21:34 Makefilen-rw-r--r-- 1 long long 6030829 5. Jan. 21:34 log')
>>> commands.getoutput('ls -lt') # Rückgabebefehl Das Ausgabeergebnis (es scheint sich vom Ausgabeformat des Shell-Befehls~ zu unterscheiden)
'total 5900n-rwxr-xr-x 1 long long 23 Jan 5 21:34 hello.shn-rw-r --r- - 1 long long 147 5. Jan. 21:34 Makefilen-rw-r--r-- 1 long long 6030829 5. Jan. 21:34 log'
>>> ('log' ) # Rufen Sie den Befehl in commands.getoutput auf, um denselben Vorgang für die 'log'-Datei auszuführen
'-rw-r--r-- 1 long long 6030829 5. Januar 21:34 log '
>>>
3. Laut der offiziellen Python-Dokumentation Das Unterprozessmodul wird verwendet, um die oben genannten Module zu ersetzen. Es gibt ein paralleles SSH-Tool in Python – mssh. Der Code ist sehr kurz, aber sehr interessant. Er ruft den Unterprozess im Thread auf, um die Arbeit zu erledigen.
[Python] Klarkopie anzeigen
>>> aus Unterprozess-Importaufruf
>>> call(["ls", "-l"])
Der Vorteil des Unterprozesses im Vergleich zum System besteht darin, dass er flexibler ist (Sie können eine Standardausgabe erhalten). , Standardfehler, „echte“ Statuscodes, bessere Fehlerbehandlung usw.). Ich denke, die Verwendung von os.system ist veraltet oder wird es bald sein.
4. Vergleich und Zusammenfassung verschiedener Methoden
4.1 Über os.system
os.system("some_command with args") wird befehlen Neben der Übergabe von Argumenten an Ihre System-Shell ist dies auch großartig, da Sie auf diese Weise mehrere Befehle gleichzeitig ausführen und Pipes sowie Eingabe- und Ausgabeumleitungen einrichten können. Zum Beispiel:
os.system("some_command < input_file | another_command > output_file")
Obwohl dies praktisch ist, müssen Sie das Escapezeichen von Shell-Zeichen wie Leerzeichen usw. manuell handhaben. Darüber hinaus können Sie damit nur einfache Shell-Befehle und keine externen Programme ausführen.
4.2. Über os.popen
Die Verwendung von stream = os.popen("some_command with args") kann auch das Gleiche bewirken wie os.system und os Der Unterschied zu .system besteht darin, dass os.popen ein dateiähnliches Objekt zurückgibt, das für den Zugriff auf die Standardeingabe und -ausgabe verwendet werden kann.
4.3. Über subprocess.popen
Die Popen-Klasse des Subprocess-Moduls soll ein Ersatz für os.popen sein, ist aber etwas umfangreicher komplizierter als os.popen.
Zum Beispiel können Sie print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read() anstelle von print os.popen("echo Hello World").read() verwenden. Aber im Vergleich dazu ist es gut, eine einheitliche Klasse mit vier verschiedenen Popen-Funktionen zu verwenden.
4.4. Über subprocess.call
Die Aufruffunktion des Subprozessmoduls. Sie ähnelt im Grunde der Popen-Klasse und verwendet dieselben Parameter, wartet jedoch einfach auf den Abschluss des Befehls und gibt Ihnen einen Rückkehrcode. Zum Beispiel:
return_code = subprocess.call("echo Hello World", shell=True)
Das Betriebssystemmodul verfügt auch über fork/exec/spawn-Funktionen wie in C, aber ich nicht Ich kann es nicht empfehlen. Möglicherweise ist dieser Unterprozess für Sie besser geeignet.
======================================== ===== ==
[1] http://demi-panda.com/2013/01/25/python-shell-command/index.html
[2] http://m. blog.csdn.net /blog/overstack/9295995
[3] http://blog.csdn.net/swiftshow/article/details/7755543
Das Folgende ist die offizielle Python-Dokumentation für den Inhalt Beteiligt am Artikel:
[4] http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module – Informationen zur Verwendung von Subprozessen zum Ersetzen von alte Methode
[5] http://docs.python.org/lib/os-process.html – Familie und Systemmethode der Exec-Methode des Betriebssystems
[6] http:// docs.python.org/ lib/os-newstreams.html – Betriebssystem-Popen-Methode
[7] http://docs.python.org/lib/node528.html – Einführung in den Betriebssystem-Unterprozess