Alamprotsessi käivitamise meetod
Meetod Subprocess.run võtab argumentide loendi. Meetodi kutsumisel täidab see käsu ja ootab protsessi lõppu, tagastades lõpuks objekti CompletedProcess. Objekt CompletedProcess tagastab stdout, stderr, meetodi kutsumisel kasutatud originaalsed argumendid ja tagastuskoodi. Stdout viitab käsu poolt toodetud andmevoole, stderr aga viitele, mis ilmnevad programmi käivitamisel. Mis tahes nullist erinev tagastamiskood (väljumiskood) tähendaks viga alamprotsessis run käivitatud käsuga.
Näide 1: tekstifaili väljundi sisu, kasutades meetodit Subprocess.run
Allolev käsk väljastab faili data.txt sisu, eeldades, et see sisaldab stringi nime = John.
import alamprotsess
alamprotsess.jooksma(['kass', 'data.txt'])
Ülaltoodud koodi käivitamine tagastab järgmise väljundi:
nimi=John
Valmisprotsess(args=['kass', 'data.txt'],tagasikood=0)
Loendiargumendi esimene element on käivitatava käsu nimi. Igale elemendile loendis, mis järgneb esimesele elemendile, loetakse käsurea suvanditeks või lülititeks. Valikute määramiseks võite kasutada ka ühe- ja topeltkriipsu. Näiteks kataloogis olevate failide ja kaustade loetlemiseks oleks kood alamprotsess.run ([ls, -l]. Enamikul juhtudel saate käsku shell iga tühikuga eraldatud argumenti käsitleda üksikute elementidena alamprotsessi.run meetodile lisatud loend.
Näide 2: Alamprotsessi käivitamise meetodi väljundi peatamine
Meetodi subprocess.run väljundi summutamiseks peate lisiargumentidena esitama stdout = subprocess.DEVNULL ja stderr = subprocess.DEVNULL.
import alamprotsessalamprotsess.jooksma(['kass', 'data.txt'],stdout=alamprotsess.DEVNULL,
stderr=alamprotsess.DEVNULL)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
CompletedProcess (args = ['kass', 'data.txt'], tagasikood = 0)
Näide 3: alamprotsessi käivitamise meetodi väljundi jäädvustamine
Meetodi subprocess.run väljundi jäädvustamiseks kasutage täiendavat argumenti, mille nimi on capture_output = True.
import alamprotsessväljund= alamprotsess.jooksma(['kass', 'data.txt'],püüdmise_väljund=Tõsi)
printida (väljund)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
Valmisprotsess(args=['kass', 'data.txt'],tagasikood=0,stdout=b'nimi = John n',stderr=b'')
Stdout ja stderr väärtustele saate individuaalselt juurde pääseda, kasutades meetodeid output.stdout ja output.stderr. Väljund toodetakse baitjärjestusena. Stringi saamiseks väljundina kasutage meetodit output.stdout.decode (utf-8). Väljundi stringivormingus saamiseks võite alamprotsessi run käivitada täiendava argumendina ka teksti = True. Väljumisolekukoodi saamiseks võite kasutada meetodit output.returncode.
Näide 4: Suurendage erandit käsu ebaõnnestumise korral, mis on täidetud meetodiga alamprotsess
Erandi tõstmiseks, kui käsk väljub nullist erineva olekuga, kasutage argumenti check = True.
import alamprotsessalamprotsess.jooksma(['kass', 'data.tx'],püüdmise_väljund=Tõsi,teksti=Tõsi,Kontrollima=Tõsi)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
tõsta CalledProcessError (retcode, process.args,alamprotsess.ColedProcessError: Käsk '[' kass ',' data.tx ']'
tagastas väljumisvälja nullist erineva oleku 1.
Näide 5: edastage string alamprotsessi käivitatud käsule
Stringi saate edastada käsule, mis tuleb täita subprocess.run meetodil, kasutades argumenti input = ’string’.
import alamprotsessväljund= alamprotsess.jooksma(['kass'], sisend='data.txt',püüdmise_väljund=Tõsi,
teksti=Tõsi,Kontrollima=Tõsi)
printida (väljund)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
CompletedProcess (args = ['kass'], tagasikood = 0, stdout = 'data.txt', stderr = '')Nagu näete, edastab ülaltoodud kood data.txt failina stringina, mitte failiobjektina. Faili data.txt failina edastamiseks kasutage argumenti stdin.
koos lahti('data.txt') naguf:väljund= alamprotsess.jooksma(['kass'],stdin=f,püüdmise_väljund=Tõsi,
teksti=Tõsi,Kontrollima=Tõsi)
printida (väljund)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
CompletedProcess (args = ['kass'], tagasikood = 0, stdout = 'nimi = John n', stderr = '')Näide 6: täitke käsk otse Shellis, kasutades meetodit Subprocess.run
Käsu saab käivitada otse kestasse sellisena, nagu see on, selle asemel, et kasutada põhikäskluses ja sellele järgnevates suvandites stringi lõhestamist. Selleks tuleb täiendava argumendina edastada shell = True. Pythoni arendajad ei soovita seda siiski teha, sest shell = True kasutamine võib põhjustada turvaprobleeme. Turvalisuse kohta saate rohkem lugeda siit siin .
import alamprotsessalamprotsess.jooksma('kass' data.txt '',kest=Tõsi)
Ülaltoodud koodi käivitamine annab järgmise väljundi:
nimi = JohnJäreldus
Pythonis kasutatav meetod alamprotsess.run on üsna võimas, kuna see võimaldab teil käivitada shellikäsklusi pythonis. See aitab piirata kogu koodi ainult pythoniga, ilma et oleks vaja eraldi failides kesta skripti koodi. Siiski võib olla üsna keeruline shellikäskude pythoniloendis õigesti märgistada. Võite kasutada meetodit shlex.split () lihtsate kesta käskude märkimiseks, kuid pikkade ja keerukate käskude puhul - eriti need, millel on torusümbolid - ei suuda shlex käsku õigesti jagada. Sellistel juhtudel võib silumine olla keeruline probleem. Selle vältimiseks võite kasutada argumenti shell = True, kuid selle toiminguga on seotud teatud turvalisusega seotud probleemid.