Python Subprocess.Popen Primjeri

Python Subprocess Popen Primjeri



Python podproces jedan je od korisnih modula koji se koristi za pokretanje različitih naredbi ljuske, procesa i izvršavanje druge skripte ili izvršnih datoteka pomoću Python skripte. Može se koristiti i za preusmjeravanje podataka iz jednog procesa u drugi proces i rukovanje pogreškama koje generiraju podređeni procesi. Modul potprocesa ima mnogo klasa koje se koriste u razne svrhe. Klasa “subprocess.Popen” jedna je od klasa ovog modula koja se koristi za interakciju s vanjskim procesima i izvršavanje različitih vrsta zadataka među procesima. Višestruke upotrebe klase “subprocess.Popen” u Python skripti prikazane su u ovom vodiču.

Tema sadržaja:

  1. Pokrenite jednostavnu Linux naredbu
  2. Pokrenite naredbu s ulaznim podacima
  3. Pokrenite Python skriptu
  4. Riješite pogrešku podprocesa
  5. Vrati kod podprocesa.Popen
  6. Preusmjerite izlaz podprocesa u datoteku
  7. Višeprocesiranje korištenjem Subprocess.Popen
  8. Rukovanje ulaznim i izlaznim tokom s
  9. Kontrolirajte vremensko ograničenje i odgodu
  10. Pročitajte strujni unos

Pokrenite jednostavnu Linux naredbu

Naredba “datum” koristi se za prikaz trenutnog datuma i vremena sustava. Napravite Python datoteku sa sljedećom skriptom koja stvara podproces koji izvršava naredbu 'datum' i ispišite izlaz ove naredbe:

#Uvezite modul

uvoz podproces

#Definirajte naredbu za podproces i

#otvorite proces pomoću funkcije Popen().

izlaz = podproces . Popen ( [ 'datum' ] , stdout = podproces . CIJEV )

#Dohvati izlaz i pogrešku komuniciranjem s procesom

stdout , stderr = izlaz. komunicirati ( )

#Ispiši izlaz

ispisati ( stdout. dekodirati ( ) )

Izlaz:







Nakon izvršavanja prethodne skripte pojavljuje se sljedeći izlaz:



  p1



Idi na vrh





Pokrenite naredbu s ulaznim podacima

Naredba “wc” s opcijom “-c” koristi se za brojanje ukupnog broja znakova vrijednosti niza koja se daje ovom naredbom. Stvorite Python datoteku sa sljedećom skriptom koja stvara podproces s funkcijom Popen() za pokretanje naredbi 'wc –c'. Vrijednost niza preuzima se iz terminala nakon izvršavanja skripte, a ukupan broj znakova ulaznog niza ispisuje se u izlazu.

#Uvezite modul

uvoz podproces

#Definirajte naredbu za podproces i

#Otvorite proces pomoću funkcije Popen().

izlaz = podproces . Popen ( [ 'zahod' , '-c' ] , stdout = podproces . CIJEV )

#Dohvati izlaz i pogrešku komuniciranjem s procesom

stdout , stderr = izlaz. komunicirati ( )

#Ispiši izlaz

ispisati ( stdout. dekodirati ( ) )

Izlaz:



Za ulaznu vrijednost 'Python Subprocess Examples' pojavljuje se sljedeći izlaz:

Idi na vrh

Pokrenite Python skriptu

Napravite Python datoteku pod nazivom 'sum.py' sa sljedećom skriptom koja izračunava zbroj dvaju brojeva, a ti se brojevi daju kao argumenti naredbenog retka:

zbroj.py

#Uvezi potreban modul

uvoz sustav

#Broj ukupnih argumenata

n = samo ( sustav . argv )

#Dodajte prve dvije vrijednosti argumenta

iznos = int ( sustav . argv [ 1 ] ) + int ( sustav . argv [ 2 ] )

#Ispiši rezultat zbrajanja

ispisati ( 'Zbroj ' + sustav . argv [ 1 ] + ' i ' + sustav . argv [ 2 ] + 'je' , iznos )

Stvorite Python datoteka s sljedeću skriptu koja će pokrenuti Python datoteka imenovani iznos . py s dva argumenta stvaranjem a podproces .

#Uvezite modul

uvoz podproces

#Pokreni python skriptu u potprocesu i

#otvorite proces pomoću funkcije Popen().

izlaz = podproces . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stdout = podproces . CIJEV ) #Dohvati izlaz i pogrešku komuniciranjem s procesom

stdout , stderr = izlaz. komunicirati ( )

#Ispiši izlaz

