Så här kör du kommandon i Python med hjälp av delprocessens körmetod

How Execute Shell Commands Python Using Subprocess Run Method



Delprocess är en inbyggd Python-modul som kan användas för att skapa nya processer och interagera med deras in- och utdataströmmar. I enklare termer kan du använda den för att köra skalkommandon och köra körbara binärer som vanligtvis är utspridda i olika binmappar över ett Linux -filsystem. Du kan också tillhandahålla en fullständig sökväg till en körbar binär och använda alla kommandoradsomkopplare som är associerade med binären. Den här artikeln kommer att förklara hur du använder delprocessmodulen och dess körningsmetod i Python -appar. Alla kodprover i artikeln testas med Python 3.8.2 på Ubuntu 20.04.

Metoden Subprocess.run

Metoden Subprocess.run tar en lista med argument. När metoden anropas utför den kommandot och väntar på att processen ska slutföras och returnerar ett CompletedProcess -objekt i slutet. Objektet CompletedProcess returnerar stdout, stderr, originalargument som användes när metoden anropades och en returkod. Stdout hänvisar till dataströmmen som produceras av kommandot, medan stderr hänvisar till eventuella fel som uppstår under körningen av programmet. Alla returkoder som inte är noll (utgångskod) skulle innebära fel med kommandot som utförs i metoden subprocess.run.







Exempel 1: Utmatningsinnehåll i en textfil med hjälp av metoden Subprocess.run

Kommandot nedan matar ut innehållet i en data.txt -fil, förutsatt att den innehåller en name = John -sträng.



importera delprocess
delprocess.springa(['katt', 'data.txt'])

Om du kör koden ovan returneras följande utdata:



namn=John
Slutförd process(args=['katt', 'data.txt'],returkod=0)

Det första elementet i listargumentet är namnet på kommandot som ska utföras. Alla element i listan som följer det första elementet betraktas som kommandoradsalternativ eller switchar. Du kan också använda enkla och dubbla streck för att definiera alternativen. Till exempel, för att lista filer och mappar i en katalog, skulle koden vara subprocess.run ([ls, -l]. I de flesta av dessa fall kan du betrakta alla mellanrumsavgränsade argument i ett skalkommando som ett individuellt element i listan som tillhandahålls till subprocess.run -metoden.





Exempel 2: Undertryck Output of Subprocess.run Method

För att undertrycka utsignalen från subprocess.run -metoden måste du ange stdout = subprocess.DEVNULL och stderr = subprocess.DEVNULL som ytterligare argument.

importera delprocess

delprocess.springa(['katt', 'data.txt'],stdout=delprocess.DEVNULL,
stderr=delprocess.DEVNULL)

Körning av koden ovan ger följande utdata:



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

Exempel 3: Capture Output of Subprocess.run Method

För att fånga ut resultatet från subprocess.run -metoden, använd ett ytterligare argument som heter capture_output = True.

importera delprocess
produktion= delprocess.springa(['katt', 'data.txt'],capture_output=Sann)
skriva ut (produktion)

Körning av koden ovan ger följande utdata:

Slutförd process(args=['katt', 'data.txt'],returkod=0,
stdout=b'namn = John n',stderr=b'')

Du kan komma åt stdout- och stderr -värden individuellt med hjälp av metoderna output.stdout och output.stderr. Utsignalen produceras som en bytesekvens. För att få en sträng som output, använd output.stdout.decode (utf-8) -metoden. Du kan också tillhandahålla text = True som ett extra argument till subprocess.run -anropet för att få utmatningen i strängformat. För att få utgångsstatuskod kan du använda metoden output.returncode.

Exempel 4: Öka undantaget vid misslyckande av kommando som utförs med metoden Subprocess.run

Om du vill göra ett undantag när kommandot avslutas med status som inte är noll använder du check = True-argumentet.

importera delprocess
delprocess.springa(['katt', 'data.tx'],capture_output=Sann,text=Sann,kontrollera=Sann)

Körning av koden ovan ger följande utdata:

höja CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Kommando '[' cat ',' data.tx ']'
returnerade icke-noll utgångsstatus 1.

Exempel 5: Vidarebefordra en sträng till kommando som utförs med metoden Subprocess.run

Du kan skicka en sträng till kommandot som ska köras med subprocess.run -metoden genom att använda input = 'string' -argument.

importera delprocess
produktion= delprocess.springa(['katt'], inmatning='data.txt',capture_output=Sann,
text=Sann,kontrollera=Sann)
skriva ut (produktion)

Körning av koden ovan ger följande utdata:

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

Som du kan se skickar koden ovan data.txt som en sträng och inte som ett filobjekt. För att skicka data.txt som en fil, använd stdin -argumentet.

med öppen('data.txt') somf:
produktion= delprocess.springa(['katt'],stdin=f,capture_output=Sann,
text=Sann,kontrollera=Sann)
skriva ut (produktion)

Körning av koden ovan ger följande utdata:

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

Exempel 6: Utför kommandot direkt i Shell med hjälp av metoden Subprocess.run

Det är möjligt att köra ett kommando direkt i ett skal som det är istället för att använda en strängdelning i huvudkommandot och alternativen som följer det. För att göra detta måste du skicka shell = True som ett ytterligare argument. Detta avskräcks dock av pythonutvecklare eftersom att använda shell = True kan leda till säkerhetsproblem. Du kan läsa mer om säkerhetsimplikationer från här .

importera delprocess
delprocess.springa('katt' data.txt '',skal=Sann)

Körning av koden ovan ger följande utdata:

namn = John

Slutsats

Subprocess.run -metoden i Python är ganska kraftfull, eftersom den låter dig köra skalkommandon inom själva python. Detta hjälper till att begränsa all kod till python själv utan att behöva ha ytterligare skalskriptkod i separata filer. Det kan dock vara ganska knepigt att korrekt tokenisera skalkommandon i en pythonlista. Du kan använda metoden shlex.split () för att tokenisera enkla skalkommandon, men i långa, komplexa kommandon - särskilt de med rörsymboler - misslyckas shlex med att dela kommandot korrekt. I sådana fall kan felsökning vara en knepig fråga. Du kan använda shell = True -argumentet för att undvika detta, men det finns vissa säkerhetsproblem relaterade till den här åtgärden.