如何在交互式python下重复最近输入
来源:互联网 发布:网络写作平台17k 编辑:程序博客网 时间:2024/06/15 17:37
问题描述:
centos中使用交互式python时按方向键显示「^[[C^[[D」等乱码
解决方法
pip install readline
问题背景
作者:涛吴
链接:https://www.zhihu.com/question/21518507/answer/18486781
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
一九七〇年代廉价的电子图像显示器出现之前,大型机的终端通常使用电传打字机(teleprinter)来跟用户交互;电传打字机的输出印在纸上,用户输入的字符就像打字机一样是删不掉的,而且用户输入什么就会立刻传给服务器;后来有了以电子显示器为输出设备的终端,一开始也只能一个字符一个字符地给服务端发信息,到七十年代末能一次给服务器发送一整行信息的「智能」终端才成为主流。此时键盘上才有了现代电脑用户觉得司空见惯(拿键盘当钢琴使的 HHKB Pro 2 用户请扭过头去)的方向键。而按下方向键给终端发送的是控制光标移动的命令,这些命令最初的表示方法是转义字串(escape sequence),也就是「我先说几个字符,说完这几个字符之后再说的那个字符请不要当作字面意思理解」。这个字符在 ANSI 标准里面排行第 27(0x1B),它是个看不见的字符,一般写「」来代表。而 ANSI 的终端机标准里面,光标上、下、右、左移动的指令分别规定为 [A,[B,[C,[D,其中方括号跟字母之间还可以插入一个数字来表示要移动几位。
你现在使用的终端模拟器,不管是 Terminal.app 还是 iTerm 2,其实都是在用软件模拟当年用硬件实现的终端,并且还在底层帮你把按下的方向键转化为能够用来移动光标的特定转义字串。编一个 C 程序,main 里只有一行 getchar(); 编译运行(或者先在 iTerm 里按 ctrl + v ),再按上下右左,屏幕上都会显示 ^[[A ^[[B ^[[C ^[[D。其中 ^[ 就代表 esc 字符(因为 ctrl + [ 输入的字符是 0x1B)。
而无论 bash、zsh 还是 OS X 系统自备的 Python shell,其实都是在底层将你按下方向键所产生的这三个字符按照 ANSI 标准理解为你要移动光标,并移动光标。这种「把三个字符按照 ANSI 标准理解为你要移动光标」,或者叫做「line editing」,的功能是如此常用,以至于人们写了专门的程序库来做这件事,它叫做 The GNU Readline Library。
但问题在于,readline 采用 GPL v3 授权,这一授权要求所有使用 readline 的程序必须开源。在版权法执行得比我国好的国家里,这是个严重的问题,OS X 里面也就因此没有 readline 库。所以,如果你不去弄一份 GNU Readline,virtualenv(注:此处我把 pythonz 和 virtualenv 弄混了。virtualenv 并不能编译 Python,只是创建一份隔离开来的 Python 运行环境)你自己编译的 Python shell 就没有 line editing 功能;而如果你在创建虚拟环境的时候指定了这一自行编译的版本作为该环境的 Python,那么当你切换到那个环境的时候就会出现这样的问题。为了在不带 GNU Readline 的系统下给 Python 程序提供 line editing 功能,Python 提供了https://pypi.python.org/pypi/readline 模块,以内嵌 GNU readline 库。更多信息可以读它的文档。
那么苹果 OS X 自带的 Python shell 是怎样实现 line editing 的呢?是用 BSD 授权的 Editline Library (libedit) 。
此外,也有可能是 virtualenv 没有正确地处理独立环境里的库——在 https://pypi.python.org/pypi/virtualenv 一页上搜寻「readline」,可以看到不少都和 OS X 有关,所以应该确定自己在使用 virtualenv 的最新版本。
而 readline 提供的功能,除去按方向键移动光标,还包括比如 ctrl + a 到行首、ctrl + e 到行尾、alt + f 前进一个单词、alt + b 后退一个单词之类;如果觉得 Emacs 讨厌,还可以转用 vi key-binding。如何才能挖掘出 readline 的全部功能,就留给读者做为习题好了。
- 如何在交互式python下重复最近输入
- [python] 如何在python交互式会话中保持输入命令的记录
- 如何在VScode中配置Python的交互式环境
- 在Mac(Unix)下Python交互式Tab键补全实现
- 来,你敢在python交互式解析器中输入 import this 吗?
- [python] 使用ftplib模块在交互式窗口下连接FTP的练习
- 如何将 Office 应用程序配置为在交互式用户帐户下运行
- 如何将 Office 应用程序配置为在交互式用户帐户下运行
- Python交互环境下如何输入代码
- 最近在学习python
- 最近在学习python
- 如何在英文Ubuntu下输入中文
- 如何在IDEA下输入命令行参数
- 通过一个例子来探讨交互式环境下输入
- 交互式输入shell参数
- 交互式数据可视化在Python中用Bokeh实现
- linux下python如何输入不用按回车
- 如何在交互式shell脚本中创建对话框
- mysql 分表修改语句
- 杭电-1114 Piggy-Bank(完全背包)
- 返回字符串
- centos7下使用yum安装mysql
- [XUPort笔记]修改的XUPorter,提供代码编辑
- 如何在交互式python下重复最近输入
- iOS7初体验(3)——图像资源Images Assets
- HTTPS和HTTP的区别
- APP性能优化基础
- Myeclipse快捷键记录
- ubuntu-12搭建tftp服务器
- #NOIP 2014# day.2 T2 寻找道路
- Emmet:HTML/CSS代码快速编写神器
- Oracle数据安装与卸载明细