在Python Shell中,"b"字母不能用,怎么回事?

16 投票
2 回答
1716 浏览
提问于 2025-04-16 23:57

你好,这真是我遇到过的最有趣的错误/冲突。

在Python的命令行里,我无法输入小写字母“b”。一开始我以为键盘下面有什么东西卡住了,但实际上在其他地方输入都没问题。而且 ctrl+bshift+b 甚至 capslock b 都能正常工作。

更奇怪的是,当我用 sudo 启动命令行(也就是 sudo python),小写的“b”就能正常输入了。

我最后一次操作是安装了 pyexiv2(用 aptitude),在有和没有 sudo 的情况下都能正常导入这个库。我已经把它卸载了,但问题依旧。

到底怎么回事呢?

我使用的是 Ubuntu 10.04 LTS x86Python 2.6.5

另外补充一下:
我安装了一个 vim 的修改脚本,这可能是问题所在。
使用这个:

$ git clone https://github.com/sontek/dotfiles.git
$ cd dotfiles
$ ./install.sh vim

这个脚本会启动更多的 git 克隆,所以可能有点难跟上。但它确实做了很多改变,包括终端的外观。

更新

1) 我甚至无法复制/粘贴“b”这个字符。ctrl+c/v选择&中间点击 都不管用。

2) 当我用 python -E 打开命令行时,之前提到的那个所谓的 vim 脚本 的修改就不见了,b 可以正常输入。当我用 pythonpython -S 打开时,修改依然存在,我就无法输入 b

3) 好消息:我已经找到了问题所在,就是那个所谓的 vim 脚本。我把它的文件夹重命名了,问题就解决了。接下来几个小时我会深入研究到底是什么导致了这个问题,并把详细结果发在这里。

2 个回答

14

你在 .pythonstartup 文件中有一行代码出了问题,可能是这样的:

 readline.parse_and_bind("bind ^I rl_complete") # darwin libedit

这个 .pythonstartup 文件可以解决这个问题...

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    if 'libedit' in readline.__doc__:
        readline.parse_and_bind("bind ^I rl_complete")
    else:
        readline.parse_and_bind("tab: complete")
8

我觉得你在命令行里使用的 readline 可能出了问题。也许 'b' 这个键被设置成了自动补全的功能。你可以看看你的 PYTHONSTARTUP 变量,看看它指向哪个文件。如果那个文件里有类似 readline.parse_and_bind 的内容……

我猜 'b' 这个键和 'bind' 这个词之间有某种联系,可能有个叫 bind_to_complete 的变量,它被字面理解了(而且只取了第一个字符)。

让我们开始疯狂猜测吧!

撰写回答