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 のバグである可能性は低いです。少なくとも、どちらのマスターでも 0.13.2 (64 ビット Debian/sid) でも再現できません。ルカはこれをissue #3884として提出したので、そこからどうなるか見ていきます.

于 2013-08-04T07:27:58.403 に答える