virtualenv: 指定使用全局包与本地包

62 投票
1 回答
58560 浏览
提问于 2025-04-17 13:59

可能重复的问题:
让虚拟环境继承特定的全局包

有没有办法创建一个 virtualenv(虚拟环境),并指定哪些包应该从系统的全局安装中使用(继承),哪些包应该被忽略?

具体来说,比如说系统中已经安装了:

numpy
scipy
matplotlib

我想创建一个虚拟环境,使得:

  • 使用系统全局安装的 numpyscipy
  • 忽略 系统全局的 matplotlib,并让我可以安装/升级我自己的版本(用 pip -U matplotlib)。

这样做可以吗?

1 个回答

89

最简单的方法是创建一个虚拟环境,这个环境可以使用系统中的包,然后安装你需要的版本:

$ virtualenv --system-site-packages foo
$ source foo/bin/activate
$ pip install Django==1.4.3

你也可以在之后清理这个虚拟环境,查看一下 pip freeze 的输出,删除你不想要的包。(在新版本的虚拟环境中,用 pip uninstall 删除系统包已经不再有效了)

另一种方法是创建一个干净的虚拟环境,然后链接你需要的部分:

$ virtualenv --no-site-packages foo
$ source foo/bin/activate
$ ln -s /usr/lib/python2.7/dist-packages/PIL* $VIRTUAL_ENV/lib/python*/site-packages

在非类Unix的环境中,命令可能会稍有不同。路径也取决于你使用的系统。要找到库的路径,可以启动Python解释器(不激活虚拟环境),导入模块,然后查看 module_name.__path__。例如:

Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>> PIL.__path__
['/usr/lib/python2.7/dist-packages/PIL']

另外,如果你是用 --system-site-packages 创建的虚拟环境,你可以用 pip install --upgrade --ignore-installed numpy 安装比系统中更新的版本。

撰写回答