Ako spustiť príkazy Shell v Pythone pomocou metódy spustenia podprocesu

How Execute Shell Commands Python Using Subprocess Run Method



Subproces je vstavaný modul Python, ktorý možno 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 spúšťanie príkazov shellu a spúšťanie spustiteľných binárnych súborov, ktoré sú zvyčajne roztrúsené 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ť ľubovoľné prepínače príkazového riadka priradené k binárnemu súboru. 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 Pythonom 3.8.2 na Ubuntu 20.04.

Metóda Subprocess.run

Metóda Subprocess.run preberá zoznam argumentov. Keď sa metóda zavolá, vykoná príkaz a počká na dokončenie procesu a na konci vráti objekt CompletedProcess. Objekt CompletedProcess vracia štandardné argumenty, štandardné argumenty použité pri volaní metódy a návratový kód. Stdout označuje dátový tok vytvorený príkazom, zatiaľ čo stderr označuje všetky chyby, ktoré sa vyskytnú počas vykonávania programu. Akýkoľvek nenulový návratový kód (výstupný kód) by znamenal chybu pri príkaze vykonanom metódou subprocess.run.







Príklad 1: Výstupný obsah textového súboru pomocou metódy Subprocess.run

Nasledujúci príkaz vygeneruje obsah súboru data.txt za predpokladu, že obsahuje reťazec name = John.



import podproces
podproces.bežať(['mačka', 'data.txt'])

Spustením vyššie uvedeného kódu sa vráti nasledujúci výstup:



názov=John
Dokončený proces(args=['mačka', 'data.txt'],návratový kód=0)

Prvým prvkom argumentu zoznamu je názov príkazu, ktorý sa má vykonať. Každý prvok v zozname, ktorý nasleduje za prvým prvkom, sa považuje za možnosti alebo prepínače príkazového riadka. Na definovanie možností môžete použiť aj jednoduchú a dvojitú pomlčku. Napríklad na zoznam súborov a priečinkov v adresári by bol kód subprocess.run ([ls, -l]. Vo väčšine týchto prípadov môžete akýkoľvek argument oddelený medzerou v príkaze shell považovať za individuálny prvok v zoznam dodaný metóde subprocess.run.





Príklad 2: Potlačenie výstupu metódy Subprocess.run

Na potlačenie výstupu metódy subprocess.run budete musieť ako ďalšie argumenty zadať stdout = subprocess.DEVNULL a stderr = subprocess.DEVNULL.

import podproces

podproces.bežať(['mačka', 'data.txt'],stdout=podproces.DEVNULL,
stderr=podproces.DEVNULL)

Spustením kódu vyššie získate nasledujúci výstup:



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

Príklad 3: Zachytenie výstupu metódy Subprocess.run

Na zachytenie výstupu metódy subprocess.run použite ďalší argument s názvom capture_output = True.

import podproces
výkon= podproces.bežať(['mačka', 'data.txt'],odchyt_výstup=Pravda)
vytlačiť (výkon)

Spustením kódu vyššie získate nasledujúci výstup:

Dokončený proces(args=['mačka', 'data.txt'],návratový kód=0,
stdout=b'meno = John n',stderr=b'')

K hodnotám stdout a stderr môžete individuálne pristupovať pomocou metód output.stdout a output.stderr. Výstup je vytvorený ako bajtová postupnosť. Na získanie reťazca ako výstupu použite metódu output.stdout.decode (utf-8). Môžete tiež zadať text = True ako ďalší argument pre volanie subprocess.run, aby bol výstup vo formáte reťazca. Ak chcete získať kód stavu ukončenia, môžete použiť metódu output.returncode.

Príklad 4: Zvýšenie výnimky pri zlyhaní príkazu vykonaného metódou Subprocess.run

Ak chcete vyvolať výnimku, keď sa príkaz skončí s nenulovým stavom, použite argument check = True.

import podproces
podproces.bežať(['mačka', 'data.tx'],odchyt_výstup=Pravda,text=Pravda,skontrolovať=Pravda)

Spustením kódu vyššie získate nasledujúci výstup:

zvýšiť CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Príkaz '[' mačka ',' data.tx ']'
vrátil nenulový stav výstupu 1.

Príklad 5: Odošlite reťazec príkazu vykonanému metódou Subprocess.run

Do príkazu, ktorý sa má vykonať, môžete zadať reťazec metódou subprocess.run pomocou argumentu input = ‘string’.

import podproces
výkon= podproces.bežať(['mačka'], vstup='data.txt',odchyt_výstup=Pravda,
text=Pravda,skontrolovať=Pravda)
vytlačiť (výkon)

Spustením kódu vyššie získate nasledujúci výstup:

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

Ako vidíte, vyššie uvedený kód odovzdáva data.txt ako reťazec a nie ako súborový objekt. Na odoslanie súboru data.txt ako súboru použite argument stdin.

s otvorené('data.txt') akof:
výkon= podproces.bežať(['mačka'],stdin=f,odchyt_výstup=Pravda,
text=Pravda,skontrolovať=Pravda)
vytlačiť (výkon)

Spustením kódu vyššie získate nasledujúci výstup:

CompletedProcess (args = ['mačka'], návratový kód = 0, stdout = 'meno = John n', stderr = '')

Príklad 6: Vykonajte príkaz priamo v prostredí Shell pomocou metódy Subprocess.run

Namiesto použitia rozdelenia reťazcov v hlavnom príkaze a volieb, ktoré za ním nasledujú, je možné spustiť príkaz priamo do shellu tak, ako je. Ak to chcete urobiť, musíte ako ďalší argument zadať shell = True. To však vývojári pythonu neodporúčajú, pretože používanie shellu = True môže viesť k problémom s bezpečnosťou. Môžete si prečítať viac o implikáciách na bezpečnosť z tu .

import podproces
podproces.bežať('cat' data.txt '',škrupina=Pravda)

Spustením kódu vyššie získate nasledujúci výstup:

meno = John

Záver

Metóda subprocess.run v Pythone je dosť účinná, pretože vám umožňuje spúšťať príkazy shellu v samotnom pythone. Pomáha to pri obmedzení celého kódu na samotný python bez toho, aby ste museli mať ďalší kód skriptu shell v samostatných súboroch. Správne tokenizovať príkazy shellu v zozname pythónov však môže byť dosť náročné. Metódu shlex.split () môžete použiť na tokenizáciu jednoduchých príkazov shellu, ale v dlhých a zložitých príkazoch - najmä tých, ktoré majú symboly potrubí - shlex nedokáže správne rozdeliť príkaz. V takýchto prípadoch môže byť ladenie zložitý problém. Aby ste tomu zabránili, môžete použiť argument shell = True, ale s touto akciou sú spojené určité bezpečnostné problémy.