我继承了一些由于在调用打印期间引发输入/输出错误而定期(随机)失败的代码。我正在尝试确定引发异常的原因(或者至少更好地理解它)以及如何正确处理它。
执行以下 Python 行时(在 2.6.6 解释器中,在 CentOS 5.5 上运行):
print >> sys.stderr, 'Unable to do something: %s' % command
引发异常(省略回溯):
IOError: [Errno 5] Input/output error
对于上下文,这通常是较大的函数当时试图做的事情:
from subprocess import Popen, PIPE
import sys
def run_commands(commands):
for command in commands:
try:
out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
print >> sys.stdout, out
if err:
raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
except:
print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])
语法对>>
我来说不是特别熟悉,它不是我经常使用的东西,而且我知道它可能是写入 stderr的最不受欢迎的方式。但是,我不相信替代方案可以解决根本问题。
从我读过的文档来看,IOError 5 经常被误用,而且定义有些松散,不同的操作系统使用它来解决不同的问题。在我的情况下,我能看到的最好的结果是 python 进程不再附加到终端/pty。
尽我所知,没有什么可以断开进程与 stdout/stderr 流的连接——例如,终端仍处于打开状态,并且一切“似乎”都很好。这可能是由子进程以不干净的方式终止引起的吗?还有什么可能是导致此问题的原因 - 或者我可以引入哪些其他步骤来进一步调试它?
在处理异常方面,我显然可以捕捉到它,但我假设这意味着我将无法在剩余的执行过程中打印到 stdout/stderr?我可以以某种方式重新连接到这些流 - 也许通过重置sys.stdout
等sys.__stdout__
?在这种情况下,无法写入 stdout/stderr 并不被认为是致命的,但如果它表明某些事情开始出错,我宁愿早点保释。
我想最终我对从哪里开始调试这个有点不知所措......