Ämne för innehåll:
- Kör ett enkelt Linux-kommando
- Kör ett kommando med indata
- Kör ett Python-skript
- Hantera underprocessfelet
- Returnera koden för Subprocess.Popen
- Omdirigera utdata från underprocessen till fil
- Multiprocessing med hjälp av Subprocess.Popen
- Hantera in- och utströmmen s
- Styr timeout och fördröjning
- 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 modulenimportera 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:
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 modulenimportera 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':
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 modulimportera 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:
`
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 modulernaimportera 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:
Följande utdata visas om kommandot 'usr' tas som indata som är ett giltigt kommando:
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 modulernaimportera 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:
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 modulimportera 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:
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 modulerimportera 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:
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 modulerimportera 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:
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 delprocessmodulenimportera 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:
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 modulimportera 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:
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.