从python的子流程中获取所有输出

时间:2018-11-24 11:03:02

标签: python python-3.x subprocess

我在Windows上使用python 3.7。我正在尝试执行一个简单的扫描命令,并以字符串形式获取其输出。 当我在python中执行命令时,我只会得到第一行:

import subprocess

def execute(command):
    proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    output = proc.stdout if proc.stdout else proc.stderr

path = "Somepath"
command = ['ecls.exe', '/files', path]
print(execute(command))
  

警告!扫描程序以受限用户的帐户运行。

但是当我在CMD中运行它时

  

ecls.exe / files“ SomePath”警告!扫描程序已在帐户中运行   有限的用户。

     

ECLS命令行扫描器...

     

命令行:/ files SomePath

     

扫描开始于:11/24/18 14:18:11

     

扫描完成于:11/24/18 14:18:11扫描时间:0秒   (0:00:00)总计:文件-1,个对象1被感染:
  文件-0,对象0已清除:文件-0,对象0

我认为该命令产生一个子进程,并产生扫描输出。我也尝试iterate over stdout,但得到了相同的输出。

编辑: 我使用check_output尝试了其他方法,例如PopenPIPE等,但是我只得到输出的第一行。我也尝试使用shell=True,但没有任何区别。正如我已经说过的那样,该命令产生了一个子进程,我需要捕获其输出,看来subprocess不能直接完成它。

1 个答案:

答案 0 :(得分:3)

this reference的帮助下,由于找不到直接解决此问题的方法,可以将输出重定向到文本文件,然后将其读回。

import subprocess
import os
import tempfile

def execute_to_file(command):
    """
    This function execute the command
    and pass its output to a tempfile then read it back
    It is usefull for process that deploy child process
    """
    temp_file = tempfile.NamedTemporaryFile(delete=False)
    temp_file.close()
    path = temp_file.name
    command = command + " > " + path
    proc = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    if proc.stderr:
        # if command failed return
        os.unlink(path)
        return
    with open(path, 'r') as f:
        data = f.read()
    os.unlink(path)
    return data

if __name__ == "__main__":
    path = "Somepath"
    command = 'ecls.exe /files ' + path
    print(execute(command))