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.

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.

  9 způsobů, jak získat Spotify Premium zdarma navždy

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.

  Jak zobrazit všechny fotografie odeslané přes vlákno konverzace iMessages

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 opravit nespolehlivé připojení v CSGO

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í 👨‍💻