Pytonorm

Hur man kör Shell-kommandon i Python med hjälp av underprocesskörningsmetoden

Hur man kör Shell-kommandon i Python med hjälp av underprocesskörningsmetoden
Underprocess ä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 vanligtvis spridda i olika "bin" -mappar över ett Linux-filsystem. Du kan också ange en fullständig sökväg till en körbar binär och använda alla kommandoradsväxlar som är associerade med binären. Den här artikeln kommer att förklara hur du använder underprocessmodulen och dess körningsmetod i Python-appar. Alla kodprover i artikeln testas med Python 3.8.2 på Ubuntu 20.04.

Underprocessen.kör metod

Underprocessen.körmetoden tar en lista med argument. När metoden anropas kör den kommandot och väntar på att processen ska slutföras och returnerar ett “CompletedProcess” -objekt till slut. Objektet "CompletedProcess" returnerar stdout, stderr, originalargument som används när du anropar metoden och en returkod. Stdout hänvisar till dataströmmen som produceras av kommandot, medan stderr hänvisar till eventuella fel som uppkommit under körning av programmet. Varje returkod som inte är noll (exit code) skulle innebära fel med kommandot som körs i delprocessen.körmetoden.

Exempel 1: Utmatningsinnehåll för en textfil med hjälp av delprocessen.kör metod

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

importera underprocess
underprocess.run (["cat", "data.Text"])

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

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

Det första elementet i listargumentet är namnet på kommandot som ska köras. Alla element i listan som följer det första elementet betraktas som kommandoradsalternativ eller växlar. Du kan också använda en streck och dubbla streck för att definiera alternativen. Om du till exempel vill lista filer och mappar i en katalog skulle koden vara "underprocess.kör ([“ls”, “-l”] ”. I de flesta av dessa fall kan du betrakta valfritt mellanslag i ett skalkommando som ett enskilt element i listan som levereras till underprocessen.körmetod.

Exempel 2: Dämpa utdata från underprocess.kör metod

För att undertrycka underprocessens utdata.körmetod måste du tillhandahålla “stdout = underprocess.DEVNULL ”och“ stderr = underprocess.DEVNULL ”som ytterligare argument.

importera underprocess
underprocess.run (["cat", "data.txt "], stdout = underprocess.DEVNULL,
stderr = underprocess.DEVNULL)

Att köra koden ovan ger följande utdata:

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

Exempel 3: Capture Output of Subprocess.kör metod

Att fånga utdata från delprocessen.körmetod, använd ett ytterligare argument med namnet “capture_output = True”.

importera underprocess
output = underprocess.run (["cat", "data.txt "], capture_output = True)
skriva ut (utdata)

Att köra koden ovan ger följande utdata:

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

Du kan komma åt stdout- och stderr-värden individuellt genom att använda “output.stdout ”och” output.stderr ”-metoder. Utgången produceras som en bytesekvens. För att få en sträng som output, använd “output.stdout.avkoda (“utf-8”) -metoden. Du kan också ange "text = True" som ett extra argument till underprocessen.kör samtal för att få utdata i strängformat. För att få utgångsstatuskod kan du använda “utgång.returkod ”-metoden.

Exempel 4: Öka undantaget vid fel på kommandot som utförs av underprocessen.kör metod

För att höja ett undantag när kommandot avslutas med status som inte är noll, använd argumentet ”check = True”.

importera underprocess
underprocess.run (["cat", "data.tx "], capture_output = True, text = True, check = True)

Att köra koden ovan ger följande utdata:

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

Exempel 5: Skicka en sträng till kommando som utförs av underprocessen.kör metod

Du kan skicka en sträng till kommandot som ska köras av delprocess.kör metod med hjälp av argumentet “input = 'string'”.

importera underprocess
output = underprocess.run (["cat"], input = "data.txt ", capture_output = True,
text = True, check = True)
skriva ut (utdata)

Att köra koden ovan ger följande utdata:

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

Som du ser överför koden ovan “data.txt ”som en sträng och inte som ett filobjekt. Att skicka “data.txt ”som en fil, använd argumentet“ stdin ”.

med öppen ("data.txt ") som f:
output = underprocess.run (["cat"], stdin = f, capture_output = True,
text = True, check = True)
skriva ut (utdata)

Att köra koden ovan ger följande utdata:

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

Exempel 6: Kör kommandot direkt i Shell med hjälp av underprocessen.kör metod

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 är dock avskräckt av pythonutvecklare att använda "shell = True" kan leda till säkerhetsproblem. Du kan läsa mer om säkerhetsimplikationer härifrån.

importera underprocess
underprocess.kör ("katt" -data.txt '", shell = True)

Att köra koden ovan ger följande utdata:

namn = John

Slutsats

Delprocessen.körmetoden 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 sig 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 “shlex.split () ”-metod 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 argumentet “shell = True” för att undvika detta, men det finns vissa säkerhetsproblem associerade med den här åtgärden.

Bästa spelkonsolemulatorer för Linux
Den här artikeln listar populära spelkonsolemuleringsprogram som finns tillgängliga för Linux. Emulation är ett mjukvarukompatibilitetsskikt som emule...
Bästa Linux Distros för spel 2021
Linux-operativsystemet har kommit långt från sitt ursprungliga, enkla, serverbaserade utseende. Detta operativsystem har förbättrats enormt de senaste...
Hur du fångar och strömmar din spelsession på Linux
Tidigare betraktades spel bara som en hobby, men med tiden såg spelindustrin en enorm tillväxt när det gäller teknik och antalet spelare. Spelpubliken...