2014-07-14 20 views
5
üzerinde hata yapıyor

Bir raw_input() istemi sırasında CTRL-C tuşuna basıldığında bir KeyboardInterrupt istisnası algılamaya çalışıyorum.raw_input() ve sys.stdin CTRL-C

try: 
    input = raw_input("Input something: ") 
except KeyboardInterrupt: 
    do_something() 

sys.stdin girdi müdahale etmeye çalışıyor sorunu geliyor: Normalde şu kod komutu algılamak için gayet güzel çalışıyor. Raw_input() ve sys.stdin arasında bir kod ekledikten sonra, şimdi CTRL-C komutu iki istisna ile sonuçlanır: EOFError ve ardından KeyboardInterrupt bir satır veya iki sonra. Aşağıda sonuçlanan

import sys 
import traceback 

class StdinReplacement(object): 
    def __init__(self): 
     self.stdin = sys.stdin 
     sys.stdin = self 
    def readline(self): 
     input = self.stdin.readline() 
     # here something could be done with input before returning it 
     return input 

if __name__ == '__main__': 

    rep = StdinReplacement() 
    while True: 
     info = None 
     try: 
      try: 
       input = raw_input("Input something: ") 
       print input 
      except: 
       info = sys.exc_info() 
       print info 
     except: 
      print '\n' 
      print "0:", traceback.print_traceback(*info) 
      print "1:", traceback.print_exception(*sys.exc_info()) 

çıktısı olan:

0:Traceback (most recent call last): 
    File "stdin_issues.py", line 19, in <module> 
    input = raw_input("Input something: ") 
EOFError: EOF when reading a line 
None 
1:Traceback (most recent call last): 
    File "stdin_issues.py", line 23, in <module> 
    print info 
KeyboardInterrupt 

ben eksik belirgin bir şey bu testte kullanılan koddur? Belki girişi kötü bir şekilde ele almak?

Aynı sorun gibi görünen bu oldukça eski sayfa bulundu. gerçi Hiçbir çözüm: https://mail.python.org/pipermail/python-list/2009-October/555375.html

Bazı çevre ayrıntıları: Python 2.7.3 (64-bit), Windows 7 SP1 (64 bit)

------------ -------------------------------------------------- ----------

DÜZENLEME: StdinReplacement'ın readline yöntemiyle ilgili bir güncelleştirme sorunu giderdi.

import sys 

class Test(object): 
    def readline(self): 
     return '' 

sys.stdin = Test() 

raw_input('') # EOFError! 

Ancak böyle boş satır yapar dönmez o değiştirerek: Sorun readline yöntem böylece dosyanın sonunu bildiren boş bir satır döndürür gibi

def readline(self): 
    input = self.stdin.readline() 
    # here something could be done with input before returning it 
    if len(input) > 0: 
     return input 
    else: 
     return '\n' 
+1

Tahminim şu ki, 'raw_input' artık bir dosya nesnesi olmayan bir şeye bağlı olan sys.stdin 'işlevini kullanıyor ve bu nedenle artık kesintinin neden olduğu (ve önceliği) EOF'u işleyemiyor. . İşe yarayıp yaramadığını görmek için 'StdinReplacement' dosyasını dosyadan miras almayı deneyin. – chepner

cevap

1

görünüyor kod çalışması: readline yöntem boş bir dize dönmelidir

import sys 

class Test(object): 
    def readline(self): 
     return '\n' # or 'a', or whatever 

sys.stdin = Test() 

raw_input('') # no error 

sadece zaman dosya bitti. EOFError tam olarak şunu belirtmek için kullanılır: raw_input dosyanın bir satır içermesi bekleniyor, ancak dosya bitti. Ancak

n Eğer 0 daha azdır, tek: PyFile_GetLine(PyObject *p, int n) belgelerine göre

return PyFile_GetLine(fin, -1); 

:


Bu end of the implementation of raw_input bulunan PyFile_GetLine çağrısına kaynaklanmaktadır satır uzunluğu 'dan bağımsız olarak okunur, ancak dosyanın sonu r ise EOFError yükseltilir. hemen her biri.

bu EOF bulunduğunda EOFError yükseltilir -1n olarak geçer yana (yani oturum readline boş bir dize döndürür).Eğer girdi eklemek ve aynı zamanda bir kesme oluşturursanız


Bildiğim kadarıyla gördüğünüz davranışı söyleyebilirim mümkündür. Sadece Ctrl + C tuşlarına basıldığında, EOFError (en azından linux) oluşturulmaz.

+0

Yardımlarınız için teşekkür ederiz. Dönmeden önce len (giriş) üzerinde bir kontrol ekleyerek sorunumu çözdüm. – crdavis

İlgili konular