我继承了一些代码,这些代码由于在调用打印时引发输入/输出错误而周期性(随机)失败。我正在尝试确定引发异常的原因(或者至少更好地理解它)以及如何正确处理它。
在执行以下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"])我并不特别熟悉>>语法,我也不经常使用它,我知道它可能是写入标准错误的least preferred way。然而,我不相信替代方案能解决根本问题。
从我读过的文档来看,IOError 5经常被误用,而且定义有些松散,不同的操作系统使用它来解决不同的问题。在我的例子中,我能看到的最好的情况是,python进程不再附加到终端/pty。
据我所知,没有什么会断开进程与stdout/stderr流的连接-例如,终端仍然是打开的,一切“看起来”都很正常。会不会是子进程以不干净的方式终止?这个问题的其他原因可能是什么--或者我可以引入哪些其他步骤来进一步调试它?
在处理异常方面,我显然可以捕获它,但我假设这意味着在剩余的执行过程中不能打印到stdout/stderr?我能以某种方式重新连接到这些流吗--比如将sys.stdout重置为sys.__stdout__等?在这种情况下,不能写入stdout/stderr不被认为是致命的,但如果这是开始出错的迹象,我宁愿早点离开。
我想我最终还是有点迷茫,不知道从哪里开始调试这个……
发布于 2017-02-11 07:21:04
我是新来的,所以请原谅我在代码细节方面的疏忽。最近,当与python脚本的运行关联的终端关闭时,我能够找出导致print语句的I/O错误的原因。这是因为要打印到stdout/stderr的字符串太长。在本例中,"out“字符串是罪魁祸首。要解决这个问题(而不必在运行python脚本时保持终端打开),只需逐行读取"out“字符串,并逐行打印,直到我们到达"out”字符串的末尾。类似于:
while true:
ln=out.readline()
if not ln: break
print ln.strip("\n") # print without new line如果将整个字符串列表打印到屏幕上,也会出现同样的问题。只需逐项打印列表即可。希望这能有所帮助!
https://stackoverflow.com/questions/10409897
复制相似问题