Emne for innhold:
- Kjør en enkel Linux-kommando
- Kjør en kommando med inndata
- Kjør et Python-skript
- Håndter underprosessfeilen
- Returner koden for Subprocess.Popen
- Omdiriger utdataene fra underprosessen til fil
- Multiprosessering ved hjelp av Subprocess.Popen
- Håndter inngangs- og utgangsstrømmen s
- Kontroller tidsavbrudd og forsinkelse
- Les en streaming-inngang
Kjør en enkel Linux-kommando
'Date'-kommandoen brukes til å vise gjeldende systemdato og -klokkeslett. Lag en Python-fil med følgende skript som lager en underprosess som utfører kommandoen 'dato' og skriv ut utdataene fra denne kommandoen:
#Importer modulenimport delprosess
#Definer en kommando for underprosessen og
#åpen prosess ved å bruke Popen() funksjonen
produksjon = delprosess . Popen ( [ 'Dato' ] , stdout = delprosess . RØR )
#Hent utdata og feil ved å kommunisere med prosessen
stdout , stderr = produksjon. kommunisere ( )
#Skriv ut utskriften
skrive ut ( stdout. dekode ( ) )
Produksjon:
Følgende utdata vises etter å ha utført det forrige skriptet:
Kjør en kommando med inndata
'wc'-kommandoen med '-c'-alternativet brukes til å telle det totale antallet tegn i strengverdien som følger med denne kommandoen. Lag en Python-fil med følgende skript som lager en underprosess med Popen()-funksjonen for å kjøre 'wc –c'-kommandoene. Strengeverdien hentes fra terminalen etter at skriptet er utført, og det totale antallet tegn i inndatastrengen skrives ut i utdataene.
#Importer modulenimport delprosess
#Definer en kommando for underprosessen og
#Åpne prosess ved å bruke Popen()-funksjonen
produksjon = delprosess . Popen ( [ 'toalett' , '-c' ] , stdout = delprosess . RØR )
#Hent utdata og feil ved å kommunisere med prosessen
stdout , stderr = produksjon. kommunisere ( )
#Skriv ut utskriften
skrive ut ( stdout. dekode ( ) )
Produksjon:
Følgende utdata vises for inngangsverdien 'Python Subprocess Examples':
Kjør et Python-skript
Lag en Python-fil med navnet 'sum.py' med følgende skript som beregner summen av to tall, og disse tallene er gitt som kommandolinjeargumenter:
sum.py
#Importer nødvendig modulimport sys
#Tell totalt argumenter
n = bare ( sys . argv )
#Legg til de to første argumentverdiene
sum = int ( sys . argv [ 1 ] ) + int ( sys . argv [ 2 ] )
#Skriv ut tilleggsresultatet
skrive ut ( 'Summen av ' + sys . argv [ 1 ] + 'og' + sys . argv [ 2 ] + ' er' , sum )
Lag en Python fil med følgende skript som vil kjøre en Python fil navngitt sum . py med to argumenter ved å lage en delprosess .
#Importer modulen
import delprosess
#Kjør python-skript i underprosessen og
#åpne prosessen ved å bruke Popen()-funksjonen
produksjon = delprosess . Popen ( [ 'python3' , «sum.py» , '25' , '55' ] , stdout = delprosess . RØR ) #Hent utdata og feil ved å kommunisere med prosessen
stdout , stderr = produksjon. kommunisere ( )
#Skriv ut utskriften
skrive ut ( stdout. dekode ( ) )
Produksjon:
Følgende utdata vises etter å ha utført det forrige skriptet:
`
Håndter underprosessfeilen
Lag en Python-fil med følgende skript som håndterer feilene i underprosessen ved å bruke 'try-except'-blokken. En kommando blir tatt fra brukeren og den utføres av underprosessen. Feilmeldingen vises hvis en ugyldig kommando blir tatt fra brukeren.
#Importer moduleneimport delprosess
import sys
#Ta kommandoen fra brukeren
kommando = input ( 'Skriv inn en gyldig kommando: ' )
prøve :
#Åpne prosess ved å bruke Popen()-funksjonen
produksjon = delprosess . Popen ( [ kommando ] , stdout = delprosess . RØR )
#Hent utdata og feil ved å kommunisere med prosessen
stdout , stderr = produksjon. kommunisere ( )
#Skriv ut utskriften
skrive ut ( stdout. dekode ( ) )
unntatt :
skrive ut ( 'Feil:' , sys . exc_info ( ) )
Produksjon:
Følgende utgang vises hvis 'pwd'-kommandoen tas som input som er en gyldig kommando:
Følgende utgang vises hvis 'usr'-kommandoen tas som input som er en gyldig kommando:
Returner koden for Subprocess.Popen
Lag en Python-fil med følgende skript som utfører en 'ls'-kommando gjennom underprosessen for å få listen over alle Python-filer fra gjeldende plassering. Skriptet venter på å fullføre delprosessen og skriver ut returkoden.
#Importer moduleneimport delprosess
import sys
#Angi kommandoen
kommando = [ 'ls' , '-l' , '*.py' ]
prøve :
#Åpne prosess ved å bruke Popen()-funksjonen
produksjon = delprosess . Popen ( kommando , stdout = delprosess . RØR ,
stderr = delprosess . RØR , tekst = ekte )
#Vent med å fullføre prosessen
retCode = produksjon. vente ( )
#Skriv ut returkoden
skrive ut ( 'Returkode:' , retCode )
unntatt :
#Skriv ut feilmelding for feil
skrive ut ( 'Feil:' , sys . exc_info ( ) )
Produksjon:
En lignende utgang vises etter å ha utført det forrige skriptet:
Omdiriger utdataene fra underprosessen til fil
Lag en Python-fil med følgende skript som skriver utdataene fra underprosessen i en tekstfil. Kommandoen som utføres av underprosessen tas fra brukeren.
#Importer modulimport delprosess
#Definer filnavnet
filnavn = 'outfile.txt'
#Ta en ping-kommando
cmd = input ( 'Skriv inn en ping-kommando:' )
#Del opp inndataene basert på plassen
args = cmd . dele ( )
#Skriv kommandoutgangen i filen
med åpen ( filnavn , 'I' ) som utdata:
prosess = delprosess . Popen ( args , stdout = utdata )
#Vent på å fullføre prosessen
returkode = prosess. vente ( )
Produksjon:
I henhold til følgende utgang, 'ping -c 3 www.google.com kommandoen tas fra brukeren og kommandoen 'cat' brukes til å vise innholdet i filen som er skrevet av underprosessen:
Multiprosessering ved hjelp av Subprocess.Popen
Lag en Python-fil med følgende skript hvor bruken av multiprosessering vises ved hjelp av underprosess. Her kalles en funksjon kalt display_msg() flere ganger ved hjelp av multiprosessering.
#Importer nødvendige modulerimport multiprosessering
import delprosess
#Definer funksjonen som skal kalles ved multiprosessering
def display_msg ( n ) :
#Definer kommandoen med format()-funksjonen
cmd = 'ekko 'Python-programmering'' . format ( n )
#Åpne prosess ved å bruke Popen()-funksjonen
prosess = delprosess . Popen ( cmd , skall = ekte , stdout = delprosess . RØR )
#Hent utdata og feil ved å kommunisere med prosessen
stdout , feil = prosess. kommunisere ( )
#Skriv ut utskriften
skrive ut ( stdout. dekode ( ) )
#Ring funksjonen 5 ganger ved å lage multiprosessering.Pool
med multiprosessering. Basseng ( multiprosessering. cpu_count ( ) ) som mp:
#Kartlegg funksjonen
smp. kart ( display_msg , område ( 1 , 5 ) )
Produksjon:
Følgende utdata vises etter å ha utført det forrige skriptet:
Håndter inngangs- og utdatastrømmene
Lag en tekstfil kalt 'test.txt' med følgende innhold før du oppretter Python-skriptet i dette eksemplet.
test.txt
PERL
python
bash
php
Lag en Python-fil med følgende skript som bruker en underprosess for å lese innholdet i 'test.txt'-filen og en annen underprosess for å søke etter et bestemt ord i den tekstfilen. Her søkes ordet 'python' i 'test.txt-filen' som inneholder dette ordet.
#Importer modulerimport delprosess
#Definer en prosess for inndatastrømmen
igang = delprosess . Popen ( [ 'katt' , 'test.txt' ] , stdout = delprosess . RØR , tekst = Tru > #Definer en prosess for utdatastrømmen
ut_prosess = delprosess . Popen (
[ 'grep' , 'pyton' ] , stdin = igang. stdout ,
stdout = delprosess . RØR , tekst = ekte )
#Lagre utdataene fra inngangs- og utdataprosessene
produksjon , _ = ut_prosess. kommunisere ( )
#Skriv ut utskriften
skrive ut ( 'Produksjon:' , produksjon )
Produksjon:
Følgende utdata vises etter utføring av skriptet:
Kontroller underprosessen ved hjelp av en timer
Lag en Python-fil med følgende skript som bruker en timer til å utføre en kommando ved hjelp av en underprosess. Her brukes 'try-except'-blokken for å starte timeren og 'endelig'-blokken brukes til å avbryte timeren.
#Importer underprosessmodulenimport delprosess
#Importer timermodulen
fra tråding import Timer
#Definer kommandoen
cmd = [ 'ping' , 'www.example.com' ]
#Åpne prosessen
s = delprosess . Popen (
cmd , stdout = delprosess . RØR , stderr = delprosess . RØR )
#Definer tidtakeren
tidtaker = Timer ( 2 , lambda prosess: prosess. drepe ( ) , [ s ] )
prøve :
#Start tidtakeren
tidtaker. start ( )
#Les utdata
stdout , _ = s. kommunisere ( )
#Skriv ut
skrive ut ( stdout. dekode ( ) )
unntatt :
#Skriv ut feilmelding for feil
skrive ut ( 'Feil:' , sys . exc_info ( ) )
endelig :
#Stopp timeren
tidtaker. Avbryt ( )
Produksjon:
Følgende utdata vises etter utføring av skriptet:
Les streaming-inngangen
Lag en Python-fil som leser innholdet i underprosessens utdata ved å bruke en 'while'-løkke og lagre innholdet i en variabel. Innholdet i denne variabelen skrives ut senere. Her brukes 'curl'-kommandoen i underprosessen for www.google.com URL.
#Importer modulimport delprosess
#Definer kommando
cmd = [ 'krøll' , 'www.example.com' ]
s = delprosess . Popen ( cmd , stdout = delprosess . RØR ,
stderr = delprosess . RØR , tekst = ekte >
#Initialiser utdatavariabelen
produksjon = ''
samtidig som ekte :
#Les prosessutdata linje for linje
ln = s. stdout . leselinje ( )
#Avslutt fra løkken når delprosessen er ferdig
hvis ikke ln:
gå i stykker
produksjon = utgang + ln
#Skriv ut linjen
skrive ut ( produksjon )
#Få returkoden etter å ha fullført prosessen
returkode = s. vente ( )
#Skriv ut returkoden
skrive ut ( 'Returkode: ' , returkode )
Produksjon:
Den siste delen av de tre utgangene er vist i bildet nedenfor. Returkoden etter å ha fullført underprosessen er 0:
Konklusjon
Ulike bruk av Python-subprocess.Popen() er vist i denne opplæringen ved å bruke flere Python-skript som vil hjelpe Python-brukerne å kjenne til de grunnleggende bruksområdene til denne funksjonen.