ispisati ( stdout. dekodirati ( ) )

Izlaz:

Nakon izvršavanja prethodne skripte pojavljuje se sljedeći izlaz:

Idi na vrh

`

Riješite pogrešku podprocesa

Stvorite Python datoteku sa sljedećom skriptom koja obrađuje pogreške potprocesa pomoću bloka 'pokušaj-osim'. Naredba se preuzima od korisnika i izvršava je podproces. Poruka o pogrešci se prikazuje ako se od korisnika preuzme bilo koja nevažeća naredba.

#Uvezite module

uvoz podproces

uvoz sustav

#Preuzmi naredbu od korisnika

naredba = ulazni ( 'Unesite valjanu naredbu: ' )

probati :

#Otvorite proces pomoću funkcije Popen().

izlaz = podproces . Popen ( [ naredba ] , stdout = podproces . CIJEV )

#Dohvati izlaz i pogrešku komuniciranjem s procesom

stdout , stderr = izlaz. komunicirati ( )

#Ispiši izlaz

ispisati ( stdout. dekodirati ( ) )

osim :

ispisati ( 'Pogreška:' , sustav . exc_info ( ) )

Izlaz:

Sljedeći izlaz pojavljuje se ako se naredba “pwd” uzme kao ulaz koji je važeća naredba:

  p4-1

Sljedeći izlaz pojavljuje se ako se naredba “usr” uzme kao ulaz koji je važeća naredba:

  p4-2

Idi na vrh

Vrati kod podprocesa.Popen

Stvorite Python datoteku sa sljedećom skriptom koja izvršava naredbu “ls” kroz podproces da biste dobili popis svih Python datoteka s trenutne lokacije. Skripta čeka da završi potproces i ispisuje povratni kod.

#Uvezite module

uvoz podproces

uvoz sustav

#Postavite naredbu

naredba = [ 'je' , '-l' , '*.py' ]

probati :

#Otvorite proces pomoću funkcije Popen().

izlaz = podproces . Popen ( naredba , stdout = podproces . CIJEV ,

stderr = podproces . CIJEV , tekst = Pravi )

#Pričekajte da završite proces

retCode = izlaz. čekati ( )

#Ispiši povratni kod

ispisati ( 'Povratni kod:' , retCode )

osim :

#Ispiši poruku o pogrešci za pogrešno

ispisati ( 'Pogreška:' , sustav . exc_info ( ) )

Izlaz:

Sličan izlaz pojavljuje se nakon izvođenja prethodne skripte:

Idi na vrh

Preusmjerite izlaz podprocesa u datoteku

Stvorite Python datoteku sa sljedećom skriptom koja zapisuje izlaz potprocesa u tekstualnu datoteku. Naredba koju izvršava potproces preuzima se od korisnika.

#Import modul

uvoz podproces

#Definirajte naziv datoteke

naziv datoteke = 'outfile.txt'

#Uzmite naredbu ping

cmd = ulazni ( 'Unesite ping naredbu: ' )

#Podijeli preuzeti unos na temelju prostora

args = cmd . podjela ( )

#Zapišite izlaz naredbe u datoteku

s otvoren ( naziv datoteke , 'U' ) kao zastarjeli podaci:

postupak = podproces . Popen ( args , stdout = zastarjeli podaci )

#Pričekajte da se proces završi

povratni_kod = postupak. čekati ( )

Izlaz:

Prema sljedećem rezultatu, 'ping -c 3 www.google.com ” naredba se preuzima od korisnika, a naredba “cat” se koristi za prikaz sadržaja datoteke koju je napisao podproces:

Idi na vrh

Višeprocesiranje korištenjem Subprocess.Popen

Stvorite Python datoteku sa sljedećom skriptom u kojoj je upotreba višestruke obrade prikazana pomoću podprocesa. Ovdje se funkcija pod nazivom display_msg() poziva više puta korištenjem višestruke obrade.

#Uvezite potrebne module

uvoz višeprocesiranje

uvoz podproces

#Definirajte funkciju koja će biti pozvana višestrukim procesiranjem

def prikaz_poruke ( n ) :

#Definirajte naredbu funkcijom format().

cmd = 'echo 'Python programiranje'' . format ( n )

#Otvorite proces pomoću funkcije Popen().

postupak = podproces . Popen ( cmd , ljuska = Pravi , stdout = podproces . CIJEV )

#Dohvati izlaz i pogrešku komuniciranjem s procesom

stdout , greška = postupak. komunicirati ( )

#Ispiši izlaz

ispisati ( stdout. dekodirati ( ) )

#Pozovite funkciju 5 puta stvaranjem multiprocessing.Pool

s višeprocesiranje. Bazen ( višeprocesiranje. cpu_count ( ) ) kao mp:

#Mapirajte funkciju

mp. karta ( prikaz_poruke , domet ( 1 , 5 ) )

Izlaz:

Nakon izvršavanja prethodne skripte pojavljuje se sljedeći izlaz:

Idi na vrh

Rukovanje ulaznim i izlaznim tokovima

Stvorite tekstualnu datoteku pod nazivom 'test.txt' sa sljedećim sadržajem prije stvaranja Python skripte ovog primjera.

test.txt

PERL

piton

udarac

php

Stvorite Python datoteku sa sljedećom skriptom koja koristi jedan podproces za čitanje sadržaja datoteke 'test.txt' i drugi podproces za traženje određene riječi u toj tekstualnoj datoteci. Ovdje se riječ 'python' pretražuje u 'test.txt datoteci' koja sadrži tu riječ.

#Uvoz modula

uvoz podproces

#Definirajte proces za ulazni tok

u procesu = podproces . Popen ( [ 'mačka' , 'test.txt' ] , stdout = podproces . CIJEV , tekst = Tru > #Definirajte proces za izlazni tok

izlazni_proces = podproces . Popen (

[ 'zahvat' , 'piton' ] , stdin = u procesu. stdout ,

stdout = podproces . CIJEV , tekst = Pravi )

#Pohrani izlaz ulaznih i izlaznih procesa

izlaz , _ = izlazni_proces. komunicirati ( )

#Ispiši izlaz

ispisati ( 'Izlaz:' , izlaz )

Izlaz:

Nakon izvršavanja skripte pojavljuje se sljedeći izlaz:

Idi na vrh

Upravljajte podprocesom pomoću mjerača vremena

Stvorite Python datoteku sa sljedećom skriptom koja koristi mjerač vremena za izvršavanje naredbe pomoću podprocesa. Ovdje se blok “try-except” koristi za pokretanje mjerača vremena, a blok “finally” se koristi za otkazivanje mjerača vremena.

#Uvezite modul potprocesa

uvoz podproces

#Uvezite Timer modul

iz narezivanje navoja uvoz Timer

#Definirajte naredbu

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

#Otvorite proces

str = podproces . Popen (

cmd , stdout = podproces . CIJEV , stderr = podproces . CIJEV )

#Definirajte mjerač vremena

mjerač vremena = Timer ( 2 , lambda proces: proces. ubiti ( ) , [ str ] )

probati :

#Pokrenite mjerač vremena

mjerač vremena. početak ( )

#Read output

stdout , _ = str. komunicirati ( )

#Izlaz za ispis

ispisati ( stdout. dekodirati ( ) )

osim :

#Ispiši poruku o pogrešci za pogrešno

ispisati ( 'Pogreška:' , sustav . exc_info ( ) )

konačno :

#Zaustavi mjerač vremena

mjerač vremena. otkazati ( )

Izlaz:

Nakon izvršavanja skripte pojavljuje se sljedeći izlaz:

Idi na vrh

Pročitajte Streaming Input

Napravite Python datoteku koja čita sadržaj izlaza potprocesa pomoću petlje 'while' i pohranjuje sadržaj u varijablu. Sadržaj ove varijable ispisuje se kasnije. Ovdje se naredba 'curl' koristi u podprocesu za www.google.com URL.

#Import modul

uvoz podproces

#Definiraj naredbu

cmd = [ 'kovrča' , 'www.example.com' ]

str = podproces . Popen ( cmd , stdout = podproces . CIJEV ,

stderr = podproces . CIJEV , tekst = Pravi >

#Inicijaliziraj izlaznu varijablu

izlaz = ''

dok Pravi :

#Pročitajte izlaz procesa redak po redak

ul = str. stdout . linija za čitanje ( )

#Završi iz petlje kada podproces završi

ako ne u:

pauza

izlaz = izlaz + ln

#Ispiši liniju

ispisati ( izlaz )

# Dobijte povratni kod nakon završetka procesa

povratni_kod = str. čekati ( )

#Ispiši povratni kod

ispisati ( 'Povratni kod: ' , povratni_kod )

Izlaz:

Posljednji dio od tri izlaza prikazan je na sljedećoj slici. Povratni kod nakon završetka potprocesa je 0:

Idi na vrh

Zaključak

Različite upotrebe Python subprocess.Popen() prikazane su u ovom vodiču pomoću više Python skripti koje će pomoći Python korisnicima da upoznaju osnovne upotrebe ove funkcije.