2015-10-20 87 views
0

我一直在这一点上停留。基本上我遵循了一些子进程使用示例,但我想我还有其他一些问题。子流程错误处理滑倒

我正在编写一个脚本,通过一个电影文件目录运行并运行exiftool每个人都拉出一些关于他们的信息。

我可以使它工作,直到我遇到一个exiftool错误的情况。如Error: File format error ...所以我试图捕捉那个或任何错误,即exiftool生成(即使错误消息可以很方便地作为变量),并跳过该文件。

在下面的代码中,myArg只是该文件的路径。

try: 
    proc = subprocess.Popen(["exiftool", "-s", "-ImageWidth", "-ImageHeight", "-VideoFrameRate", "-CompressorName", "-MediaDuration", myArg], stdout=subprocess.PIPE) 
    (out, err) = proc.communicate() 
except OSError: 
    print "Pass, something is borked..." 
    pass 

回答

1

我想你要寻找的是从exiftool获得的退出代码。它应该成功返回0,因此检查您可以在proc.communicate()之后添加这样的错误:

if proc.returncode != 0: 
    print "Pass, something is borked..." 

如果错误讯息,到标准输出,你应该在你的out变量。如果它转到stderr,请将stderr=subprocess.PIPE添加到您的pOpen命令中,然后它应该在err中。

+0

这工作,也帮助看到我做错了什么。 – user1978912

0

如果我理解正确,您想传递的,而不是OSERROR的同时阅读文件,如果是的话那么广义的错误处理,可以发生任何错误,

except Exception as e: 
    print "Error Descr"+ str(e) 
    pass 
1

有很多方法可以做到这一点。你可以使用subprocess.call如果你只是想返回代码:

import subprocess 

ret = subprocess.call(['ls', 'sadknlsknfd']) 
if ret: 
    print('Something is borked\nreturncode:%i' % ret) 

# Something is borked 
# returncode:2 

或者subprocess.check_call引发异常:

try: 
    subprocess.check_call(['ls', 'sadknlsknfd']) 
except subprocess.CalledProcessError as e: 
    print('Something is borked\ncommand: %s\noutput: %s\nreturncode:%i' 
      % (e.cmd, e.output, e.returncode)) 

# Something is borked 
# command: ['ls', 'sadknlsknfd'] 
# output: None 
# returncode:2 

或者,如果你想要的输出,以及你可以使用subprocess.check_output

try: 
    # note that `out` will be undefined if the call fails 
    out = subprocess.check_output(['ls', 'sadknlsknfd']) 
except subprocess.CalledProcessError as e: 
    print('Something is borked\ncommand: %s\noutput: %s\nreturncode:%i' 
      % (e.cmd, e.output, e.returncode)) 

# Something is borked 
# command: ['ls', 'sadknlsknfd'] 
# output: 
# returncode:2 

要获得STDERR消息,您也可以使用redirect it to STDOUT

try: 
    out = subprocess.check_output(['ls', 'sadknlsknfd'], stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    # `out` will be undefined if the call fails 
    print('Something is borked\ncommand: %s\noutput: %s\nreturncode:%i' 
      % (e.cmd, e.output, e.returncode)) 

# Something is borked 
# command: ['ls', 'sadknlsknfd'] 
# output: ls: cannot access sadknlsknfd: No such file or directory 

# returncode:2 

您也可以使用subprocess.Popen.communicate这样的:

p = subprocess.Popen(['ls', 'saddsfsdf'], 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
(out, err) = p.communicate() 
ret = p.returncode 
if ret: 
    print('Something is borked\nstdout:%s\nstderr:%s\nretcode:%i' 
      % (out, err, ret)) 

# Something is borked 
# stdout: 
# stderr:ls: cannot access saddsfsdf: No such file or directory 

# retcode:2 
+0

哇,很好的帮助,我打算学习这些,看看这一切是如何工作的,感谢伟大的例子 – user1978912