Skip to main content
 首页 » 编程设计

python之防止 IOError : [Errno 4] Interrupted system call

2025年05月04日13zengkefu

我不明白为什么在我的代码中会出现奇怪的 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 

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

请您参考如下方法:

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