Slajd omawia moduł subprocess, funkcję subprocess.run(), przechwytywanie wyjścia oraz reguły bezpieczeństwa związane z flagą shell=False.
Integracja z powłoką systemu operacyjnego
- Funkcja subprocess.run(): rekomendowane, nowoczesne narzędzie do synchronicznego uruchamiania programów zewnętrznych w systemie.
- Bezpieczeństwo (shell=False): przekazywanie polecenia jako listy argumentów ['ping', '-c', '4', host] zapobiega wstrzykiwaniu komend.
- Przechwytywanie wyjścia (capture_output): parametry capture_output=True oraz text=True kierują wyniki polecenia do obiektu CompletedProcess.
- Weryfikacja kodów wyjścia (check=True): automatyczne zgłoszenie wyjątku CalledProcessError w przypadku zakończenia programu kodem błędu.
Moduł subprocess: standardowy podsystem Pythona do tworzenia nowych procesów potomnych, podłączania ich potoków wejścia/wyjścia (stdin/stdout/stderr) oraz pobierania kodów powrotu z jądra systemu operacyjnego.
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. Oficjalną specyfikację udostępnia portal Python Software Foundation Documentation.
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.
Skróty użyte w tym slajdzie:
SUBPROCESS - moduł zarządzania procesami potomnymi i potokami I/O.
CLI - Command Line Interface, tekstowy interfejs wiersza poleceń.
STDOUT - standardowy strumień wyjściowy procesu.
SEC - bezpieczeństwo teleinformatyczne i ochrona przed podatnościami.