【问题标题】:read output from subprocess.Popen in python从 python 中的 subprocess.Popen 读取输出
【发布时间】:2016-04-16 09:35:37
【问题描述】:

我正在尝试在 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.

我正在寻找输出 **Drives: A:\ C:\ D:** 即使在使用 subprocess.Popen() 运行 psexec 命令时也是如此。有什么办法可以吗?


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

【问题讨论】:

  • 直接从进程标准输出中读取。
  • 也许反斜杠在两个环境之间的解释不同?尝试对 Popen 命令使用原始字符串。
  • PsExec 不会将客户端输出中继给您。最好使用 OpenSSH 远程启动命令,尽管在 Windows 上安装有点痛苦。你也可以滚动你自己的 JSON 服务器。
  • @RishavKundu - 你建议使用 output.stdout.readlines() 吗?

标签: python subprocess psexec


【解决方案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

【讨论】:

  • 嗨科里,我看到这里的问题不在于反斜杠,因为我能够在远程机器上运行命令。为了检查它是否真的有效,我改变了需要在远程机器上运行的命令来回显一些东西,然后我得到了输出。只有当我尝试运行命令 cmd.exe /C fsutil fsinfo drive 时,子进程才不会捕获输出。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多