为什么virtualenv有效地禁用Python 3制表符完成?

时间:2015-11-09 13:09:18

标签: python python-3.x virtualenv tab-completion

当我创建python3 virtual-env时,tab-completion(默认使用python3)不再起作用。那是为什么?

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

没有--system-site-packages它有同样的问题:没有制表完成。如果我在没有激活任何虚拟env的情况下运行python3,则Tab-completion可以正常工作。

5 个答案:

答案 0 :(得分:15)

this GitHub comment上引用Carl Meyer,

  

是的,virtualenv实现的一个更丑陋的方面是它必须拥有自己的站点模块副本,该模块用于所有virtualenvs,无论它们是用哪个版本创建的。

问题出在$VIRTUAL_ENV/lib/python3.4/site.py文件中,该文件未设置标签完成。它不提供enablerlcompleter功能。将它与Python 3分发的site.py文件进行比较。

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

python3 -mvenv ~/venv3.site

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

答案 1 :(得分:14)

这就是我完成标签完成的方式:

将以下内容添加到~/.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

答案 2 :(得分:0)

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

我创建了链接

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

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

答案 3 :(得分:-1)

我遇到了类似的情况。这可能是由不同的原因造成的。但我只想把它放在这里,以便其他人不会花一天时间来调试这个。

我使用的是Ubuntu 16.04 LTS,Python 3.5.2和pyvenv,Virtualenv 15.1.0。我一直在" 标签&然后终端消失"问题。在我做过的一些批处理文件中,我有#34;设置-e"。显然,当你做"设置-e"在该终端会话中,自动完成将终止该终端窗口。删除"设置-e"从这些批处理文件中,问题得到解决。

答案 4 :(得分:-1)

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

所以我不得不稍微更改我的~/.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")