IOError Ошибка ввода-вывода при печати

Я унаследовал некоторый код, который периодически (случайным образом )дает сбой из-за ошибки ввода/вывода, возникающей во время вызова Распечатать. Я пытаюсь определить причину возбуждения исключения (или, по крайней мере, лучше понять его )и как правильно с ним обращаться.

При выполнении следующей строки 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 не считается фатальной, но если это указывает на то, что что-то начинает идти не так, я бы предпочел пораньше.

Думаю, в конце концов я немного растерялся, с чего начать отладку этого...

20
задан Community 23 May 2017 в 12:17
поделиться