Python

Sådan udføres shell-kommandoer i Python ved hjælp af underprocesskøringsmetoden

Sådan udføres shell-kommandoer i Python ved hjælp af underprocesskøringsmetoden
Underproces er et indbygget Python-modul, der kan bruges til at oprette nye processer og interagere med deres input- og outputdatastrømme. I enklere termer kan du bruge den til at køre shell-kommandoer og køre eksekverbare binære filer, der normalt er spredt i forskellige "bin" -mapper på tværs af et Linux-filsystem. Du kan også levere en fuld sti til en eksekverbar binær og bruge alle kommandolinjekontakter, der er knyttet til binærprogrammet. Denne artikel forklarer, hvordan du bruger delprocessormodulet og dets køremetode i Python-apps. Alle kodeeksempler i artiklen er testet med Python 3.8.2 på Ubuntu 20.04.

Underprocessen.kør metode

Underprocessen.run-metoden tager en liste over argumenter. Når metoden kaldes, udfører den kommandoen og venter på, at processen er færdig, hvilket returnerer et "CompletedProcess" -objekt til sidst. Objektet "CompletedProcess" returnerer stdout, stderr, originale argumenter, der blev brugt under kald til metoden, og en returkode. Stdout refererer til datastrømmen produceret af kommandoen, mens stderr henviser til eventuelle fejl, der er rejst under udførelsen af ​​programmet. Enhver ikke-nul-returkode (exit-kode) vil betyde fejl med kommandoen, der udføres i underprocessen.køre metode.

Eksempel 1: Outputindhold i en tekstfil ved hjælp af underprocessen.kør metode

Kommandoen nedenfor udsender indholdet af “data.txt ”-fil, forudsat at den indeholder en” name = John ”-streng.

import underproces
underproces.kør (["kat", "data.txt "])

At køre ovenstående kode returnerer følgende output:

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

Det første element i listeargumentet er navnet på den kommando, der skal udføres. Ethvert element på listen, der følger det første element, betragtes som kommandolinjevalg eller switche. Du kan også bruge et enkelt bindestreg og dobbelt bindestreg til at definere indstillingerne. For eksempel for at liste filer og mapper i et bibliotek, ville koden være “underproces.kør ([“ls”, “-l”] ”. I de fleste af disse tilfælde kan du overveje ethvert rumadskilt argument i en shell-kommando som et individuelt element på listen leveret til underprocessen.køre metode.

Eksempel 2: Undertryk output af underproces.kør metode

At undertrykke output fra underprocessen.kør metode, skal du levere “stdout = underproces.DEVNULL ”og“ stderr = underproces.DEVNULL ”som yderligere argumenter.

import underproces
underproces.kør (["kat", "data.txt "], stdout = underproces.DEVNULL,
stderr = underproces.DEVNULL)

At køre ovenstående kode vil producere følgende output:

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

Eksempel 3: Capture Output of Subprocess.kør metode

At fange output fra underprocessen.kør metode, brug et ekstra argument med navnet “capture_output = True”.

import underproces
output = underproces.kør (["kat", "data.txt "], capture_output = Sand)
udskriv (output)

At køre ovenstående kode vil producere følgende output:

CompletedProcess (args = ['cat', 'data.txt '], returkode = 0,
stdout = b'name = John \ n ', stderr = b ")

Du kan få adgang til stdout- og stderr-værdier individuelt ved hjælp af “output.stdout ”og“ output.stderr ”-metoder. Outputtet produceres som en bytesekvens. For at få en streng som output skal du bruge “output.stdout.afkode (“utf-8”) ”metode. Du kan også levere "text = True" som et ekstra argument til underprocessen.kør opkald for at få output i strengformat. For at få udgangsstatuskode kan du bruge “output.returncode ”metode.

Eksempel 4: Hæv undtagelsen ved manglende kommando udført af underproces.kør metode

For at hæve en undtagelse, når kommandoen afsluttes med en status, der ikke er nul, skal du bruge argumentet "check = True".

import underproces
underproces.kør (["kat", "data.tx "], capture_output = True, text = True, check = True)

At køre ovenstående kode vil producere følgende output:

hæve CalledProcessError (retcode, proces.argumenterer,
underproces.CalledProcessError: Kommando '[' cat ',' data.tx ']'
returnerede ikke-nul udgangsstatus 1.

Eksempel 5: Send en streng til kommando udført af underprocessen.kør metode

Du kan sende en streng til kommandoen, der skal udføres af underproces.kør metode ved hjælp af "input = 'string'" argument.

import underproces
output = underproces.kør (["cat"], input = "data.txt ", capture_output = Sandt,
text = True, check = True)
udskriv (output)

At køre ovenstående kode vil producere følgende output:

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. At videregive “data.txt ”som en fil, brug argumentet“ stdin ”.

med åben ("data.txt ") som f:
output = underproces.kør (["cat"], stdin = f, capture_output = True,
text = True, check = True)
udskriv (output)

At køre ovenstående kode vil producere følgende output:

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

Eksempel 6: Udfør kommando direkte i Shell ved hjælp af underprocessen.kør metode

Det er muligt at køre en kommando direkte i en shell "som den er" i stedet for at bruge en strengopdeling i hovedkommandoen og de muligheder, der følger den. For at gøre dette skal du videregive “shell = True” som et yderligere argument. Dette frarådes dog af pythonudviklere, da brug af "shell = True" kan føre til sikkerhedsproblemer. Du kan læse mere om sikkerhedsimplikationer herfra.

import underproces
underproces.kør ("kat" data.txt '", shell = True)

At køre ovenstående kode vil producere følgende output:

navn = John

Konklusion

Underprocessen.Kør metoden i Python er ret kraftig, da den giver dig mulighed for at køre shell-kommandoer i selve python. Dette hjælper med at begrænse al kode til selve python uden behov for at have yderligere shell-scriptkode i separate filer. Det kan dog være ret vanskeligt at korrekt tokenize shell-kommandoer i en pythonliste. Du kan bruge “shlex.split () ”metode til tokenisering af enkle shell-kommandoer, men i lange, komplekse kommandoer - især dem med rørsymboler - kan shlex ikke opdele kommandoen korrekt. I sådanne tilfælde kan fejlfinding være et vanskeligt problem. Du kan bruge argumentet “shell = True” for at undgå dette, men der er visse sikkerhedsproblemer forbundet med denne handling.

Bedste spilkonsolemulatorer til Linux
Denne artikel viser en liste over populære spilkonsolemuleringssoftware, der er tilgængelig til Linux. Emulation er et softwarekompatibilitetslag, der...
Bedste Linux Distros til spil i 2021
Linux-operativsystemet er kommet langt fra dets originale, enkle, serverbaserede udseende. Dette operativsystem er forbedret enormt i de senere år og ...
Sådan registreres og streames din gaming-session på Linux
Tidligere blev spil kun betragtet som en hobby, men med tiden oplevede spilindustrien en enorm vækst med hensyn til teknologi og antallet af spillere....