subprocess.Popen stderr to string

时间:2012-11-13 22:13:51

标签: python subprocess

我想调用一个进程并将其stdd和stout输出到字符串以供检查。此代码触发意外的错误块。

try:
    proc = subprocess.Popen('ls -ddd 1>&2', stdout=subprocess.PIPE,  stderr=subprocess.PIPE,)
    stdout,stderr = proc.communicate()
    if len(stderr)>1:
        actualResult =stderr
    else:
        actualResult =stdout
    print actualResult
except:
    print "Unexpected error"

我基于http://www.oreillynet.com/onlamp/blog/2007/08/pymotw_subprocess_1.html,但显然遗漏了一些东西。是否可以在try块中执行此操作?

1 个答案:

答案 0 :(得分:3)

你永远不应该使用通用的Except子句,因为这会捕获任何异常,并阻止你修复脚本(捕获每个和任何异常,所以你怎么知道哪个一个发生?)。

在这里,如果删除“受限”块,则会遇到OSError: [Errno 2] No such file or directory。这意味着subprocess.Popen未在您的路径中找到您要求的可执行文件。

发生这种情况的原因是您没有将shell = true传递给Popen来电 未传递shell = True,这意味着subprocess.Popen正在寻找名为"ls -ddd 1>&2"的可执行文件,这相当于在您的提示符下写字"ls -ddd 1>&2"并导致“找不到命令!“
(除非你碰巧有一个文件名中包含空格和&符号的可执行文件!)

这当然是您想要的,您想要的是使用参数ls调用-ddd命令并重定向1>&2


长话短说,请在通话中添加shell = True