让 virtualenv 从你的全局站点包中继承特定的包
Posted
技术标签:
【中文标题】让 virtualenv 从你的全局站点包中继承特定的包【英文标题】:Make virtualenv inherit specific packages from your global site-packages 【发布时间】:2012-08-18 06:13:24 【问题描述】:我正在寻找一种方法来制作一个 virtualenv,它只包含基本 python 安装的一些库(我选择了)。
更具体地说,我试图在创建 virtualenv 期间将我的 matplotlib 导入 virtualenv。它无法使用 pip 或 easy_install 有效安装,因为它缺少一些 fortran 编译器库。到目前为止,我这样做的方式是手动复制:
/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/
但是,这会阻止手动导入的链接被 yolk 注册(它会打印 virtualenv 中所有当前可用的库)。
那么,有没有办法做一个选择性的变体
virtualenv --system-site-packages
【问题讨论】:
@foobarbecue 我是最初的 OP。我目前没有设置测试环境,所以我会尽快接受答案,我可以测试答案。 在过去的几个月里好像有 12 个人为您进行了测试... 没有正确答案。 OP 要求选择性--system-site-packages
。 Answers建议使用非选择性--system-site-packages
,然后在本地重装一些包,有什么不同,有不同的含义。
2020 年很难。请测试并接受答案,OP,我们不能再等了。
嘿,是我,OP :) 我已经有一段时间没有问这个问题了,每隔一段时间我就会去看看答案是什么。最受欢迎的答案是一个非常好的解决方法,并且似乎被很多用户接受(基于投票)。但是,它会导致带有系统包的 virtualenv 不是解决方案。添加一个以某种方式清理不需要的系统包的步骤将是一个完整的修复。
【参考方案1】:
我在 Ubuntu 20.04 上使用 python.3.8 和 pip3 玩游戏迟到了。
对我来说摆脱烦人的 .local 安装的唯一方法是设置一个环境变量 (bash):
export PYTHONNOUSERSITE="true"
这不需要是“真的”任何东西都可以。我不会选择 0。;-)
【讨论】:
【参考方案2】:使用 virtualenv --system-site-packages
创建环境。然后,激活 virtualenv,当你想在 virtualenv 而不是系统 python 中安装东西时,使用 pip install --ignore-installed
或 pip install -I
。这样,即使存在系统范围的版本,pip 也会在本地安装您请求的内容。您的 python 解释器将首先在 virtualenv 的包目录中查找,因此这些包应该覆盖全局包。
【讨论】:
通过使用 -I,您将始终重新安装包,即使它们已经存在于系统范围的站点包目录中。如果您改用 -U,它会将较新版本的软件包安装到您的 virtualenv 中,但不会重新安装系统中已具有所需版本的任何软件包。 您知道是否有任何方法可以在先前创建的虚拟环境中“激活”--system-site-packages 选项?我希望避免重新安装所有本地软件包的麻烦! 是的,有***.com/questions/3371136/… -1 该问题要求使 某些 包可见,而不是 所有 除了阴影包。将有限集合列入白名单比将所有内容列入白名单要安全得多,因为它可以保证所有包都必须存在于 venv 中,除了明确列入白名单的包。 @foobarbecue 不幸的是,没有很好的解决方案。我发现的最佳解决方法是this answer,它建议使用--no-site-packages
并将整个包从venv 符号链接回系统站点包。这似乎运作良好,并且可以精确控制 venv 中可见的内容。【参考方案3】:
您可以使用--system-site-packages
,然后为您的虚拟环境“过度安装”特定的东西。这样,您安装到 virtualenv 中的所有内容都将从那里获取,否则将从您的系统中获取。
【讨论】:
我不确定什么不清楚,但会尝试:如果您使用 --system-site-packages 选项创建 virtualenv,系统将首先尝试在您的 virtualenv 中查找包,如果它在那里找不到它,它会尝试在您的系统 python 安装中找到它。只有当它在那里也没有找到它时,它才会引发 ImportError。 这种方法的唯一问题是您现在拥有所有系统库。您可能希望对安装的内容进行非常严格的控制。 尚不清楚这实际上是如何实现的!如果您在系统中存在 myprog 的 --system-site-packages 创建的 virtualenv 中执行 pip install myprog,则它不会“过度安装”myprog。它只会发现 myprog 存在,并说“要求已经满足”。所以……你是什么意思? 要“过度安装”已经在系统站点包中的包,在 virtualenv 中,使用--force-reinstall
运行 pip【参考方案4】:
安装虚拟环境
virtualenv --system-site-packages
并使用pip install -U to install matplotlib
【讨论】:
这与问题所问的相反。以上是关于让 virtualenv 从你的全局站点包中继承特定的包的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS Elastic Beanstalk 上使用 virtualenv 系统站点包?
virtualenv --no-site-packages 和 pip 仍在寻找全局包?