Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in das Unterprozesspaket der Python-Standardbibliothek
Der Inhalt hier basiert auf Linux-Prozessgrundlagen und Linux-Textstreams. Die Hauptfunktion des Unterprozesspakets besteht darin, externe Befehle und Programme auszuführen. Zum Beispiel muss ich wget verwenden, um eine Datei herunterzuladen. Ich rufe das Programm wget in Python auf. In diesem Sinne funktionieren Unterprozesse ähnlich wie die Shell.
Unterprozess und häufig verwendete Kapselungsfunktionen
Wenn wir Python ausführen, erstellen wir einen Prozess und führen ihn aus. Wie wir in Linux Process Basics vorgestellt haben, kann ein Prozess einen untergeordneten Prozess verzweigen und den untergeordneten Prozess ein anderes Programm ausführen lassen. In Python verwenden wir das Unterprozesspaket in der Standardbibliothek, um einen Unterprozess zu forken und ein externes Programm auszuführen (Fork, Exec, siehe Linux-Prozessgrundlagen).
Das Unterprozesspaket definiert mehrere Funktionen zum Erstellen von Unterprozessen. Diese Funktionen erstellen Unterprozesse auf unterschiedliche Weise, sodass wir je nach Bedarf einen davon auswählen können. Darüber hinaus bietet Subprocess auch einige Tools zum Verwalten von Standard-Streams und -Pipes, um die Textkommunikation zwischen Prozessen zu nutzen.
Wenn Sie die Funktionen im Unterprozesspaket zum Erstellen eines untergeordneten Prozesses verwenden, beachten Sie bitte Folgendes:
1) Nach dem Erstellen des untergeordneten Prozesses, ob der übergeordnete Prozess angehalten ist und auf den untergeordneten Prozess wartet laufen.
2) Was gibt die Funktion zurück?
3) Wie geht der übergeordnete Prozess damit um, wenn der Rückgabecode nicht 0 ist?
subprocess.call()
Der übergeordnete Prozess wartet auf den Abschluss des untergeordneten Prozesses
Exit-Informationen zurückgeben (Returncode, entspricht dem Exit-Code, siehe Linux-Prozessgrundlagen)
subprocess.check_call()
Der übergeordnete Prozess wartet auf den Abschluss des untergeordneten Prozesses
Rückgabe 0
Überprüfen Sie die Exit-Informationen, wenn der Rückgabecode nicht 0 ist , lösen Sie den Fehler subprocess.CalledProcessError aus, der Das Objekt enthält ein Returncode-Attribut, das mit try...exclus... überprüft werden kann (siehe Python-Fehlerbehandlung).
subprocess.check_output()
Der übergeordnete Prozess wartet auf den Abschluss des untergeordneten Prozesses
Gibt das Ausgabeergebnis des untergeordneten Prozesses an die Standardausgabe zurück
Überprüfen Sie die Exit-Informationen, wenn der Returncode nicht 0 ist, wird der Fehler subprocess.CalledProcessError ausgelöst. Das Objekt enthält das Returncode-Attribut und das Ausgabeattribut. Das Ausgabeattribut ist das Ausgabeergebnis der Standardausgabe und kann mit try überprüft werden ...außer....
Die Verwendung dieser drei Funktionen ist ähnlich:
import subprocess rc = subprocess.call(["ls","-l"])
Wir ändern den Programmnamen (ls ) und die Parameter (-l) werden in einer Tabelle abgelegt und an subprocess.call() übergeben
Ein ganzer String kann durch eine Shell interpretiert werden:
import subprocess out = subprocess.call("ls -l", shell=True) out = subprocess.call("cd ..", shell=True)
Wir haben den Parameter „shell=True“ verwendet. Dieses Mal verwenden wir eine ganze Zeichenfolge anstelle einer Tabelle, um den untergeordneten Prozess auszuführen. Python führt zunächst eine Shell aus und verwendet diese Shell dann, um die gesamte Zeichenfolge zu interpretieren.
Einige der Shell-Befehle sind integrierte Befehle der Shell. Diese Befehle müssen über die Shell ausgeführt werden, $cd. Mit „shell=True“ können wir solche Befehle ausführen.
Popen()
Eigentlich sind unsere drei oben genannten Funktionen alle Wrapper, die auf Popen() basieren. Der Zweck dieser Kapselung besteht darin, uns die Verwendung von Unterprozessen zu erleichtern. Wenn wir unsere Anforderungen stärker anpassen möchten, greifen wir auf die Popen-Klasse zurück, die Objekte generiert, die untergeordnete Prozesse darstellen.
Anders als bei der obigen Kapselung wartet das Hauptprogramm nach der Erstellung des Popen-Objekts nicht automatisch auf den Abschluss des Unterprozesses. Wir müssen die wait()-Methode des Objekts aufrufen, damit der übergeordnete Prozess wartet (dh den Block blockiert):
import subprocess child = subprocess.Popen(["ping","-c","5","www.google.com"]) print("parent process")
Wie aus ersichtlich ist Die laufenden Ergebnisse zeigen, dass der übergeordnete Prozess nach dem Start des untergeordneten Prozesses nicht auf den Abschluss des untergeordneten Prozesses wartet, sondern direkt den Druck ausführt.
Vergleichen Sie die Wartesituation:
import subprocess child = subprocess.Popen(["ping","-c","5","www.google.com"]) child.wait() print("parent process")
Darüber hinaus können Sie im übergeordneten Prozess auch andere Operationen am untergeordneten Prozess ausführen, z unser Beispiel oben Das untergeordnete Objekt:
child.poll() # 检查子进程状态 child.kill() # 终止子进程 child.send_signal() # 向子进程发送信号 child.terminate() # 终止子进程
Die PID des untergeordneten Prozesses wird in child.pid gespeichert.
Die Textflusssteuerung des untergeordneten Prozesses Prozess
(Nach dem untergeordneten Unterprozess) Die Standardeingabe, die Standardausgabe und der Standardfehler des untergeordneten Prozesses können auch durch die folgenden Attribute dargestellt werden:
child.stdin
child.stdout
child.stderr
Wir können die Standardeingabe, die Standardausgabe und den Standardfehler ändern, wenn Popen() einen untergeordneten Prozess erstellt, und können subprocess.PIPE zum Herstellen einer Verbindung verwenden die Eingabe und Ausgabe mehrerer untergeordneter Prozesse zusammen, um eine Pipeline (Pipe) zu bilden:
import subprocess child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE) child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE) out = child2.communicate() print(out)
subprocess.PIPE stellt tatsächlich einen Pufferbereich für den Textstrom bereit. Der stdout von Child1 gibt den Text in den Pufferbereich aus, und dann liest der stdin von child2 den Text aus der PIPE. Der Ausgabetext von child2 wird ebenfalls in PIPE gespeichert, bis die Methode communi() den Text in PIPE aus PIPE liest.
Es ist zu beachten, dass communications() eine Methode des Popen-Objekts ist, die den übergeordneten Prozess blockiert, bis der untergeordnete Prozess abgeschlossen ist.
Wir können auch die Methode communi() verwenden, um PIPE zu verwenden, um Eingaben in den untergeordneten Prozess einzugeben:
import subprocess child = subprocess.Popen(["cat"], stdin=subprocess.PIPE) child.communicate("vamei")
我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。
通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),并将应用的结果输出给Python,并让Python继续处理。shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。
总结
subprocess.call, subprocess.check_call(), subprocess.check_output()
subprocess.Popen(), subprocess.PIPE
Popen.wait(), Popen.communicate()
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in das Unterprozesspaket der Python-Standardbibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!