【问题标题】:Pythons Console Module has made it impossible to type the tab keyPython 控制台模块导致无法键入 tab 键
【发布时间】:2021-08-10 22:57:07
【问题描述】:

不久前我开始在我的一个程序中使用它。从那以后,每当我在运行 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 解释器中。在正在运行的程序或其他程序中键入选项卡不会造成任何问题。

【问题讨论】:

    标签: python debugging


    【解决方案1】:

    经过测试的 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 终端

    【讨论】:

    • 虽然这消除了错误,但它会产生一个奇怪的行为,即在该行中添加了一个额外的选项卡。
    • 最好是注释掉整个if not text.strip():代码块,让它建议用所有全局变量完成
    • 这为我消除了错误,但仍然没有让我使用 tab 键(什么都不会发生)。这篇文章解决了这个问题:stackoverflow.com/questions/56838545/…
    • 我刚刚注释掉了readline.redisplay()这一行,并将readline.insert_text('\t')这一行设置为readline.insert_text(' '*4)。就像 user2357112 说的那样,这件事完全被放弃了(有拉动请求来解决这个不会被合并的问题)。 Windows 可能有更好的 readline 解决方案,但我现在懒得去寻找它(因此我们在这里黑客...)
    【解决方案2】:

    Github 上看到的 Windows 机器似乎是一个持续存在的问题。一种解决方法似乎是卸载 pyreadline 包。

    【讨论】:

    • 不会在其他地方抛出异常
    • @MohsinKale 似乎大多数用户都没有任何问题。看起来它是由windows中的python进程在后台调用的,所以无论你是否显式调用它都会引发错误。如果确实遇到异常,您可以随时重新安装,但它似乎已被放弃
    • 如何卸载/禁用pyreadline?我在 Windows / Python 3.7 上遇到了与 OP 相同的问题,pyreadline==2.1,但 pip uninstall pyreadline 导致 Cannot uninstall 'pyreadline'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall. 这对我也不起作用:stackoverflow.com/questions/51261584/…
    • @wkzhu 显然,您粘贴的错误是在使用另一个包管理器安装模块时发生的。您在使用 Anaconda(即 Conda)吗?如果是这样,请尝试conda uninstall pyreadline。不过要小心,因为它可能会删除您需要的许多模块。我发现@Yedhrab 下面的答案解决了这个问题。请注意,路径会有所不同,(从 python 错误消息中复制它)我的是:C:\Users\&lt;USERNAME&gt;\Anaconda3\lib\rlcompleter.py
    • 直到今天,我发现安装 manimgl(数学动画的 manim 包的一个版本)安装了 pyreadline 包作为依赖项......其他一些这样的包仍然依赖于 pyreadline.. ..我只是指出!
    【解决方案3】:

    停止使用 pyreadline。它被遗弃了。您看到的是 known issue,但除非有人接管 pyreadline 开发,否则它不太可能得到修复。

    【讨论】:

    • 我没有使用它,这只是发生
    • @MohsinKale:堆栈跟踪显示运行 pyreadline 代码的 8 个堆栈帧。您正在使用 pyreadline。它可能是作为 console 的依赖项安装的,also 已被废弃,also 将永远无法修复。
    • 很遗憾我不得不手动修补它,因为conda uninstall pyreadline 试图删除许多似乎需要它的软件包。
    • 是的...conda uninstall pyreadline 想要删除超过 100 个包。
    • 有比 pyreadline 更好的 windows 替代品吗?
    【解决方案4】:

    pyreadline 可以通过在命令提示符中输入pip uninstall pyreadline 来卸载。我遇到了同样的问题,但在卸载 pyreadline 后,Tab 密钥对我有用。

    注意:要查看已安装的软件包,请在命令提示符下键入 pip list

    【讨论】:

      【解决方案5】:

      好吧,如果您没有机器上的权限。您将无法执行这些卸载解决方案。

      所以设置completer函数。它将解决问题并且不会有奇怪的行为。但是自动完成将不再起作用。如果您希望它工作,请查看 documentation 并实施它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 2018-08-07
        • 2013-08-01
        • 1970-01-01
        相关资源
        最近更新 更多