Subprocesso Python Popen.communicate () equivalente a Popen.stdout.read ()?

Pergunta muito específica (espero):Quais são as diferenças entre os três códigos a seguir?

(Espero que seja apenas que o primeiro não espere que o processo filho seja concluído, enquanto o segundo e o terceiro o fazem. Mas preciso ter certeza de que esse é osó diferença...)

Saúdo também outras observações / sugestões (embora já esteja bem ciente doshell=True perigos e limitações de plataforma cruzada)

Note que eu já liInteração de subprocesso do Python, por que meu processo funciona com Popen.communicate, mas não com Popen.stdout.read ()? e que eu não quero / preciso interagir com o programa depois.

Observe também que eu já liAlternativas às limitações de memória do Python Popen.communicate ()? mas que eu realmente não entendi ...

Finalmente, note que estou ciente de que em algum lugar há um risco de deadlock quando um buffer é preenchido com uma saída usando um método, mas me perdi enquanto procurava explicações claras na Internet ...

Primeiro código:

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

Segundo código:

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

Terceiro código:

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

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion