Python Subprocess.Popen Exempel

Python Subprocess Popen Exempel



Python subprocess är en av de användbara modulerna som används för att köra olika skalkommandon, processer och köra ett annat skript eller körbara filer med Python-skriptet. Det kan också användas för att omdirigera data från en process till en annan process och hantera de fel som genereras av de underordnade processerna. Delprocessmodulen har många klasser som används för olika ändamål. Klassen 'subprocess.Popen' är en av klasserna i denna modul som används för att interagera med de externa processerna och utföra olika typer av uppgifter bland processerna. Flera användningar av klassen 'subprocess.Popen' i Python-skriptet visas i denna handledning.

Ämne för innehåll:

  1. Kör ett enkelt Linux-kommando
  2. Kör ett kommando med indata
  3. Kör ett Python-skript
  4. Hantera underprocessfelet
  5. Returnera koden för Subprocess.Popen
  6. Omdirigera utdata från underprocessen till fil
  7. Multiprocessing med hjälp av Subprocess.Popen
  8. Hantera in- och utströmmen s
  9. Styr timeout och fördröjning
  10. Läs en Streaming-ingång

Kör ett enkelt Linux-kommando

Kommandot 'datum' används för att visa aktuellt systemdatum och tid. Skapa en Python-fil med följande skript som skapar en underprocess som kör kommandot 'date' och skriv ut resultatet av detta kommando:

#Importera modulen

importera delprocess

#Definiera ett kommando för underprocessen och

#öppna process genom att använda Popen()-funktionen

produktion = delprocess . Popen ( [ 'datum' ] , stdout = delprocess . RÖR )

#Hämta utdata och fel genom att kommunicera med processen

stdout , stderr = produktion. kommunicera ( )

#Skriv ut utskriften

skriva ut ( stdout. avkoda ( ) )

Produktion:







Följande utdata visas efter exekvering av föregående skript:



  p1



Gå till toppen





Kör ett kommando med indata

Kommandot 'wc' med alternativet '-c' används för att räkna det totala antalet tecken i strängvärdet som tillhandahålls med detta kommando. Skapa en Python-fil med följande skript som skapar en underprocess med Popen()-funktionen för att köra “wc –c”-kommandona. Strängvärdet tas från terminalen efter exekvering av skriptet och det totala antalet tecken i inmatningssträngen skrivs ut i utgången.

#Importera modulen

importera delprocess

#Definiera ett kommando för underprocessen och

#Öppna processen genom att använda Popen()-funktionen

produktion = delprocess . Popen ( [ 'toalett' , '-c' ] , stdout = delprocess . RÖR )

#Hämta utdata och fel genom att kommunicera med processen

stdout , stderr = produktion. kommunicera ( )

#Skriv ut utskriften

skriva ut ( stdout. avkoda ( ) )

Produktion:



Följande utdata visas för ingångsvärdet 'Python Subprocess Exempel':

Gå till toppen

Kör ett Python-skript

Skapa en Python-fil med namnet 'sum.py' med följande skript som beräknar summan av två tal och dessa siffror tillhandahålls som kommandoradsargument:

sum.py

#Importera nödvändig modul

importera sys

#Räkna totalt argument

n = endast ( sys . argv )

#Lägg till de två första argumentvärdena

belopp = int ( sys . argv [ 1 ] ) + int ( sys . argv [ 2 ] )

#Skriv ut tilläggsresultatet

skriva ut ( 'Summan av ' + sys . argv [ 1 ] + ' och ' + sys . argv [ 2 ] + ' är' , belopp )

Skapa en Python fil med följande skript som kör en Python fil som heter belopp . py med två argument genom att skapa en delprocess .

#Importera modulen

importera delprocess

#Kör python-skript i underprocessen och

#öppna processen genom att använda Popen()-funktionen

produktion = delprocess . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stdout = delprocess . RÖR ) #Hämta utdata och fel genom att kommunicera med processen

stdout , stderr = produktion. kommunicera ( )

#Skriv ut utskriften

skriva ut ( stdout. avkoda ( ) )

Produktion:

