Virtualenv:全局 site-packages 与虚拟环境中的 site-packages

7 投票
2 回答
4455 浏览
提问于 2025-04-15 16:45
  1. 如果我在全局的包目录和本地的包目录都安装了某个包,那么在使用时会导入哪个包呢?这样做会不会出错?
  2. 我应该把哪些包放在全局的包目录里,哪些放在本地的包目录里呢?

2 个回答

3

新创建的虚拟环境默认可以访问全局的包目录,除非你在创建时加上 --no-site-packages 这个选项。如果你在某个虚拟环境中使用 easy_install 来安装新包,这会导致这个虚拟环境里的包覆盖全局包中的同名包(就像是继承一样)。当虚拟环境里没有某个包时,它会使用全局的包。

9

之前的回答解决了第一个问题,但忽略了第二个问题。

我看到的关于哪些包应该全局安装的最佳实践是:

首先,核心的Python包,因为这些包在升级到新版本时不会有向后不兼容的问题,除非你升级到一个大版本。而且,你会希望Python的安全修复能够自动应用到你的虚拟环境中。

其次,像MySQLdb/psycopg和PIL这样的包,它们不常改变,但在每个虚拟环境中安装起来比较麻烦。

其他的包基本上都应该放在你的虚拟环境的包里(我强烈推荐使用pip的需求文件和virtualenvwrapper,这样可以让设置过程变得简单,尤其是在其他机器上)。

撰写回答