Chcę wywołać zewnętrzny program z Pythona. Użyłem obu Popen()
i call()
do tego.
Jaka jest różnica między nimi?
Moim konkretnym celem jest uruchomienie następującego polecenia z Pythona. Nie wiem, jak działają przekierowania.
./my_script.sh > output
Przeczytałem dokumentację i mówi, że call()
jest to funkcja wygoda lub funkcja skrótu. Czy tracimy jakąkolwiek moc, używając call()
zamiast Popen()
?
python
subprocess
popen
varunl
źródło
źródło
call()
wydaje się być bardzo jasna. Czy możesz podać cytat lub link, abyśmy wiedzieli, na czym należy się skupić w odpowiedzi?Odpowiedzi:
Istnieją dwa sposoby wykonania przekierowania. Oba mają zastosowanie do jednego
subprocess.Popen
lubsubprocess.call
.Ustaw argument słowa kluczowego
shell = True
lubexecutable = /path/to/the/shell
i określ polecenie tak, jak je tam masz.Ponieważ po prostu przekierowujesz dane wyjściowe do pliku, ustaw argument słowa kluczowego
gdzie obiekt wskazuje na
output
plik.subprocess.Popen
jest bardziej ogólny niżsubprocess.call
.Popen
nie blokuje, umożliwiając interakcję z procesem podczas jego działania lub kontynuowanie innych rzeczy w programie w języku Python. Wezwanie doPopen
zwracaPopen
obiekt.call
robi blok. Chociaż obsługuje wszystkie te same argumenty coPopen
konstruktor, więc nadal możesz ustawić dane wyjściowe procesu, zmienne środowiskowe itp., Twój skrypt czeka na zakończenie programu icall
zwraca kod reprezentujący stan wyjścia procesu.to w zasadzie to samo, co dzwonienie
call
to tylko funkcja zapewniająca wygodę. Jego implementacja w CPythonie znajduje się w subprocess.py :Jak widać, jest to cienkie opakowanie
Popen
.źródło
Druga odpowiedź jest bardzo kompletna, ale oto praktyczna zasada:
call
blokuje:Popen
nie blokuje:źródło