我想调用一个进程并将其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块中执行此操作?
答案 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
。