Предотвратить IOError: [Errno 4] Прерванный системный вызов

Я не могу понять, почему в моем коде я получаю странное IOError [Errno 4] Interrupted system call.

Пример ниже является фиктивным, но он позволяет (по крайней мере, на моем ноутбуке с Linux) воспроизвести ошибку:

import subprocess as sp

def dummyfun():
    p1 = sp.Popen(['ls','-lah'], stderr=sp.STDOUT, stdout=sp.PIPE, close_fds=True)
    p2 = sp.Popen(['grep','.'],stdin=p1.stdout, stdout=sp.PIPE, close_fds=True)
    p1.stdout.close()
    return p2.stdout

def dummyfun2(fo):
    for l in fo:
        print l,

def dummyfun3():
    fo = dummyfun()
    dummyfun2(fo)
    fo.close()

Вызов dummyfun3 в основном просто выводит на экран список всех файлов с точкой в ​​имени (в моем случае я нахожусь в папке с примерно 100 файлами, и все они имеют какое-то расширение и, следовательно, точку).

Если я вызову функцию как dummyfun3(), она просто сработает.

Однако, если я вызову его в цикле, например:

for i in range(1000):
    dummyfun3()

после нескольких итераций код останавливается (обычно i находится между 5 и 15), отображая следующее сообщение об ошибке:

<ipython-input-213-a47ea086386d> in <module>()
      1 for i in range(1000):
----> 2     dummyfun3()
      3 

<ipython-input-205-21366f183162> in dummyfun3()
      1 def dummyfun3():
      2     fo = dummyfun()
----> 3     dummyfun2(fo)
      4     fo.close()
      5 

<ipython-input-204-1c08d906020b> in dummyfun2(fo)
      1 def dummyfun2(fo):
      2     for l in fo:
----> 3         print l,
      4 

IOError: [Errno 4] Interrupted system call

Почему такая ошибка и как ее предотвратить?


person lucacerone    schedule 02.08.2013    source источник
comment
У меня работает :-( Linux (32 или 64), Python 2.7, в каталоге 115 файлов. Вы уверены, что ошибка возникает в строке print l,? Это больше похоже на ошибку ipython. Это работает в командной строке?   -  person Armin Rigo    schedule 02.08.2013
comment
вы правы.. работая с python2.7 вместо ipython, он работает нормально... так что это означает, что мой код правильный, верно?   -  person lucacerone    schedule 02.08.2013
comment
Да, ваш код в порядке. Это все еще плохо, потому что это похоже на какую-то ошибку в ipython или какое-то другое фиктивное взаимодействие. Вы должны попробовать последнюю версию ipython для разработки, и если она по-прежнему не работает, сообщите об этом как об ошибке, я бы сказал.   -  person Armin Rigo    schedule 03.08.2013
comment
@ArminRigo спасибо :) если вы отправите ответ, я с радостью приму его!   -  person lucacerone    schedule 03.08.2013


Ответы (2)


Ошибка возникает в строке print l,: это больше похоже на ошибку ipython. Как вы уже сказали в комментариях, это работает в командной строке. Вы должны попробовать последнюю версию ipython для разработки, и если она по-прежнему не работает, сообщите об этом как об ошибке, я бы сказал.

person Armin Rigo    schedule 03.08.2013

Разработчик IPython здесь. Как бы то ни было, маловероятно, что это ошибка IPython — по крайней мере, я не могу воспроизвести ее ни в мастере, ни в 0.13.2 (64-битный Debian/sid). Лука зарегистрировал это как issue #3884, так что посмотрим, что будет дальше.

person Paul Ivanov    schedule 04.08.2013
comment
Спасибо. Как я ответил в системе отслеживания ошибок, я последовал вашим советам и увидел, что проблема возникает только при запуске с опцией --pylab. - person lucacerone; 04.08.2013