Python

Ako vykonávať príkazy shellu v Pythone pomocou metódy spustenia podprocesu

Ako vykonávať príkazy shellu v Pythone pomocou metódy spustenia podprocesu
Podproces je zabudovaný modul Pythonu, ktorý sa dá použiť na vytváranie nových procesov a interakciu s ich vstupnými a výstupnými dátovými tokmi. Zjednodušene povedané, môžete ho použiť na spustenie príkazov shellu a spustenie spustiteľných binárnych súborov zvyčajne roztrúsených v rôznych priečinkoch „bin“ v systéme súborov Linux. Môžete tiež zadať úplnú cestu k spustiteľnému binárnemu súboru a použiť akékoľvek prepínače príkazového riadku spojené s týmto binárnym súborom. Tento článok vysvetlí, ako používať modul podprocesu a jeho metódu spustenia v aplikáciách Python. Všetky ukážky kódu v článku sú testované s programom Python 3.8.2 na Ubuntu 20.04.

Podproces.spustiť metódu

Podproces.metóda spusti zoznam argumentov. Keď sa metóda volá, vykoná príkaz a počká na dokončenie procesu. Na konci vráti objekt „CompletedProcess“. Objekt „CompletedProcess“ vracia štandardný výstup, stderr, pôvodné argumenty použité pri volaní metódy a návratový kód. Stdout označuje dátový prúd produkovaný príkazom, zatiaľ čo stderr označuje všetky chyby vzniknuté počas vykonávania programu. Akýkoľvek nenulový návratový kód (výstupný kód) by znamenal chybu v príkaze vykonanom v podprocese.spustiť metódu.

Príklad 1: Výstupný obsah textového súboru pomocou podprocesu.spustiť metódu

Nasledujúci príkaz vygeneruje obsah „údajov.Súbor txt ”za predpokladu, že obsahuje reťazec„ name = John “.

importovať podproces
podproces.spustiť (["mačka", "údaje.TXT"])

Spustenie vyššie uvedeného kódu vráti nasledujúci výstup:

meno = John
CompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0)

Prvým prvkom argumentu zoznamu je názov príkazu, ktorý sa má vykonať. Akýkoľvek prvok v zozname, ktorý nasleduje po prvom prvku, sa považuje za voľbu príkazového riadku alebo prepínač. Na definovanie možností môžete použiť aj jednoduché a dvojité pomlčky. Napríklad pre zoznam súborov a priečinkov v adresári by bol kód „podproces.spustiť ([„ls“, „-l“] “). Vo väčšine týchto prípadov môžete akýkoľvek argument oddelený medzerou v príkaze shell považovať za samostatný prvok v zozname dodávanom do podprocesu.spustiť metódu.

Príklad 2: Potlačiť výstup podprocesu.spustiť metódu

Potlačiť výstup podprocesu.spustená metóda, budete musieť dodať „stdout = podproces.DEVNULL “a„ stderr = podproces.DEVNULL “ako ďalšie argumenty.

importovať podproces
podproces.spustiť (["mačka", "údaje.txt "], stdout = podproces.DEVNULL,
stderr = podproces.DEVNULL)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

CompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0)

Príklad 3: Zachytiť výstup podprocesu.spustiť metódu

Na zachytenie výstupu podprocesu.spustite metódu, použite ďalší argument s názvom „capture_output = True“.

importovať podproces
výstup = podproces.spustiť (["mačka", "údaje.txt "], capture_output = True)
tlač (výstup)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

