Подпроцесс 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
Благодарю.