为什么 virtualenv 会有效地禁用 Python 3 tab-completion?

Why does virtualenv effectively disable Python 3 tab-completion?

当我创建一个 python3 虚拟环境时,tab 补全(python3 默认)不再工作。这是为什么?

virtualenv -p /usr/bin/python3 --system-site-packages ~/venv3.site
. ~/venv3.site/bin/activate

没有 --system-site-packages 它有同样的问题:没有制表符完成。如果我 运行 python3 没有激活任何 virtual-env,tab-completion 工作。

this GitHub comment

上引用 Carl Meyer

Yes, one of the uglier aspects of virtualenv's implementation is that it has to have its own copy of the site module, which is used for all virtualenvs regardless of which version of Python they are created with.

问题出在 $VIRTUAL_ENV/lib/python3.4/site.py 文件中,它没有设置制表符补全。它不提供 enablerlcompleter 功能。将其与随 Python 分发的 site.py 文件进行比较 3.

如果您使用 Python 3.3 或更新版本,我建议 pyvenv 而不是 virtualenv

python3 -mvenv ~/venv3.site

您可以做的另一件事是滚动您自己的 Python 启动脚本并在 PYTHONSTARTUP 环境变量中引用它。将选项卡完成和其他启动调整放在那里。有关此类脚本的示例,请参阅 Mike Covington 的回答。

这就是我恢复制表符完成的方式:

~/.pythonrc.py 添加了以下内容:

try:
    import readline
except ImportError:
    print("Module readline not available.")
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

~/.bash_profile 添加了以下内容:

export PYTHONSTARTUP=$HOME/.pythonrc.py

我遇到了类似的情况。这可能是由不同的原因引起的。但我只是想把它留在这里,这样其他人就不会再花一天的时间来调试它。

我正在使用 Ubuntu 16.04 LTS,Python 3.5.2 和 pyvenv,Virtualenv 15.1.0。我不断收到“tab & then terminal disappear”问题。在我做的一些批处理文件中 "source ",我有 "set -e"。显然,当您在该终端会话中执行 "set -e" 时,自动完成将终止该终端 window。从那些批处理文件中删除 "set -e",问题已解决。

前面提到的解决方案对我不起作用(Python 3.6 在 Mac OS X High Sierra 上安装了 brew) .

所以我不得不稍微更改我的 ~/.pythonrc.py 文件:

import readline
import rlcompleter
readline.parse_and_bind('bind ^I rl_complete')

当然,您的 ~/.bash_profile:

中仍然需要这一行
export PYTHONSTARTUP=$HOME/.pythonrc.py

在 Ubuntu 上,而是使用:

import readline
import rlcompleter
readline.parse_and_bind("tab: complete")

坚持使用 virtualenv(Python 3.6 在 Mac OS X High Sierra 上安装了 brew)... 在我的 virtualenv 中,我做了 pip install readline 我试图将 ~/.pythonrc 添加到我的 ~/.bash_profile 但这不是问题所在。 .virtualenvs/py3cv4/lib/python3.6/readline.so 正在寻找 /usr/local/opt/readline/lib/libreadline.7.dylib 但由于某种原因我找到了 8 个。

我创建了 link

ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib

无需添加任何内容 ~/.bash_profile