Blog JSystems - z miłości do programowania

Moduł subprocess i wywoływanie komend systemu operacyjnego



Moduł subprocess zastępuje: os.system(), os.spawn*(), commands.*(), os.popen*(), popen2.*() oferując nam wyższym model abstrakcji i większą wygodę wykorzystania. Omówimy tu dwie funkcje, jedna to call, druga Popen. Różnica polega na tym, że pierwsza powoduje wykonanie liniowe wywoływanej komendy w ramach wątku naszej aplikacji, druga generuje osobny proces w systemie operacyjnym.


 


Funkcja call


Wywołamy ping na Onecie. Argumenty do funkcji call podajemy w postaci listy. Podajemy w niej kolejne komendy i ich parametry. Zasadniczo elementy zostaną rozdzielone spacjami i tak wykonane w systemie:


import subprocess
result=subprocess.call(['ping' ,'-n','10','onet.pl'])
print(f"result={result}")
print('koniec')


Wynik na konsoli:



Zastanawiać może enigmatyczne „result” odbierane od funcji. Jeśli komenda systemu operacyjnego wykona się z błędem, zostanie zwrócona wartość 1. Jeśli wszystko było ok dostaniemy 0. Wyświetliłem też komunikat „koniec” by zaprezentować liniowe wykonanie. Funkcja ta pozwala jeszcze na ustawienie argumentu shell=True, co spowoduje zaczytywanie zmiennych środowiskowych i generalnie wykonanie za pośrednictwem powłoki.


 


Funkcja Popen


Wykonam tę samą czynność co w przykładzie funkcją call. Tym razem jednak użyję funkcji Popen powodującej uruchomienie czynności w osobnym procesie systemu operacyjnego:


import subprocess
result=subprocess.Popen(['ping','-n','2','onet.pl'])
print('koniec')
print(result.communicate())


Efekt:



Tym razem komunikat „koniec” wyświetlił się na początku. Widzimy dzięki temu że proces faktycznie rozpoczął się w osobnym procesie.


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!