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.
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.
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.
Komentarze (0)
Brak komentarzy...