Python Subprocess.Popen Exemple

Python Subprocess Popen Exemple



Subprocesul Python este unul dintre modulele utile care este folosit pentru a rula diferite comenzi shell, procese și pentru a executa un alt script sau fișiere executabile folosind scriptul Python. Poate fi folosit și pentru redirecționarea datelor de la un proces la altul și gestionarea erorilor care sunt generate de procesele copil. Modulul de subproces are multe clase care sunt utilizate în diverse scopuri. Clasa „subprocess.Popen” este una dintre clasele acestui modul care este folosită pentru a interacționa cu procesele externe și pentru a efectua diferite tipuri de sarcini între procese. În acest tutorial sunt prezentate mai multe utilizări ale clasei „subprocess.Popen” în scriptul Python.

Subiect de conținut:

  1. Rulați o comandă Linux simplă
  2. Rulați o comandă cu date de intrare
  3. Rulați un script Python
  4. Gestionați eroarea de subproces
  5. Returnați codul de subproces.Popen
  6. Redirecționați ieșirea subprocesului către fișier
  7. Multiprocesare folosind Subprocess.Popen
  8. Gestionați fluxul de intrare și ieșire s
  9. Controlați timeout-ul și întârzierea
  10. Citiți o intrare în flux

Rulați o comandă simplă Linux

Comanda „date” este utilizată pentru a afișa data și ora curentă a sistemului. Creați un fișier Python cu următorul script care creează un subproces care execută comanda „date” și tipăriți rezultatul acestei comenzi:

#Importă modulul

import subproces

#Definiți o comandă pentru subproces și

#deschideți procesul folosind funcția Popen().

ieșire = subproces . Popen ( [ 'Data' ] , stdout = subproces . ȚEVA )

#Preluați rezultatul și eroarea comunicând cu procesul

stdout , stderr = ieșire. comunica ( )

#Tipărește rezultatul

imprimare ( stdout. decodifica ( ) )

Ieșire:







Următoarea ieșire apare după executarea scriptului anterior:



  p1



Du-te sus





Rulați o comandă cu date de intrare

Comanda „wc” cu opțiunea „-c” este utilizată pentru a număra numărul total de caractere din valoarea șirului care este furnizat cu această comandă. Creați un fișier Python cu următorul script care creează un subproces cu funcția Popen() pentru a rula comenzile „wc –c”. Valoarea șirului este preluată de la terminal după executarea scriptului și totalul de caractere ale șirului de intrare sunt imprimate în ieșire.

#Importă modulul

import subproces

#Definiți o comandă pentru subproces și

#Deschideți procesul utilizând funcția Popen().

ieșire = subproces . Popen ( [ 'WC' , '-c' ] , stdout = subproces . ȚEVA )

#Preluați rezultatul și eroarea comunicând cu procesul

stdout , stderr = ieșire. comunica ( )

#Tipărește rezultatul

imprimare ( stdout. decodifica ( ) )

Ieșire:



Următoarea ieșire apare pentru valoarea de intrare „Exemple de subprocese Python”:

Du-te sus

Rulați un script Python

Creați un fișier Python numit „sum.py” cu următorul script care calculează suma a două numere și aceste numere sunt furnizate ca argumente de linie de comandă:

sum.py

#Importă modulul necesar

import sys

#Numărați totalul argumentelor

n = numai ( sys . argv )

#Adăugați primele două valori ale argumentului

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

#Tipărește rezultatul adunării

imprimare ( 'Suma ' + sys . argv [ 1 ] + ' și ' + sys . argv [ 2 ] + ' este' , sumă )

Creați un Python fişier cu următorul script care va rula un Python fişier numit sumă . py cu două argumente prin crearea a subproces .

#Importă modulul

import subproces

#Run script python în subproces și

#deschideți procesul utilizând funcția Popen().

ieșire = subproces . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stdout = subproces . ȚEVA ) #Preluați rezultatul și eroarea comunicând cu procesul

stdout , stderr = ieșire. comunica ( )

#Tipărește rezultatul

imprimare ( stdout. decodifica ( ) )

Ieșire:

Următoarea ieșire apare după executarea scriptului anterior:

