Krajta

Jak provádět příkazy prostředí v Pythonu pomocí metody běhu podprocesu

Jak provádět příkazy prostředí v Pythonu pomocí metody běhu podprocesu
Subproces je vestavěný modul Pythonu, který lze použít k vytváření nových procesů a interakci s jejich vstupními a výstupními datovými toky. Jednoduše řečeno, můžete jej použít ke spuštění příkazů prostředí a ke spuštění spustitelných binárních souborů, které jsou obvykle roztroušeny v různých složkách „bin“ v systému souborů Linux. Můžete také zadat úplnou cestu ke spustitelnému binárnímu souboru a použít jakékoli přepínače příkazového řádku přidružené k binárnímu souboru. Tento článek vysvětlí, jak používat modul podprocesu a jeho metodu běhu v aplikacích Pythonu. Všechny ukázky kódu v článku jsou testovány pomocí Pythonu 3.8.2 na Ubuntu 20.04.

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 podproces
podproces.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 = John
CompletedProcess (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 podproces
podproces.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 podprocesu
vý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 podprocesu
podproces.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 podproces
vý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 podprocesu
podproces.run ("cat" data.txt '", shell = True)

Spuštění výše uvedeného kódu způsobí následující výstup:

jméno = John

Zá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.

Hry Výukový program Shadow of the Tomb Raider pro Linux
Výukový program Shadow of the Tomb Raider pro Linux
Shadow of the Tomb Raider je dvanáctý přírůstek do série Tomb Raider - série akčních adventur vytvořená Eidosem Montrealem. Tato hra byla docela dobře...
Hry Jak zvýšit FPS v Linuxu?
Jak zvýšit FPS v Linuxu?
FPS znamená Snímků za sekundu. Úkolem FPS je měřit snímkovou frekvenci při přehrávání videa nebo herních výkonech. Jednoduše řečeno, počet nepřerušova...
Hry Nejlepší hry Oculus App Lab
Nejlepší hry Oculus App Lab
Pokud jste vlastníkem náhlavní soupravy Oculus, musíte mít informace o bočním nakládání. Sideloading je proces instalace neukládaného obsahu do náhlav...