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.

questionAnswers(1)

yourAnswerToTheQuestion