Jak spouštět bash skripty pomocí Pythonu?
Pokud používáte Linux, pak byste určitě milovali příkazy shellu.
A pokud pracujete s Pythonem, možná jste se pokusili věci automatizovat. To je způsob, jak ušetřit čas. Můžete mít také nějaké bash skripty pro automatizaci věcí.
Python je vhodný pro psaní skriptů než bash. A správa skriptů Python je ve srovnání s bash skripty snadná. Jakmile se bash skripty rozrostou, bude pro vás obtížné udržovat je.
Ale co když již máte bash skripty, které chcete spouštět pomocí Pythonu?
Existuje nějaký způsob, jak spustit bash příkazy a skripty v Pythonu?
Ano, Python má vestavěný modul nazvaný subprocess, který se používá k provádění příkazů a skriptů uvnitř skriptů Pythonu. Podívejme se, jak podrobně provádět bash příkazy a skripty ve skriptech Pythonu.
Table of Contents
Provádění Bash příkazů
Jak jste již možná viděli, podproces modulu se používá k provádění příkazů a skriptů bash. Poskytuje různé metody a třídy pro totéž.
Existuje hlavně jedna metoda a jedna třída, o kterých byste měli vědět z modulu subprocess. Jsou run a Popen. Tyto dva nám pomáhají provádět bash příkazy ve skriptech Pythonu. Podívejme se na ně jednoho po druhém.
subprocess.run()
Metoda subprocess.run() vezme jako poziční argument seznam řetězců. Toto je povinné, protože obsahuje příkaz bash a pro něj argumenty. První položka v seznamu je název příkazu a zbývající položky jsou argumenty příkazu.
Podívejme se na rychlý příklad.
import subprocess subprocess.run(["ls"])
Výše uvedený skript obsahuje seznam všech položek v aktuálním pracovním adresáři, jak skript leží. Ve výše uvedeném skriptu nejsou k příkazu žádné argumenty. Zadali jsme pouze příkaz bash. Příkazu ls můžeme poskytnout další argumenty jako -l, -a, -la atd.
Podívejme se na rychlý příklad s argumenty příkazu.
import subprocess subprocess.run(["ls", "-la"])
Výše uvedený příkaz zobrazí všechny soubory včetně skrytých souborů spolu s oprávněními. Poskytli jsme argument la, který zobrazuje další informace o souborech a adresářích a skryté soubory.
Může se stát, že při psaní příkazů uděláme nějaké chyby. Chyby se budou zvyšovat podle chyb. Co když je chcete zachytit a použít později? Ano, můžeme to udělat pomocí klíčového slova argument stderr.
Podívejme se na příklad.
import subprocess result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True) print(result.stderr)
Ujistěte se, že v pracovním adresáři nemáte soubor s názvem sample.txt. Hodnota argumentu klíčového slova stderr je PIPE, což pomáhá vrátit chybu v objektu. Můžeme k němu později přistupovat se stejným názvem. A text argumentu klíčového slova pomáhá říci, že výstupem by měl být řetězec.
Podobně můžeme zachytit výstup příkazu pomocí argumentu klíčového slova stdout.
import subprocess result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(result.stdout)
subprocess.run() – vstup
Vstup do příkazů můžete zadat pomocí argumentu klíčového slova input. Vstupy budeme uvádět ve formátu řetězce. Musíme tedy nastavit text argumentu klíčového slova na hodnotu True. Ve výchozím nastavení to bere v bajtech.
Podívejme se na příklad.
import subprocess subprocess.run(["python3", "add.py"], text=True, input="2 3")
Ve výše uvedeném programu bude Python skript add.py brát jako vstup dvě čísla. Vstup do skriptu Python jsme zadali pomocí argumentu klíčového slova input.
subprocess.Popen()
Třída subprocess.Popen() je pokročilejší než metoda subprocess.run(). Poskytuje nám více možností pro provádění příkazů. Vytvoříme instanci subprocess.Popen() a použijeme ji pro různé věci, jako je znalost stavu provádění příkazu, získávání výstupu, zadávání vstupu atd..,
Existuje několik metod třídy subprocess.Popen(), které potřebujeme znát. Podívejme se na ně jeden po druhém spolu s příklady kódu.
Počkejte
Slouží k čekání na dokončení provedení příkazu. Další řádky skriptu Python se nespustí, dokud nebude dokončen předchozí příkaz, který je zapsán po metodě čekání. Podívejme se na příklad.
import subprocess process = subprocess.Popen(["ls", "-la"]) print("Completed!")
Spusťte výše uvedený kód a sledujte výstup. Uvidíte, že zpráva Dokončeno! se vytiskne před provedením příkazu. Můžeme se tomu vyhnout pomocí metody čekání. Počkáme na dokončení příkazu.
import subprocess process = subprocess.Popen(["ls", "-la"]) process.wait() print("Completed!")
Pokud uvidíte výstup pro výše uvedený kód, uvědomíte si, že čekání skutečně funguje. Tiskový příkaz se provede po dokončení provádění příkazu.
komunikovat
Metoda komunikace se používá k získání výstupu, chyby a zadání vstupu příkazu. Vrací n-tici obsahující výstup a chybu. Podívejme se na příklad.
import subprocess process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) result = process.communicate() print(result)
subprocess.Popen() – vstup
Vstup nemůžeme předat přímo třídě Popen. K zadání vstupu příkazu musíme použít argument klíčového slova s názvem stdin. Instance třídy Popen nám poskytne objekt stdin. Má metodu nazvanou write, která se používá k zadání vstupu příkazu.
Jak jsme diskutovali dříve, ve výchozím nastavení bude mít vstupy jako objekty podobné bajtům. Při vytváření instance Popen tedy nezapomeňte nastavit text argumentu klíčového slova na True.
Podívejme se na příklad.
import subprocess process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) process.stdin.write("2 3") process.stdin.close() print(process.stdout.read())
hlasování
Metoda dotazování se používá ke kontrole, zda je provedení příkazu dokončeno nebo ne. Tato metoda vrátí None, pokud se příkaz stále provádí. Podívejme se na příklad.
import subprocess process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True) while True: output = process.stdout.readline() if output: print(output.strip()) result = process.poll() if result is not None: break
Ve výše uvedeném kódu jsme použili příkaz ping s 5 požadavky. Existuje nekonečná smyčka, která se opakuje až do dokončení provádění příkazu. Ke kontrole stavu provádění příkazu jsme použili metodu dotazování. Pokud dotaz metody vrátí kód jiný než Žádný, pak se provedení dokončí. A nekonečná smyčka se přeruší.
Provádění Bash skriptů
Viděli jsme dva způsoby provádění příkazů. Nyní se podívejme, jak spustit bash skripty ve skriptech Pythonu.
Podproces má metodu nazývanou call. Tato metoda se používá k provádění bash skriptů. Metoda vrací výstupní kód z bash skriptu. Výchozí výstupní kód pro bash skripty je 0. Podívejme se na příklad.
Vytvořte bash skript s názvem practice.sh následovně.
#!/bin/bash echo "Hello, World!" exit 1
Nyní napište skript Python a spusťte výše uvedený bash skript.
import subprocess exit_code = subprocess.call('./practice.sh') print(exit_code)
Jakmile spustíte výše uvedený skript Python, získáte následující výstup.
Hello, World! 1
Závěr
Viděli jsme, jak spouštět bash příkazy a skripty v Pythonu. Můžete je použít k efektivnější automatizaci věcí.
Veselé kódování 👨💻