Du-te sus

`

Gestionați eroarea de subproces

Creați un fișier Python cu următorul script care se ocupă de erorile subprocesului folosind blocul „try-except”. O comandă este preluată de la utilizator și este executată de subproces. Mesajul de eroare este afișat dacă orice comandă nevalidă este preluată de la utilizator.

#Importă modulele

import subproces

import sys

#Preia comanda de la utilizator

comanda = intrare ( 'Introduceți o comandă validă: ' )

încerca :

#Deschideți procesul utilizând funcția Popen().

ieșire = subproces . Popen ( [ comanda ] , stdout = subproces . ȚEVA )

#Preluați rezultatul și eroarea comunicând cu procesul

stdout , stderr = ieșire. comunica ( )

#Tipărește rezultatul

imprimare ( stdout. decodifica ( ) )

cu exceptia :

imprimare ( 'Eroare:' , sys . exc_info ( ) )

Ieșire:

Următoarea ieșire apare dacă comanda „pwd” este luată ca intrare care este o comandă validă:

  p4-1

Următoarea ieșire apare dacă comanda „usr” este luată ca intrare care este o comandă validă:

  p4-2

Du-te sus

Returnați codul de subproces.Popen

Creați un fișier Python cu următorul script care execută o comandă „ls” prin intermediul subprocesului pentru a obține lista tuturor fișierelor Python din locația curentă. Scriptul așteaptă să finalizeze subprocesul și tipărește codul de returnare.

#Importă modulele

import subproces

import sys

#Setați comanda

comanda = [ 'ls' , '-l' , „*.py” ]

încerca :

#Deschideți procesul utilizând funcția Popen().

ieșire = subproces . Popen ( comanda , stdout = subproces . ȚEVA ,

stderr = subproces . ȚEVA , text = Adevărat )

#Așteptați să finalizați procesul

retCode = ieșire. aștepta ( )

#Tipărește codul de retur

imprimare ( „Cod de returnare:” , retCode )

cu exceptia :

#Print mesaj de eroare pentru greșit

imprimare ( 'Eroare:' , sys . exc_info ( ) )

Ieșire:

O ieșire similară apare după executarea scriptului anterior:

Du-te sus

Redirecționați ieșirea subprocesului către fișier

Creați un fișier Python cu următorul script care scrie rezultatul subprocesului într-un fișier text. Comanda care este executată de subproces este preluată de la utilizator.

#Import modul

import subproces

#Definește numele fișierului

nume de fișier = „outfile.txt”

#Preluați o comandă ping

cmd = intrare ( 'Introduceți o comandă ping: ' )

#Divizați intrarea luată în funcție de spațiu

argumente = cmd . Despică ( )

#Scrieți rezultatul comenzii în fișier

cu deschis ( nume de fișier , 'În' ) la fel de outdata:

proces = subproces . Popen ( argumente , stdout = outdate )

#Așteptați finalizarea procesului

cod_return = proces. aștepta ( )

Ieșire:

Conform următoarei rezultate, „ping -c 3 www.google.com comanda ” este preluată de la utilizator și comanda „cat” este folosită pentru a afișa conținutul fișierului care este scris de subprocesul:

Du-te sus

Multiprocesare folosind Subprocess.Popen

Creați un fișier Python cu următorul script în care utilizarea multiprocesării este afișată folosind subproces. Aici, o funcție numită display_msg() este apelată de mai multe ori folosind multiprocesare.

#Importa modulele necesare

import multiprocesare

import subproces

#Definiți funcția care va fi apelată prin multiprocesare

def display_msg ( n ) :

#Definiți comanda cu funcția format().

cmd = „echo „Programare Python”” . format ( n )

#Deschideți procesul utilizând funcția Popen().

proces = subproces . Popen ( cmd , coajă = Adevărat , stdout = subproces . ȚEVA )

#Preluați rezultatul și eroarea comunicând cu procesul

stdout , eroare = proces. comunica ( )

#Tipărește rezultatul

imprimare ( stdout. decodifica ( ) )

#Apelați funcția de 5 ori prin crearea multiprocesării. Pool

cu multiprocesare. Bazin ( multiprocesare. cpu_count ( ) ) la fel de mp:

#Cartografiați funcția

mp. Hartă ( display_msg , gamă ( 1 , 5 ) )

Ieșire:

Următoarea ieșire apare după executarea scriptului anterior:

Du-te sus

Gestionați fluxurile de intrare și de ieșire

Creați un fișier text numit „test.txt” cu următorul conținut înainte de a crea scriptul Python din acest exemplu.

test.txt

PERL

piton

bash

php

Creați un fișier Python cu următorul script care utilizează un subproces pentru a citi conținutul fișierului „test.txt” și un alt subproces pentru a căuta un anumit cuvânt în acel fișier text. Aici, cuvântul „python” este căutat în „fișierul test.txt” care conține acest cuvânt.

#Import module

import subproces

#Definiți un proces pentru fluxul de intrare

in proces = subproces . Popen ( [ 'pisică' , „test.txt” ] , stdout = subproces . ȚEVA , text = Tru > #Definiți un proces pentru fluxul de ieșire

out_process = subproces . Popen (

[ 'prindere' , 'piton' ] , stdin = in proces. stdout ,

stdout = subproces . ȚEVA , text = Adevărat )

# Stocați rezultatul proceselor de intrare și de ieșire

ieșire , _ = out_process. comunica ( )

#Tipărește rezultatul

imprimare ( 'Ieșire:' , ieșire )

Ieșire:

Următoarea ieșire apare după executarea scriptului:

Du-te sus

Controlați subprocesul folosind un temporizator

Creați un fișier Python cu următorul script care utilizează un cronometru pentru a executa o comandă folosind un subproces. Aici, blocul „try-except” este folosit pentru a porni cronometrul, iar blocul „finally” este folosit pentru a anula cronometrul.

#Importați modulul subprocesului

import subproces

#Importați modulul Timer

din filetat import Temporizator

#Definește comanda

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

#Deschide procesul

p = subproces . Popen (

cmd , stdout = subproces . ȚEVA , stderr = subproces . ȚEVA )

#Definește cronometrul

temporizator = Temporizator ( 2 , lambda proces: proces. ucide ( ) , [ p ] )

încerca :

#Porniți cronometrul

temporizator. start ( )

#Read output

stdout , _ = p. comunica ( )

#Print output

imprimare ( stdout. decodifica ( ) )

cu exceptia :

#Print mesaj de eroare pentru greșit

imprimare ( 'Eroare:' , sys . exc_info ( ) )

in cele din urma :

#Opriți cronometrul

temporizator. Anulare ( )

Ieșire:

Următoarea ieșire apare după executarea scriptului:

Du-te sus

Citiți intrarea în flux

Creați un fișier Python care citește conținutul rezultatului subprocesului folosind o buclă „while” și stocați conținutul într-o variabilă. Conținutul acestei variabile este tipărit ulterior. Aici, comanda „curl” este utilizată în subprocesul pentru www.google.com URL.

#Import modul

import subproces

#Define comanda

cmd = [ 'răsuci' , „www.example.com” ]

p = subproces . Popen ( cmd , stdout = subproces . ȚEVA ,

stderr = subproces . ȚEVA , text = Adevărat >

#Inițializați variabila de ieșire

ieșire = ''

in timp ce Adevărat :

#Citiți rezultatul procesului linie cu linie

ln = p. stdout . Citeste linia ( )

#Terminați din buclă când se termină subprocesul

dacă nu ln:

pauză

ieșire = ieșire + ln

#Tipărește linia

imprimare ( ieșire )

#Obțineți codul de returnare după finalizarea procesului

cod_return = p. aștepta ( )

#Tipărește codul de retur

imprimare ( „Cod de returnare:” , cod_return )

Ieșire:

Ultima parte a celor trei ieșiri este prezentată în imaginea următoare. Codul de returnare după finalizarea subprocesului este 0:

Du-te sus

Concluzie

Diferite utilizări ale subprocesului Python. Popen() sunt prezentate în acest tutorial folosind mai multe scripturi Python care vor ajuta utilizatorii Python să cunoască utilizările de bază ale acestei funcții.