virtualenvs可以回退到用户包而不是系统包吗?

时间:2014-04-28 17:59:46

标签: python pip virtualenv python-jedi

我在Emacs中使用Jedi进行Python自动完成,但它不是我的代码的依赖项,所以我不想把它放在我的requirements.txt中。 (其他开发人员可能不使用Jedi编辑器插件,当我部署到Heroku时肯定不需要它。)

但绝地必须可以从我的virtualenv获得,以便运作,即如果我不能

import jedi

它没有用。

有没有一种很好的方法可以在全球范围内安装Jedi用户,以便在所有版本中使用它?

认为我想要的是

  1. 使用pip's --user flag将Jedi安装到~/.local/lib/python2.7/site-packages/,然后安装到
  2. 使用等效的the --system-site-packages flag创建我的virtualenv,但是对于用户包而不是系统包。
  3. 我当前的解决方法是在每个virtualenvs中pip install jedi。然后,当我添加新的依赖项pip install foopip freeze > requirements.txt时,然后在提交之前从文件中手动删除jedi和其他一些内容。显然,这非常耗时且容易出错。

    有人有更好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

virtuenv activate时,它会更改几个env变量,例如PATH PYTHONHOMEPS1等等,以指向所需的python二进制,库等。您可以更改脚本以更改PYTHONPATH以使用您的用户站点包,即~/.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