我在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
尝试了其他方法,例如Popen
,PIPE
等,但是我只得到输出的第一行。我也尝试使用shell=True
,但没有任何区别。正如我已经说过的那样,该命令产生了一个子进程,我需要捕获其输出,看来subprocess
不能直接完成它。
答案 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))