CompletedProcess (args = ['cat', 'data.txt '], návratový kód = 0,
stdout = b'name = John \ n ', stderr = b ")

K hodnotám stdout a stderr môžete individuálne pristupovať pomocou „výstupu.štandardný výstup a výstup.stderr “metódy. Výstup je produkovaný ako bajtová sekvencia. Ak chcete získať reťazec ako výstup, použite „výstup.stdout.metóda dekódovania („utf-8“) “. Môžete tiež dodať „text = True“ ako ďalší argument pre podproces.spustite volanie a získate výstup vo formáte reťazca. Ak chcete získať výstupný stavový kód, môžete použiť výstup.metóda vrátenia kódu “.

Príklad 4: Zvýšenie výnimky pri zlyhaní príkazu vykonaného podprocesom.spustiť metódu

Na vyvolanie výnimky pri ukončení príkazu s nenulovým stavom použite argument „check = True“.

importovať podproces
podproces.spustiť (["mačka", "údaje.tx "], capture_output = True, text = True, check = True)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

zvýšiť CalledProcessError (retcode, proces.args,
podproces.CalledProcessError: Príkaz '[' cat ',' dáta.tx ']'
vrátený nenulový stav ukončenia 1.

Príklad 5: Zadajte reťazec príkazu vykonanému podprocesom.spustiť metódu

Do príkazu, ktorý sa má vykonať podprocesom, môžete vložiť reťazec.spustite metódu pomocou argumentu „input = 'string'“.

importovať podproces
výstup = podproces.spustiť (["mačka"], vstup = "údaje.txt ", capture_output = True,
text = True, check = True)
tlač (výstup)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

CompletedProcess (args = ['cat'], návratový kód = 0, stdout = "údaje.txt ", stderr =")

Ako vidíte, vyššie uvedený kód odovzdáva „údaje.txt “ako reťazec a nie ako súborový objekt. Odovzdať „údaje.txt “ako súbor, použite argument„ stdin “.

s otvorenými ("údajmi".txt ") ako f:
výstup = podproces.run (["mačka"]), stdin = f, capture_output = True,
text = True, check = True)
tlač (výstup)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

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

Príklad 6: Vykonajte príkaz priamo v prostredí Shell pomocou podprocesu.spustiť metódu

Je možné spustiť príkaz priamo do shellu „ako je“, namiesto použitia reťazca rozdeleného v hlavnom príkaze a volieb, ktoré za ním nasledujú. Ak to chcete urobiť, musíte ako ďalší argument zadať slovo „shell = True“. To však vývojárov pythonu neodporúča, pretože používanie parametra „shell = True“ môže viesť k bezpečnostným problémom. Viac informácií o bezpečnostných dopadoch si môžete prečítať tu.

importovať podproces
podproces.spustiť ("cat" údaje.txt '", shell = True)

Spustenie vyššie uvedeného kódu spôsobí nasledujúci výstup:

meno = John

Záver

Podproces.Metóda spustenia v Pythone je dosť silná, pretože vám umožňuje spúšťať príkazy shellu v samotnom Pythone. To pomáha pri obmedzení celého kódu na samotný python bez nutnosti mať ďalší kód skriptu shellu v samostatných súboroch. Môže byť však dosť zložité správne tokenizovať príkazy shellu v zozname pythónov. Môžete použiť „shlex“.split () ”metóda na tokenizáciu jednoduchých príkazov shellu, ale v dlhých a zložitých príkazoch - najmä tých so symbolmi potrubia - shlex nedokáže správne rozdeliť príkaz. V takýchto prípadoch môže byť ladenie zložitou záležitosťou. Môžete sa vyhnúť argumentu „shell = True“, ale s touto akciou sú spojené určité bezpečnostné problémy.

Hry Top 10 hier, ktoré sa dajú hrať na Ubuntu
Top 10 hier, ktoré sa dajú hrať na Ubuntu
Platforma Windows je jednou z dominujúcich platforiem pre hry kvôli obrovskému percentu hier, ktoré sa dnes vyvíjajú na natívnu podporu systému Window...
Hry 5 najlepších arkádových hier pre Linux
5 najlepších arkádových hier pre Linux
V dnešnej dobe sú počítače vážne stroje používané na hranie hier. Ak nemôžete dosiahnuť nové najvyššie skóre, budete vedieť, čo tým myslím. V tomto pr...
Hry Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 Vývoj uvoľnený
Battle For Wesnoth 1.13.6 vydané minulý mesiac, je šiestym vývojovým vydaním v 1.13.séria x a prináša množstvo vylepšení, najmä používateľského rozhra...