使virtualenv继承全局站点程序包中的特定程序包


208

我正在寻找一种制作virtualenv的方法,该方法只包含基本python安装的一些库(我选择了这些库)。

更具体地说,我正在尝试在创建virtualenv的过程中将matplotlib导入virtualenv。由于缺少某些fortran编译器库,因此无法使用pip或easy_install有效安装。我到目前为止的方法是手动从

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

但是,这会阻止手动导入的链接被蛋黄注册(这会在virtualenv中打印所有当前可用的库)。

因此,有没有一种方法可以对

virtualenv --system-site-packages

16
温馨提示-如果出现以下情况之一,请选择答案。
foob​​arbecue 2013年

1
在过去的几个月中,似乎有12个人为您进行了测试……
foob​​arbecue 2014年

2
为什么要烦扰OP?我们都可以看到哪个是最受欢迎的答案。他是否接受真的很重要吗?我认为他在自我测试中的正直,而不是简单地打勾最受欢迎的答案,应该受到赞赏。
Michael Scheper

5
2013年:正确答案和错误答案之间的答案分数非常相似。OP说他会测试。2016年:Michael Scheper印象深刻,以至OP(三年前)表示会接受测试。2017:我再次遇到这个问题,感到很开心。
foob​​arbecue

2
没有正确的答案。OP要求选择性--system-site-packages。答案表明,使用非选择性--system-site-packages然后在本地过度安装某些软件包,这是不同的并且具有不同的含义。
Piotr Jurkiewicz

Answers:


238

用创建环境virtualenv --system-site-packages。然后,激活virtualenv,并在将其安装在virtualenv中而不是系统python中时,请使用pip install --ignore-installedpip install -I。这样,即使存在系统范围的版本,pip也会在本地安装您所请求的内容。您的python解释器将首先在virtualenv的package目录中查找,因此这些程序包应覆盖全局程序包。


45
通过使用-I,您将始终重新安装软件包,即使它们已存在于系统范围的site-packages目录中。如果改用-U,它将在您的virtualenv中安装较新版本的软件包,但不会使用所需的版本重新安装系统中已经可用的任何软件包。
Danilo Bargen

15
您是否知道在先前创建的虚拟环境中是否可以“激活” --system-site-packages选项?我希望避免重新安装所有本地软件包的麻烦!
加百利


我发现这个答案非常有趣,但是我遇到了一个很奇怪的案例,即它不起作用。我有no-global-site-packages启用的virtualenv 。但是由于某种原因,我不知道全球系统使用了beeing的软件包。pip install -I从virtualenv内部使用软件包无效。最后,我最终从virtualenv和全局系统暂时卸载了该软件包,然后可以将其重新安装到virtualenv和系统中(按此顺序)。所以现在工作正常。
kstenger

3
-1这个问题要求使某些包可见,除了阴影包以外,不是全部。将受限集合列入白名单比将所有内容列入白名单要安全得多,因为它可以保证除明确列入白名单的软件包外,所有软件包都必须存在于venv中。
bluenote10 '18 -10-17

19

您可以使用--system-site-packages,然后“过度安装”您的virtualenv特定的东西。这样,您安装到virtualenv中的所有内容都将从此处获取,否则将从系统中获取。


我不确定目前尚不清楚,但是会尝试:如果您使用--system-site-packages选项创建virtualenv,系统将首先尝试在您的virtualenv中找到软件包,如果找不到,它将尝试在系统python安装中找到它。只有在该处也找不到它时,它才会引发和ImportError。
schacki

4
这种方法的唯一问题是您现在拥有所有系统库。您可能希望非常严格地控制所安装的内容。
Dwayne

7
尚不清楚这实际上是怎么可能的!如果您在系统中存在myprog的位置使用--system-site-packages创建的virtualenv中pip安装myprog,则不会“过度安装” myprog。它只会发现myprog存在,然后说“已经满足要求”。那么...你是什么意思?
foob​​arbecue

-5

使用安装虚拟环境

virtualenv --system-site-packages

和使用 pip install -U to install matplotlib


3
这与问题所提出的相反。
丹·盖茨

-7

您可以使用virtualenv --clear。不会安装任何软件包,然后安装所需的软件包。


这不能回答有关如何利用某些系统范围的程序包的实际问题的答案
MrLeeh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.