Ответ 1
Я уверен, что есть способ сделать это, не создавая временных файл для хранения выходных данных процесса
Вам просто нужно проверить документацию Popen
, в частности о stdout
и stderr
:
stdin
,stdout
иstderr
указать стандартные исполняемые программы вход, стандартный вывод и стандартные файлы файлов ошибок соответственно. Допустимыми значениями являютсяPIPE
, существующий файловый дескриптор (положительный целое), существующий файловый объект иNone
.PIPE
указывает, что a должен быть создан новый канал для ребенка. С настройками по умолчаниюNone
, перенаправление не произойдет; файлы файлов childs будут унаследованный от родителя. Кроме того,stderr
может бытьstdout
, что указывает, что данныеstderr
дочернего процесса должны быть захваченным в тот же дескриптор файла, что и дляstdout
.
Итак, вы можете видеть, что вы можете использовать файл-объект или значение PIPE
. Это позволяет использовать метод communicate()
для получения результата:
from StringIO import StringIO
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output, error = process.communicate()
log_subprocess_output(StringIO(output))
Я бы переписал ваш код как:
import shlex
import logging
import subprocess
from StringIO import StringIO
def run_shell_command(command_line):
command_line_args = shlex.split(command_line)
logging.info('Subprocess: "' + command_line + '"')
try:
command_line_process = subprocess.Popen(
command_line_args,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
process_output, _ = command_line_process.communicate()
# process_output is now a string, not a file,
# you may want to do:
# process_output = StringIO(process_output)
log_subprocess_output(process_output)
except (OSError, CalledProcessError) as exception:
logging.info('Exception occured: ' + str(exception))
logging.info('Subprocess failed')
return False
else:
# no exception was raised
logging.info('Subprocess finished')
return True