Python Subprocess.Popen példák

Python Subprocess Popen Peldak



A Python alfolyamat egyike azon hasznos moduloknak, amelyek különböző shell-parancsok és folyamatok futtatására szolgálnak, valamint másik szkript vagy végrehajtható fájlok végrehajtására a Python-szkript használatával. Használható az adatok egyik folyamatból egy másik folyamatba való átirányítására és a gyermekfolyamatok által generált hibák kezelésére is. Az alfolyamat modul számos osztályt tartalmaz, amelyeket különféle célokra használnak. A „subprocess.Popen” osztály ennek a modulnak az egyik osztálya, amely a külső folyamatokkal való interakcióra és a folyamatok közötti különböző típusú feladatok végrehajtására szolgál. Ez az oktatóanyag a Python-szkript „subprocess.Popen” osztályának többszörös használatát mutatja be.

Tartalom témája:

  1. Futtasson egy egyszerű Linux-parancsot
  2. Futtasson egy parancsot a bemeneti adatokkal
  3. Futtasson egy Python-szkriptet
  4. Kezelje az alfolyamat hibát
  5. Adja vissza a részfolyamat kódját.Popen
  6. Irányítsa át az alfolyamat kimenetét a fájlba
  7. Multiprocessing Subprocess használatával.Popen
  8. Kezelje a bemeneti és kimeneti adatfolyamot s
  9. Az időtúllépés és a késleltetés szabályozása
  10. Streaming bemenet olvasása

Futtasson egy egyszerű Linux-parancsot

A „date” parancs az aktuális rendszerdátum és idő megjelenítésére szolgál. Hozzon létre egy Python-fájlt a következő szkripttel, amely létrehoz egy alfolyamatot, amely végrehajtja a „date” parancsot, és nyomtassa ki a parancs kimenetét:

#Importálja a modult

import részfolyamat

#Adjon meg egy parancsot az alfolyamathoz és

#nyissa meg a folyamatot a Popen() függvény használatával

Kimenet = részfolyamat . Popen ( [ 'dátum' ] , stdout = részfolyamat . CSŐ )

#A kimenet és a hiba visszakeresése a folyamattal való kommunikációval

stdout , stderr = Kimenet. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( stdout. dekódolni ( ) )

Kimenet:







Az előző szkript végrehajtása után a következő kimenet jelenik meg:



  p1



Ugrás a tetejére





Futtasson egy parancsot a bemeneti adatokkal

A „wc” parancs a „-c” kapcsolóval a parancshoz tartozó karakterlánc-érték teljes karakterszámának megszámlálására szolgál. Hozzon létre egy Python-fájlt a következő szkripttel, amely alfolyamatot hoz létre a Popen() függvénnyel a „wc –c” parancsok futtatásához. A karakterlánc értéke a script végrehajtása után kerül levételre a terminálról, és a bemeneti karakterlánc összes karaktere kinyomtatásra kerül a kimenetben.

#Importálja a modult

import részfolyamat

#Adjon meg egy parancsot az alfolyamathoz és

#Nyissa meg a folyamatot a Popen() függvény segítségével

Kimenet = részfolyamat . Popen ( [ 'WC' , '-c' ] , stdout = részfolyamat . CSŐ )

#A kimenet és a hiba visszakeresése a folyamattal való kommunikációval

stdout , stderr = Kimenet. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( stdout. dekódolni ( ) )

Kimenet:



A következő kimenet jelenik meg a „Python Subprocess Examples” bemeneti értékhez:

Ugrás a tetejére

Futtasson egy Python-szkriptet

Hozzon létre egy „sum.py” nevű Python-fájlt a következő szkripttel, amely két szám összegét számítja ki, és ezek a számok parancssori argumentumként jelennek meg:

sum.py

#Importálja a szükséges modult

import sys

#Számolja meg az összes argumentumot

n = csak ( sys . argv )

#Adja hozzá az első két argumentumértéket

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

#Nyomtassa ki az összeadás eredményét

nyomtatás ( 'összege' + sys . argv [ 1 ] + 'és' + sys . argv [ 2 ] + 'van' , összeg )

Hozzon létre egy Pythont fájlt val vel a következő szkript, amely egy Pythont futtat fájlt nevezett összeg . py val vel két argumentum létrehozásával a részfolyamat .

#Importálja a modult

import részfolyamat

#Futtassa a python szkriptet az alfolyamatban és

#nyissa meg a folyamatot a Popen() függvény segítségével

Kimenet = részfolyamat . Popen ( [ 'python3' , 'sum.py' , '25' , '55' ] , stdout = részfolyamat . CSŐ ) #A kimenet és a hiba visszakeresése a folyamattal való kommunikációval

stdout , stderr = Kimenet. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( stdout. dekódolni ( ) )

Kimenet:

