Можно ли заставить virtualenv использовать пакеты пользователя вместо системных пакетов?

Я использую Jedi для автозаполнения Python в Emacs, но это не зависит от моего кода, поэтому я не хочу помещать его в свой код requirements.txt, (Другие разработчики могут не использовать плагин для редактора джедаев, и это, безусловно, не нужно при развертывании в Heroku.)

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

import jedi

это не работает

Есть ли хороший способ установить пользовательский джедай глобально, чтобы он был доступен во всех моих virtualenvs?

Я думаю, что я хочу, чтобы

  1. установить джедая в ~/.local/lib/python2.7/site-packages/ с pip "s --user флаг, затем
  2. создать мой virtualenv, используя эквивалент --system-site-packages флаг, но для пользовательских пакетов вместо системных пакетов.

Мой текущий способ обхода pip install jedi в каждом из моих virtualenvs. Затем, когда я добавляю новые зависимости, я pip install foo, pip freeze > requirements.txt затем вручную удалите jedi и несколько других вещей из файла до совершения. Очевидно, что это отнимает много времени и подвержено ошибкам.

У кого-нибудь есть лучшее решение?

1 ответ

Решение

Когда virtuenvactivates, он изменяет несколько переменных env, таких как PATH, PYTHONHOME, PS1и т. д., чтобы указать желаемый двоичный файл Python, библиотеку и т. д. Вы можете изменить скрипт для изменения PYTHONPATH использовать ваши пользовательские site-пакеты, а именно ~/.local/lib/python2.7/site-packagesи, возможно, ваши системные пакеты сайта. С этим параметром pip будет искать библиотеку в виртуальной среде, а затем переключаться на пакеты сайта пользователя / системы. Обратите внимание, что обычно активировать скрипт не меняется PYTHONPATH совсем.

То есть, добавьте следующие строки в ваш virtual_env/bin/activate,

# in activate script

    # in deactivate function
    if [ -n "$_OLD_VIRTUAL_PYTHONPATH" ] ; then
        PYTHONPATH="$_OLD_VIRTUAL_PYTHONPATH"
        export PYTHONPATH
        unset _OLD_VIRTUAL_PYTHONPATH
    fi

# in activate section
if [ -n "$PYTHONPATH" ] ; then
    _OLD_VIRTUAL_PYTHONPATH="$PYTHONPATH"
    PYTHONPATH=$HOME/.local/lib/python2.7/site-packages:/usr/lib/python2.7/site-packages
fi
Другие вопросы по тегам