Python Subprocess.Popen-voorbeelden

Python Subprocess Popen Voorbeelden



Python-subproces is een van de nuttige modules die wordt gebruikt om verschillende shell-opdrachten en processen uit te voeren en een ander script of uitvoerbare bestanden uit te voeren met behulp van het Python-script. Het kan ook worden gebruikt voor het omleiden van de gegevens van het ene proces naar het andere proces en voor het afhandelen van de fouten die door de onderliggende processen worden gegenereerd. De subprocesmodule heeft veel klassen die voor verschillende doeleinden worden gebruikt. De klasse “subprocess.Popen” is een van de klassen van deze module die wordt gebruikt om te communiceren met de externe processen en om verschillende soorten taken tussen de processen uit te voeren. In deze tutorial worden meerdere toepassingen van de klasse “subprocess.Popen” in het Python-script getoond.

Onderwerp van inhoud:

  1. Voer een eenvoudige Linux-opdracht uit
  2. Voer een opdracht uit met invoergegevens
  3. Voer een Python-script uit
  4. Behandel de subprocesfout
  5. Retourneer de code van Subprocess.Popen
  6. Leid de uitvoer van het subproces om naar een bestand
  7. Multiprocessing met behulp van Subprocess.Popen
  8. Behandel de invoer- en uitvoerstroom S
  9. Beheer de time-out en vertraging
  10. Lees een streaminginvoer

Voer een eenvoudige Linux-opdracht uit

Het commando “date” wordt gebruikt om de huidige systeemdatum en -tijd weer te geven. Maak een Python-bestand met het volgende script dat een subproces aanmaakt dat het “date”-commando uitvoert en de uitvoer van dit commando afdrukt:

#Importeer de module

importeren subproces

#Definieer een commando voor het subproces en

#open proces met behulp van de functie Popen().

uitgang = subproces . Popen ( [ 'datum' ] , stoer = subproces . PIJP )

#Haal de uitvoer en de fout op door met het proces te communiceren

stoer , stderr = uitgang. communiceren ( )

#Print de uitvoer

afdrukken ( stoer. decoderen ( ) )

Uitgang:







De volgende uitvoer verschijnt na het uitvoeren van het vorige script:



  p1



Ga naar boven





Voer een opdracht uit met invoergegevens

Het commando “wc” met de optie “-c” wordt gebruikt om het totale aantal tekens te tellen van de tekenreekswaarde die bij dit commando wordt geleverd. Maak een Python-bestand met het volgende script dat een subproces creëert met de functie Popen() om de “wc –c”-opdrachten uit te voeren. De tekenreekswaarde wordt uit de terminal gehaald na het uitvoeren van het script en het totale aantal tekens van de invoerreeks wordt in de uitvoer afgedrukt.

#Importeer de module

importeren subproces

#Definieer een commando voor het subproces en

#Open proces met behulp van de functie Popen().

uitgang = subproces . Popen ( [ 'wc' , '-C' ] , stoer = subproces . PIJP )

#Haal de uitvoer en de fout op door met het proces te communiceren

stoer , stderr = uitgang. communiceren ( )

#Print de uitvoer

afdrukken ( stoer. decoderen ( ) )

Uitgang:



De volgende uitvoer verschijnt voor de invoerwaarde “Python Subprocess Voorbeelden”:

Ga naar boven

Voer een Python-script uit

Maak een Python-bestand met de naam “sum.py” met het volgende script dat de som van twee getallen berekent en deze getallen worden opgegeven als opdrachtregelargumenten:

som.py

#Importeer de benodigde module

importeren sys

#Tel het totale aantal argumenten

N = alleen ( sys . argv )

#Voeg de eerste twee argumentwaarden toe

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

#Print het optelresultaat

afdrukken ( 'De som van ' + sys . argv [ 1 ] + ' En ' + sys . argv [ 2 ] + ' is' , som )

Maak een Python bestand met het volgende script dat een Python zal uitvoeren bestand genaamd som . py met twee argumenten door a te creëren subproces .

#Importeer de module

importeren subproces

#Voer Python-script uit in het subproces en

#open het proces met behulp van de functie Popen().

uitgang = subproces . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stoer = subproces . PIJP ) #Haal de uitvoer en de fout op door met het proces te communiceren

stoer , stderr = uitgang. communiceren ( )

#Print de uitvoer

afdrukken ( stoer. decoderen ( ) )

