Sådan udføres Shell -kommandoer i Python ved hjælp af metode til underproceskørsel

How Execute Shell Commands Python Using Subprocess Run Method



Delproces 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 kommandolinjeafbrydere, der er knyttet til binæren. Denne artikel vil forklare, hvordan du bruger delprocesmodulet og dets køringsmetode i Python -apps. Alle kodeeksempler i artiklen er testet med Python 3.8.2 på Ubuntu 20.04.

Metoden Subprocess.run

Metoden Subprocess.run tager en liste over argumenter. Når metoden kaldes, udfører den kommandoen og venter på, at processen er færdig, og returnerer et CompletedProcess -objekt til sidst. Objektet CompletedProcess returnerer stdout, stderr, originale argumenter, der blev brugt under opkald til metoden, og en returkode. Stdout refererer til datastrømmen produceret af kommandoen, mens stderr refererer til eventuelle fejl, der opstår under udførelsen af ​​programmet. Enhver ikke-nul returkode (exit-kode) ville betyde fejl med kommandoen udført i metoden subprocess.run.







Eksempel 1: Outputindhold i en tekstfil ved hjælp af metoden Subprocess.run

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



importere delproces
delproces.løb(['kat', 'data.txt'])

Kørsel af koden ovenfor returnerer følgende output:



navn=John
Afsluttet proces(args=['kat', '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 kommandolinjemuligheder eller switches. Du kan også bruge enkelt bindestreg og dobbelt streger til at definere mulighederne. For eksempel for at liste filer og mapper i et bibliotek ville koden være subprocess.run ([ls, -l]. I de fleste af disse tilfælde kan du betragte ethvert mellemrumsadskilt argument i en shell -kommando som et individuelt element i listen, der er leveret til metoden subprocess.run.





Eksempel 2: Undertryk output fra subprocess.run -metode

For at undertrykke output fra metoden subprocess.run skal du angive stdout = subprocess.DEVNULL og stderr = subprocess.DEVNULL som yderligere argumenter.

importere delproces

delproces.løb(['kat', 'data.txt'],stdout=delproces.DEVNULL,
stderr=delproces.DEVNULL)

Kørsel af koden ovenfor vil producere følgende output:



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

Eksempel 3: Capture Output of Subprocess.run Method

For at fange output fra metoden subprocess.run skal du bruge et ekstra argument med navnet capture_output = True.

importere delproces
produktion= delproces.løb(['kat', 'data.txt'],capture_output=Sand)
Print (produktion)

Kørsel af koden ovenfor vil producere følgende output:

Afsluttet proces(args=['kat', 'data.txt'],returkode=0,
stdout=b'navn = John n',stderr=b'')

Du kan få individuel adgang til stdout og stderr værdier 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.decode (utf-8) metode. Du kan også levere text = True som et ekstra argument til subprocess.run -opkaldet for at få output i strengformat. For at få exit -statuskode kan du bruge metoden output.returncode.

Eksempel 4: Hæv undtagelsen ved fejl i kommandoen udført med Subprocess.run -metoden

Hvis du vil hæve en undtagelse, når kommandoen forlader med en status uden nul, skal du bruge check = True-argumentet.

importere delproces
delproces.løb(['kat', 'data.tx'],capture_output=Sand,tekst=Sand,kontrollere=Sand)

Kørsel af koden ovenfor vil producere følgende output:

raise CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Kommando '[' kat ',' data.tx ']'
returnerede ikke-nul exit-status 1.

Eksempel 5: Videregiv en streng til kommando udført ved hjælp af metoden Subprocess.run

Du kan sende en streng til kommandoen, der skal udføres ved hjælp af subprocess.run -metoden ved hjælp af input = 'string' -argument.

importere delproces
produktion= delproces.løb(['kat'], input='data.txt',capture_output=Sand,
tekst=Sand,kontrollere=Sand)
Print (produktion)

Kørsel af koden ovenfor 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. For at videregive data.txt som en fil skal du bruge stdin -argumentet.

med åben('data.txt') somf:
produktion= delproces.løb(['kat'],stdin=f,capture_output=Sand,
tekst=Sand,kontrollere=Sand)
Print (produktion)

Kørsel af koden ovenfor 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 metoden Subprocess.run

Det er muligt at køre en kommando direkte ind i en skal 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 sende shell = True som et ekstra argument. Dette frarådes imidlertid af python -udviklere, da brug af shell = True kan føre til sikkerhedsproblemer. Du kan læse mere om sikkerhedsmæssige konsekvenser fra her .

importere delproces
delproces.løb('kat' data.txt '',skal=Sand)

Kørsel af koden ovenfor vil producere følgende output:

navn = John

Konklusion

Subprocess.run -metoden i Python er temmelig kraftfuld, da den giver dig mulighed for at køre shell -kommandoer i selve python. Dette hjælper med at begrænse al kode til python selv uden at skulle have yderligere shell -scriptkode i separate filer. Det kan dog være ret vanskeligt at korrekt tokenisere shell -kommandoer i en python -liste. Du kan bruge metoden shlex.split () til at tokenisere simple shell -kommandoer, men i lange, komplekse kommandoer - især dem med pipesymboler - kan shlex ikke opdele kommandoen korrekt. I sådanne tilfælde kan fejlfinding være et vanskeligt problem. Du kan bruge shell = True -argumentet for at undgå dette, men der er visse sikkerhedsproblemer forbundet med denne handling.