Co to jest subprocess?
subprocess pozwala uruchamiać polecenia systemowe z poziomu Pythona. Możesz wykonywać komendy systemowe i pobierać ich wyniki.
Podstawowe użycie
subprocess.run(["polecenie", "argument"])
Najważniejsze parametry
capture_output=True - przechwytuje wyjście
text=True - dekoduje bajty na tekst
check=True - rzuca błąd przy niepowodzeniu
WAŻNE!
Zawsze używaj listy argumentów, nie stringa! Zabezpiecza to przed atakami.
import subprocess
import sys
# Uruchomienie prostego polecenia
# W systemie Windows polecenie echo jest wbudowane w powłoce (cmd.exe),
# dlatego używamy shell=True - jest to wymagane dla wbudowanych poleceń Windows.
print("=== Pierwsze polecenie ===")
if sys.platform.startswith("win"):
subprocess.run(["echo", "Witaj z Pythona!"], shell=True)
else:
subprocess.run(["echo", "Witaj z Pythona!"])
# Pobranie wyniku polecenia
print("\n=== Z wynikiem ===")
if sys.platform.startswith("win"):
wynik = subprocess.run(["echo", "Test Python"], capture_output=True, text=True, shell=True)
else:
wynik = subprocess.run(["echo", "Test Python"], capture_output=True, text=True)
print(f"Wynik: {wynik.stdout}")
# Sprawdzenie kodu powrotu
print("\n=== Sprawdzenie kodu ===")
if sys.platform.startswith("win"):
wynik = subprocess.run(["echo", "OK"], capture_output=True, text=True, shell=True)
else:
wynik = subprocess.run(["echo", "OK"], capture_output=True, text=True)
print(f"Kod powrotu: {wynik.returncode}") # 0 = sukces
# Obsługa błędów
print("\n=== Obsługa błędów ===")
try:
if sys.platform.startswith("win"):
subprocess.run(["nonexistent_command"], check=True, capture_output=True, text=True, shell=True)
else:
subprocess.run(["nonexistent_command"], check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e:
print(f"Błąd polecenia: {e}")
except FileNotFoundError:
print("Polecenie nie znalezione!")
# WAŻNE: Bezpieczne vs niebezpieczne
# Bezpiecznie (lista argumentów, shell=False):
# subprocess.run(["ping", "-n", "1", "8.8.8.8"]) # Windows
# subprocess.run(["ping", "-c", "1", "8.8.8.8"]) # Linux
# Niebezpiecznie (string ze shell=True - unikaj!):
# subprocess.run("ping -n 1 8.8.8.8", shell=True)
Moduł `subprocess` w Pythonie umożliwia uruchamianie zewnętrznych poleceń systemowych, przechwytywanie ich wyjścia i zarządzanie procesami potomnymi. Funkcja `subprocess.run()` jest najprostszym i najczęściej używanym sposobem wykonania polecenia, przyjmując listę argumentów, na przykład `subprocess.run(["ls", "-l"])`. Parametr `capture_output=True` pozwala na przechwycenie standardowego wyjścia i błędów, które są dostępne w obiekcie wyniku jako atrybuty `stdout` i `stderr`. Parametr `text=True` powoduje zwrócenie danych jako stringów zamiast bajtów.
Starsza funkcja `subprocess.call()` jest prostsza, ale nie oferuje przechwytywania wyjścia. W przypadku potrzeby bardziej zaawansowanego zarządzania procesami dostępne są klasy `Popen` i `PIPE`, które pozwalają na strumieniowanie danych, komunikację przez potoki i asynchroniczne wykonywanie poleceń. Przy uruchamianiu poleceń systemowych z poziomu Pythona należy zawsze zachować ostrożność i unikać przekazywania niesprawdzonych danych wejściowych użytkownika bezpośrednio do powłoki, aby zapobiec atakom typu command injection. Moduł `subprocess` jest niezbędnym narzędziem w skryptach automatyzujących zadania administracyjne.