我不明白为什么在我的代码中会得到一个奇怪的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
为什么会出现这样的错误,我该如何防止?
错误发生在print l,
行:这看起来更像是一个ipython错误。正如你在评论中已经说过的,它在命令行中起作用。你应该试试ipython的最新开发版本,如果它仍然失败,我会说,把它报告为一个bug。
IPython开发者。就其价值而言,这不太可能是一个IPython错误——至少我无法在master或0.13.2(64位Debian/sid)上复制它。卢卡将此作为第3884期提交,所以我们将看看它会从那里走向何方。