2013-08-02 41 views
2

我无法弄清楚为什么在我的代码中我得到一个奇怪的IOError [Errno 4] Interrupted system call防止IOError:[Errno 4]中断系统调用

下面这个例子是一个虚拟的,但它可以(至少在我的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 

为什么会出现这样的错误,我怎样才能防止它呢?

+0

适合我':-('Linux(32或64),Python 2.7,在一个包含115个文件的目录中。你确定错误发生在'print l'行吗?看起来更像是一个ipython bug 。它是否在命令行工作? –

+0

你是正确的..使用python2.7而不是ipython它工作正常...所以这意味着我的代码是正确的,对吧? – lucacerone

+0

是的,你的代码是好的。不好,因为它看起来像ipython中的一些错误,或者一些其他虚假的交互。你应该尝试ipython的最新开发版本,如果它仍然失败,报告它作为一个错误,我会说。 –

回答

1

错误发生在print l,行:看起来更像是一个ipython错误。正如你在评论中已经说过的那样,它在命令行上工作。你应该试试ipython的最新开发版本,如果它仍然失败,那就报告它是一个bug,我会说。

0

IPython开发人员在这里。对于它的价值,这不太可能是一个IPython的bug - 至少我无法在master或者0.13.2(64位Debian/sid)中重现它。卢卡提出这个为issue #3884,所以我们会看到它从那里去。

+0

谢谢。正如我在错误跟踪系统中回答的,我遵循了您的建议,并且发现只有在使用--pylab选项运行时才会出现问题。 – lucacerone