【问题标题】:Can virtualenvs be made to fall back to user packages instead of system packages?可以让 virtualenvs 回退到用户包而不是系统包吗?
【发布时间】:2014-04-28 17:59:46
【问题描述】:

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

但是 Jedi 必须在我的 virtualenv 中可用才能运行,即如果我不能

import jedi

它不起作用。

有没有一种好方法可以全局安装 Jedi,以便在我所有的 virtualenvs 中都可以使用它?

认为我想要的是

  1. 将 Jedi 安装到 ~/.local/lib/python2.7/site-packages/pip's --user flag,然后到
  2. 使用 the --system-site-packages flag 的等效项创建我的 virtualenv,但用于用户包而不是系统包。

我目前的解决方法是在我的每个 virtualenvs 中使用pip install jedi。然后,当我添加新的依赖项时,我 pip install foopip freeze > requirements.txt,然后在提交之前手动从文件中删除 jedi 和其他一些内容。显然,这是耗时且容易出错的。

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

【问题讨论】:

  • 为什么不将它安装在全局站点包中?了解您正在使用的 Emacs 的 Jedi 插件也会有所帮助。
  • @DaveHalter,我正在使用emacs-jedi intalled via MELPA。我不会在全球范围内安装 Jedi 并回退到那个位置,因为我不希望我的 virtualenvs 看到我已安装的任何其他全局软件包......如果它们是独立的,我可以更有信心我有我在requirements.txt 中列出的所有依赖项。

标签: python pip virtualenv python-jedi


【解决方案1】:

virtuenvactivates 时,它会更改几个环境变量,例如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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2019-11-21
相关资源
最近更新 更多