Python

Hvordan utføre shell-kommandoer i Python ved hjelp av fremgangsmåten for underprosesskjøring

Hvordan utføre shell-kommandoer i Python ved hjelp av fremgangsmåten for underprosesskjøring
Subprocess er en innebygd Python-modul som kan brukes til å lage nye prosesser og samhandle med deres inn- og utdatastrømmer. I enklere termer kan du bruke den til å kjøre skallkommandoer og kjøre kjørbare binære filer som vanligvis er spredt i forskjellige "søppel" -mapper over et Linux-filsystem. Du kan også levere en full bane til en kjørbar binær og bruke kommandolinjebrytere tilknyttet binæren. Denne artikkelen vil forklare hvordan du bruker delprosessmodulen og kjøringsmetoden i Python-apper. Alle kodeeksempler i artikkelen er testet med Python 3.8.2 på Ubuntu 20.04.

Underprosessen.kjør Metode

Underprosessen.kjør metoden tar en liste over argumenter. Når metoden kalles, utfører den kommandoen og venter på at prosessen skal fullføres, og returnerer et "CompletedProcess" -objekt til slutt. “CompletedProcess” -objektet returnerer stdout, stderr, originale argumenter som ble brukt mens du kalte metoden, og en returkode. Stdout refererer til datastrømmen produsert av kommandoen, mens stderr refererer til eventuelle feil som oppdages under gjennomføring av programmet. Enhver returkode som ikke er null (exit code) vil bety feil med kommandoen utført i underprosessen.kjøre metode.

Eksempel 1: Output Contents of A Text File Using the Subprocess.kjør Metode

Kommandoen nedenfor vil sende innholdet til en "data.txt ”-fil, forutsatt at den inneholder en” name = John ”-streng.

importere underprosess
underprosess.kjør (["cat", "data.tekst"])

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

navn = John
CompletedProcess (args = ['cat', '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, betraktes som kommandolinjealternativer eller brytere. Du kan også bruke en bindestrek og dobbel bindestrek for å definere alternativene. Hvis du for eksempel vil liste filer og mapper i en katalog, vil koden være "underprosess.kjør ([“ls”, “-l”] ”. I de fleste av disse tilfellene kan du betrakte et hvilket som helst romadskilt argument i en skallkommando som et enkelt element i listen som leveres til underprosessen.kjøre metode.

Eksempel 2: Undertrykk utdata fra underprosess.kjør Metode

For å undertrykke produksjonen av underprosessen.kjøremetode, må du levere “stdout = underprosess.DEVNULL ”og“ stderr = underprosess.DEVNULL ”som tilleggsargumenter.

importere underprosess
underprosess.kjør (["cat", "data.txt "], stdout = underprosess.DEVNULL,
stderr = underprosess.DEVNULL)

Å kjøre koden ovenfor gir følgende utdata:

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

Eksempel 3: Capture Output of Subprocess.kjør Metode

For å fange utdataene fra underprosessen.kjør metode, bruk et ekstra argument som heter “capture_output = True”.

importere underprosess
utgang = underprosess.kjør (["cat", "data.txt "], capture_output = True)
skriv ut (utdata)

Å kjøre koden ovenfor gir følgende utdata:

CompletedProcess (args = ['cat', 'data.txt '], returkode = 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 bytesekvens. For å få en streng som utdata, bruk “output.stdout.dekode (“utf-8”) ”-metoden. Du kan også levere “text = True” som et ekstra argument til underprosessen.kjør anrop for å få utdataene i strengformat. For å få utgangsstatuskode, kan du bruke “output.returkode ”-metoden.

Eksempel 4: Hev unntak ved manglende kommando utført av underprosess.kjør Metode

For å heve et unntak når kommandoen avsluttes med en status som ikke er null, bruk argumentet "check = True".

importere underprosess
underprosess.kjør (["cat", "data.tx "], capture_output = True, text = True, check = True)

Å kjøre koden ovenfor gir følgende utdata:

heve CalledProcessError (retcode, prosess.argumenterer,
underprosess.CalledProcessError: Kommando '[' cat ',' data.tx ']'
returnerte ikke-null utgangsstatus 1.

Eksempel 5: Gi en streng til kommando utført av underprosessen.kjør Metode

Du kan sende en streng til kommandoen som skal utføres av underprosess.kjør metoden ved å bruke argumentet "input = 'string'".

importere underprosess
utgang = underprosess.kjør (["cat"], input = "data.txt ", capture_output = True,
text = True, check = True)
skriv ut (utdata)

Å kjøre koden ovenfor gir følgende utdata:

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

Som du kan se, overfører koden ovenfor “data.txt ”som en streng og ikke som et filobjekt. Å overføre “data.txt ”som en fil, bruk argumentet“ stdin ”.

med åpen ("data.txt ") som f:
utgang = underprosess.run (["cat"], stdin = f, capture_output = True,
text = True, check = True)
skriv ut (utdata)

Å kjøre koden ovenfor gir følgende utdata:

CompletedProcess (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 i et skall "som det er", i stedet for å bruke en streng delt i hovedkommandoen og alternativene som følger den. For å gjøre dette må du sende "shell = True" som et ekstra argument. Dette frarådes imidlertid av pythonutviklere at bruk av "shell = True" kan føre til sikkerhetsproblemer. Du kan lese mer om sikkerhetsimplikasjoner herfra.

importere underprosess
underprosess.kjør ("cat" data.txt '", shell = True)

Å kjøre koden ovenfor gir følgende utdata:

navn = John

Konklusjon

Underprosessen.kjøremetoden i Python er ganske kraftig, da den lar deg kjøre skallkommandoer i selve python. Dette hjelper med å begrense all kode til seg selv uten behov for å ha ekstra skallskriptkode i separate filer. Det kan imidlertid være vanskelig å korrekt tokenisere skallkommandoer i en pythonliste. Du kan bruke “shlex.split () ”-metode for å tokenisere enkle skallkommandoer, men i lange, komplekse kommandoer - spesielt de med pipesymboler - klarer ikke shlex å dele kommandoen riktig. I slike tilfeller kan feilsøking være et vanskelig problem. Du kan bruke argumentet “shell = True” for å unngå dette, men det er visse sikkerhetsproblemer knyttet til denne handlingen.

Mus AppyMouse Pekeplate og musepeker på skjermen for Windows-nettbrett
AppyMouse Pekeplate og musepeker på skjermen for Windows-nettbrett
Nettbrettbrukere savner ofte musepekeren, spesielt når de bruker vanlige bærbare datamaskiner. Berøringsskjermen Smarttelefoner og nettbrett har mange...
Mus Midterste museknapp fungerer ikke i Windows 10
Midterste museknapp fungerer ikke i Windows 10
De midtre museknapp hjelper deg med å bla gjennom lange websider og skjermer med mye data. Hvis det stopper, vil du ende opp med å bruke tastaturet ti...
Mus Hvordan endre venstre og høyre museknapp på Windows 10 PC
Hvordan endre venstre og høyre museknapp på Windows 10 PC
Det er ganske vanlig at alle datamusenheter er ergonomisk designet for høyrehendte brukere. Men det er tilgjengelige musenheter som er spesielt design...