Kā izpildīt čaulas komandas Python, izmantojot apakšprocesa palaišanas metodi

How Execute Shell Commands Python Using Subprocess Run Method



Apakšprocess ir iebūvēts Python modulis, ko var izmantot, lai izveidotu jaunus procesus un mijiedarbotos ar to ievades un izvades datu plūsmām. Vienkāršāk sakot, jūs varat to izmantot, lai palaistu čaulas komandas un palaistu izpildāmos bināros failus, kas parasti ir izkaisīti dažādās tvertņu mapēs visā Linux failu sistēmā. Varat arī nodrošināt pilnu ceļu uz izpildāmu bināro failu un izmantot visus komandrindas slēdžus, kas saistīti ar bināro. Šajā rakstā tiks paskaidrots, kā izmantot apakšprocesa moduli un tā izpildes metodi Python lietotnēs. Visi rakstā iekļautie koda paraugi tiek pārbaudīti ar Python 3.8.2 operētājsistēmā Ubuntu 20.04.

Apakšprocesa palaišanas metode

Subprocess.run metode ņem argumentu sarakstu. Kad metode tiek izsaukta, tā izpilda komandu un gaida procesa pabeigšanu, beigās atgriežot objektu CompletedProcess. Objekts CompletedProcess atgriež stdout, stderr, sākotnējos argumentus, kas izmantoti, izsaucot metodi, un atgriešanās kodu. Stdout attiecas uz komandas izveidoto datu plūsmu, bet stderr attiecas uz kļūdām, kas radušās programmas izpildes laikā. Jebkurš atgriešanās kods, kas nav nulle (izejas kods), nozīmētu kļūdu ar komandu, kas izpildīta subprocess.run metodē.







1. piemērs. Teksta faila izvades saturs, izmantojot metodi Subprocess.run

Tālāk esošā komanda izvadīs faila data.txt saturu, pieņemot, ka tajā ir vārds = Jāņa virkne.



importēt apakšprocess
apakšprocess.skriet(['kaķis', 'data.txt'])

Palaižot iepriekš minēto kodu, tiks parādīta šāda izvade:



vārds=Džons
PabeigtsProcess(args=['kaķis', 'data.txt'],atgriešanās kods=0)

