我继承了一些代码,由于调用print时会引发输入/输出错误而导致代码在定期(随机)失败。我正在尝试确定异常被引发的原因(或者至少更好地理解它),以及如何正确处理它。
在执行以下Python代码行时(在运行于CentOS 5.5上的2.6.6解释器中):
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"])
>>
语法对我来说并不是特别熟悉,我很少使用它,我知道它可能是写入标准错误的最不受欢迎的方式。然而,我认为替代方案并不能解决根本问题。从我读过的文档中可以看出,IOError 5经常被误用,并且定义比较宽泛,不同的操作系统用它来覆盖不同的问题。在我的情况下,我能看到的最好的解释是Python进程不再连接到终端/pty上。
据我所知,没有任何东西会使进程与stdout/stderr流断开连接 - 终端仍然打开,一切“看起来”都正常。这可能是由于子进程以不干净的方式终止造成的吗?还有其他哪些因素可能导致这个问题?或者我能引入哪些其他步骤来进一步调试它?
在处理异常方面,我显然可以捕获它,但我假设这意味着我将无法在剩余的执行过程中打印到stdout/stderr?我能以某种方式重新连接这些流吗 - 例如通过将
sys.stdout
重置为sys.__stdout__
等?在这种情况下,无法写入stdout/stderr不被视为致命的,但如果这是某些问题开始出现的迹象,我宁愿尽早退出。我想最终我有点不知道从哪里开始调试这个问题...
multiprocessing
模块并对我的数据进行pickling时遇到相同的错误。 - Charlie