【问题标题】:Capturing the output of a program started via cmd script捕获通过 cmd 脚本启动的程序的输出
【发布时间】:2018-06-25 18:03:10
【问题描述】:

我正在尝试对 stanford 解析器进行复杂性分析。为此,我通过 cmd 文件启动程序,因此如果我使用 subprocess.check_output,我的 python 程序将为我提供我正在使用的命令行参数。解析器在命令行上打印自己的运行时,因此我必须想出一些东西来读出我已经开始在命令行上打印的程序。

subprocess.check_output("path-to-cmd", shell=True tldr:这给了我 cmd-files 输出,我想要在终端中打印启动的程序。

由于我的问题被标记为重复,我想要通过 cmd 启动的程序的输出,如果我使用 subproces.check_output,它只会给我 cmd 的内容,而不是输出我运行的java程序。我想捕获 java 程序写入终端的内容。

【问题讨论】:

  • 这里要做的显而易见的事情是编辑 cmd 文件,这样无论它打印的任何额外输出都不会被打印,或者被打印到 stderr 而不是 stdout。或者,如果 cmd 足够简单,直接报废,直接调用程序,不用 shell。
  • 您可能会发现我的这个answer 很有用。

标签: python batch-file cmd terminal io


【解决方案1】:
import subprocess

# Create test file.
with open('test.cmd', 'w') as w:
    w.write(
     '@echo off\n'
     'echo 1 stdout\n'
     '>&2 echo 2 stderr\n'
     '>&3 echo 3 program output\n')

output = subprocess.check_output(
 'test.cmd 1>nul',
 universal_newlines=True,
 shell=True)

print('check_output:', repr(output))

该示例将从句柄 3 获取程序输出。程序 这里只是一个echo,通过重定向来模仿程序 是目标。

CMD 最多支持 9 个输出句柄,引用自 SS64 站点:

STDIN = 0 键盘输入 STDOUT = 1 文本输出 STDERR = 2 错误文本输出 未定义 = 3-9

您可以在批处理文件中输出程序来处理 3。 然后您可以将句柄 1 重定向到 nul1>nul 或 只是>nul 在 Python 文件中。 因此,check_output 只会输出句柄 3 作为标准输出。

输出:

2 stderr
check_output: '3 program output\n'
  • 输出使用repr() 在 1 行中显示输出以进行测试。
  • 1 stdout 行没有输出,因为句柄 1 被重定向到 nul。
  • Stderr 仍将打印到控制台,因为它没有被重定向。 您可以选择如何处理标准错误。

如果 Stanford Parser 将数据输出为标准错误(句柄 2) 而不是标准输出(句柄 1),那么您可以使用 2>&3 在批处理文件命令中重定向到句柄 3。即

2>&3 java -cp stanford-parser.jar ...

我没有使用 Stanford Parser 的经验,所以命令 示例是来自stanford.edu 的在线示例的猜测。

如果你想要所有的输出而不只是程序输出 和程序输出处理2。然后在 check_output2>&1 或推荐的参数 stderr=subprocess.STDOUT 并省略 1>nul。这可能 包括可能不受欢迎的批处理文件脚本错误。

如果可能,尽量避免将批处理文件重写为 Python 复杂性和 1 个脚本获得所有控制权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多