Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python shell中按箭头键时看到转义字符_Python_Shell_Ssh_Arrow Keys - Fatal编程技术网

在python shell中按箭头键时看到转义字符

在python shell中按箭头键时看到转义字符,python,shell,ssh,arrow-keys,Python,Shell,Ssh,Arrow Keys,在像交互式python shell这样的shell中,通常可以使用箭头键在当前行中移动,或者获取以前的命令(向上箭头)等等 但在我ssh到另一台机器并在那里启动python之后,我会得到如下会话: >>> import os >>> ^[[A 最后一个字符来自向上箭头的位置。或者,使用向左箭头: >>> impor^[[D 我怎样才能解决这个问题 在常规bash中,箭头键可以正常工作。奇怪的行为就在交互式python(或perl

在像交互式python shell这样的shell中,通常可以使用箭头键在当前行中移动,或者获取以前的命令(向上箭头)等等

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

>>> import os 
>>> ^[[A    
最后一个字符来自向上箭头的位置。或者,使用向左箭头:

>>> impor^[[D
我怎样才能解决这个问题


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

您尝试过使用不同的SSH客户端吗?一些SSH客户端为不同的远程进程提供了特殊的内置密钥映射。我在emacs上经常碰到这个


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

当情况正常时,您的环境变量$TERM集是如何设置的[a]和[b]当它们不正常时?Env设置通常是此类问题的关键。

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

从手册页:

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


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

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

多亏了@chown,这里有关于这个的文档:

  • 安装readline-devel软件包
  • 使用readline模块重新编译python
  • 宾果
    尝试在服务器上运行密钥代码库。如果这不起作用,试着下载一个具有读键功能的库。

    以下是我在ubuntu 12.04 for python 3.3中使用的步骤

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

    2) 从下载python 3.3.2的源文件

    3) 提取它并导航到shell中的Python-3.3.2/目录

    4) 执行以下命令:

    ./configure
    make
    make test
    sudo make install
    

    我通过安装
    readline
    软件包解决了这个问题:

    pip install readline
    

    在CentOS,我通过

    yum安装readline-devel

    然后重新编译python 3.4

    在OpenSUSE上,我通过

    pip3 install readline
    
    按照瓦莱里奥·克里尼的回答


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

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

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


    问题终于解决了

    我通过执行以下操作修复了此问题:

    • yum安装readline-devel
    • 安装读线

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

        gcc:readline/libreadline.a:没有这样的文件或目录

        gcc:readline/libhistory.a:没有这样的文件或目录

        我通过安装
        补丁
        修复了此问题:

        yum安装修补程序

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


    仅供参考,我在OSX上使用RedHat,Xcode更新有时会中断读线。解决方案:

    brew uninstall readline
    brew upgrade python3
    brew install readline
    pip3 install readline
    
    如果问题仍然存在,请尝试使用
    pip
    删除
    readline
    ,然后使用
    easy\u install
    进行安装:

    pip3 uninstall readline
    easy_install readline
    

    在OSX上,我有不同的问题

    当我使用系统pythonshell时,密钥没有问题,但在virtualenv中是问题。我尝试重新安装/升级virtualenv/readline,但没有任何修复

    当我尝试在有问题的python shell中导入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
    

    问题解决了

    如果使用Anaconda Python,可以通过运行以下命令来修复此问题:

    conda install readline
    

    为我工作

    在OS X上,使用python 3.5和virtualenv

    $ pip install gnureadline
    
    在解释程序中,请执行以下操作:

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


    其他信息

    请注意,截至2015年10月1日,readline已被弃用(来源)

    改用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
    
    导入readline 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ImportError:dlopen(/Users/pi/tmp/python readline test/.venv/lib/python3.5/readline.so,2):未加载库:/usr/local/opt/readline/lib/libreadline.6.dylib 引用自:/Users/pi/tmp/python readline test/.venv/lib/python3.5/readline.so 原因:找不到图像
    对于使用conda的用户,从conda forge频道安装readline软件包将解决以下问题:

    conda install -c conda-forge readline=6.2
    

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

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

    我在Ubuntu 16.04 LTS上使用Python3.6.x的shell历史记录(tab/arrows命令)时遇到问题

    Python3.6.x是从源代码安装的

    对我来说,解决的办法是安装模块“gnureadline”,正如
    sudo pip3.6 install gnureadline
    
    brew reinstall python2
    
    brew reinstall readline
    
    sudo apt install libreadline-dev
    pyenv uninstall 3.8.8
    pyenv install 3.8.8