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'
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