Python Subprocess.Mga Halimbawa ng Popen

Python Subprocess Mga Halimbawa Ng Popen



Ang Python subprocess ay isa sa mga kapaki-pakinabang na module na ginagamit upang magpatakbo ng iba't ibang shell command, proseso, at magsagawa ng isa pang script o mga executable na file gamit ang Python script. Magagamit din ito para sa pag-redirect ng data mula sa isang proseso patungo sa isa pang proseso at paghawak sa mga error na nabuo ng mga proseso ng bata. Ang subprocess module ay may maraming klase na ginagamit para sa iba't ibang layunin. Ang klase ng 'subprocess.Popen' ay isa sa mga klase ng modyul na ito na ginagamit upang makipag-ugnayan sa mga panlabas na proseso at magsagawa ng iba't ibang uri ng mga gawain sa mga proseso. Maramihang paggamit ng klase ng 'subprocess.Popen' sa script ng Python ay ipinapakita sa tutorial na ito.

Paksa ng Nilalaman:

  1. Magpatakbo ng Simple Linux Command
  2. Magpatakbo ng Command na may Input Data
  3. Magpatakbo ng Python Script
  4. Pangasiwaan ang Subprocess Error
  5. Ibalik ang Code of Subprocess.Popen
  6. I-redirect ang Output ng Subprocess sa File
  7. Multiprocessing Gamit ang Subprocess.Popen
  8. Pangasiwaan ang Input at Output Stream s
  9. Kontrolin ang Timeout at Delay
  10. Magbasa ng Streaming Input

Magpatakbo ng Simple Linux Command

Ang utos na 'petsa' ay ginagamit upang ipakita ang kasalukuyang petsa at oras ng system. Gumawa ng Python file na may sumusunod na script na lumilikha ng subprocess na nagpapatupad ng command na 'date' at i-print ang output ng command na ito:

#Import ang module

angkat subprocess

#Tukuyin ang isang utos para sa subprocess at

#bukas na proseso sa pamamagitan ng paggamit ng Popen() function

output = subprocess . Popen ( [ 'date' ] , stdout = subprocess . PIPE )

#Retrieve ang output at error sa pamamagitan ng pakikipag-ugnayan sa proseso

stdout , stderr = output. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

Output:







Lumilitaw ang sumusunod na output pagkatapos isagawa ang nakaraang script:



  p1



Pumunta sa tuktok





Magpatakbo ng Command na may Input Data

Ang command na 'wc' na may opsyon na '-c' ay ginagamit upang bilangin ang kabuuang bilang ng mga character ng string value na ibinigay kasama ng command na ito. Gumawa ng Python file na may sumusunod na script na lumilikha ng subprocess na may Popen() function para patakbuhin ang mga command na “wc –c”. Ang halaga ng string ay kinuha mula sa terminal pagkatapos isagawa ang script at ang kabuuang mga character ng input string ay naka-print sa output.

#Import ang module

angkat subprocess

#Tukuyin ang isang utos para sa subprocess at

#Buksan ang proseso sa pamamagitan ng paggamit ng Popen() function

output = subprocess . Popen ( [ 'wc' , '-c' ] , stdout = subprocess . PIPE )

#Retrieve ang output at error sa pamamagitan ng pakikipag-ugnayan sa proseso

stdout , stderr = output. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

Output:



Lumilitaw ang sumusunod na output para sa halaga ng input na 'Mga Halimbawa ng Python Subprocess':

Pumunta sa tuktok

Magpatakbo ng Python Script

Lumikha ng Python file na pinangalanang 'sum.py' na may sumusunod na script na kinakalkula ang kabuuan ng dalawang numero at ang mga numerong ito ay ibinigay bilang mga argumento sa command-line:

sum.py

#Mag-import ng kinakailangang module

angkat sys

#Bilangin ang kabuuang mga argumento

n = lamang ( sys . argv )

#Idagdag ang unang dalawang halaga ng argumento

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

#I-print ang resulta ng karagdagan

print ( 'Ang kabuuan ng' + sys . argv [ 1 ] + 'at' + sys . argv [ 2 ] + 'ay' , kabuuan )

Lumikha ng Python file kasama ang sumusunod na script na magpapatakbo ng Python file pinangalanan kabuuan . py kasama dalawang argumento sa pamamagitan ng paglikha ng a subprocess .

#Import ang module

angkat subprocess

#Run python script sa subprocess at

#buksan ang proseso sa pamamagitan ng paggamit ng Popen() function

