Почему virtualenv эффективно отключает заполнение вкладки Python 3?

Когда я создаю python3 virtual-env, добавление табуляции (по умолчанию с python3) больше не работает. Почему это?

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

Без --system-site-packages у него та же проблема: нет завершения табуляции. Если я запустил python3 без активации виртуального env, будет выполнено выполнение табуляции.

Ответ 1

Цитата Карла Мейера на этот комментарий GitHub,

Да, один из уродливых аспектов реализации virtualenv заключается в том, что у него должна быть своя собственная копия модуля сайта, которая используется для всех virtualenvs, независимо от того, какая версия Python создана.

Проблема заключается в файле $VIRTUAL_ENV/lib/python3.4/site.py, который не настраивает вкладку. Он не предоставляет функцию enablerlcompleter. Сравните его с файлом site.py, распространяемым с помощью Python 3.

Если вы используете Python 3.3 или новее, я советую pyvenv вместо virtualenv.

python3 -mvenv ~/venv3.site

Еще одна вещь, которую вы могли бы сделать - это запустить свой собственный запуск Python script и обратиться к нему в переменной среды PYTHONSTARTUP. Поместите вкладку и другие настройки загрузки. См. Ответ Майка Ковингтона на пример такого script.

Ответ 2

Вот как я получил завершение табуляции:

Добавлено значение ~/.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

Ответ 3

Я попал в подобную ситуацию. Это может быть вызвано другой причиной. Но я просто хочу сохранить его здесь, чтобы другие люди не провели еще один день, чтобы отлаживать это.

Я использую Ubuntu 16.04 LTS, Python 3.5.2 с pyvenv, Virtualenv 15.1.0. Я продолжал получать " вкладку, а затем проблему с терминалом". В некоторых пакетных файлах, которые я использовал "source", у меня был "set -e" . По-видимому, когда вы делаете "set -e" в этом сеансе терминала, автозаполнение завершает это окно терминала. Удалите "set -e" из этих пакетных файлов, проблема была решена.

Ответ 4

Ранее упомянутые решения не сработали для меня (Python 3.6 установлен с brew на Mac OS X High Sierra).

Поэтому мне пришлось слегка изменить файл ~/.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")