从python中的subprocess.Popen读取输出

时间:2016-01-11 22:30:45

标签: python subprocess psexec

我正在尝试在python 2.6

中运行以下subprocess.Popen()命令
output = subprocess.Popen("psexec -accepteula \\machineName -u username -p password cmd.exe /C fsutil fsinfo drives", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
print(output.communicate())

但是我使用output.communicate()

得到以下结果
('\r\n', '\r\nPsExec v2.11 - Execute processes remotely\r\nCopyright (C) 2001-2014 Mark Russinovich\r\nSysinternals - www.sysinternals.com\r\n\r\nConnecting to machineNameHere...\r\r\rStarting PSEXESVC service on machineNameHere...\r\r\rConnecting with PsExec service on machineNameHere...\r\r\rStarting cmd.exe on machineNameHere...\r\r\r\r\ncmd.exe exited on machineNameHere with error code 0.\r\n')

当我从windows中的cmd行运行相同的psexec命令时,我得到了正确的输出。

PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

**Drives: A:\ C:\ D:\**
cmd.exe exited on machineNameHere with error code 0.

我正在寻找输出**驱动器:A:\ C:\ D:**即使在使用subprocess.Popen()运行psexec命令时也是如此。我能以任何方式做到吗?

现在我通过运行dir和echo" test"等不同命令来缩小问题范围。问题似乎是Popen只读取stdout的第一行而不是完整的输出。有关如何解决此问题的任何建议吗?

1 个答案:

答案 0 :(得分:1)

(扩展John Gordon对这个问题的评论)

您正试图通过shell运行此命令:
"psexec -accepteula \\machineName -u username -p password cmd.exe /C fsutil fsinfo drives"

注意命令(\\machineName)中有双反斜杠。反斜杠恰好是字符串文字中的转义字符(用于转义具有特殊含义的字符)。因此,\\machineName在传递到生成的进程之前会被转换为\machineName

以下是处理此问题的两种方法:

1)在每个反斜杠之前添加一个转义字符(另一个反斜杠): "psexec -accepteula \\\\machineName"

2)在字符串文字之前添加一个'r',这使它成为一个原始字符串,并且不会将后退解释为转义字符: r"psexec -accepteula \\machineName"

这是python解释器中的一个示例,应该说清楚。注意打印的输出:

>>> print("\\machineName")
\machineName
>>> print("\\\\machineName")
\\machineName
>>> print(r"\\machineName")
\\machineName