Очень конкретный вопрос (надеюсь): Каковы различия между следующими тремя кодами?
(Я ожидаю, что это будет только то, что первый не дожидается завершения дочернего процесса, а второй и третий. Но я должен быть уверен, что это единственная разница...)
Я также приветствую другие замечания/предложения (хотя я уже хорошо знаю опасности 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
Спасибо.