在交互式 python shell 等 shell 中,您通常可以使用箭头键在当前行中移动或获取先前的命令(带箭头)等。
但是在我 ssh 进入另一台机器并从python
那里开始之后,我会得到如下会话:
>>> import os
>>> ^[[A
最后一个字符来自箭头。或者,使用左箭头:
>>> impor^[[D
我怎样才能解决这个问题?
在常规 bash 中,箭头键可以正常工作。奇怪的行为只是在交互式 python(或 perl 等)shell 中。
在交互式 python shell 等 shell 中,您通常可以使用箭头键在当前行中移动或获取先前的命令(带箭头)等。
但是在我 ssh 进入另一台机器并从python
那里开始之后,我会得到如下会话:
>>> import os
>>> ^[[A
最后一个字符来自箭头。或者,使用左箭头:
>>> impor^[[D
我怎样才能解决这个问题?
在常规 bash 中,箭头键可以正常工作。奇怪的行为只是在交互式 python(或 perl 等)shell 中。
我已经通过安装readline
包解决了这个问题:
pip install readline
在 OS X 上,我有不同的问题。
当我使用系统 python shell 时,键没有问题,但 virtualenv 有问题。我会尝试重新安装/升级 virtualenv/readline 并没有解决任何问题。
当我尝试import readline
在问题 python shell 中时,收到此错误消息:
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
问题已解决!
在 OS X 上,Xcode 更新有时会中断readline
. 解决方案:
brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline
如果问题仍然存在,请尝试删除readline
usingpip
并使用以下方式安装easy_install
:
pip3 uninstall readline
easy_install readline
看起来 readline 没有启用。检查是否PYTHONSTARTUP
定义了变量,对我来说它指向/etc/pythonstart
并且该文件在交互之前由 python 进程执行,这设置了 readline/history 处理。
感谢@chown,这里有关于此的文档:http: //docs.python.org/2/tutorial/interactive.html
在 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
我最近遇到了这个问题,在阅读了很多关于pip install readline
(不适用于 mac osx)并且pip install gnureadline
不满意之后,现在这是我的设置,可以在任何 python 控制台中使用箭头键:
pip install gnureadline
现在你可以做import gnureadline
并且箭头键应该按预期工作。要使它们自动工作,请执行以下步骤:
~/.startup.py
:import gnureadline
~/.bash_profile
:export PYTHONSTARTUP=~/.startup.py
一件事不起作用,但在我之前的设置中是:自动导入 gnureadline on pdb.set_trace()
。如果有人对此问题有很好的解决方案,我将不胜感激。
我在 Ubuntu 16.04 LTS 上遇到了 Python 3.6.x 的 shell 历史记录(选项卡/箭头命令)问题。
Python 3.6.x 是从源代码安装的。
为我解决的问题是使用以下命令行安装 user12345 所说的模块“gnureadline”:
sudo pip3.6 install gnureadline
:)
以下是在 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
将Mac升级到High Sierra后受到影响,这为我成功解决了:
brew unlink python
xcode-select --install
brew install python
在 CentOS 上,我通过
yum install readline-devel
然后重新编译python 3.4。
在 OpenSUSE 上,我通过
pip3 install readline
遵循 Valerio Crini 的回答。
也许“pip3 install readline”是一个通用的解决方案。还没有在我的 CentOS 上尝试过。
如果你使用 Anaconda Python,你可以通过运行来解决这个问题:
conda install readline
为我工作!
这些答案都不适用于我在两个不同版本的 Ubuntu 上。对我有用但不是真正的解决方法是将我的 python 代码包装在对rlwrap
(在 ubuntu 存储库中可用)的调用中:
rlwrap python mycode.py
我通过执行以下操作解决了这个问题:
点安装阅读线
我在这里遇到了另一个错误:
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
对于那些使用 conda 的人,从 conda-forge 频道安装 readline 包将解决问题:
conda install -c conda-forge readline=6.2
您是否使用-t参数调用 ssh来告诉 ssh 为您分配一个虚拟终端?
从手册页:
-t
强制伪 tty 分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。
此外,您可能还必须按照另一篇文章中的建议正确设置服务器上的TERM环境变量。
readline 模块已被弃用,这将在最新的 python 版本中导致在 python shell 中执行 quit() 或 exit() 时出现无效指针错误。
pip install gnureadline
反而
在具有各种历史安装的 Mac OS X Mojave 10.14.6 上,brew
我通过以下方式解决了这个问题:
brew reinstall python2
鉴于每个人都有不同的安装场景,可能没有灵丹妙药。我也尝试了上述方法,所以它可能是几个答案的组合。Brew 默认是python3
这样,如果你安装了这个python2
包,它也需要重新安装。
您是否尝试过使用不同的 SSH 客户端?一些 SSH 客户端具有用于不同远程进程的特殊内置键映射。我经常用emacs遇到这个问题。
你用的是什么客户端?我建议尝试使用 Putty 和 SecureCRT 来比较它们的行为。
当一切正常时,您的环境变量 $TERM 如何设置 [a],而当它们不正常时,您的环境变量如何设置 [b]?环境设置通常是此类问题的关键。
尝试在服务器上运行一个关键代码库。如果这不起作用,请尝试下载具有读取密钥能力的库。
我正在尝试在 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 中。
终于问题解决了。
在 MacOsx 上,我通过重新安装 readline 解决了这个问题
brew reinstall readline
在 Unbuntu 或 Mint 中,如果您使用的是pyenv,
sudo apt install libreadline-dev
pyenv uninstall 3.8.8
pyenv install 3.8.8
安装 libreadline-dev 后,您无需在每个 python 版本上都安装 pip install gnureadline。
您可以通过以下方式从“sh”切换到“bash”
$ /sh/bash