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

时间:2013-10-06 16:12:14

标签: python ubuntu virtualenv packages environment

我知道virtualenv,如果在创建新虚拟环境时未传递--no-site-packages参数,则会将/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 - 我觉得单独安装很困难且很费时(以及它们的所有依赖性)如果它们不能通过{ {3}}。
  2. /usr/local/lib/python2.7/site-packages:这是空的,我认为它会在Ubuntu上保持这种状态,除非我从源代码安装包。
  3. /usr/local/lib/python2.7/dist-packages:这里有非常重要的天文地方包,特别是那些与PyRAF,STScI等相关的包,而且单独安装它们非常困难和耗时。
  4. 请注意,我的系统上不存在/usr/lib/python2.7/site-packages等全局目录。另请注意,我的ipython,scipy等全局安装允许我使用这些软件包 on-the-fly ,而不必每次都来源/激活虚拟环境。

    当然,我现在想使用virtualenv在我的用户主目录中创建一个虚拟环境,我将为未来的项目提供/激活。但是,我希望这个虚拟环境在创建时链接/复制上面列表中位置(1)和(3)中的所有包。这样做的主要原因是我不想通过pip install进程(如果可能的话)重新安装ipython,scipy,astro-packages等等(也许还有其他) )虚拟环境。

    以下是我的问题:

    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
    4. 提前感谢您的帮助!

5 个答案:

答案 0 :(得分:15)

这可能是合法使用PYTHONPATH - virtualenv未触及的环境变量,它使用与环境变量PATH相同的语法,在bash {{1在.bashrc或类似的。如果你遵循这条道路,

  1. 您根本不必告诉您的虚拟环境,也不会尝试更改它。

  2. 不需要重新连接,

  3. 如果你在虚拟环境之外安装它们,那么它仍然会去任何地方(PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages总是使用/usr/local/lib/python2.7/dist-packages/为我的Ubuntu)环境。如果你在虚拟环境中安装它们(当它被激活时),那么它当然会被置于虚拟环境中。

答案 1 :(得分:6)

我只是围绕着virtualenv,但到目前为止似乎有一个比提到的更简单的方法。

  1. 由于virtualenv 1.7 --no-site-packages一直是默认行为。 因此,如果你使用Ubuntu提供的调整版virtualenv,那么使用--system-site-packages标志来实现virtualenv只需要在你的路径中获得dist-packages。 (This answerthis one提供了一些有用的历史记录)。我已经对此进行了测试,但确实有效。

    $ virtualenv --system-site-packages .

  2. 我同意托马斯的观点 - 我无法看到virtualenv需要采取任何措施来查看dist-packages中更新的效果。

  3. python setup.py install进行了测试后,(确实如托马斯所说的那样)仍然会进入dist-packages。你可以通过构建自己的python来改变它,但这有点极端。

答案 2 :(得分:4)

PYTHONPATH适合我。

vim ~/.bashrc

在下面添加以下内容:

export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
source ~/.bashrc

答案 3 :(得分:2)

在目录site-packages中,创建一个文件dist.pth 在文件dist.path中,输入以下内容: ../dist-packages

enter image description here

现在停用并激活你的virtualenv。你应该被设置。

答案 4 :(得分:0)

您想要实现的目标实际上是将特定文件夹(dist-packages)添加到Python搜索路径中。你有很多选择:

  1. 使用路径配置(.pth)文件,条目将附加到系统路径。
  2. 修改PYTHONPATH(来自它的条目转到系统路径的开头)。
  3. 直接从您的Python脚本修改sys.path,即附加所需的文件夹。
  4. 我认为对于这个特定的案例(启用全局dist-packages文件夹)第三个选项更好,因为有了第一个选项,你必须为每个virtualenv创建.pth文件将要使用(使用一些外部shell脚本?)。分发包装时很容易忘记它。第二个选项需要运行时设置(添加一个envvar),这也很容易错过。

    只有第三个选项在配置或运行时不需要任何先决条件,并且可以毫无问题地分发(当然,在相同类型的系统上)。

    你可以使用这样的功能:

    def enable_global_distpackages():
        import sys
        sys.path.append('/usr/lib/python2.7/dist-packages')
        sys.path.append('/usr/local/lib/python2.7/dist-packages')
    

    然后在您的软件包的__init__.py文件中:

    enable_global_distpackages()