Mam sporo kodu, który używa starej przestarzałej popen
z platform
pakiet. Ponieważ jest to przestarzałe, przeniosę to do subprocess
pakiet.
Jakie jest równoważne stwierdzenie popen("some_command")
? Czy istnieje powód, dla którego Popen był przestarzały?
Odpowiedzi:
0 dla odpowiedzi № 1platform.popen
nie jest przestarzałe tak dobrze, jak mogę powiedzieć. Jest to jednak funkcja niskiego poziomu, z której nie należy korzystać ze względu na elastyczność i przenośność.Wiele innych rzeczy uruchamiających procesy zostało wycofanych, a niektóre usunięte w Pythonie 3. Wiele, wiele prób zrobienia tego dobrze podjęto w historii Pythona, i
subprocess.Popen
a jego funkcje wygody są zdecydowanie najlepsze. Po jego istnieniu pozostałe stały się kruche, a większość zachowanych jest tylko po to, aby obsługiwać starszy kod.Jeśli zamierzasz przenieść swój kod, aby użyć
subprocess
moduł, nie szukaj dokładnego odpowiednika tego, co robiłeś, inaczej stracisz sposoby, w jakie jest to lepsze. Przeczytaj i zrozumsubprocess
dokumentację i poznaj pomysły, które wykorzystuje do lepszego rozwiązania procesu uruchamiania niż starsze rozwiązania.Jak jest
subprocess.Popen
lepsze niż starsze alternatywy?Jest bezpieczny. Zamiast
something("shell command here")
, my robimyPopen(["shell", "command", "here"])
. Nie uruchamia to niepotrzebnego procesu powłoki, przez co jest mniej podatny na błędy i niebezpieczny.Zastanów się, czy poprosiłem użytkownika o podanie jego nazwy. Mógłbym pisać
something("foo %s" % name)
w starej rzeczy. Powinno działać - jeśli użytkownik poda ci nazwę „Mike”, staje się to poleceniem podobnym dofoo Mike
. Ale co, jeśli nazwa użytkownika to „Mike Graham”? W takim razie chcęfoo "Mike Graham"
. Więc teraz zawsze umieszczam apostrofy, ale co teraz, jeśli nazwa użytkownika to"Mike O"Reilley"
? Co gorsza, co jeśli ma na imię"Mike; rm -rf /"
? Rozwiązaniem tutaj nie jest próba ucieczki przed nimi samemu (co jest trudne do zrobienia dobrze, nie mówiąc już o pracy na różnych platformach), ale przekazanie argumentów bezpośrednio, bez kłopotania się powłoką -Popen(["foo"
, name]) `.Jest elastyczny. Możesz w pełni kontrolować wejście i wyjście.
To jest nieblokujące.
Popen
może uruchomić proces równolegle z twoim.