我敢肯定有一种方法可以做到,而无需创建临时文件来存储进程输出
您只需要检查的文档
Popen,尤其是有关
stdout和的文档
stderr:
stdin,stdout并分别stderr指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE:现有文件描述符(正整数),现有文件对象和None。PIPE指示应创建到子级的新管道。使用默认设置时None,将不会发生重定向。子级的文件句柄将从父级继承。另外,stderr可以是STDOUT,表示stderr来自子进程的数据应捕获到与相同的文件句柄中stdout。
因此,您可以看到可以使用文件对象或
PIPE值。这使您可以使用该
communicate()方法来检索输出:
from StringIO import StringIOprocess = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)output, error = process.communicate()log_subprocess_output(StringIO(output))
我会将您的代码重写为:
import shleximport loggingimport subprocessfrom StringIO import StringIOdef 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


