Podproces.spustit metodu
Podproces.metoda run vezme seznam argumentů. Když je metoda volána, provede příkaz a čeká na dokončení procesu, na konci vrátí objekt „CompletedProcess“. Objekt „CompletedProcess“ vrací stdout, stderr, původní argumenty použité při volání metody a návratový kód. Stdout odkazuje na datový proud produkovaný příkazem, zatímco stderr odkazuje na jakékoli chyby vzniklé během provádění programu. Jakýkoli nenulový návratový kód (výstupní kód) by znamenal chybu v příkazu provedeném v podprocesu.spustit metodu.
Příklad 1: Výstup obsahu textového souboru pomocí podprocesu.spustit metodu
Následující příkaz vygeneruje obsah „dat.Soubor txt ”za předpokladu, že obsahuje řetězec„ name = John “.
importovat podprocespodproces.spustit (["kočka", "data.txt "]))
Spuštěním výše uvedeného kódu se vrátí následující výstup:
jméno = JohnCompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0)
Prvním prvkem argumentu seznamu je název příkazu, který má být proveden. Jakýkoli prvek v seznamu, který následuje za prvním prvkem, se považuje za možnosti příkazového řádku nebo přepínače. K definování možností můžete také použít jednoduché a dvojité pomlčky. Například pro seznam souborů a složek v adresáři by kód byl „podproces.spustit ([„ls“, „-l“] “). Ve většině těchto případů můžete jakýkoli mezerou oddělený argument v příkazu prostředí považovat za samostatný prvek v seznamu dodávaném do podprocesu.spustit metodu.
Příklad 2: Potlačit výstup podprocesu.spustit metodu
Potlačit výstup podprocesu.spustit metodu, budete muset zadat „stdout = podproces.DEVNULL “a„ stderr = podproces.DEVNULL ”jako další argumenty.
importovat podprocespodproces.spustit (["kočka", "data.txt "], stdout = podproces.DEVNULL,
stderr = podproces.DEVNULL)
Spuštění výše uvedeného kódu způsobí následující výstup:
CompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0)Příklad 3: Zachycení výstupu podprocesu.spustit metodu
Chcete-li zachytit výstup podprocesu.metoda spuštění, použijte další argument s názvem „capture_output = True“.
import podprocesuvýstup = podproces.spustit (["kočka", "data.txt "], capture_output = True)
tisk (výstup)
Spuštění výše uvedeného kódu způsobí následující výstup:
CompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0,stdout = b'name = John \ n ', stderr = b ")
K jednotlivým hodnotám stdout a stderr můžete jednotlivě přistupovat pomocí „výstupu.stdout “a„ výstup.stderr ”metody. Výstup je vytvořen jako bajtová sekvence. Chcete-li získat řetězec jako výstup, použijte „výstup.stdout.metoda dekódování („utf-8“). Můžete také zadat „text = True“ jako další argument pro podproces.spusťte volání a získejte výstup ve formátu řetězce. Chcete-li získat stavový kód ukončení, můžete použít „výstup.metoda „návratového kódu“.
Příklad 4: Zvýšení výjimky při selhání příkazu provedeného podprocesem.spustit metodu
Chcete-li vyvolat výjimku při ukončení příkazu s nenulovým stavem, použijte argument „check = True“.
import podprocesupodproces.spustit (["kočka", "data.tx "], capture_output = True, text = True, check = True)
Spuštění výše uvedeného kódu způsobí následující výstup:
zvýšit CalledProcessError (retcode, zpracování.args,podproces.CalledProcessError: Příkaz '[' cat ',' data.tx ']'
vrácený nenulový stav ukončení 1.
Příklad 5: Předejte řetězec příkazu provedenému podprocesem.spustit metodu
Řetězci můžete předat příkaz, který má být proveden podprocesem.spusťte metodu pomocí argumentu „input = 'string'“.
importovat podprocesvýstup = podproces.run (["kočka"], vstup = "data.txt ", capture_output = True,
text = True, check = True)
tisk (výstup)
Spuštění výše uvedeného kódu způsobí následující výstup:
CompletedProcess (args = ['cat'], návratový kód = 0, stdout = "data.txt ", stderr =")Jak vidíte, výše uvedený kód předává „data.txt ”jako řetězec a ne jako souborový objekt. Předat „data.txt “jako soubor, použijte argument„ stdin “.
s otevřenými ("data.txt ") jako f:výstup = podproces.run (["kočka"]), stdin = f, capture_output = True,
text = True, check = True)
tisk (výstup)
Spuštění výše uvedeného kódu způsobí následující výstup:
CompletedProcess (args = ['cat'], návratový kód = 0, stdout = "name = John \ n", stderr = ")Příklad 6: Proveďte příkaz přímo v prostředí Shell pomocí podprocesu.spustit metodu
Je možné spustit příkaz přímo do prostředí „tak, jak je“, namísto použití rozdělení řetězce v hlavním příkazu a možností, které za ním následují. Chcete-li to provést, musíte předat „shell = True“ jako další argument. Toto však vývojáři pythonu odrazují, protože používání „shell = True“ může vést k bezpečnostním problémům. Další informace o dopadech na zabezpečení si můžete přečíst zde.
import podprocesupodproces.run ("cat" data.txt '", shell = True)
Spuštění výše uvedeného kódu způsobí následující výstup:
jméno = JohnZávěr
Dílčí proces.metoda běhu v Pythonu je docela silná, protože umožňuje spouštět příkazy prostředí v samotném pythonu. To pomáhá omezit veškerý kód na samotný python, aniž byste museli mít další kód skriptu prostředí v samostatných souborech. Může však být docela složité správně tokenizovat příkazy prostředí v seznamu pythonu. Můžete použít „shlex.split () ”metoda pro tokenizaci jednoduchých příkazů prostředí, ale u dlouhých a složitých příkazů - zejména těch se symboly potrubí - shlex nedokáže správně rozdělit příkaz. V takových případech může být ladění obtížný problém. Chcete-li se tomu vyhnout, můžete použít argument „shell = True“, ale s touto akcí jsou spojeny určité bezpečnostní problémy.