I use Jedi for Python autocompletion in Emacs, but it's not a dependency of my code so I don't want to put it in my requirements.txt
. (Other developers may not use a Jedi editor plugin, and it's certainly not needed when I deploy to Heroku.)
But Jedi must be available from my virtualenv in order to function, i.e. if I can't
import jedi
it doesn't work.
Is there a good way to install Jedi user-globally such that it is available in all of my virtualenvs?
I think what I want is to
~/.local/lib/python2.7/site-packages/
with pip
's --user
flag, then to--system-site-packages
flag, but for user packages instead of system packages.My current workaround is to pip install jedi
in each of my virtualenvs. Then when I add new dependencies I pip install foo
, pip freeze > requirements.txt
, then manually remove jedi
and a few other things from the file before committing. Obviously, this is time-consuming and error-prone.
Does anybody have a better solution?
When virtuenv
activate
s, it changes several env variables, such as PATH
,
PYTHONHOME
, PS1
, and so on, to point desired python binary, library, etc. You can change the script to change PYTHONPATH
to use your user site-packages, namely ~/.local/lib/python2.7/site-packages
, and possibly your system site-packages. With this setting, pip will search for library in virtual env, and then failover to user/system site-packages. Note that normally activate script does not change PYTHONPATH
at all.
That is, add the following lines in your 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