我从调用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 shell运行该命令,它看起来像这样
>>> 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,但我没有明确告诉它不要这样做?
我在使用Python 2.6.6的Windows 7 x64上运行它
答案 0 :(得分:7)
它会去stderr吗?尝试重定向:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True).communicate()[0]
答案 1 :(得分:3)
正如SimonJ建议的那样,它可能会stderr
。
此外,docs表示不要在Windows中使用shell=True
:
可执行参数指定 程序执行。这很少见 需要:通常,程序来 execute由args定义 论点。如果shell = True,那么 可执行参数指定哪个 shell使用。在Unix上,默认 shell是/ bin / sh。在Windows上, 默认shell由。指定 COMSPEC环境变量。唯一的 你需要指明的原因 shell = True在Windows上是 你希望执行的命令是 实际上内置于shell中,例如 迪尔,复制。你不需要shell = True 运行批处理文件,也不运行 基于控制台的可执行文件。
shell=True
。