Python subprocess Popen.communicate () odpowiadający Popen.stdout.read ()?
Bardzo konkretne pytanie (mam nadzieję):Jakie są różnice między następującymi trzema kodami?
(Spodziewam się tylko, że pierwszy nie czeka na zakończenie procesu potomnego, podczas gdy drugi i trzeci robią. Ale muszę być pewien, że to jesttylko różnica...)
Z zadowoleniem przyjmuję również inne uwagi / sugestie (choć już dobrze wiem oshell=True
niebezpieczeństwa i ograniczenia międzyplatformowe)
Zauważ, że już czytałemInterakcja podprocesu Pythona, dlaczego mój proces działa z Popen.communicate, ale nie Popen.stdout.read ()? i że nie chcę / potrzebuję interakcji z programem po.
Zauważ też, że już czytałemAlternatywy dla ograniczeń pamięci Python Popen.communicate ()? ale że tak naprawdę nie zrozumiałem ...
Na koniec zauważ, że zdaję sobie sprawę, że gdzieś istnieje ryzyko zakleszczenia, gdy jeden bufor jest wypełniony jednym wyjściem za pomocą jednej metody, ale zgubiłem się, szukając wyraźnych wyjaśnień w Internecie ...
Pierwszy kod:
from subprocess import Popen, PIPE
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
Drugi kod:
from subprocess import Popen, PIPE
from subprocess import communicate
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
(stdout, stderr) = process.communicate()
return process, stderr, stdout
Trzeci kod:
from subprocess import Popen, PIPE
from subprocess import wait
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
code = process.wait()
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
Dzięki.