Kuidas Pythonis Shelli käske täita, kasutades alamprotsessi käitamise meetodit

How Execute Shell Commands Python Using Subprocess Run Method



Alamprotsess on sisseehitatud Pythoni moodul, mida saab kasutada uute protsesside loomiseks ning nende sisend- ja väljundandmete voogudega suhtlemiseks. Lihtsamalt öeldes saate seda kasutada shellikäskude käivitamiseks ja käivitatavate binaarfailide käivitamiseks, mis on tavaliselt hajutatud erinevatesse prügikasti kaustadesse kogu Linuxi failisüsteemis. Samuti saate käivitatavale binaarfailile anda täieliku tee ja kasutada mis tahes binaarfailiga seotud käsurea lüliteid. Selles artiklis selgitatakse, kuidas kasutada alamprotsessimoodulit ja selle käitamismeetodit Pythoni rakendustes. Kõiki artiklis sisalduvaid koodinäidiseid testitakse Ubuntu 20.04 versiooniga Python 3.8.2.

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 alamprotsess

alamprotsess.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 alamprotsess
vä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 alamprotsess
alamprotsess.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 alamprotsess
vä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 alamprotsess
alamprotsess.jooksma('kass' data.txt '',kest=Tõsi)

Ülaltoodud koodi käivitamine annab järgmise väljundi:

nimi = John

Jä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.