捕获通过cmd脚本启动的程序的输出

时间:2018-06-25 18:03:10

标签: python batch-file cmd terminal io

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

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

由于我的问题被标记为重复问题,因此我希望通过cmd启动的程序的输出,如果我使用subproces.check_output,它将仅提供cmd的内容,而不是cmd的输出我已经运行的Java程序。我想捕获Java程序写到终端的内容。

1 个答案:

答案 0 :(得分:0)

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  Keyboard input
STDOUT = 1  Text output
STDERR = 2  Error text output
UNDEFINED = 3-9

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

输出:

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

如果 Stanford Parser 将数据输出为stderr(句柄2) 您可以使用2>&3代替stdout(句柄1) 在批处理文件命令中重定向到处理3。即

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

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

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

如果可能,请避免将批处理文件重写为Python 并发症和1个脚本可以控制一切。