Uitgang:

De volgende uitvoer verschijnt na het uitvoeren van het vorige script:

Ga naar boven

`

Behandel de subprocesfout

Maak een Python-bestand met het volgende script dat de fouten van het subproces afhandelt met behulp van het ‘try-except’-blok. Er wordt een commando van de gebruiker overgenomen en door het subproces uitgevoerd. Het foutbericht wordt weergegeven als er een ongeldige opdracht van de gebruiker wordt overgenomen.

#Importeer de modules

importeren subproces

importeren sys

#Neem het commando over van de gebruiker

commando = invoer ( 'Voer een geldige opdracht in: ' )

poging :

#Open proces met behulp van de functie Popen().

uitgang = subproces . Popen ( [ commando ] , stoer = subproces . PIJP )

#Haal de uitvoer en de fout op door met het proces te communiceren

stoer , stderr = uitgang. communiceren ( )

#Print de uitvoer

afdrukken ( stoer. decoderen ( ) )

behalve :

afdrukken ( 'Fout:' , sys . exc_info ( ) )

Uitgang:

De volgende uitvoer verschijnt als de opdracht “pwd” wordt gebruikt als invoer die een geldige opdracht is:

  p4-1

De volgende uitvoer verschijnt als de opdracht “usr” wordt gebruikt als invoer die een geldige opdracht is:

  p4-2

Ga naar boven

Retourneer de code van Subprocess.Popen

Maak een Python-bestand met het volgende script dat een “ls”-opdracht uitvoert via het subproces om de lijst met alle Python-bestanden van de huidige locatie op te halen. Het script wacht met het voltooien van het subproces en drukt de retourcode af.

#Importeer de modules

importeren subproces

importeren sys

#Stel de opdracht in

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

poging :

#Open proces met behulp van de functie Popen().

uitgang = subproces . Popen ( commando , stoer = subproces . PIJP ,

stderr = subproces . PIJP , tekst = WAAR )

#Wacht om het proces te voltooien

retCode = uitgang. wachten ( )

#Print de retourcode

afdrukken ( 'Retourcode:' , retCode )

behalve :

#Foutbericht afdrukken voor de fout

afdrukken ( 'Fout:' , sys . exc_info ( ) )

Uitgang:

Een soortgelijke uitvoer verschijnt na het uitvoeren van het vorige script:

Ga naar boven

Leid de uitvoer van het subproces om naar een bestand

Maak een Python-bestand met het volgende script dat de uitvoer van het subproces in een tekstbestand schrijft. Het commando dat door het subproces wordt uitgevoerd, wordt van de gebruiker overgenomen.

#Importmodule

importeren subproces

#Definieer de bestandsnaam

bestandsnaam = 'outfile.txt'

#Neem een ​​ping-commando

cmd = invoer ( 'Voer een ping-commando in: ' )

#Splits de ingevoerde invoer op basis van de ruimte

arg = cmd . gesplitst ( )

#Schrijf de opdrachtuitvoer in het bestand

met open ( bestandsnaam , 'In' ) als gegevens over:

proces = subproces . Popen ( arg , stoer = gegevens uit )

#Wacht tot het proces is voltooid

retourcode = proces. wachten ( )

Uitgang:

Volgens de volgende uitvoer wordt de “ping -c 3 www.google.com De opdracht 'cat' wordt van de gebruiker overgenomen en de opdracht 'cat' wordt gebruikt om de inhoud van het bestand weer te geven dat door het subproces is geschreven:

Ga naar boven

Multiprocessing met behulp van Subprocess.Popen

Maak een Python-bestand met het volgende script waarin het gebruik van multiprocessing wordt weergegeven met behulp van subprocess. Hier wordt een functie met de naam display_msg() meerdere keren aangeroepen met behulp van multiprocessing.

#Importeer de benodigde modules

importeren multiverwerking

importeren subproces

#Definieer de functie die wordt aangeroepen door multiprocessing

zeker display_msg ( N ) :

#Definieer de opdracht met de functie format().

cmd = 'echo 'Python-programmering'' . formaat ( N )

#Open proces met behulp van de functie Popen().

proces = subproces . Popen ( cmd , schelp = WAAR , stoer = subproces . PIJP )

#Haal de uitvoer en de fout op door met het proces te communiceren

stoer , fout = proces. communiceren ( )

#Print de uitvoer

afdrukken ( stoer. decoderen ( ) )

#Roep de functie 5 keer aan door de multiprocessing.Pool te maken

met multiverwerking. Zwembad ( multiverwerking. cpu_telling ( ) ) als mp:

#Breng de functie in kaart

mp. kaart ( display_msg , bereik ( 1 , 5 ) )

Uitgang:

De volgende uitvoer verschijnt na het uitvoeren van het vorige script:

Ga naar boven

Behandel de invoer- en uitvoerstromen

Maak een tekstbestand met de naam “test.txt” met de volgende inhoud voordat u het Python-script van dit voorbeeld maakt.

test.txt

PERL

Python

bashen

php

Maak een Python-bestand met het volgende script dat één subproces gebruikt om de inhoud van het bestand “test.txt” te lezen en een ander subproces om naar een bepaald woord in dat tekstbestand te zoeken. Hier wordt gezocht naar het woord “python” in het “test.txt-bestand” dat dit woord bevat.

#Modules importeren

importeren subproces

#Definieer een proces voor de invoerstroom

in proces = subproces . Popen ( [ 'kat' , 'test.txt' ] , stoer = subproces . PIJP , tekst = Waar > #Definieer een proces voor de uitvoerstroom

uit_proces = subproces . Popen (

[ 'greep' , 'Python' ] , stdin = in proces. stoer ,

stoer = subproces . PIJP , tekst = WAAR )

#Sla de uitvoer van de invoer- en uitvoerprocessen op

uitgang , _ = uit_proces. communiceren ( )

#Print de uitvoer

afdrukken ( 'Uitvoer:' , uitgang )

Uitgang:

De volgende uitvoer verschijnt na het uitvoeren van het script:

Ga naar boven

Beheer het subproces met behulp van een timer

Maak een Python-bestand met het volgende script dat een timer gebruikt om een ​​opdracht uit te voeren met behulp van een subproces. Hier wordt het ‘try-except’-blok gebruikt om de timer te starten en het ‘finally’-blok om de timer te annuleren.

#Importeer de subprocesmodule

importeren subproces

#Importeer de Timer-module

van draadsnijden importeren Timer

#Definieer de opdracht

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

#Open het proces

P = subproces . Popen (

cmd , stoer = subproces . PIJP , stderr = subproces . PIJP )

#Definieer de timer

timer = Timer ( 2 , lambda proces: proces. doden ( ) , [ P ] )

poging :

#Start de timer

timer. begin ( )

#Lees uitvoer

stoer , _ = P. communiceren ( )

#Afdrukuitvoer

afdrukken ( stoer. decoderen ( ) )

behalve :

#Foutbericht afdrukken voor de fout

afdrukken ( 'Fout:' , sys . exc_info ( ) )

Eindelijk :

#Stop de timer

timer. annuleren ( )

Uitgang:

De volgende uitvoer verschijnt na het uitvoeren van het script:

Ga naar boven

Lees de streaminginvoer

Maak een Python-bestand dat de inhoud van de subprocesuitvoer leest met behulp van een “while”-lus en sla de inhoud op in een variabele. De inhoud van deze variabele wordt later afgedrukt. Hier wordt het commando “curl” gebruikt in het subproces voor de www.google.com URL.

#Importmodule

importeren subproces

#Definieer opdracht

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

P = subproces . Popen ( cmd , stoer = subproces . PIJP ,

stderr = subproces . PIJP , tekst = WAAR >

#Initialiseer de uitvoervariabele

uitgang = ''

terwijl WAAR :

#Lees de procesuitvoer regel voor regel

ln = P. stoer . Lees regel ( )

#Beëindig de lus wanneer het subproces is voltooid

als niet In:

pauze

uitgang = uitgang + ln

#Druk de regel af

afdrukken ( uitgang )

#Ontvang de retourcode nadat u het proces hebt voltooid

retourcode = P. wachten ( )

#Print de retourcode

afdrukken ( 'Retourcode: ' , retourcode )

Uitgang:

Het laatste deel van de drie uitgangen wordt weergegeven in de volgende afbeelding. De retourcode na voltooiing van het subproces is 0:

Ga naar boven

Conclusie

In deze zelfstudie worden verschillende toepassingen van het Python-subproces.Popen() getoond met behulp van meerdere Python-scripts die de Python-gebruikers zullen helpen het basisgebruik van deze functie te kennen.