Python 子进程错误处理滑过

Python 子进程错误处理滑过,python,error-handling,subprocess,Python,Error Handling,Subprocess,我在这件事上纠缠了一段时间。基本上,我遵循了许多子流程使用示例,但我想我肯定还有其他问题 我正在编写一个脚本,该脚本在电影文件目录中运行,并在每个文件上运行exiftool,以提取有关它们的一些信息 我可以让它工作,直到我遇到exiftool错误的情况。例如错误:文件格式错误。。。因此,我试图捕获该错误或exiftool生成的任何错误(甚至错误消息也可以方便地作为变量),然后跳过该文件 在下面的代码中,myArg只是文件的路径 try: proc = subprocess.Popen([

我在这件事上纠缠了一段时间。基本上,我遵循了许多子流程使用示例,但我想我肯定还有其他问题

我正在编写一个脚本,该脚本在电影文件目录中运行,并在每个文件上运行
exiftool
,以提取有关它们的一些信息

我可以让它工作,直到我遇到
exiftool
错误的情况。例如
错误:文件格式错误
。。。因此,我试图捕获该错误或
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

如果我理解正确,您希望传递读取文件时可能发生的任何错误,如果是这样,则传递通用错误处理,而不是OsError

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

如果我理解正确,您希望传递读取文件时可能发生的任何错误,如果是这样,则传递通用错误处理,而不是OsError

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

如果我理解正确,您希望传递读取文件时可能发生的任何错误,如果是这样,则传递通用错误处理,而不是OsError

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

如果我理解正确,您希望传递读取文件时可能发生的任何错误,如果是这样,则传递通用错误处理,而不是OsError

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

有很多方法可以做到这一点。如果您只需要返回代码,可以使用:

import subprocess

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

# Something is borked
# returncode:2
或者提出一个例外:

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
或者,如果您也想要输出,您可以使用:

要同时获取STDERR消息,您可以:

您也可以这样使用:

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

有很多方法可以做到这一点。如果您只需要返回代码,可以使用:

import subprocess

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

# Something is borked
# returncode:2
或者提出一个例外:

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
或者,如果您也想要输出,您可以使用:

要同时获取STDERR消息,您可以:

您也可以这样使用:

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

有很多方法可以做到这一点。如果您只需要返回代码,可以使用:

import subprocess

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

# Something is borked
# returncode:2
或者提出一个例外:

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
或者,如果您也想要输出,您可以使用:

要同时获取STDERR消息,您可以:

您也可以这样使用:

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

有很多方法可以做到这一点。如果您只需要返回代码,可以使用:

import subprocess

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

# Something is borked
# returncode:2
或者提出一个例外:

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
或者,如果您也想要输出,您可以使用:

要同时获取STDERR消息,您可以:

您也可以这样使用:

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

我认为您需要的是从
exiftool
获取退出代码。成功时,它应该返回0,因此要检查错误,您可以在
proc.communicate()
之后添加它:


如果错误消息转到stdout,则应将其放在
out
变量中。如果它转到stderr,则将
stderr=subprocess.PIPE
添加到pOpen命令中,然后它应该位于
err

中,我认为您要查找的是从
exiftool
获取退出代码。成功时,它应该返回0,因此要检查错误,您可以在
proc.communicate()
之后添加它:


如果错误消息转到stdout,则应将其放在
out
变量中。如果它转到stderr,则将
stderr=subprocess.PIPE
添加到pOpen命令中,然后它应该位于
err

中,我认为您要查找的是从
exiftool
获取退出代码。成功时,它应该返回0,因此要检查错误,您可以在
proc.communicate()
之后添加它:


如果错误消息转到stdout,则应将其放在
out
变量中。如果它转到stderr,则将
stderr=subprocess.PIPE
添加到pOpen命令中,然后它应该位于
err

中,我认为您要查找的是从
exiftool
获取退出代码。成功时,它应该返回0,因此要检查错误,您可以在
proc.communicate()
之后添加它:


如果错误消息转到stdout,则应将其放在
out
变量中。如果它转到stderr,将
stderr=subprocess.PIPE
添加到您的pOpen命令中,然后它应该位于
err

中,这起作用了,还帮助查看了我做错了什么。这起作用了,还帮助查看了我做错了什么。这起作用了,还帮助我了解了我做错了什么。哇,帮了大忙,我将研究这些并四处玩转,看看这一切是如何运作的,感谢伟大的例子,很好的帮助,我将研究这些并四处玩转,看看这一切是如何运作的,感谢伟大的例子,很好的帮助,我将研究这些并四处玩耍,看看这一切是如何运作的,感谢伟大的例子W,伟大的帮助,我将研究这些并四处玩耍,看看这一切是如何运作的,感谢伟大的例子