/ / Przenoszenie z platformy.popen do podprocesu Otwarcie? - python, podproces

Porting z platformy platform.popen do podprocesu.Popen? - python, podproces

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 № 1
  • platform.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 zrozum subprocess 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 robimy Popen(["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 do foo 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.