Hvordan utføre skallkommandoer i Python ved hjelp av kjøremetoden for delprosesser

How Execute Shell Commands Python Using Subprocess Run Method



Delprosess er en innebygd Python-modul som kan brukes til å lage nye prosesser og samhandle med datastrømmene deres for input og output. I enklere termer kan du bruke den til å kjøre skallkommandoer og kjøre kjørbare binære filer vanligvis spredt i forskjellige bin -mapper over et Linux -filsystem. Du kan også levere en fullstendig bane til en kjørbar binær og bruke alle kommandolinjebrytere som er knyttet til binæren. Denne artikkelen vil forklare hvordan du bruker delprosessmodulen og kjøremetoden i Python -apper. Alle kodeprøver i artikkelen er testet med Python 3.8.2 på Ubuntu 20.04.

Metoden Subprocess.run

Subprocess.run -metoden tar en liste med argumenter. Når metoden kalles, utfører den kommandoen og venter på at prosessen er ferdig, og returnerer et CompletedProcess -objekt til slutt. Objektet CompletedProcess returnerer stdout, stderr, originale argumenter som ble brukt mens metoden ble kalt, og en returkode. Stdout refererer til datastrømmen som produseres av kommandoen, mens stderr refererer til eventuelle feil som oppstår under utførelsen av programmet. Enhver returkode som ikke er null (utgangskode) vil bety feil med kommandoen som ble utført i metoden subprocess.run.







Eksempel 1: Utskriftsinnhold i en tekstfil ved hjelp av metoden Subprocess.run

Kommandoen nedenfor sender ut innholdet i en data.txt -fil, forutsatt at den inneholder en name = John -streng.



import delprosess
delprosess.løpe(['katt', 'data.txt'])

Hvis du kjører koden ovenfor, returneres følgende utdata:



Navn=John
Fullført prosess(args=['katt', 'data.txt'],returkode=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 enkeltstrek og dobbelstrek for å definere alternativene. For eksempel, for å vise filer og mapper i en katalog, vil koden være subprocess.run ([ls, -l]. I de fleste av disse tilfellene kan du vurdere ethvert mellomromsseparert argument i en skallkommando som et individuelt element i listen som er levert til subprocess.run -metoden.





Eksempel 2: Undertrykk Output of Subprocess.run Method

For å undertrykke utdataene fra subprocess.run -metoden må du levere stdout = subprocess.DEVNULL og stderr = subprocess.DEVNULL som tilleggsargumenter.

import delprosess

delprosess.løpe(['katt', 'data.txt'],stdout=delprosess.DEVNULL,
stderr=delprosess.DEVNULL)

Hvis du kjører koden ovenfor, får du følgende utgang:



CompletedProcess (args = ['cat', 'data.txt'], returkode = 0)

Eksempel 3: Capture Output of Subprocess.run Method

For å fange ut utdataene fra metoden subprocess.run, bruk et tilleggsargument som heter capture_output = True.

import delprosess
produksjon= delprosess.løpe(['katt', 'data.txt'],capture_output=ekte)
skrive ut (produksjon)

Hvis du kjører koden ovenfor, får du følgende utgang:

Fullført prosess(args=['katt', 'data.txt'],returkode=0,
stdout=b'navn = John n',stderr=b'')

Du kan få individuell tilgang til stdout og stderr verdier ved å bruke output.stdout og output.stderr metoder. Utgangen produseres som en bytesekvens. For å få en streng som utgang, bruk metoden output.stdout.decode (utf-8). Du kan også levere text = True som et ekstra argument til subprocess.run -samtalen for å få utgangen i strengformat. For å få utgangsstatuskode, kan du bruke metoden output.returncode.

Eksempel 4: Øk unntaket ved svikt i kommandoen som utføres med Subprocess.run -metoden

For å oppnå et unntak når kommandoen går ut med en status som er null, bruker du check = True-argumentet.

import delprosess
delprosess.løpe(['katt', 'data.tx'],capture_output=ekte,tekst=ekte,kryss av=ekte)

Hvis du kjører koden ovenfor, får du følgende utgang:

heve CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Kommando '[' cat ',' data.tx ']'
returnerte ikke-null utgangsstatus 1.

Eksempel 5: Send en streng til kommandoen som utføres av Subprocess.run -metoden

Du kan sende en streng til kommandoen som skal kjøres med subprocess.run -metoden ved å bruke input = 'string' -argumentet.

import delprosess
produksjon= delprosess.løpe(['katt'], input='data.txt',capture_output=ekte,
tekst=ekte,kryss av=ekte)
skrive ut (produksjon)

Hvis du kjører koden ovenfor, får du følgende utgang:

CompletedProcess (args = ['cat'], returkode = 0, stdout = 'data.txt', stderr = '')

Som du kan se, passerer koden ovenfor data.txt som en streng og ikke som et filobjekt. For å sende data.txt som en fil, bruk stdin -argumentet.

med åpen('data.txt') somf:
produksjon= delprosess.løpe(['katt'],stdin=f,capture_output=ekte,
tekst=ekte,kryss av=ekte)
skrive ut (produksjon)

Hvis du kjører koden ovenfor, får du følgende utgang:

CompletedProcess (args = ['cat'], returkode = 0, stdout = 'name = John n', stderr = '')

Eksempel 6: Utfør kommando direkte i Shell ved hjelp av Subprocess.run -metoden

Det er mulig å kjøre en kommando direkte inn i et skall som det er, i stedet for å bruke en strengdeling i hovedkommandoen og alternativene som følger den. For å gjøre dette må du sende shell = True som et tilleggsargument. Dette frarådes imidlertid av python -utviklere fordi bruk av shell = True kan føre til sikkerhetsproblemer. Du kan lese mer om sikkerhetsimplikasjoner fra her .

import delprosess
delprosess.løpe('cat' data.txt '',skall=ekte)

Hvis du kjører koden ovenfor, får du følgende utgang:

navn = John

Konklusjon

Subprocess.run -metoden i Python er ganske kraftig, siden den lar deg kjøre skallkommandoer i selve python. Dette hjelper til med å begrense all kode til python selv uten at du trenger å ha ytterligere skallskriptkode i separate filer. Det kan imidlertid være ganske vanskelig å korrekt tokenisere skallkommandoer i en python -liste. Du kan bruke metoden shlex.split () til å symbolisere enkle skallkommandoer, men i lange, komplekse kommandoer - spesielt de med pipesymboler - klarer shlex ikke å dele kommandoen riktig. I slike tilfeller kan feilsøking være et vanskelig problem. Du kan bruke shell = True -argumentet for å unngå dette, men det er visse sikkerhetsproblemer knyttet til denne handlingen.