【问题标题】:Seeing escape characters when pressing the arrow keys in python shell在 python shell 中按箭头键时看到转义字符
【发布时间】:2010-10-27 22:36:18
【问题描述】:

在交互式 python shell 等 shell 中,您通常可以使用箭头键在当前行中移动或获取先前的命令(带箭头)等。

但是在我 ssh 进入另一台机器并在那里启动 python 后,我得到如下会话:

>>> import os 
>>> ^[[A    

最后一个字符来自向上箭头。或者,使用左箭头:

>>> impor^[[D

我该如何解决这个问题?

在常规 bash 中,箭头键可以正常工作。奇怪的行为只是在交互式 python(或 perl 等)shell 中。

【问题讨论】:

  • 我认为这属于服务器故障。这是由不正确的终端类型引起的。
  • 我同意下面卡特曼的观点,这是一个 readline 问题,而不是终端类型问题。
  • easy_install readline 然后 easy_install ipython 在 mac 中完美运行。
  • 安装anaconda2或anaconda3并设置.pystartup请看link
  • @LeonWANG 给出了一个错误的答案——不要为了让你的 .pystartup 文件正常工作而安装像 anaconda 这样大的东西。完全没有必要。

标签: python shell ssh arrow-keys


【解决方案1】:

您是否尝试过使用不同的 SSH 客户端?一些 SSH 客户端具有用于不同远程进程的特殊内置键映射。我经常用 emacs 遇到这个问题。

您使用的是什么客户端?我建议尝试使用 Putty 和 SecureCRT 来比较它们的行为。

【讨论】:

  • 嗯,我只是在终端中使用 ssh 命令(ssh -v 表示 OpenSSH_3.9p1,OpenSSL 0.9.7a Feb 19 2003)。
  • 试用 Putty(免费)并回复我们 :)
  • 好的,我刚刚安装了putty并用它来连接机器,但是那里的行为是一样的。
  • :(那肯定是服务器端问题。我会调查一下并回复你。
  • 使用 ssh 命令连接到一些 other 机器可以正常工作:在那里,箭头键没有问题。它似乎是一个有问题的特定系统。
【解决方案2】:

你的环境变量 $TERM 是如何设置 [a] 的,什么时候工作正常,而 [b] 什么时候不正常?环境设置通常是此类问题的关键。

【讨论】:

  • 我只是尝试了一些 TERM 变量值:vt102、vt220、ansi、xterm,但它们都没有改变行为。
【解决方案3】:

您是否使用 -t 参数调用 ssh 来告诉 ssh 为您分配一个虚拟终端?

来自手册页:

-t
强制伪 tty 分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。

此外,您可能还必须按照另一篇文章中的建议正确设置服务器上的 TERM 环境变量。

【讨论】:

    【解决方案4】:

    看起来 readline 没有启用。检查是否定义了 PYTHONSTARTUP 变量,对我来说它指向 /etc/pythonstart 并且该文件在交互之前由 python 进程执行,这设置了 readline/history 处理。

    感谢@chown,这是关于此的文档:http://docs.python.org/2/tutorial/interactive.html

    【讨论】:

    • 谢谢,我同意 readline 似乎是问题所在。该系统确实有 /usr/lib/libreadline.so.5 虽然。没有 /etc/pythonstart。
    • 经过一番谷歌搜索后,安装 readline-devel 后,该系统上的 python 似乎必须重新编译。
    • 环境变量是PYTHONSTARTUP,而不是PYTHONSTART。不确定特定于发行版的/etc/pythonstart 文件。
    • 实际上,阅读docs.python.org/2/tutorial/interactive.html 提供了 pystartup 文件所需的所有信息。
    • 在带有 brew 的 OSX 上,我所要做的就是 brew reinstall python3
    【解决方案5】:
    1. 安装 readline-devel 包。
    2. 用 readline 模块重新编译 python
    3. 宾果游戏!

    【讨论】:

    • 感谢您提高我的生活质量! {;-) 在 Centos 5.5 上,这是 yum install readline-devel 并且您不必在重新编译时明确指定 readline
    • 我们如何重新编译 Python?我是否需要从源代码(./configure、make、make install)安装提取 python,设置 virtualenv 并再次安装我的所有包?
    【解决方案6】:

    尝试在服务器上运行关键代码库。如果这不起作用,请尝试下载具有读取密钥功能的库。

    【讨论】:

      【解决方案7】:

      以下是在 ubuntu 12.04 for python 3.3 中对我有用的步骤。

      1) 打开终端并写sudo apt-get install libreadline-dev

      2)从http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.xz下载python 3.3.2的源文件

      3) 解压并导航到 shell 中的 Python-3.3.2/ 目录

      4) 执行以下命令:

      ./configure
      make
      make test
      sudo make install
      

      【讨论】:

        【解决方案8】:

        我已经通过安装readline 包解决了这个问题:

        pip install readline
        

        【讨论】:

        • 我必须在我的 Ubuntu 机器上安装 libncurses-dev,然后正确安装了 readline。
        • 在 CentOS 上安装 ncurses-devel 然后 readline 安装没问题。交互式外壳现在可以工作了。
        • 无法在我的 OS X 机器上使用 pip install readline,即使在成功完成 brew install readline 之后每次都失败
        • 我不得不安装gnureadline,见stackoverflow.com/q/43013060/2846923
        • @TheGuywithTheHat:这里有同样的问题。我尝试在运行sudo pip3 install readline 的Raspberry Pi 上安装readline,但是当我打开Python 命令提示符并输入命令时,Python 崩溃了。我不得不卸载readline 并安装gnureadline。现在它的工作完美无瑕... +1 为您的建议!
        【解决方案9】:

        在 CentOS 上,我通过

        解决了这个问题

        yum install readline-devel

        然后重新编译python 3.4。

        在 OpenSUSE 上,我通过以下方式解决了这个问题

        pip3 install readline
        

        按照 Valerio Crini 的回答。

        也许“pip3 install readline”是一个通用的解决方案。还没有在我的 CentOS 上尝试过。

        【讨论】:

        • 使用 readline-devel 技巧的好电话。它在 Centos6.5 机器上运行 python 2.7.8 对我有用。我直接调用了pip install readline,没有重新编译python,效果很好。
        【解决方案10】:

        我正在尝试在 Ubuntu 14.0 上构建 Python 2.7。您将需要 libreadline-dev。但是,如果从 apt-get 获取,当前版本是 6.3,与 Python 2.7 不兼容(不确定 Python 3)。例如,之前版本的 readline 中定义的数据类型“Function”和“CPPFunction”已在 6.3 中删除,如下所述:

        https://github.com/yyuu/pyenv/issues/126

        也就是说你需要获取更早版本的readline的源代码。我从 apt-get 为库安装了 libreadline 5.2,并为头文件获取了 5.2 的源代码。将它们放在 /usr/include 中。

        问题终于解决了。

        【讨论】:

          【解决方案11】:

          我通过以下操作解决了这个问题:

          • yum install readline-devel
          • pip install readline

            • 我在这里遇到了另一个错误:

              gcc: readline/libreadline.a: No such file or directory

              gcc: readline/libhistory.a: No such file or directory

              我通过安装 patch 解决了这个问题:

              yum install patch

          之后我成功运行pip install readline,这解决了我的python shell中的转义字符。

          仅供参考,我正在使用 RedHat

          【讨论】:

          • CentOS 6.8,Python2.7.12,成功
          【解决方案12】:

          在 OS X 上,Xcode 更新有时会破坏 readline。解决方案:

          brew uninstall readline
          brew upgrade python3
          brew install readline
          pip3 install readline
          

          如果问题仍然存在,请尝试使用pip 删除readline,然后使用easy_install 安装它:

          pip3 uninstall readline
          easy_install readline
          

          【讨论】:

          • 如果您使用的是系统 Python 2.7.10,是否有等价物?
          • @user5359531 我已经用easy_install 选项更新了答案
          • 使用 easy_install 对我有用,而使用 pip 的那个不起作用。
          • 这结合brew link readline(即使它已经被链接)为我修复了它。
          【解决方案13】:

          在 OS X 上,我有不同的问题。

          当我使用系统python shell时,键没有问题,但virtualenv中有问题。我会尝试重新安装/升级 virtualenv/readline 并没有解决任何问题。

          当我尝试在问题 python shell 中 import readline 时,收到以下错误消息:

          ImportError: dlopen(/Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
          Referenced from: /Users/raptor/.virtualenvs/bottle/lib/python2.7/lib-dynload/readline.so
          Reason: image not found
          

          因为有/usr/local/opt/readline/lib/libreadline.7.dylib但没有libreadline.6.dylib,所以我做一个符号链接:

          ln -s libreadline.7.dylib libreadline.6.dylib
          

          问题已经解决了!

          【讨论】:

          • 在查看和查看后,我能够通过此建议解决问题。谢谢!
          • 如果调用 v6 而没有意识到它实际上是 v7,这不会导致问题吗?
          • 我遇到了同样的问题,但我没有使用这些说明,而是使用了brew update && brew upgrade。这是否在这个过程中破坏了 PHP 还有待观察。
          • @AdamBarnes 这也对我有用。我也使用 pyenv,所以请确保在升级所有自制软件包后卸载/重新安装我需要的 python 版本。
          • 我没有 libreadline.7.dylib(可能是因为我在 Mojave 10.14.x 上,然后更新了 XCode 10.2.1),但有版本 8。执行ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib修复了扫码问题,但没有带回历史命令召回。虽然在这种情况下,半个修复总比没有好。 (是的,我还添加了 6 的链接,没有区别)。附录:这对我来说是/只是 python2 的一个问题。 python3 没有链接也能正常工作。
          【解决方案14】:

          如果你使用 Anaconda Python,你可以通过运行来解决这个问题:

          conda install readline
          

          为我工作!

          【讨论】:

          • 在我的情况下,readline 已经安装,我必须执行conda install ncurses 才能使其工作。
          • 这对我有用,但只有在我卸载然后重新安装 python 之后
          【解决方案15】:

          在 OS X 上,使用 python 3.5 和 virtualenv

          $ pip install gnureadline
          

          在解释器中执行:

          import gnureadline
          

          现在箭头键应该可以正常工作了。


          其他信息...

          请注意,截至 2015 年 10 月 1 日 - readline 已已弃用(来源 https://github.com/ludwigschwardt/python-readline

          改用 gnureadline(请参阅:https://github.com/ludwigschwardt/python-gnureadline

          如果我使用 python 3.5 安装 readline 而不是 gnureadline,我会在尝试导入解释器后收到错误:

          >>> import readline
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
            Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
            Reason: image not found
          

          【讨论】:

          • 这行得通,但是这意味着我需要在每个交互会话的顶部添加import gnureadline,这真的很烦人。有没有办法在每次互动会议开始时启动它?
          • @Panchishin 尝试使用 PYTHONSTARTUP 环境变量来命名在显示交互式提示之前执行 Python 命令的文件(即import gnureadline)。有关可能的其他想法,另请参阅:run python command line interpreter with imports loaded automatically
          【解决方案16】:

          对于那些使用 conda 的人,从 conda-forge 频道安装 readline 包将解决问题:

          conda install -c conda-forge readline=6.2
          

          【讨论】:

            【解决方案17】:

            在将 Mac 升级到 High Sierra 后受到影响,这已为我成功解决:

            brew unlink python
            xcode-select --install
            brew install python
            

            【讨论】:

              【解决方案18】:

              我在 Ubuntu 16.04 LTS 上遇到了 Python 3.6.x 的 shell 历史记录(选项卡/箭头命令)问题。

              Python 3.6.x 是从源代码安装的。

              为我解决的问题是使用以下命令行安装 user12345 所说的模块“gnureadline”:

              sudo pip3.6 install gnureadline
              

              :)

              【讨论】:

              • 我尝试了所有其他解决方案,但这个解决方案适用于我的 Python 3.6
              • 确保在 shell 中调用 import gnureadline 以使其工作
              • 不需要使用sudo
              【解决方案19】:

              readline 模块已被弃用,这将在最新的 python 版本中在 python shell 中执行 quit() 或 exit() 时导致无效指针错误。 改为pip install gnureadline

              【讨论】:

                【解决方案20】:

                我最近遇到了这个问题,在阅读了很多关于 pip install readline (不适用于 mac osx)和 pip install gnureadline 并且不满意之后,现在这是我的设置,可以在任何 python 控制台中使用箭头键:

                1. 使用pip install gnureadline安装gnureadline

                现在您可以执行import gnureadline 并且箭头键应该可以按预期工作。要使它们自动工作,请按照以下步骤操作:

                1. 创建(或附加到)文件~/.startup.py:import gnureadline
                2. 附加到文件~/.bash_profile:export PYTHONSTARTUP=~/.startup.py

                在我之前的设置中不起作用的一件事是:在pdb.set_trace() 上自动导入 gnureadline。如果有人对此问题有很好的解决方案,我将不胜感激。

                【讨论】:

                  【解决方案21】:

                  在 Mac OS X Mojave 10.14.6 上通过 brew 进行了各种历史安装,我通过以下方式解决了这个问题:

                  brew reinstall python2
                  

                  鉴于每个人都有不同的安装场景,可能没有灵丹妙药。我也尝试了上述方法,所以它可能是几个答案的组合。 Brew 默认为python3,因此如果您安装了python2 软件包,它也需要重新安装。

                  【讨论】:

                    【解决方案22】:

                    在 MacOsx 上,我通过重新安装 readline 解决了这个问题

                    brew reinstall readline
                    

                    【讨论】:

                      【解决方案23】:

                      这些答案都不适用于我在两个不同版本的 Ubuntu 上。对我有用但不是真正的解决方法是将我的 python 代码包装在对 rlwrap 的调用中(在 ubuntu 存储库中可用):

                      rlwrap python mycode.py

                      【讨论】:

                        【解决方案24】:

                        在 Unbuntu 或 Mint 中, 如果您使用的是 pyenv

                        sudo apt install libreadline-dev
                        pyenv uninstall 3.8.8
                        pyenv install 3.8.8
                        

                        安装 libreadline-dev 后,您无需在每个 python 版本上都安装 pip install gnureadline。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-04-28
                          • 2015-03-15
                          • 2016-12-19
                          相关资源
                          最近更新 更多