Jak spustit příkazy prostředí v Pythonu pomocí metody spuštění podprocesu

How Execute Shell Commands Python Using Subprocess Run Method



Subprocess 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šeji řečeno, můžete jej použít ke spouštění příkazů shellu a spouštění spustitelných binárních souborů obvykle roztroušených 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 libovolné 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 spuštění 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.

Metoda Subprocess.run

Metoda Subprocess.run přebírá seznam argumentů. Když je metoda volána, provede příkaz a čeká na dokončení procesu a nakonec vrátí CompletedProcess objekt. CompletedProcess Objekt vrací stdout, stderr, původní argumenty použité při volání metody a návratový kód. Stdout odkazuje na datový proud vytvořený 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 s příkazem provedeným v metodě subprocess.run.







Příklad 1: Výstupní obsah textového souboru pomocí metody Subprocess.run

Níže uvedený příkaz vygeneruje obsah souboru data.txt za předpokladu, že obsahuje řetězec name = John.



import podproces
podproces.běh(['kočka', 'data.txt'])

Spuštěním výše uvedeného kódu se vrátí následující výstup:



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

Prvním prvkem argumentu seznamu je název příkazu, který se má provést. Jakýkoli prvek v seznamu, který následuje za prvním prvkem, je považován za volby nebo přepínače příkazového řádku. K definování možností můžete použít také jednoduché pomlčky a dvojité pomlčky. Například pro výpis souborů a složek v adresáři by byl kód subprocess.run ([ls, -l]. Ve většině těchto případů můžete jakýkoli argument oddělený mezerou v příkazu shell považovat za individuální prvek v seznam dodaný metodě subprocess.run.





Příklad 2: Potlačit výstup metody Subprocess.run

Chcete -li potlačit výstup metody subprocess.run, budete muset jako další argumenty zadat stdout = subprocess.DEVNULL a stderr = subprocess.DEVNULL.

import podproces

podproces.běh(['kočka', 'data.txt'],standardní výstup=podproces.DEVNULL,
stderr=podproces.DEVNULL)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:



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

Příklad 3: Zachycení výstupu metody Subprocess.run

K zachycení výstupu metody subprocess.run použijte další argument s názvem capture_output = True.

import podproces
výstup= podproces.běh(['kočka', 'data.txt'],capture_output=Skutečný)
tisk (výstup)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:

Dokončený proces(args=['kočka', 'data.txt'],návratový kód=0,
standardní výstup=b'name = John n',stderr=b'')

K hodnotám stdout a stderr můžete jednotlivě přistupovat pomocí metod output.stdout a output.stderr. Výstup je vytvořen jako bajtová sekvence. Chcete-li jako výstup získat řetězec, použijte metodu output.stdout.decode (utf-8). Můžete také zadat text = True jako další argument pro volání subprocess.run, abyste získali výstup ve formátu řetězce. Chcete -li získat kód stavu ukončení, můžete použít metodu output.returncode.

Příklad 4: Zvýšení výjimky při selhání příkazu provedeného metodou Subprocess.run

Chcete-li vyvolat výjimku, když se příkaz ukončí s nenulovým stavem, použijte argument check = True.

import podproces
podproces.běh(['kočka', 'data.tx'],capture_output=Skutečný,text=Skutečný,šek=Skutečný)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:

zvýšit CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Příkaz '[' kočka ',' data.tx ']'
vrátil nenulový stav ukončení 1.

Příklad 5: Předejte řetězec příkazu provedenému metodou Subprocess.run

Do příkazu, který má být spuštěn metodou subprocess.run, můžete předat řetězec pomocí argumentu input = ‘string’.

import podproces
výstup= podproces.běh(['kočka'], vstup='data.txt',capture_output=Skutečný,
text=Skutečný,šek=Skutečný)
tisk (výstup)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:

CompletedProcess (args = ['kočka'], 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. Chcete -li předat data.txt jako soubor, použijte argument stdin.

s otevřeno('data.txt') tak jakoF:
výstup= podproces.běh(['kočka'],stdin=F,capture_output=Skutečný,
text=Skutečný,šek=Skutečný)
tisk (výstup)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:

CompletedProcess (args = ['kočka'], návratový kód = 0, stdout = 'jméno = John n', stderr = '')

Příklad 6: Proveďte příkaz přímo v prostředí pomocí metody Subprocess.run

Je možné spustit příkaz přímo do shellu tak, jak je, místo použití rozdělení řetězce v hlavním příkazu a možnostech, které po něm následují. Chcete -li to provést, musíte jako další argument předat shell = True. To však vývojáři pythonu nedoporučují, protože používání shellu = True může vést k problémům se zabezpečením. Můžete si přečíst více o bezpečnostních důsledcích z tady .

import podproces
podproces.běh('cat' data.txt '',skořápka=Skutečný)

Spuštěním výše uvedeného kódu se vytvoří následující výstup:

jméno = John

Závěr

Metoda subprocess.run v Pythonu je docela výkonná, protože vám umožňuje spouštět příkazy shellu v samotném pythonu. To pomáhá při omezení veškerého kódu na samotný python bez nutnosti mít další kód skriptu shellu v samostatných souborech. Správně tokenizovat příkazy shellu v seznamu pythonů však může být docela ošidné. Metodu shlex.split () můžete použít k tokenizaci jednoduchých příkazů shellu, ale u dlouhých, 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í složitý problém. Chcete -li tomu zabránit, můžete použít argument shell = True, ale s touto akcí jsou spojena určitá bezpečnostní rizika.