Подпроцесс Python Popen.communicate () эквивалентен Popen.stdout.read ()?

Очень конкретный вопрос (надеюсь):Каковы различия между следующими тремя кодами?

(Я ожидаю, что это будет только потому, что первый не ожидает завершения дочернего процесса, в то время как второй и третий делают. Но я должен быть уверен, что этотолько разница ...)

Я также приветствую другие замечания / предложения (хотя яЯ уже хорошо осведомлен оshell=True опасности и кроссплатформенные ограничения)

Обратите внимание, что я уже прочиталВзаимодействие с подпроцессами Python, почему мой процесс работает с Popen.communicate, но не с Popen.stdout.read ()? и что я не хочу / не нужно взаимодействовать с программой после.

Также обратите внимание, что я уже прочиталАльтернативы Python Popen.communicate () ограничения памяти? но я этого не сделалдействительно понимаю ...

Наконец, обратите внимание, что я знаю, что где-то существует риск тупиковой ситуации, когда один буфер заполняется одним выводом одним методом, но я заблудился, когда искал четких объяснений в Интернете ...

Первый код:

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

Второй код:

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

Третий код:

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

Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос