如何让virtualenv在Ubuntu中使用dist-packages?
如何让virtualenv在Ubuntu中使用dist-packages?
我知道如果创建新的虚拟环境时没有传递--no-site-packages
参数,virtualenv会将在/usr/local/lib/python2.7/site-packages
(对于Python 2.7)中的包与新创建的虚拟环境链接起来。在Ubuntu 12.04 LTS中,我有三个位置可以安装Python 2.7包(使用默认的Ubuntu提供的Python 2.7安装):
1. /usr/lib/python2.7/dist-packages
:这里有我全局安装的ipython、scipy、numpy、matplotlib等包,如果它们不是通过scipy stack提供的话,我会发现单独安装它们(以及它们的依赖项)非常困难和耗时。
2. /usr/local/lib/python2.7/site-packages
:这是空的,我认为在Ubuntu上它会一直保持这个状态,除非我从源代码安装一个包。
3. /usr/local/lib/python2.7/dist-packages
:这里有非常重要的天文本地包,尤其是与PyRAF、STScI等相关的包,单独安装它们非常困难和耗时。
请注意,我系统上不存在像/usr/lib/python2.7/site-packages
这样的全局目录。请注意,我全局安装的ipython、scipy等能让我在不必每次都源/激活虚拟环境的情况下即时使用这些包。
自然地,我现在想使用virtualenv在我的用户主目录中创建一个虚拟环境,我将在将来的项目中使用它。然而,我希望在创建这个虚拟环境时,它能够链接/复制我上面列表中位置(1)和(3)的所有包。这样做的主要原因是我不想为这个(以及可能的其他)虚拟环境重新安装ipython、scipy、天文学包等,如果这样做甚至可能的话,也无需经过pip install
的过程。
以下是我的问题:
- 是否有办法告诉virtualenv我希望为将来创建的虚拟环境链接/复制这两个
dist-packages
目录中的软件包? - 当我最终在这两个
dist-packages
目录中更新我的scipy、ipython等全局安装时,这是否也会更新/更改我虚拟环境使用的软件包(并且最初在virtualenv创建过程中获取)? - 如果我在Ubuntu上从源代码安装软件包,它会被安装在
/usr/local/lib/python2.7/dist-packages
还是/usr/local/lib/python2.7/site-packages
中?
提前感谢您的帮助!
我只是在学习virtualenv,但似乎有一个比目前提到的更简单的方法。
-
自从virtualenv 1.7,--no-site-packages已成为默认行为。
因此,如果您使用Ubuntu提供的修改版virtualenv,则只需要使用--system-site-packages
标志就可以将dist-packages添加到您的路径中。(这个答案和这个也提供了一些有用的历史记录)。我已经测试过了,确实有效。$ virtualenv --system-site-packages .
-
我在这里同意Thomas的看法——我看不出需要在virtualenv中采取任何操作来查看dist-packages的更新效果。
-
在使用
python setup.py install
测试后,它(再次如Thomas所说)仍然进入dist-packages。您可以通过构建自己的Python来更改这一点,但这有点极端。
这可能是使用PYTHONPATH
的正当用途 - 它是一个环境变量,virtualenv
不会更改它,它使用与环境变量PATH
相同的语法,在bash中PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
可以放在 .bashrc 或其他类似的文件中。如果你遵循这个路径,
-
你不需要告诉虚拟环境它,它不会尝试更改它。
-
不需要重新链接,
-
它仍然会去到它本应该去的地方(对于我的Ubuntu,
pip install
总是使用/usr/local/lib/python2.7/dist-packages/),如果你在虚拟环境之外安装它们。如果你在虚拟环境内(启用它后)安装它们,它们当然会被放在虚拟环境中。