在像交互式python shell这样的shell中,你通常可以使用箭头键在当前行中移动或获取以前的命令(带有向上箭头)等。
但是在我进入另一台机器并在那里开始python
之后,我得到了以下会话:
>>> import os
>>> ^[[A
最后一个角色来自向上箭头。或者,使用向左箭头:
>>> impor^[[D
我该如何解决这个问题?
在常规bash中,箭头键工作正常。奇怪的行为只是在交互式python(或perl等)shell中。
答案 0 :(得分:83)
我已经通过安装readline
包解决了这个问题:
pip install readline
答案 1 :(得分:56)
在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
问题已经解决了!
答案 2 :(得分:45)
在OS X上,Xcode更新有时会中断readline
。解决方案:
brew uninstall readline
brew upgrade python3
brew install readline
pip3 install readline
如果问题仍然存在,请尝试使用readline
删除pip
并使用easy_install
进行安装:
pip3 uninstall readline
easy_install readline
答案 3 :(得分:30)
看起来没有启用readline。检查是否定义了PYTHONSTARTUP
变量,对我来说它指向/etc/pythonstart
并且该文件在进行交互之前由python进程执行,这将设置readline / history处理。
感谢@chown,这里有关于此的文档:http://docs.python.org/2/tutorial/interactive.html
答案 4 :(得分:19)
在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
答案 5 :(得分:15)
答案 6 :(得分:10)
以下是在ubuntu 12.04 for python 3.3中为我工作的步骤。
1)打开teminal并写下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
答案 7 :(得分:8)
我在Ubuntu 16.04 LTS上遇到Python 3.6.x的shell历史记录(tab / arrows命令)。
Python 3.6.x是从源代码安装的。
为我解决的是安装模块&#34; gnureadline&#34;如user12345所述,使用以下命令行:
sudo pip3.6 install gnureadline
:)
答案 8 :(得分:7)
将Mac升级到High Sierra后受到影响,这为我成功解决了这个问题:
brew unlink python
xcode-select --install
brew install python
答案 9 :(得分:5)
我最近遇到了这个问题,在阅读了很多有关pip install readline
(不适用于mac osx)和pip install gnureadline
并且不满意之后,现在这是我的设置,启用了箭头键在任何python控制台中:
pip install gnureadline
现在您可以执行import gnureadline
并且箭头键应该可以正常工作。要使它们自动工作,请执行以下步骤:
~/.startup.py
:import gnureadline
~/.bash_profile
:export PYTHONSTARTUP=~/.startup.py
不起作用,但在我先前的设置中起作用的一件事是:在pdb.set_trace()
上自动导入gnureadline。如果有人能很好地解决这个问题,我将不胜感激。
答案 10 :(得分:5)
在CentOS上,我通过
解决了这个问题 yum install readline-devel
然后重新编译python 3.4。
在OpenSUSE上,我通过
解决了这个问题pip3 install readline
遵循Valerio Crini的回答。
也许&#34; pip3安装readline&#34;是一般解决方案。 Haven没试过我的CentOS。
答案 11 :(得分:3)
我通过执行以下操作来修复此问题:
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
答案 12 :(得分:3)
如果您使用Anaconda Python,可以通过运行:
来解决此问题conda install readline
为我工作!
答案 13 :(得分:2)
您是否使用 -t 参数调用ssh告诉ssh为您分配虚拟终端?
从手册页:
-t
强制伪tty分配。这可用于在远程机器上执行任意基于屏幕的程序,这可能非常有用,例如,实现菜单服务时。多个-t选项强制tty分配,即使ssh没有本地tty。
此外,您可能还需要按照另一篇文章中的建议正确设置服务器上的 TERM 环境变量。
答案 14 :(得分:2)
在Mac OS X Mojave 10.14.6上,通过brew
进行了各种历史安装,我使用以下方法解决了此问题:
brew reinstall python2
考虑到每个人的安装方案不同,可能没有万灵丹。我也尝试了上述方法,因此可能是一些答案的组合。 Brew默认为python3
,因此,如果您安装了python2
软件包,则也需要重新安装它。
答案 15 :(得分:1)
对于使用conda的用户,从conda-forge通道安装readline包将解决问题:
conda install -c conda-forge readline=6.2
答案 16 :(得分:1)
您是否尝试过使用其他SSH客户端?某些SSH客户端具有针对不同远程进程的特殊内置键映射。我和emacs一起经常遇到这个。
您使用的是哪个客户?我建议尝试使用Putty和SecureCRT来比较他们的行为。
答案 17 :(得分:0)
在 Unbuntu 或 Mint 中, 如果您使用 pyenv,
sudo apt install libreadline-dev
pyenv uninstall 3.8.8
pyenv install 3.8.8
一旦安装了 libreadline-dev,你就不需要在每个 python 版本上安装 pip install gnureadline。
答案 18 :(得分:0)
在MacOsx上,我通过重新安装readline修复了此问题
brew reinstall readline
答案 19 :(得分:0)
在两个不同版本的Ubuntu上,这些答案都不对我有用。对我有用,但不是真正的解决办法,是将我的python代码包装在对rlwrap
的调用中(可在ubuntu存储库中找到):
rlwrap python mycode.py
答案 20 :(得分:0)
在OS X上,这对我有用:
xcode-select --install # install xcode command line tools (if you haven't already)
brew reinstall python3 # reinstall python3 (perhaps not necessary)
pip3 install gnureadline # pip install the gnureadline package
答案 21 :(得分:0)
readline模块已被弃用,在python shell中执行quit()或exit()时,它将在最新的python版本中导致无效的指针错误。
改为pip install gnureadline
答案 22 :(得分:0)
我在Ubuntu 14.0上尝试构建Python 2.7。你需要libreadline-dev。但是,如果从apt-get获得它,当前版本是6.3,这与Python 2.7不兼容(不确定Python 3)。例如,数据类型&#34;功能&#34;在6.3中删除了先前版本的readline中定义的&#34; CPPFunction&#34;,如下所示:
https://github.com/yyuu/pyenv/issues/126
也就是说你需要获得早期版本readline的源代码。我从apt-get为库安装了libreadline 5.2,并为头文件获取了5.2的源代码。把它们放在/ usr / include中。
最后问题已经解决。
答案 23 :(得分:0)
尝试获取在服务器上运行的密钥代码库。如果这不起作用,请尝试下载具有读取密钥功能的库。
答案 24 :(得分:0)
你的env变量$ TERM如何设置[a]当事情正常时,[b]当它们没有时?环境设置通常是解决此类问题的关键。