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

qua*_*ash 16 python environment ubuntu packages virtualenv

我知道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 - 如果它们不能通过scipy堆栈获得,我会发现单独安装(以及它们的所有依赖)会很困难和耗时.
  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)中的所有包.这样做的主要原因是我不想经历这个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

在此先感谢您的帮助!

Tho*_*mas 16

这可能是合法使用PYTHONPATH- 一个virtualenv不接触的环境变量,它使用与环境变量相同的语法PATH,在PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages.bashrc或类似的bash 中.如果你沿着这条路走

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

  2. 不需要重新连接,并且

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

  • 这很棒,谢谢!另一种方法是创建一个[.pth](http://docs.python.org/2/install/index.html#modifying-python-s-search-path)文件,其中每一行都是要添加的路径到默认的sys.path,并将该文件放在虚拟环境的site-packages目录中,例如,在`/ home/userX/envY/lib/python2.7/site-packages`中的dist-packages.pth.我现在选择了后一种方法,因为它更明确地说明了为什么这个特定的虚拟环境可以访问全局dist-packages目录,而不是.bashrc中的"全局"`PYTHONPATH`环境变量. (3认同)
  • 啊那太好了.有时我会在虚拟环境中向激活脚本添加内容,你可以在那里设置和取消设置PYTHONPATH,但是因为.pth文件的工作可能更好.这是其他类似事物的好地方. (2认同)

Dan*_*mal 6

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

  1. 由于virtualenv 1.7 --no-site-packages一直是默认行为.因此,使用--system-site-packagesvirtualenv 的标志就是在你的路径中获得dist-packages所需的全部 - 如果你使用Ubuntu发布的tweato virtualenv.(这个答案这个给出了一些有用的历史).我测试了这个,它确实有效.

    $ virtualenv --system-site-packages .

  2. 我在这里同意Thomas的观点 - 我看不出virtualenv中需要采取任何行动来查看dist-packages中更新的效果.

  3. 经过测试后python setup.py install,它确实(再次像托马斯所说的那样)仍然进行分析.你可以通过构建自己的python来改变它,但这有点极端.