我正在尝试在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的第一行而不是完整的输出。有关如何解决此问题的任何建议吗?
答案 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