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 underprocessunderprocess.run (["cat", "data.Text"])
Körning av koden ovan returnerar följande utdata:
namn = JohnCompletedProcess (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 underprocessunderprocess.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 underprocessoutput = 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 underprocessunderprocess.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 underprocessoutput = 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 underprocessunderprocess.kör ("katt" -data.txt '", shell = True)
Att köra koden ovan ger följande utdata:
namn = JohnSlutsats
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.