使virtualenv从您的全局站点包继承特定的包

The*_*eer 190 python virtualenv

我正在寻找一种方法来制作一个virtualenv,其中只包含基本python安装的一些库(我选择).

更具体一点,我正在尝试在virtualenv的创建过程中将matplotlib导入virtualenv.它无法通过pip或easy_install高效安装,因为它错过了一些fortran编译器库.我到目前为止的方式是手动复制

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/
Run Code Online (Sandbox Code Playgroud)

但是这可以防止yolk注册manully导入的链接(打印virtualenv中所有当前可用的库).

那么,有没有办法做一个选择性的变体

virtualenv --system-site-packages
Run Code Online (Sandbox Code Playgroud)

foo*_*cue 218

创建环境virtualenv --system-site-packages.然后,激活virtualenv,当你想在virtualenv而不是系统python中安装东西时,使用pip install --ignore-installedpip install -I.这样,即使存在系统范围的版本,pip也会安装您在本地请求的内容.你的python解释器将首先在virtualenv的包目录中查找,因此这些包应该影响全局的包.

  • 通过使用-I,您将始终重新安装软件包,即使它们已存在于systemwide site-packages目录中.如果您使用-U,它将在您的virtualenv中安装较新版本的软件包,但不会重新安装系统中已具有所需版本的任何软件包. (44认同)
  • 您是否知道在以前创建的虚拟环境中是否有任何"激活"--system-site-packages选项的方法?我很想避免重新安装我所有本地包裹的麻烦! (15认同)
  • 是的有http://stackoverflow.com/questions/3371136/revert-the-no-site-packages-option-with-virtualenv (14认同)
  • -1这个问题要求使*某些*包可见,而不是*所有*除了阴影包。将受限集合列入白名单比将所有内容列入白名单要安全得多,因为它可以保证除明确列入白名单的软件包外,所有软件包都必须存在于venv中。 (2认同)

sch*_*cki 17

你可以使用--system-site-packages然后"overinstall"你的virtualenv特定的东西.这样,您安装到virtualenv中的所有内容都将从那里获取,否则将从您的系统中获取.

  • 目前还不清楚这是如何实现的!如果您在使用--system-site-packages创建的virtualenv中安装myprog,其中myprog存在于系统中,它将不会"重载"myprog.它会发现myprog存在,并说"要求已经满足".那么......你的意思是什么? (6认同)
  • 这种方法的唯一问题是您现在拥有所有系统库.您可能希望对所安装的内容进行非常严格的控制. (4认同)