Hvordan utføre skallkommandoer i Python ved hjelp av underprosessløpsmetoden

Hvordan utføre skallkommandoer i Python ved hjelp av underprosessløpsmetoden
Underprosess er en innebygd Python-modul som kan brukes til å lage nye prosesser og samhandle med deres inngangs- og utgangsdatastrømmer. For enklere vilkår kan du bruke den til å kjøre skallkommandoer og kjøre kjørbare binærfiler som vanligvis er spredt i forskjellige "bin" -mapper over et Linux -filsystem. Du kan også levere en full vei til en kjørbar binær og bruke eventuelle kommandolinjebrytere tilknyttet det binære. Denne artikkelen vil forklare hvordan du bruker delprosessmodulen og dens RUN -metoden i Python Apps. Alle kodeprøver i artikkelen er testet med Python 3.8.2 på Ubuntu 20.04.

Underprosessen.Kjør metode

Underprosessen.Kjørmetode tar en liste over argumenter. Når metoden kalles, utfører den kommandoen og venter på at prosessen skal fullføre, og returnerer et "fullført prosess" -objekt til slutt. "Fullført prosess" -objekt returnerer stdout, stderr, originale argumenter som brukes mens du ringer til metoden, og en returkode. Stdout refererer til datastrømmen produsert av kommandoen, mens Stderr refererer til eventuelle feil som er reist under utførelse av programmet. Enhver ikke-null returkode (exit code) vil bety feil med kommandoen utført i underprosessen.Kjør metode.

Eksempel 1: Outputinnhold i en tekstfil ved hjelp av underprosessen.Kjør metode

Kommandoen nedenfor vil sende inn innholdet i en “Data.txt ”-fil, forutsatt at den inneholder en“ name = john ”-streng.

Importer underprosess
underprosess.Kjør (["Cat", "Data.tekst"])

Å kjøre koden over vil returnere følgende utdata:

Navn = John
Fullført prosess (args = ['katt', 'data.txt '], returncode = 0)

Det første elementet i listeargumentet er navnet på kommandoen som skal utføres. Ethvert element i listen som følger det første elementet, regnes som kommandolinjealternativer eller brytere. Du kan også bruke enkeltstrikker og doble streker for å definere alternativene. For å liste opp filer og mapper i en katalog, vil koden for eksempel være “Underprosess.løp ([“ls”, “-l”] ”. I de fleste av disse tilfellene kan du vurdere ethvert rom-separert argument i en Shell-kommando som et individuelt element på listen levert til underprosessen.Kjør metode.

Eksempel 2: Undertrykkende utgang av underprosess.Kjør metode

Å undertrykke utgangen fra underprosessen.Kjør metode, du må levere “stdout = underprosess.DevNull ”og“ Stderr = underprosess.Devnull ”som flere argumenter.

Importer underprosess
underprosess.Kjør (["Cat", "Data.txt "], stdout = underprosess.Devnull,
STDERR = underprosess.Devnull)

Å kjøre koden over vil produsere følgende utgang:

Fullført prosess (args = ['katt', 'data.txt '], returncode = 0)

Eksempel 3: Fang utgang av underprosess.Kjør metode

For å fange utgangen fra underprosessen.Kjør metode, bruk et tilleggsargument kalt “Capture_output = True”.

Importer underprosess
output = underprosess.Kjør (["Cat", "Data.txt "], capture_output = true)
Print (Output)

Å kjøre koden over vil produsere følgende utgang:

Fullført prosess (args = ['katt', 'data.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

Du kan få tilgang til Stdout- og STDERR -verdier individuelt ved å bruke “Output.stdout ”og“ output.stderr ”-metoder. Utgangen produseres som en byte -sekvens. For å få en streng som utgang, bruk “output.stdout.dekode (“UTF-8”) ”-metode. Du kan også levere "tekst = sant" som et ekstra argument til underprosessen.Kjør samtale for å få utdataene i strengformat. For å få statsstatuskode, kan du bruke “Output.ReturnCode ”-metode.

Eksempel 4: Hev unntak ved svikt i kommandoen utført av underprosess.Kjør metode

For å heve et unntak når kommandoen går ut med en status som ikke er null, bruk argumentet "sjekk = sant".

Importer underprosess
underprosess.Kjør (["Cat", "Data.tx "], capture_output = true, text = true, check = true)

Å kjøre koden over vil produsere følgende utgang:

heve kalt prosessror (retcode, prosess.Args,
underprosess.Kalt ProcessError: Command '[' Cat ',' Data.tx ']'
returnerte ikke-null avkjøringsstatus 1.

Eksempel 5: Pass en streng til kommando utført av underprosessen.Kjør metode

Du kan gi en streng til kommandoen som skal utføres av underprosess.Kjør metode ved å bruke "input = 'String'” -argument.

Importer underprosess
output = underprosess.Kjør (["Cat"], input = "Data.txt ", capture_output = true,
tekst = sant, sjekk = sant)
Print (Output)

Å kjøre koden over vil produsere følgende utgang:

Fullført prosess (args = ['cat'], returncode = 0, stdout = 'data.txt ', stderr = ")

Som du ser, passerer koden over “Data.txt ”som en streng og ikke som et filobjekt. Å passere “data.txt ”som en fil, bruk“ stdin ”-argumentet.

med åpne ("Data.txt ") som f:
output = underprosess.løp (["Cat"], stdin = f, capture_output = true,
tekst = sant, sjekk = sant)
Print (Output)

Å kjøre koden over vil produsere følgende utgang:

FullførtProcess (args = ['cat'], returncode = 0, stdout = 'name = John \ n', stderr = ")

Eksempel 6: Utfør kommandoen direkte i Shell ved hjelp av underprosessen.Kjør metode

Det er mulig å kjøre en kommando direkte inn i et skall "som den er", i stedet for å bruke en streng delt i hovedkommandoen og alternativene som følger den. For å gjøre dette, må du passere “skall = sant” som et ekstra argument. Dette er imidlertid motløs av Python -utviklere som bruk av "shell = true" kan føre til sikkerhetsproblemer. Du kan lese mer om sikkerhetsmessige implikasjoner herfra.

Importer underprosess
underprosess.Kjør ("Cat 'data.txt '", shell = true)

Å kjøre koden over vil produsere følgende utgang:

Navn = John

Konklusjon

Underprosessen.Kjøremetode i Python er ganske kraftig, da den lar deg kjøre skallkommandoer i Python selv. Dette hjelper med å begrense all kode til å python seg selv uten å ha ekstra skallskriptkode i separate filer. Det kan imidlertid være ganske vanskelig å ta rekkenalisere skallkommandoer i en Python -liste. Du kan bruke “Shlex.split () ”metode for å tokenisere enkle skallkommandoer, men i lange, komplekse kommandoer - spesielt de med rørsymboler - klarer ikke Shlex å dele kommandoen riktig. I slike tilfeller kan feilsøking være et vanskelig spørsmål. Du kan bruke "Shell = True" -argumentet for å unngå dette, men det er visse sikkerhetsproblemer knyttet til denne handlingen.