- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 Python 脚本中,程序员可以导入 readline,然后为 input() 提供扩展功能(readline 有许多其他用途)。我想在我的脚本中使用 select.select() 而不是 input() 因为我喜欢超时功能。但是,当导入 readline 时,我无法使用 input() 通过 readline 获得的功能。我所指的“扩展功能”的一个示例是能够按下向上键并查看之前的输入,或者使用左右箭头键移动内联光标以更改输入。
问题:如何使 select.select() 具有 GNU-readline 特性?这可能吗?
编辑:为了防止你们中的任何人对我想要完成的事情感到好奇,我制作了一个基于终端的聊天机器人(有点像 Alicebot)。如果该位在设定的时间内没有收到任何输入,我希望机器人感到无聊并做其他事情。 ( https://launchpad.net/neobot )
最佳答案
您可以使用 readline 模块的 readline.set_pre_input_hook([function]) 机制来完成此操作。
这是一个在 10 秒无输入后超时的示例 - 未实现的机制是在提供输入时禁用警报。
由于信号不能遍历线程,因此线程必须以不同的方式完成。但是,你明白了基本的想法..
我为这段代码的提前道歉,我在我的笔记本电脑上的一家咖啡店,只是把它拍打在一起。这是 python2.7 的代码,但基本上应该与 python3 兼容——概念是重要的部分。
如果您希望每一行输入都有超时,我想您会希望在 input_loop() 函数开头的某个位置禁用警报。
您还应该查看 Python 模块树中的 readline.c 源代码以获得更多想法。
#!/usr/bin/python
import readline
import logging
import signal
import os
LOG_FILENAME = '/tmp/completer.log'
HISTORY_FILENAME = '/tmp/completer.hist'
logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG,)
class YouAreTooSlow(Exception): pass
def get_history_items():
return [ readline.get_history_item(i)
for i in xrange(1, readline.get_current_history_length() + 1)
]
class HistoryCompleter(object):
def __init__(self):
self.matches = []
return
def complete(self, text, state):
response = None
if state == 0:
history_values = get_history_items()
logging.debug('history: %s', history_values)
if text:
self.matches = sorted(h
for h in history_values
if h and h.startswith(text))
else:
self.matches = []
logging.debug('matches: %s', self.matches)
try:
response = self.matches[state]
except IndexError:
response = None
logging.debug('complete(%s, %s) => %s',
repr(text), state, repr(response))
return response
def input_loop():
if os.path.exists(HISTORY_FILENAME):
readline.read_history_file(HISTORY_FILENAME)
print 'Max history file length:', readline.get_history_length()
print 'Startup history:', get_history_items()
try:
while True:
line = raw_input('Prompt ("stop" to quit): ')
if line == 'stop':
break
if line:
print 'Adding "%s" to the history' % line
finally:
print 'Final history:', get_history_items()
readline.write_history_file(HISTORY_FILENAME)
# Register our completer function
def slow_handler(signum, frame):
print 'Signal handler called with signal', signum
raise YouAreTooSlow()
def pre_input_hook():
signal.signal(signal.SIGALRM, slow_handler)
signal.alarm(10)
readline.set_pre_input_hook(pre_input_hook)
readline.set_completer(HistoryCompleter().complete)
# Use the tab key for completion
readline.parse_and_bind('tab: complete')
# Prompt the user for text
input_loop()
关于Python3 : readline equavalent in select. 选择(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124405/
在 Python 脚本中,程序员可以导入 readline,然后为 input() 提供扩展功能(readline 有许多其他用途)。我想在我的脚本中使用 select.select() 而不是 in
我是一名优秀的程序员,十分优秀!