Az előző szkript végrehajtása után a következő kimenet jelenik meg:

Ugrás a tetejére

`

Kezelje az alfolyamat hibát

Hozzon létre egy Python-fájlt a következő szkripttel, amely kezeli az alfolyamat hibáit a „try-except” blokk használatával. Egy parancsot vesz a felhasználó, és az alfolyamat végrehajtja. A hibaüzenet akkor jelenik meg, ha a felhasználó érvénytelen parancsot kapott.

#Importálja a modulokat

import részfolyamat

import sys

#Vegye át a parancsot a felhasználótól

parancs = bemenet ( 'Írjon be egy érvényes parancsot: ' )

próbáld ki :

#Nyissa meg a folyamatot a Popen() függvény segítségével

Kimenet = részfolyamat . Popen ( [ parancs ] , stdout = részfolyamat . CSŐ )

#A kimenet és a hiba visszakeresése a folyamattal való kommunikációval

stdout , stderr = Kimenet. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( stdout. dekódolni ( ) )

kivéve :

nyomtatás ( 'Hiba:' , sys . exc_info ( ) )

Kimenet:

A következő kimenet jelenik meg, ha a „pwd” parancsot érvényes parancs bemenetként veszi:

  p4-1

A következő kimenet jelenik meg, ha az „usr” parancsot érvényes parancs bemenetként veszi:

  p4-2

Ugrás a tetejére

Adja vissza a részfolyamat kódját.Popen

Hozzon létre egy Python-fájlt a következő szkripttel, amely egy „ls” parancsot hajt végre az alfolyamat során, hogy megkapja az összes Python-fájl listáját az aktuális helyről. A szkript vár az alfolyamat befejezésére, és kinyomtatja a visszatérési kódot.

#Importálja a modulokat

import részfolyamat

import sys

# Állítsa be a parancsot

parancs = [ 'ls' , '-én' , '*.py' ]

próbáld ki :

#Nyissa meg a folyamatot a Popen() függvény segítségével

Kimenet = részfolyamat . Popen ( parancs , stdout = részfolyamat . CSŐ ,

stderr = részfolyamat . CSŐ , szöveg = Igaz )

#Várja meg a folyamat befejezését

retCode = Kimenet. várjon ( )

#Nyomtassa ki a visszatérési kódot

nyomtatás ( 'Visszaküldési kód:' , retCode )

kivéve :

#Nyomtassa ki a hibaüzenetet a rosszért

nyomtatás ( 'Hiba:' , sys . exc_info ( ) )

Kimenet:

Hasonló kimenet jelenik meg az előző szkript végrehajtása után:

Ugrás a tetejére

Irányítsa át az alfolyamat kimenetét a fájlba

Hozzon létre egy Python-fájlt a következő szkripttel, amely az alfolyamat kimenetét szövegfájlba írja. Az alfolyamat által végrehajtott parancs a felhasználótól származik.

#Modul importálása

import részfolyamat

#Határozza meg a fájlnevet

fájl név = 'outfile.txt'

#Vegyél ki egy ping parancsot

cmd = bemenet ( 'Írjon be egy ping parancsot:' )

#Ossza fel a vett bemenetet a tér alapján

args = cmd . hasított ( )

#Írja be a parancs kimenetét a fájlba

val vel nyisd ki ( fájl név , 'Ban ben' ) mint elavult adatok:

folyamat = részfolyamat . Popen ( args , stdout = elavult adatok )

#Várja meg a folyamat befejezését

return_code = folyamat. várjon ( )

Kimenet:

A következő kimenet szerint a „ping -c 3 www.google.com ” parancs a felhasználótól származik, a „cat” parancs pedig az alfolyamat által írt fájl tartalmának megjelenítésére szolgál:

Ugrás a tetejére

Multiprocessing Subprocess használatával.Popen

Hozzon létre egy Python-fájlt a következő szkripttel, ahol az alfolyamat használatával látható a többfeldolgozás használata. Itt a display_msg() nevű függvényt többszörös feldolgozással hívják meg.

#Importálja a szükséges modulokat

import több feldolgozás

import részfolyamat

#Határozza meg a többfeldolgozás által meghívott függvényt

def display_msg ( n ) :

#Határozza meg a parancsot a format() függvénnyel

cmd = 'echo 'Python programozás'' . formátum ( n )

#Nyissa meg a folyamatot a Popen() függvény segítségével

folyamat = részfolyamat . Popen ( cmd , héj = Igaz , stdout = részfolyamat . CSŐ )

#A kimenet és a hiba visszakeresése a folyamattal való kommunikációval

stdout , hiba = folyamat. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( stdout. dekódolni ( ) )

#Hívja meg a függvényt 5-ször a multiprocessing.Pool létrehozásával

val vel több feldolgozás. Medence ( több feldolgozás. cpu_count ( ) ) mint mp:

#Térképezze fel a függvényt

mp. térkép ( display_msg , hatótávolság ( 1 , 5 ) )

Kimenet:

Az előző szkript végrehajtása után a következő kimenet jelenik meg:

Ugrás a tetejére

Kezelje a bemeneti és kimeneti adatfolyamokat

A példa Python-szkriptjének létrehozása előtt hozzon létre egy „test.txt” nevű szövegfájlt a következő tartalommal.

teszt.txt

PERL

piton

bash

php

Hozzon létre egy Python-fájlt a következő szkripttel, amely egy alfolyamatot használ a „test.txt” fájl tartalmának beolvasására, egy másik alfolyamatot pedig egy adott szó keresésére a szövegfájlban. Itt a „python” szót keresi a „test.txt fájlban”, amely ezt a szót tartalmazza.

#Modulok importálása

import részfolyamat

#Határozzon meg egy folyamatot a bemeneti adatfolyamhoz

folyamatban = részfolyamat . Popen ( [ 'macska' , 'teszt.txt' ] , stdout = részfolyamat . CSŐ , szöveg = Tru > #Határozzon meg egy folyamatot a kimeneti adatfolyamhoz

out_process = részfolyamat . Popen (

[ 'markolat' , 'piton' ] , stdin = folyamatban. stdout ,

stdout = részfolyamat . CSŐ , szöveg = Igaz )

# Tárolja a bemeneti és kimeneti folyamatok kimenetét

Kimenet , _ = out_process. kommunikálni ( )

#Nyomtassa ki a kimenetet

nyomtatás ( 'Kimenet:' , Kimenet )

Kimenet:

A következő kimenet jelenik meg a szkript végrehajtása után:

Ugrás a tetejére

Az alfolyamat vezérlése időzítővel

Hozzon létre egy Python-fájlt a következő szkripttel, amely időzítőt használ egy parancs végrehajtásához egy alfolyamat segítségével. Itt a „try-except” blokk az időzítő indítására szolgál, a „végre” blokk pedig az időzítő törlésére szolgál.

#Importálja az alfolyamat modult

import részfolyamat

#Importálja az időzítő modult

tól től befűzés import Időzítő

#Határozza meg a parancsot

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

#Nyissa meg a folyamatot

p = részfolyamat . Popen (

cmd , stdout = részfolyamat . CSŐ , stderr = részfolyamat . CSŐ )

#Határozza meg az időzítőt

időzítő = Időzítő ( 2 , lambda folyamat: folyamat. megöl ( ) , [ p ] )

próbáld ki :

#Indítsa el az időzítőt

időzítő. Rajt ( )

#Kimenet olvasása

stdout , _ = p. kommunikálni ( )

#Nyomtatási kimenet

nyomtatás ( stdout. dekódolni ( ) )

kivéve :

#Nyomtassa ki a hibaüzenetet a rosszért

nyomtatás ( 'Hiba:' , sys . exc_info ( ) )

végül :

# Állítsa le az időzítőt

időzítő. megszünteti ( )

Kimenet:

A következő kimenet jelenik meg a szkript végrehajtása után:

Ugrás a tetejére

Olvassa el a streaming bemenetet

Hozzon létre egy Python-fájlt, amely beolvassa az alfolyamat kimenetének tartalmát egy „while” ciklus segítségével, és tárolja a tartalmat egy változóban. Ennek a változónak a tartalma később kerül kinyomtatásra. Itt a „curl” parancs az alfolyamatban használatos a www.google.com URL.

#Modul importálása

import részfolyamat

#Define parancs

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

p = részfolyamat . Popen ( cmd , stdout = részfolyamat . CSŐ ,

stderr = részfolyamat . CSŐ , szöveg = Igaz >

#Inicializálja a kimeneti változót

Kimenet = ''

míg Igaz :

# Olvassa el a folyamat kimenetét soronként

ln = p. stdout . readline ( )

#Ha az alfolyamat befejeződik, fejezze be a ciklust

ha nem ln:

szünet

Kimenet = kimenet + ln

#Nyomtassa ki a sort

nyomtatás ( Kimenet )

#A folyamat befejezése után szerezze be a visszatérési kódot

return_code = p. várjon ( )

#Nyomtassa ki a visszatérési kódot

nyomtatás ( 'Visszatérési kód:' , return_code )

Kimenet:

A három kimenet utolsó része a következő képen látható. Az alfolyamat befejezése után a visszatérési kód 0:

Ugrás a tetejére

Következtetés

Ebben az oktatóanyagban a Python-alfolyamat különböző felhasználási módjai láthatók. A Popen() több Python-szkriptet használ, amelyek segítenek a Python-felhasználóknak megismerni a függvény alapvető felhasználásait.