Python

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

Kā izpildīt čaulas komandas Python, izmantojot apakšprocesa palaišanas metodi
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 “bin” mapēs visā Linux failu sistēmā. Varat arī piegādāt pilnu ceļu uz izpildāmo 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ā palaišanas metodi Python lietotnēs. Visi raksta kodu paraugi tiek pārbaudīti ar Python 3.8.2 uz Ubuntu 20.04.

Apakšprocess.palaist metodi

Apakšprocess.palaišanas 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 straumi, bet stderr - uz visām 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 apakšprocesā.palaišanas metode.

1. piemērs: Teksta faila saturs, izmantojot apakšprocesu.palaist metodi

Zemāk esošā komanda izdos “datu.txt ”fails, pieņemot, ka tajā ir virkne“ name = John ”.

importa apakšprocess
apakšprocess.palaist (["kaķis", "dati.txt "])

Palaidot iepriekš minēto kodu, tiks parādīta šāda izeja:

vārds = Jānis
CompletedProcess (args = ['kaķis', 'dati.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 un divas domuzīmes. Piemēram, lai direktorijā uzskaitītu failus un mapes, kods būtu “apakšprocess.palaist ([“ls”, “-l”] ”. Lielākoties šajos gadījumos jebkuru ar atstarpēm atdalītu argumentu čaulas komandā varat uzskatīt par atsevišķu elementu apakšprocesam piegādātajā sarakstā.palaišanas metode.

2. piemērs: Apspiediet apakšprocesa izvadi.palaist metodi

Lai nomāktu apakšprocesa izvadi.palaist metodi, jums būs jāpiegādā “stdout = subprocess.ATTĪSTĪBA ”un“ stderr = apakšprocess.DEVNULL ”kā papildu argumentus.

importa apakšprocess
apakšprocess.palaist (["kaķis", "dati.txt "], stdout = apakšprocess.ATTĪSTĪT,
stderr = apakšprocess.ATTĪSTĪBA)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

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

3. piemērs: Apakšprocesa izvades tveršana.palaist metodi

Lai notvertu apakšprocesa izvadi.palaišanas metodi, izmantojiet papildu argumentu ar nosaukumu “capture_output = True”.

importa apakšprocess
izeja = apakšprocess.palaist (["kaķis", "dati.txt "], capture_output = True)
izdruka (izeja)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

CompletedProcess (args = ['kaķis', 'dati.txt '], atgriešanās kods = 0,
stdout = b'name = John \ n ', stderr = b ")

Varat individuāli piekļūt stdout un stderr vērtībām, izmantojot “output”.stdout ”un“ output.stderr ”metodes. Rezultāts tiek ražots kā baitu secība. Lai iegūtu izvades virkni, izmantojiet “output.stdout.dekodēt (“utf-8”) ”metodi. Apakšprocesam kā papildu argumentu varat norādīt arī tekstu “True”.palaist zvanu, lai iegūtu izvadi virknes formātā. Lai iegūtu izejas statusa kodu, varat izmantot “output.atgriešanās kods ”metodi.

4. piemērs: palieliniet izņēmumu par apakšprocesa izpildītās komandas atteici.palaist metodi

Lai izvirzītu izņēmumu, kad komanda iziet ar statusu, kas nav nulle, izmantojiet argumentu “check = True”.

importa apakšprocess
apakšprocess.palaist (["kaķis", "dati.tx "], capture_output = True, text = True, check = True)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

paaugstināt CalledProcessError (pārkodēt, process.argumentē,
apakšprocess.CalledProcessError: komanda '[' cat ',' data.tx ']'
atgriezts izejas statuss, kas nav nulle 1.

5. piemērs: nododiet virkni komandai, kuru izpilda apakšprocess.palaist metodi

Jūs varat nodot virkni komandai, kas jāizpilda ar apakšprocesu.palaist metodi, izmantojot argumentu “input = 'string' '.

importa apakšprocess
izeja = apakšprocess.palaist (["kaķis"], input = "dati.txt ", capture_output = True,
teksts = taisnība, pārbaude = taisnība)
izdruka (izeja)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

CompletedProcess (args = ['cat'], atgriešanās kods = 0, stdout = "dati.txt ", stderr =")

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

ar atvērtu ("dati.txt ") kā f:
izeja = apakšprocess.palaist (["kaķis"], stdin = f, capture_output = True,
teksts = taisnība, pārbaude = taisnība)
izdruka (izeja)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

CompletedProcess (args = ['cat'], atgriešanās kods = 0, stdout = "name = John \ n", stderr = ")

6. piemērs: izpildiet komandu tieši čaulā, izmantojot apakšprocesu.palaist metodi

Ir iespējams palaist komandu tieši tādā čaulā, kāda tā ir, nevis izmantot virknes sadalījumu galvenajā komandā un opcijas, kas tai seko. Lai to izdarītu, jums kā papildu arguments jānokārto “shell = True”. Python izstrādātāji tomēr to attur, jo “shell = True” izmantošana var izraisīt drošības problēmas. Šeit varat uzzināt vairāk par drošības ietekmi.

importa apakšprocess
apakšprocess.palaist ("kaķu" dati.txt '", apvalks = True)

Palaidot iepriekš minēto kodu, tiks izveidota šāda izeja:

vārds = Jānis

Secinājums

Apakšprocess.palaist metode Python ir diezgan spēcīga, jo tā ļauj palaist čaulas komandas pašā pitonā. Tas palīdz ierobežot visu kodu līdz pašam pitonam, bez nepieciešamības atsevišķos failos pievienot papildu čaulas skripta kodu. Pareizi tokenizēt čaulas komandas pitonu sarakstā var būt diezgan sarežģīti. Jūs varat izmantot “shlex.split () ”metode vienkāršu čaulas komandu marķēšanai, bet garās, sarežģītās komandās - īpaši komandās ar caurules simboliem - shlex neizdodas pareizi sadalīt komandu. Šādos gadījumos atkļūdošana var būt grūts jautājums. Lai to izvairītos, varat izmantot argumentu “shell = True”, taču ar šo darbību ir saistītas noteiktas drošības problēmas.

Microsoft Sculpt Touch bezvadu peles apskats
Es nesen lasīju par Microsoft Sculpt Touch bezvadu pele un nolēma to nopirkt. Pēc kāda laika izmantošanas es nolēmu dalīties savā pieredzē ar to. Šo b...
AppyMouse ekrāna skārienpaliktnis un peles rādītājs Windows planšetdatoriem
Planšetdatoru lietotājiem bieži pietrūkst peles rādītāja, it īpaši, ja viņi parasti lieto klēpjdatorus. Skārienekrāna viedtālruņiem un planšetdatoriem...
Vidējā peles poga nedarbojas sistēmā Windows 10
The peles vidējā poga palīdz jums ritināt garas tīmekļa lapas un ekrānus ar lielu datu daudzumu. Ja tas apstājas, jūs galu galā izmantosiet tastatūru,...