我正在尝试对斯坦福解析器进行复杂度分析。为此,我通过cmd文件启动程序,因此,如果我使用subprocess.check_output,我的python程序将为我提供我正在使用的命令行参数。解析器在命令行上打印其自己的运行时,因此,我实际上必须想出一些东西,以读取我已开始在命令行上打印的程序。
subprocess.check_output("path-to-cmd", shell=True
tldr:这给了我cmd-files输出,我想要在终端中打印出启动程序。
由于我的问题被标记为重复问题,因此我希望通过cmd启动的程序的输出,如果我使用subproces.check_output,它将仅提供cmd的内容,而不是cmd的输出我已经运行的Java程序。我想捕获Java程序写到终端的内容。
答案 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 stdout
的输出重定向到nul。 如果 Stanford Parser 将数据输出为stderr(句柄2)
您可以使用2>&3
代替stdout(句柄1)
在批处理文件命令中重定向到处理3。即
2>&3 java -cp stanford-parser.jar ...
我没有使用 Stanford Parser 的经验,因此该命令 示例是来自stanford.edu的在线示例中的猜测。
如果要所有输出而不是仅程序输出
然后程序输出到处理2。然后在
check_output
与2>&1
或推荐的参数
stderr=subprocess.STDOUT
并省略1>nul
。这可能
包括可能不希望的批处理文件脚本错误。
如果可能,请避免将批处理文件重写为Python 并发症和1个脚本可以控制一切。