如何让virtualenv在Ubuntu中使用dist-packages?

17 浏览
0 Comments

如何让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的过程。

以下是我的问题:

  1. 是否有办法告诉virtualenv我希望为将来创建的虚拟环境链接/复制这两个dist-packages目录中的软件包?
  2. 当我最终在这两个dist-packages目录中更新我的scipy、ipython等全局安装时,这是否也会更新/更改我虚拟环境使用的软件包(并且最初在virtualenv创建过程中获取)?
  3. 如果我在Ubuntu上从源代码安装软件包,它会被安装在/usr/local/lib/python2.7/dist-packages还是/usr/local/lib/python2.7/site-packages中?

提前感谢您的帮助!

admin 更改状态以发布 2023年5月24日
0
0 Comments

我只是在学习virtualenv,但似乎有一个比目前提到的更简单的方法。

  1. 自从virtualenv 1.7,--no-site-packages已成为默认行为。
    因此,如果您使用Ubuntu提供的修改版virtualenv,则只需要使用--system-site-packages标志就可以将dist-packages添加到您的路径中。(这个答案这个也提供了一些有用的历史记录)。我已经测试过了,确实有效。

    $ virtualenv --system-site-packages .

  2. 我在这里同意Thomas的看法——我看不出需要在virtualenv中采取任何操作来查看dist-packages的更新效果。

  3. 在使用python setup.py install测试后,它(再次如Thomas所说)仍然进入dist-packages。您可以通过构建自己的Python来更改这一点,但这有点极端。

0
0 Comments

这可能是使用PYTHONPATH的正当用途 - 它是一个环境变量,virtualenv不会更改它,它使用与环境变量PATH相同的语法,在bash中PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages可以放在 .bashrc 或其他类似的文件中。如果你遵循这个路径,

  1. 你不需要告诉虚拟环境它,它不会尝试更改它。

  2. 不需要重新链接,

  3. 它仍然会去到它本应该去的地方(对于我的Ubuntu,pip install总是使用/usr/local/lib/python2.7/dist-packages/),如果你在虚拟环境之外安装它们。如果你在虚拟环境内(启用它后)安装它们,它们当然会被放在虚拟环境中。

0