Saraksta argumenta pirmais elements ir izpildāmās komandas nosaukums. Jebkurš saraksta elements, kas seko pirmajam elementam, tiek uzskatīts par komandrindas opcijām vai slēdžiem. Lai definētu opcijas, varat izmantot arī vienu domuzīmi un dubultās svītras. Piemēram, lai uzskaitītu direktorijā esošos failus un mapes, kods būtu subprocess.run ([ls, -l]. Vairumā gadījumu jebkuru ar atdalītu argumentu apvalka komandā varat uzskatīt par atsevišķu elementu apakšprocess.run metodei piegādātais saraksts.





2. piemērs. Apakšprocesa izpildes metodes izvades apturēšana

Lai apspiestu metodes subprocess.run izvadi, jums kā papildu argumenti būs jānorāda stdout = subprocess.DEVNULL un stderr = subprocess.DEVNULL.

importēt apakšprocess

apakšprocess.skriet(['kaķis', 'data.txt'],stdout=apakšprocess.DEVNULL,
stderr=apakšprocess.DEVNULL)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:



CompletedProcess (args = ['kaķis', 'data.txt'], atgriešanās kods = 0)

3. piemērs: Subprocess.run metodes uztveršanas izvade

Lai attēlotu metodes subprocess.run izvadi, izmantojiet papildu argumentu ar nosaukumu capture_output = True.

importēt apakšprocess
izvade= apakšprocess.skriet(['kaķis', 'data.txt'],uztveršanas_izvade=Taisnība)
drukāt (izvade)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:

PabeigtsProcess(args=['kaķis', 'data.txt'],atgriešanās kods=0,
stdout=b'vārds = Jānis n',stderr=b'')

Jūs varat individuāli piekļūt stdout un stderr vērtībām, izmantojot metodes output.stdout un output.stderr. Izeja tiek veidota kā baitu secība. Lai iegūtu virkni kā izvadi, izmantojiet metodi output.stdout.decode (utf-8). Jūs varat arī pievienot tekstu = True kā papildu argumentu apakšprocesa.run izsaukumam, lai iegūtu izvadi virknes formātā. Lai iegūtu izejas statusa kodu, varat izmantot metodi output.returncode.

4. piemērs. Palieliniet izņēmumu, ja komanda nav izpildīta, izmantojot apakšprocesa palaišanas metodi

Lai paaugstinātu izņēmumu, kad komanda iziet ar statusu, kas nav nulle, izmantojiet argumentu check = True.

importēt apakšprocess
apakšprocess.skriet(['kaķis', 'data.tx'],uztveršanas_izvade=Taisnība,teksts=Taisnība,pārbaudiet=Taisnība)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:

paaugstināt CalledProcessError (retcode, process.args,
apakšprocess.ConedProcessError: Komanda '[' cat ',' data.tx ']'
atgriezts izejas statuss, kas nav nulle 1.

5. piemērs: nododiet virkni komandai, kas tiek izpildīta ar metodi Subprocess.run

Jūs varat nodot virkni komandai, kas jāizpilda, izmantojot metodi subprocess.run, izmantojot argumentu input = ’string’.

importēt apakšprocess
izvade= apakšprocess.skriet(['kaķis'], ievadi='data.txt',uztveršanas_izvade=Taisnība,
teksts=Taisnība,pārbaudiet=Taisnība)
drukāt (izvade)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:

CompletedProcess (args = ['kaķis'], atgriešanās kods = 0, stdout = 'data.txt', stderr = '')

Kā redzat, iepriekš minētais kods nodod failu data.txt kā virkni, nevis kā faila objektu. Lai nodotu failu data.txt kā failu, izmantojiet argumentu stdin.

ar atvērts('data.txt') f:
izvade= apakšprocess.skriet(['kaķis'],stdin=f,uztveršanas_izvade=Taisnība,
teksts=Taisnība,pārbaudiet=Taisnība)
drukāt (izvade)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:

PabeigtsProcess (args = ['cat'], returncode = 0, stdout = 'name = John n', stderr = '')

6. piemērs. Izpildiet komandu tieši čaulā, izmantojot metodi Subprocess.run

Ir iespējams palaist komandu tieši čaulā, kā tas ir, nevis izmantot virknes sadalījumu galvenajā komandā un tai sekojošās opcijās. Lai to izdarītu, kā papildu arguments jānodod shell = True. Tomēr python izstrādātāji to attur, jo, izmantojot shell = True, var rasties drošības problēmas. Jūs varat lasīt vairāk par ietekmi uz drošību no šeit .

importēt apakšprocess
apakšprocess.skriet('kaķis' data.txt '',apvalks=Taisnība)

Palaižot iepriekš minēto kodu, tiks iegūta šāda izvade:

vārds = Jānis

Secinājums

Subprocess.run metode Python ir diezgan spēcīga, jo tā ļauj palaist čaulas komandas pašā python. Tas palīdz ierobežot visu kodu līdz pašam python, bez papildu čaulas skripta koda nepieciešamības atsevišķos failos. Tomēr var būt diezgan sarežģīti pareizi marķēt čaulas komandas python sarakstā. Jūs varat izmantot shlex.split () metodi, lai marķētu vienkāršas čaulas komandas, bet garās, sarežģītās komandās - īpaši tajās, kurās ir cauruļu simboli - shlex nespēj pareizi sadalīt komandu. Šādos gadījumos atkļūdošana var būt sarežģīta problēma. Lai to izvairītos, varat izmantot argumentu shell = True, taču ar šo darbību ir saistītas dažas drošības problēmas.