Можно ли заставить virtualenv использовать пакеты пользователя вместо системных пакетов?
Я использую Jedi для автозаполнения Python в Emacs, но это не зависит от моего кода, поэтому я не хочу помещать его в свой код requirements.txt
, (Другие разработчики могут не использовать плагин для редактора джедаев, и это, безусловно, не нужно при развертывании в Heroku.)
Но джедай должен быть доступен из моего virtualenv, чтобы функционировать, т.е. если я не могу
import jedi
это не работает
Есть ли хороший способ установить пользовательский джедай глобально, чтобы он был доступен во всех моих virtualenvs?
Я думаю, что я хочу, чтобы
- установить джедая в
~/.local/lib/python2.7/site-packages/
сpip
"s--user
флаг, затем - создать мой virtualenv, используя эквивалент
--system-site-packages
флаг, но для пользовательских пакетов вместо системных пакетов.
Мой текущий способ обхода pip install jedi
в каждом из моих virtualenvs. Затем, когда я добавляю новые зависимости, я pip install foo
, pip freeze > requirements.txt
затем вручную удалите jedi
и несколько других вещей из файла до совершения. Очевидно, что это отнимает много времени и подвержено ошибкам.
У кого-нибудь есть лучшее решение?
1 ответ
Когда virtuenv
activate
s, он изменяет несколько переменных 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