Python Subprocess.Popen eksempler

Python Subprocess Popen Eksempler



Python-underprosessen er en av de nyttige modulene som brukes til å kjøre forskjellige skallkommandoer, prosesser og kjøre et annet skript eller kjørbare filer ved å bruke Python-skriptet. Den kan også brukes til å omdirigere data fra en prosess til en annen prosess og håndtere feilene som genereres av underordnede prosesser. Delprosessmodulen har mange klasser som brukes til ulike formål. Klassen 'subprocess.Popen' er en av klassene i denne modulen som brukes til å samhandle med de eksterne prosessene og utføre ulike typer oppgaver blant prosessene. Flere bruksområder for 'subprocess.Popen'-klassen i Python-skriptet er vist i denne opplæringen.

Emne for innhold:

  1. Kjør en enkel Linux-kommando
  2. Kjør en kommando med inndata
  3. Kjør et Python-skript
  4. Håndter underprosessfeilen
  5. Returner koden for Subprocess.Popen
  6. Omdiriger utdataene fra underprosessen til fil
  7. Multiprosessering ved hjelp av Subprocess.Popen
  8. Håndter inngangs- og utgangsstrømmen s
  9. Kontroller tidsavbrudd og forsinkelse
  10. 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 modulen

import 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:



  p1



Gå til toppen





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 modulen

import 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':

Gå til toppen

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 modul

import 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:

Gå til toppen

`

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 modulene

import 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:

  s4-1

Følgende utgang vises hvis 'usr'-kommandoen tas som input som er en gyldig kommando:

  s4-2

Gå til toppen

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 modulene

import 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:

Gå til toppen

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 modul

import 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:

Gå til toppen

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 moduler

import 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:

Gå til toppen

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 moduler

import 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:

Gå til toppen

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 underprosessmodulen

import 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:

Gå til toppen

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 modul

import 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:

Gå til toppen

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.