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 delprocesdelproces.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 delprocesproduktion= 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 delprocesdelproces.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 delprocesproduktion= 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 delprocesdelproces.løb('kat' data.txt '',skal=Sand)
Kørsel af koden ovenfor vil producere følgende output:
navn = JohnKonklusion
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.