2015-10-20 88 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