【问题标题】:Capture all output and error, warning of a command in windows by python捕获所有输出和错误,通过python在windows中警告命令
【发布时间】:2016-07-18 03:51:30
【问题描述】:

在 Linux 的 bash shell 中,我可以(从文件)读取命令,然后执行命令并将所有输出、错误和返回代码写入文件。我可以通过在 windows 中使用 python 来做到这一点吗?

【问题讨论】:

  • 如果它只是写给stdoutstderr,那么当然你可以简单地使用subprocess.Popen;将这些标准文件设置为subprocess.PIPE;并调用Popen 实例的communicate 方法。但是如果它通过打开\\.\CONOUT$直接输出到控制台,那么你需要通过ReadConsoleOutput刮取控制台的输出。它还可以使用OutputDebugString 输出调试消息,在这种情况下,您需要使用调试器 API 来捕获这些消息。
  • @eryksun,为什么要把整个答案塞进评论里?你写的是一个尝试的答案。当你这样做时,任何阅读它的人都会感到困惑。我确定您正在尝试提供帮助,但 IMO 它降低了 SO 的有用性。 cmets 中也没有降价格式……当您包含示例时,这使得它们难以阅读。所以...如果您有实际的评论或澄清问题,请使用评论字段。否则,只需回答问题。
  • @CoreyGoldberg,这只是评论,这可能会帮助正在写完整答案的人。对于我看到的大多数问题,我没有时间编写(和维护)令人满意的答案。因此,我提供一些我认为有帮助的信息,或者提供对现有答案的反馈以改进它们。

标签: python windows shell


【解决方案1】:

当然可以。有很多方法可以做到这一点。

假设您有一个名为commands 的文本文件,其中每一行都包含一个命令。你可以这样做:

  • 打开输入文件
  • 从文件中读取下一个命令名
  • 使用subprocess执行命令
  • 将标准错误重定向到标准输出
  • 捕获组合输出
  • 如果命令成功,则将返回码设置为 0,否则从抛出的异常中捕获返回码。
  • 写入返回码并输出到文件

你会想要使用: https://docs.python.org/2/library/subprocess.html 或者 https://docs.python.org/3/library/subprocess.html

例如:

import shlex
import subprocess

with open('commands.txt') as fin:
    for command in fin:
        try:
            proc = subprocess.Popen(
                shlex.split(command),
                stderr=subprocess.STDOUT,
                stdout=subprocess.PIPE
            )
            returncode = 0
            output = proc.communicate()[0]
        except subprocess.CalledProcessError as e:
            returncode = e.returncode
            output = e.output
        with open('output.txt', 'w') as fout:
            fout.write('{}, {}'.format(returncode, output))

【讨论】:

  • 我不建议在 Windows 中使用 shlex.split。那是为了拆分用于 POSIX shell 的命令行。如果你已经有一个命令行,你可以直接在 Windows 中传递它;您无需将其拆分为列表。 subprocess.list2cmdline 只需将其重建为命令行即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多