debugging Pythons控制台模块已使您无法键入Tab键

nkoocmlb  于 2022-11-14  发布在  Python
关注(0)|答案(6)|浏览(121)

不久前,我开始在我的一个程序中使用它。从那以后,每当我在运行python的控制台(cmd.exe示例)上键入tab键时,我都会得到一个readline内部错误。完整的回溯如下(注意,我没有在这个上下文中导入cmd模块,甚至没有导入使用它的脚本。我只是启动了python,按下tab键,瞧,一个异常):

<pre>
Traceback (most recent call last):
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\console\console.py", line 768, in hook_wrapper_23
    res = ensure_str(readline_hook(prompt))
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\rlmain.py", line 571, in readline
    self._readline_from_keyboard()
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\rlmain.py", line 536, in _readline_from_keyboard
    if self._readline_from_keyboard_poll():
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\rlmain.py", line 556, in _readline_from_keyboard_poll
    result = self.mode.process_keyevent(event.keyinfo)
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\modes\emacs.py", line 243, in process_keyevent
    r = self.process_keyevent_queue[-1](keyinfo)
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\modes\emacs.py", line 286, in _process_keyevent
    r = dispatch_func(keyinfo)
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\modes\basemode.py", line 257, in complete
    completions = self._get_completions()
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\lib\site-packages\pyreadline\modes\basemode.py", line 200, in _get_completions
    r = self.completer(ensure_unicode(text), i)
  File "C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\Lib\rlcompleter.py", line 80, in complete
    readline.redisplay()
AttributeError: module 'readline' has no attribute 'redisplay'
</pre>

在你问之前,我已经把python安装到了“C:\SP_CI_PROGRAMS\Languages\Python\3.6.1”目录下,可以通过路径变量访问它,我设计的任何脚本也可以通过路径变量访问(包括使用python的cmd模块的脚本)。
这似乎不是一个紧迫的问题,特别是看到我可以只输入4个空格,但使用制表符是我已经变得特别习惯,第二次我输入制表符键,任何我写在前一个块是立即丢失,因为追溯打印。请,有人能告诉我如何解决这个问题。
编辑:这只是在python解释器中,在一个运行的程序中键入tab或者其他什么都不会造成任何问题。

6ie5vjzr

6ie5vjzr1#

针对Windows 10的测试解决方案(2020年1月17日)

  • 复制上一个回溯档案路径C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\Lib\rlcompleter.py
  • 使用任何文本编辑器打开它
  • 如果有VsCode,请使用cmd并复制此
  • code C:\SP_CI_PROGRAMS\Languages\Python\3.6.1\Lib\rlcompleter.py
  • line 80,回溯告诉我们
  • 更改这些行(开始79),如下图所示,它将工作
  • 不会出现错误消息和不必要的选项卡
...
if _readline_available:                  ## The old one is ##
    if hasattr(readline, 'redisplay'):   # if _readline_available:
        readline.insert_text('\t')       #     readline.insert_text('\t')
        readline.redisplay()             #     readline.redisplay()
    return ''                            # return ''
...

不要忘记重新启动python终端

vecaoik1

vecaoik12#

正如在Github上看到的那样,这似乎是Windows机器的一个持续问题。解决办法似乎是卸载pyreadline包。

zujrkrfu

zujrkrfu3#

停止使用pyreadline。它已经被放弃了。你看到的是一个known issue,但是除非有人接管pyreadline的开发,否则它不太可能被修复。

5n0oy7gb

5n0oy7gb4#

pyreadline可以通过在命令提示符下键入pip uninstall pyreadline来卸载。我也遇到过同样的问题,但卸载pyreadline后,Tab键对我来说是有效的。
注:要查看已安装的软件包,请在命令提示符下键入pip list

pb3s4cty

pb3s4cty5#

如果你没有权限的机器上。你将无法做这些卸载解决方案。
因此,设置completer函数。它将解决问题,不会有奇怪的行为。但自动完成将不再工作。如果你希望它工作,看看文档并实现它。

readline.set_completer(lambda t, s: [None][s])
46scxncf

46scxncf6#

对我起作用的(而其他人由于某种未知的原因没有起作用)是以下几点:
第78行:

if _readline_available:
    if hasattr(readline, 'redisplay'):
        readline.insert_text('\t')
        readline.redisplay()
    return ' ' * 4

相关问题