获取subprocess.Popen的完整输出
我在使用subprocess.Popen的时候遇到了一些奇怪的结果,我觉得这可能跟我刚开始学Python有关。
args = [ 'cscript', '%USERPROFILE%\\tools\\jslint.js','%USERPROFILE%\\tools\\jslint.js' ]
p = Popen(args, stdout=PIPE, shell=True).communicate()[0]
输出结果看起来像这样(后面的双\r\n是为了防止遗漏,如果重要的话)
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.\r\n\r\n
如果我在交互式的Python环境中运行那个命令,结果是这样的
>>> args = ['cscript', '%USERPROFILE%\\tools\\jslint.js', '%USERPROFILE%\\tools\jslint.js']
>>> p = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True).communicate()[0]
Lint at line 5631 character 17: Unexpected /*member 'OpenTextFile'.
f = fso.OpenTextFile(WScript.Arguments(0), 1),
...
Lint at line 5649 character 17: Unexpected /*member 'Quit'.
WScript.Quit(1);
所以,这里是我真正关心的所有输出,但如果我查看一下刚刚设置的“p”变量的值……
>>> p
'Microsoft (R) Windows Script Host Version 5.8\r\nCopyright (C) Microsoft Corpor
ation. All rights reserved.\r\n\r\n'
>>>
我想要的数据都去哪儿了?显然没有在“p”里面。看起来是输出到了标准输出(stdout),但我并没有明确告诉它不要这样做啊?
我是在Windows 7 x64系统上,使用的是Python 2.6.6。
2 个回答
3
可能会输出到stderr
,正如SimonJ所说的。
另外,文档提到在你的情况下,不要在Windows上使用shell=True
:
可执行程序的参数指定了要执行的程序。这个参数很少需要使用:通常,执行的程序是通过args参数来定义的。如果设置了shell=True,那么可执行程序的参数就指定了要使用哪个shell。在Unix系统中,默认的shell是/bin/sh。在Windows中,默认的shell由COMSPEC环境变量指定。你只有在想要执行的命令实际上是内置于shell中的情况下,才需要指定shell=True,比如dir、copy命令。运行批处理文件或控制台程序时,不需要使用shell=True。
后来:哦等等。你是通过shell来获取那些环境变量展开的吗?好吧,我收回之前的话:你确实需要shell=True
。
7
这个信息是说,输出是不是去了错误信息流?你可以试着把它重定向到其他地方:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True).communicate()[0]