防止IOError:[Errno 4]系统调用中断

时间:2013-08-02 13:49:31

标签: python python-2.7 subprocess errno ioerror

我无法理解为什么在我的代码中我得到一个奇怪的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

为什么会出现这样的错误?如何防止它?

2 个答案:

答案 0 :(得分:1)

错误发生在print l,行:这看起来更像是一个ipython错误。正如您在评论中所说,它适用于命令行。您应该尝试ipython的最新开发版本,如果它仍然失败,请将其报告为错误,我会说。

答案 1 :(得分:0)

IPython开发者在这里。对于它的价值,它不太可能是一个IPython错误 - 至少我无法在master中重现它,也不能在0.13.2(64位Debian / sid)上重现它。 Luca将此归档为issue #3884,因此我们会看到它从那里开始。