0

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

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 块内执行此操作?

4

1 回答 1

3

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

在这里,如果您删除 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到您的通话中。

于 2012-11-13T22:17:56.397 回答