Python Subprocess.Popen Beispiele
Das Python-Subprozess-Modul ist eines der nützlichen Module, das verwendet wird, um verschiedene Shell-Befehle, Prozesse auszuführen und ein anderes Skript oder ausführbare Dateien mithilfe des Python-Skripts auszuführen. Es kann auch verwendet werden, um Daten von einem Prozess an einen anderen Prozess umzuleiten und die Fehler zu behandeln, die von den untergeordneten Prozessen erzeugt werden. Das Subprozess-Modul hat viele Klassen, die für verschiedene Zwecke verwendet werden. Die Klasse "subprocess.Popen" ist eine der Klassen dieses Moduls, die verwendet wird, um mit externen Prozessen zu interagieren und verschiedene Arten von Aufgaben zwischen den Prozessen auszuführen. Mehrere Verwendungen der Klasse "subprocess.Popen" im Python-Skript werden in diesem Tutorial gezeigt.
Thema des Inhalts:
- Führen Sie einen einfachen Linux-Befehl aus
- Führen Sie einen Befehl mit Eingabedaten aus
- Führen Sie ein Python-Skript aus
- Behandle den Unterprozessfehler
- Geben Sie den Code von Subprocess.Popen zurück.
- Leiten Sie die Ausgabe des Unterprozesses in eine Datei um.
- Mehrprozessverarbeitung mit Subprocess.Popen
- Verwalte die Eingabe- und Ausgabeströme
- Steuere das Timeout und die Verzögerung
- Einen Streaming-Eingang lesen
Führen Sie einen einfachen Linux-Befehl aus
Der Befehl „date“ wird verwendet, um das aktuelle Systemdatum und die Uhrzeit anzuzeigen. Erstellen Sie eine Python-Datei mit dem folgenden Skript, das einen Unterprozess erstellt, der den Befehl „date“ ausführt und die Ausgabe dieses Befehls druckt:
#Import the module
import subprocess
#Define a command for the subprocess and
#open process by using Popen() function
output = subprocess.Popen(["date"], stdout=subprocess.PIPE)
#Retrieve the output and error by communicating with the process
stdout, stderr = output.communicate()
#Print the output
print(stdout.decode())Ausgabe:
Die folgende Ausgabe erscheint nach der Ausführung des vorherigen Skripts:
Gehe nach oben
Führen Sie einen Befehl mit Eingabedaten aus
Der "wc" Befehl mit der "-c" Option wird verwendet, um die Gesamtanzahl der Zeichen des String-Wertes zu zählen, der mit diesem Befehl bereitgestellt wird. Erstellen Sie eine Python-Datei mit dem folgenden Skript, das einen Unterprozess mit der Popen() Funktion erstellt, um die "wc -c" Befehle auszuführen. Der String-Wert wird nach der Ausführung des Skripts vom Terminal genommen und die Gesamtanzahl der Zeichen des Eingabestrings wird in der Ausgabe gedruckt.
#Import the module
import subprocess
#Define a command for the subprocess and
#Open process by using Popen() function
output = subprocess.Popen(["wc", "-c"], stdout=subprocess.PIPE)
#Retrieve the output and error by communicating with the process
stdout, stderr = output.communicate()
#Print the output
print(stdout.decode())Ausgabe:
Die folgende Ausgabe erscheint für den Eingabewert „Python Subprocess Beispiele“:
Gehe nach oben
Ein Python-Skript ausführen
Erstellen Sie eine Python-Datei mit dem Namen „sum.py“ mit dem folgenden Skript, das die Summe von zwei Zahlen berechnet, wobei diese Zahlen als Befehlszeilenargumente übergeben werden:
sum.py
#Import necessary module
import sys
#Count total arguments
n = len(sys.argv)
#Add the first two argument values
sum = int(sys.argv[1]) + int(sys.argv[2])
#Print the addition result
print("The sum of " + sys.argv[1] + " and " + sys.argv[2] + " is", sum)
Create a Python file with the following script that will run a Python file named sum.py with two arguments by creating a subprocess.
#Import the module
import subprocess
#Run python script in the subprocess and
#open the process by using Popen() function
output = subprocess.Popen(["python3", "sum.py", "25", "55"], stdout=subprocess.PIPE)#Retrieve the output and error by communicating with the process
stdout, stderr = output.communicate()
#Print the output
print(stdout.decode())Ausgabe:
Die folgende Ausgabe erscheint nach der Ausführung des vorherigen Skripts:
Gehe nach oben
`
Behandeln Sie den Unterprozessfehler
Erstellen Sie eine Python-Datei mit dem folgenden Skript, das die Fehler des Subprozesses mit dem "try-except"-Block behandelt. Ein Befehl wird vom Benutzer eingegeben und vom Subprozess ausgeführt. Die Fehlermeldung wird angezeigt, wenn ein ungültiger Befehl vom Benutzer eingegeben wird.
#Import the modules
import subprocess
import sys
#Take command from the user
command = input("Enter a valid command: ")
try:
#Open process by using Popen() function
output = subprocess.Popen([command], stdout=subprocess.PIPE)
#Retrieve the output and error by communicating with the process
stdout, stderr = output.communicate()
#Print the output
print (stdout.decode())
except:
print ("Error:", sys.exc_info())Ausgabe:
Die folgende Ausgabe erscheint, wenn der Befehl „pwd“ als eingabefähiger Befehl eingegeben wird:
Die folgende Ausgabe erscheint, wenn der Befehl „usr“ als eingabewert verwendet wird, der ein gültiger Befehl ist:
Gehe nach oben
Geben Sie den Code von Subprocess.Popen zurück
Erstellen Sie eine Python-Datei mit folgendem Skript, das einen "ls"-Befehl über den Subprozess ausführt, um die Liste aller Python-Dateien aus dem aktuellen Verzeichnis abzurufen. Das Skript wartet auf den Abschluss des Subprozesses und gibt den Rückgabewert aus.
#Import the modules
import subprocess
import sys
#Set the command
command = ['ls', '-l', '*.py']
try:
#Open process by using Popen() function
output = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True)
#Wait to complete the process
retCode = output.wait()
#Print the return code
print("Return Code:", retCode)
except:
#Print error message for the wrong
print ("Error:", sys.exc_info())Ausgabe:
Ein ähnliches Ergebnis erscheint nach der Ausführung des vorherigen Skripts:
Gehe nach oben
Leiten Sie die Ausgabe des Unterprozesses in eine Datei um.
Erstellen Sie eine Python-Datei mit dem folgenden Skript, das die Ausgabe des Unterprozesses in eine Textdatei schreibt. Der Befehl, der vom Unterprozess ausgeführt wird, wird vom Benutzer entnommen.
#Import module
import subprocess
#Define the filename
filename = "outfile.txt"
#Take a ping command
cmd = input("Enter a ping command: ")
#Split the taken input based on the space
args = cmd.split()
#Write the command output in the file
with open(filename, 'w') as outdata:
process = subprocess.Popen(args,stdout=outdata)
#Wait for completing the process
return_code = process.wait()Ausgabe:
Laut der folgenden Ausgabe wird der Befehl "ping -c 3 www.google.com" vom Benutzer eingegeben, und der Befehl "cat" wird verwendet, um den Inhalt der Datei anzuzeigen, die vom Unterprozess geschrieben wurde:
Gehe nach oben
Multiprocessing mit Subprocess.Popen
Erstelle eine Python-Datei mit dem folgenden Skript, in dem die Verwendung von Multithreading mithilfe von subprocess gezeigt wird. Hier wird eine Funktion namens display_msg() mehrfach unter Verwendung von Multiprocessing aufgerufen.
#Import necessary modules
import multiprocessing
import subprocess
#Define the function that will be called by multiprocessing
def display_msg(n):
#Define the command with the format() function
cmd = "echo 'Python Programming'".format(n)
#Open process by using Popen() function
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
#Retrieve the output and error by communicating with the process
stdout, error = process.communicate()
#Print the output
print (stdout.decode())
#Call the function 5 times by creating the multiprocessing.Pool
with multiprocessing.Pool(multiprocessing.cpu_count()) as mp:
#Map the function
mp.map(display_msg, range(1, 5))Ausgabe:
Die folgende Ausgabe erscheint nach der Ausführung des vorherigen Skripts:
Gehe nach oben
Verwalten Sie die Eingabe- und Ausgabeströme
Erstellen Sie eine Textdatei mit dem Namen "test.txt" mit dem folgenden Inhalt, bevor Sie das Python-Skript dieses Beispiels erstellen.
test.txt
PERL
Python
Bash
php
Erstellen Sie eine Python-Datei mit dem folgenden Skript, das einen Unterprozess verwendet, um den Inhalt der Datei „test.txt“ zu lesen, und einen weiteren Unterprozess, um nach einem bestimmten Wort in dieser Textdatei zu suchen. Hier wird das Wort „python“ in der Datei „test.txt“ gesucht, die dieses Wort enthält.
#Import modules
import subprocess
#Define a process for the input stream
in_process = subprocess.Popen(["cat", "test.txt"], stdout=subprocess.PIPE, text=Tru>#Define a process for the output stream
out_process = subprocess.Popen(
["grep", "python"], stdin=in_process.stdout,
stdout=subprocess.PIPE, text=True)
#Store the output of the input and output processes
output, _ = out_process.communicate()
#Print the output
print ("Output:", output)Ausgabe:
Die folgende Ausgabe erscheint nach dem Ausführen des Skripts:
Gehe nach oben
Steuern Sie den Unterprozess mit einem Timer
Erstellen Sie eine Python-Datei mit dem folgenden Skript, das einen Timer verwendet, um einen Befehl mit einem Subprozess auszuführen. Hier wird der „try-except“-Block verwendet, um den Timer zu starten, und der „finally“-Block wird verwendet, um den Timer abzubrechen.
#Import the subprocess module
import subprocess
#Import the Timer module
from threading import Timer
#Define the command
cmd = ['ping', 'www.example.com']
#Open the process
p = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#Define the timer
timer = Timer(2, lambda process: process.kill(), [p])
try:
#Start the timer
timer.start()
#Read output
stdout, _ = p.communicate()
#Print output
print (stdout.decode())
except:
#Print error message for the wrong
print ("Error:", sys.exc_info())
finally:
#Stop the timer
timer.cancel()Ausgabe:
Die folgende Ausgabe erscheint nach dem Ausführen des Skripts:
Gehe nach oben
Lesen Sie den Streaming-Eingang
Erstellen Sie eine Python-Datei, die den Inhalt der Ausgabe des Unterprozesses mit einer "while"-Schleife liest und den Inhalt in einer Variablen speichert. Der Inhalt dieser Variablen wird später ausgegeben. Hierbei wird der "curl"-Befehl im Unterprozess für die URL www.google.com verwendet.
#Import module
import subprocess
#Define command
cmd = ["curl", "www.example.com"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, text=True>
#Initialize the output variable
output = ""
while True:
#Read the process output line by line
ln = p.stdout.readline()
#Terminate from the loop when the subprocess finishes
if not ln:
break
output = output + ln
#Print the line
print (output)
#Get the return code after finishing the process
return_code = p.wait()
#Print the return code
print ("Return code: ", return_code)Ausgabe:
Der letzte Teil der drei Ausgaben ist im folgenden Bild dargestellt. Der Rückgabecode nach Abschluss des Unterprozesses ist 0:
Gehe nach oben
Fazit
In diesem Tutorial werden verschiedene Anwendungen von Python subprocess.Popen() anhand mehrerer Python-Skripte gezeigt, die den Python-Nutzern helfen werden, die grundlegenden Anwendungen dieser Funktion zu verstehen.










