【问题标题】:Prevent IOError: [Errno 4] Interrupted system call防止 IOError:[Errno 4] 中断的系统调用
【发布时间】:2023-03-17 00:32:01
【问题描述】:

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

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

【问题讨论】:

  • 为我工作:-( Linux(32 或 64),Python 2.7,在一个包含 115 个文件的目录中。您确定错误发生在print l, 行吗?这看起来更像是一个 ipython 错误。它可以在命令行上运行吗?
  • 你是对的......使用 python2.7 而不是 ipython 工作正常......所以这意味着我的代码是正确的,对吧?
  • 是的,你的代码没问题。它仍然很糟糕,因为它看起来像 ipython 中的一些错误,或者一些其他虚假的交互。您应该尝试最新的 ipython 开发版本,如果仍然失败,请将其报告为错误。
  • @ArminRigo 谢谢 :) 如果您提交答案,我很乐意接受!

标签: python python-2.7 subprocess errno ioerror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。正如我在错误跟踪系统中回答的那样,我遵循了您的建议,发现问题仅在使用 --pylab 选项运行时出现。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2012-08-05
    • 2018-04-09
    • 2019-01-19
    • 2011-08-06
    相关资源
    最近更新 更多