2

我不知道为什么在我的代码中我得到一个奇怪的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

为什么会出现这样的错误,我该如何预防?

4

2 回答 2

1

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

于 2013-08-03T15:23:44.080 回答
0

IPython 开发人员在这里。对于它的价值,这不太可能是一个 IPython 错误——至少我无法在任何一个 master 中重现它,也无法在 0.13.2(64 位 Debian/sid)上重现它。Luca 将此作为issue #3884提交,所以我们将看看它从那里开始。

于 2013-08-04T07:27:58.403 回答