output = subprocess . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stdout = subprocess . PIPE ) #Retrieve ang output at error sa pamamagitan ng pakikipag-ugnayan sa proseso

stdout , stderr = output. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

Output:

Lumilitaw ang sumusunod na output pagkatapos isagawa ang nakaraang script:

Pumunta sa tuktok

`

Pangasiwaan ang Subprocess Error

Gumawa ng Python file na may sumusunod na script na humahawak sa mga error ng subprocess gamit ang block na 'try-except'. Ang isang utos ay kinuha mula sa gumagamit at ito ay isinasagawa ng subprocess. Ang mensahe ng error ay ipinapakita kung ang anumang di-wastong utos ay kinuha mula sa user.

#Import ang mga module

angkat subprocess

angkat sys

#Take command mula sa user

utos = input ( 'Magpasok ng wastong utos: ' )

subukan :

#Buksan ang proseso sa pamamagitan ng paggamit ng Popen() function

output = subprocess . Popen ( [ utos ] , stdout = subprocess . PIPE )

#Retrieve ang output at error sa pamamagitan ng pakikipag-ugnayan sa proseso

stdout , stderr = output. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

maliban sa :

print ( 'Error:' , sys . exc_info ( ) )

Output:

Ang sumusunod na output ay lilitaw kung ang 'pwd' na utos ay kinuha bilang input na isang wastong utos:

  p4-1

Ang sumusunod na output ay lilitaw kung ang 'usr' na utos ay kinuha bilang input na isang wastong utos:

  p4-2

Pumunta sa tuktok

Ibalik ang Code of Subprocess.Popen

Gumawa ng Python file na may sumusunod na script na nagpapatupad ng command na 'ls' sa pamamagitan ng subprocess para makuha ang listahan ng lahat ng Python file mula sa kasalukuyang lokasyon. Ang script ay naghihintay upang makumpleto ang subprocess at i-print ang return code.

#Import ang mga module

angkat subprocess

angkat sys

#Itakda ang utos

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

subukan :

#Buksan ang proseso sa pamamagitan ng paggamit ng Popen() function

output = subprocess . Popen ( utos , stdout = subprocess . PIPE ,

stderr = subprocess . PIPE , text = totoo )

#Maghintay upang makumpleto ang proseso

retCode = output. maghintay ( )

#I-print ang return code

print ( 'Return Code:' , retCode )

maliban sa :

#Print error message para sa mali

print ( 'Error:' , sys . exc_info ( ) )

Output:

Lumilitaw ang isang katulad na output pagkatapos isagawa ang nakaraang script:

Pumunta sa tuktok

I-redirect ang Output ng Subprocess sa File

Gumawa ng Python file na may sumusunod na script na nagsusulat ng output ng subprocess sa isang text file. Ang utos na isinagawa ng subprocess ay kinuha mula sa user.

#Mag-import ng module

angkat subprocess

#Tukuyin ang filename

filename = 'outfile.txt'

#Kumuha ng ping command

cmd = input ( 'Magpasok ng ping command: ' )

#Split ang kinuhang input batay sa espasyo

args = cmd . hati ( )

#Isulat ang output ng command sa file

kasama bukas ( filename , 'Sa' ) bilang outdata:

proseso = subprocess . Popen ( args , stdout = outdata )

#Maghintay para makumpleto ang proseso

return_code = proseso. maghintay ( )

Output:

Ayon sa sumusunod na output, ang 'ping -c 3 www.google.com Ang command na ” ay kinuha mula sa user at ang command na “cat” ay ginagamit upang ipakita ang nilalaman ng file na isinulat ng subprocess:

Pumunta sa tuktok

Multiprocessing Gamit ang Subprocess.Popen

Gumawa ng Python file na may sumusunod na script kung saan ipinapakita ang paggamit ng multiprocessing gamit ang subprocess. Dito, ang isang function na pinangalanang display_msg() ay tinatawag nang maraming beses gamit ang multiprocessing.

#Mag-import ng mga kinakailangang module

angkat multiprocessing

angkat subprocess

#Tukuyin ang function na tatawagin sa pamamagitan ng multiprocessing

def display_msg ( n ) :

#Define ang command gamit ang format() function

cmd = 'echo 'Python Programming'' . pormat ( n )

#Buksan ang proseso sa pamamagitan ng paggamit ng Popen() function

proseso = subprocess . Popen ( cmd , kabibi = totoo , stdout = subprocess . PIPE )

#Retrieve ang output at error sa pamamagitan ng pakikipag-ugnayan sa proseso

stdout , pagkakamali = proseso. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

#Tawagan ang function nang 5 beses sa pamamagitan ng paggawa ng multiprocessing.Pool

kasama multiprocessing. Pool ( multiprocessing. cpu_count ( ) ) bilang mp:

#Map ang function

mp. mapa ( display_msg , saklaw ( 1 , 5 ) )

Output:

Lumilitaw ang sumusunod na output pagkatapos isagawa ang nakaraang script:

Pumunta sa tuktok

Pangasiwaan ang Input at Output Stream

Gumawa ng text file na pinangalanang 'test.txt' na may sumusunod na nilalaman bago gumawa ng Python script ng halimbawang ito.

test.txt

PERL

sawa

bash

php

Gumawa ng Python file na may sumusunod na script na gumagamit ng isang subprocess para basahin ang content ng “test.txt” file at isa pang subprocess para maghanap ng partikular na salita sa text file na iyon. Dito, hinahanap ang salitang 'python' sa 'test.txt file' na naglalaman ng salitang ito.

#Mag-import ng mga module

angkat subprocess

#Tukuyin ang isang proseso para sa input stream

pinoproseso = subprocess . Popen ( [ 'pusa' , 'test.txt' ] , stdout = subprocess . PIPE , text = Tru > #Tukuyin ang isang proseso para sa output stream

out_process = subprocess . Popen (

[ 'hawakan' , 'python' ] , stdin = pinoproseso. stdout ,

stdout = subprocess . PIPE , text = totoo )

#Imbak ang output ng mga proseso ng input at output

output , _ = out_process. makipag-usap ( )

#I-print ang output

print ( 'Output:' , output )

Output:

Ang sumusunod na output ay lilitaw pagkatapos isagawa ang script:

Pumunta sa tuktok

Kontrolin ang Subprocess Gamit ang Timer

Gumawa ng Python file na may sumusunod na script na gumagamit ng timer para magsagawa ng command gamit ang subprocess. Dito, ang 'try-except' block ay ginagamit upang simulan ang timer at ang 'finally' block ay ginagamit upang kanselahin ang timer.

#Import ang subprocess module

angkat subprocess

#Import ang module ng Timer

mula sa threading angkat Timer

#Tukuyin ang utos

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

#Buksan ang proseso

p = subprocess . Popen (

cmd , stdout = subprocess . PIPE , stderr = subprocess . PIPE )

#Tukuyin ang timer

timer = Timer ( 2 , lambda proseso: proseso. pumatay ( ) , [ p ] )

subukan :

#Simulan ang timer

timer. simulan ( )

#Basahin ang output

stdout , _ = p. makipag-usap ( )

#I-print ang output

print ( stdout. mag-decode ( ) )

maliban sa :

#Print error message para sa mali

print ( 'Error:' , sys . exc_info ( ) )

sa wakas :

#Ihinto ang timer

timer. kanselahin ( )

Output:

Ang sumusunod na output ay lilitaw pagkatapos isagawa ang script:

Pumunta sa tuktok

Basahin ang Streaming Input

Gumawa ng Python file na nagbabasa ng content ng subprocess na output gamit ang 'while' loop at iimbak ang content sa isang variable. Ang nilalaman ng variable na ito ay ipi-print sa ibang pagkakataon. Dito, ang command na 'curl' ay ginagamit sa subprocess para sa www.google.com URL.

#Import ang module

angkat subprocess

#Tukuyin ang utos

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

p = subprocess . Popen ( cmd , stdout = subprocess . PIPE ,

stderr = subprocess . PIPE , text = totoo >

#Initialize ang output variable

output = ''

habang totoo :

#Basahin ang proseso ng output linya sa linya

ln = p. stdout . Basahin ang linya ( )

#Wakasan mula sa loop kapag natapos ang subprocess

kung hindi sa:

pahinga

output = output + ln

#I-print ang linya

print ( output )

#Kunin ang return code pagkatapos matapos ang proseso

return_code = p. maghintay ( )

#I-print ang return code

print ( 'Return code: ' , return_code )

Output:

Ang huling bahagi ng tatlong mga output ay ipinapakita sa sumusunod na larawan. Ang return code pagkatapos makumpleto ang subprocess ay 0:

Pumunta sa tuktok

Konklusyon

Ang iba't ibang paggamit ng Python subprocess.Popen() ay ipinapakita sa tutorial na ito gamit ang maramihang Python script na makakatulong sa mga gumagamit ng Python na malaman ang mga pangunahing gamit ng function na ito.