2013-08-02 32 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