Följande utdata visas efter exekvering av föregående skript:

Gå till toppen

`

Hantera underprocessfelet

Skapa en Python-fil med följande skript som hanterar felen i underprocessen med hjälp av 'försök-utom'-blocket. Ett kommando tas från användaren och det exekveras av underprocessen. Felmeddelandet visas om något ogiltigt kommando tas från användaren.

#Importera modulerna

importera delprocess

importera sys

#Ta kommandot från användaren

kommando = inmatning ( 'Ange ett giltigt kommando:' )

Prova :

#Öppna processen genom att använda Popen()-funktionen

produktion = delprocess . Popen ( [ kommando ] , stdout = delprocess . RÖR )

#Hämta utdata och fel genom att kommunicera med processen

stdout , stderr = produktion. kommunicera ( )

#Skriv ut utskriften

skriva ut ( stdout. avkoda ( ) )

bortsett från :

skriva ut ( 'Fel:' , sys . exc_info ( ) )

Produktion:

Följande utdata visas om kommandot 'pwd' tas som indata som är ett giltigt kommando:

  p4-1

Följande utdata visas om kommandot 'usr' tas som indata som är ett giltigt kommando:

  p4-2

Gå till toppen

Returnera koden för Subprocess.Popen

Skapa en Python-fil med följande skript som kör ett 'ls'-kommando genom underprocessen för att få listan över alla Python-filer från den aktuella platsen. Skriptet väntar på att slutföra delprocessen och skriver ut returkoden.

#Importera modulerna

importera delprocess

importera sys

#Ställ in kommandot

kommando = [ 'ls' , '-l' , '*.py' ]

Prova :

#Öppna processen genom att använda Popen()-funktionen

produktion = delprocess . Popen ( kommando , stdout = delprocess . RÖR ,

stderr = delprocess . RÖR , text = Sann )

#Vänta med att slutföra processen

retCode = produktion. vänta ( )

#Skriv ut returkoden

skriva ut ( 'Returkod:' , retCode )

bortsett från :

#Skriv ut felmeddelande för fel

skriva ut ( 'Fel:' , sys . exc_info ( ) )

Produktion:

En liknande utdata visas efter exekvering av föregående skript:

Gå till toppen

Omdirigera utdata från underprocessen till fil

Skapa en Python-fil med följande skript som skriver utdata från underprocessen i en textfil. Kommandot som exekveras av underprocessen tas från användaren.

#Importera modul

importera delprocess

#Definiera filnamnet

filnamn = 'outfile.txt'

#Ta ett ping-kommando

cmd = inmatning ( 'Ange ett pingkommando:' )

#Dela upp den tagna inmatningen baserat på utrymmet

args = cmd . dela ( )

#Skriv kommandot i filen

med öppen ( filnamn , 'I' ) som outdata:

bearbeta = delprocess . Popen ( args , stdout = outdata )

#Vänta på att processen är klar

returkod = bearbeta. vänta ( )

Produktion:

Enligt följande utdata, 'ping -c 3 www.google.com kommandot tas från användaren och kommandot 'cat' används för att visa innehållet i filen som är skriven av underprocessen:

Gå till toppen

Multiprocessing med hjälp av Subprocess.Popen

Skapa en Python-fil med följande skript där användningen av multiprocessing visas med hjälp av subprocess. Här anropas en funktion som heter display_msg() flera gånger med hjälp av multiprocessing.

#Importera nödvändiga moduler

importera multibearbetning

importera delprocess

#Definiera funktionen som kommer att anropas av multiprocessing

def display_msg ( n ) :

#Definiera kommandot med format()-funktionen

cmd = 'eko 'Python-programmering'' . formatera ( n )

#Öppna processen genom att använda Popen()-funktionen

bearbeta = delprocess . Popen ( cmd , skal = Sann , stdout = delprocess . RÖR )

#Hämta utdata och fel genom att kommunicera med processen

stdout , fel = bearbeta. kommunicera ( )

#Skriv ut utskriften

skriva ut ( stdout. avkoda ( ) )

#Anropa funktionen 5 gånger genom att skapa multiprocessing.Pool

med multibearbetning. Slå samman ( multibearbetning. cpu_count ( ) ) som mp:

#Karta funktionen

smp. Karta ( display_msg , räckvidd ( 1 , 5 ) )

Produktion:

Följande utdata visas efter exekvering av föregående skript:

Gå till toppen

Hantera in- och utströmmar

Skapa en textfil med namnet 'test.txt' med följande innehåll innan du skapar Python-skriptet i detta exempel.

test.txt

PERL

pytonorm

våldsamt slag

php

Skapa en Python-fil med följande skript som använder en underprocess för att läsa innehållet i filen 'test.txt' och en annan underprocess för att söka efter ett visst ord i den textfilen. Här söks ordet 'python' i filen 'test.txt' som innehåller detta ord.

#Importera moduler

importera delprocess

#Definiera en process för inmatningsströmmen

pågående = delprocess . Popen ( [ 'katt' , 'test.txt' ] , stdout = delprocess . RÖR , text = Tru > #Definiera en process för utgångsströmmen

ut_process = delprocess . Popen (

[ 'grepp' , 'pytonorm' ] , stdin = pågående. stdout ,

stdout = delprocess . RÖR , text = Sann )

#Lagra utdata från ingångs- och utdataprocesser

produktion , _ = ut_process. kommunicera ( )

#Skriv ut utskriften

skriva ut ( 'Produktion:' , produktion )

Produktion:

Följande utdata visas efter exekvering av skriptet:

Gå till toppen

Styr underprocessen med hjälp av en timer

Skapa en Python-fil med följande skript som använder en timer för att utföra ett kommando med hjälp av en underprocess. Här används 'försök-utom'-blocket för att starta timern och 'äntligen'-blocket används för att avbryta timern.

#Importera delprocessmodulen

importera delprocess

#Importera timermodulen

från gängning importera Timer

#Definiera kommandot

cmd = [ 'ping' , 'www.example.com' ]

#Öppna processen

sid = delprocess . Popen (

cmd , stdout = delprocess . RÖR , stderr = delprocess . RÖR )

#Definiera timern

timer = Timer ( 2 , lambda process: process. döda ( ) , [ sid ] )

Prova :

#Starta timern

timer. Start ( )

#Läs utdata

stdout , _ = sid. kommunicera ( )

#Skriv ut

skriva ut ( stdout. avkoda ( ) )

bortsett från :

#Skriv ut felmeddelande för fel

skriva ut ( 'Fel:' , sys . exc_info ( ) )

till sist :

#Stoppa timern

timer. Avbryt ( )

Produktion:

Följande utdata visas efter exekvering av skriptet:

Gå till toppen

Läs streaming-ingången

Skapa en Python-fil som läser innehållet i underprocessens utdata med hjälp av en 'while'-loop och lagra innehållet i en variabel. Innehållet i denna variabel skrivs ut senare. Här används kommandot 'curl' i underprocessen för www.google.com URL.

#Importera modul

importera delprocess

#Definiera kommando

cmd = [ 'ringla' , 'www.example.com' ]

sid = delprocess . Popen ( cmd , stdout = delprocess . RÖR ,

stderr = delprocess . RÖR , text = Sann >

#Initiera utdatavariabeln

produktion = ''

medan Sann :

#Läs processens utdata rad för rad

ln = sid. stdout . läslinje ( )

#Avsluta från slingan när underprocessen är klar

om inte ln:

ha sönder

produktion = utgång + ln

#Skriv ut raden

skriva ut ( produktion )

#Hämta returkoden efter att ha avslutat processen

returkod = sid. vänta ( )

#Skriv ut returkoden

skriva ut ( 'Returkod:' , returkod )

Produktion:

Den sista delen av de tre utgångarna visas i följande bild. Returkoden efter att ha slutfört delprocessen är 0:

Gå till toppen

Slutsats

Olika användningar av Python-subprocess.Popen() visas i denna handledning med flera Python-skript som hjälper Python-användarna att känna till de grundläggande användningarna av denna funktion.