Website-Suche

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:

  1. Führen Sie einen einfachen Linux-Befehl aus
  2. Führen Sie einen Befehl mit Eingabedaten aus
  3. Führen Sie ein Python-Skript aus
  4. Behandle den Unterprozessfehler
  5. Geben Sie den Code von Subprocess.Popen zurück.
  6. Leiten Sie die Ausgabe des Unterprozesses in eine Datei um.
  7. Mehrprozessverarbeitung mit Subprocess.Popen
  8. Verwalte die Eingabe- und Ausgabeströme
  9. Steuere das Timeout und die Verzögerung
  10. 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.