22

我知道 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 包等。

以下是我的问题:

  1. 有没有办法让我指定 virtualenv 我希望它为dist-packages将来创建的虚拟环境链接/复制这两个目录中的包?
  2. 当我最终在两个目录中更新我的 scipy、ipython 等全局安装时,dist-packages这是否也会更新/更改我的虚拟环境使用的包(以及它最初在 virtualenv 创建期间获得的包)?
  3. 如果我曾经在 Ubuntu 上从源代码安装一个包,它会进入/usr/local/lib/python2.7/dist-packages,还是/usr/local/lib/python2.7/site-packages

在此先感谢您的帮助!

4

5 回答 5

16

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

  1. 你根本不需要告诉你的虚拟环境这件事,它不会试图改变它。

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

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

于 2013-10-06T17:13:39.397 回答
6

我只是在了解 virtualenv,但似乎有比目前提到的更简单的方法。

  1. virtualenv 1.7开始 --no-site-packages 一直是默认行为。因此--system-site-packages,如果您使用 Ubuntu 提供的经过调整的 virtualenv,那么在您的路径中获取 dist 包所需的全部内容就是使用 virtualenv 标志。(这个答案这个给出了一些有用的历史)。我已经对此进行了测试,并且确实有效。

    $ virtualenv --system-site-packages .

  2. 我同意 Thomas 的观点——我看不到 virtualenv 中需要任何操作来查看 dist 包中更新的效果。

  3. python setup.py install. 您可以通过构建自己的 python 来改变这一点,但这有点极端。

于 2015-07-27T16:49:08.197 回答
4

PYTHONPATH为我工作。

vim ~/.bashrc

在下面添加这一行:

export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
source ~/.bashrc
于 2014-03-27T03:31:50.153 回答
3

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

在此处输入图像描述

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

于 2017-12-16T05:49:04.650 回答
1

您想要在这里实现的本质上是将特定文件夹 ( dist-packages) 添加到 Python 搜索路径。为此,您有多种选择:

  1. 使用路径配置 ( .pth) 文件,条目将附加到系统路径。
  2. 修改PYTHONPATH(其中的条目转到系统路径的开头)。
  3. 直接从您的 Python 脚本修改sys.path,即将所需的文件夹附加到它。

我认为对于这种特殊情况(启用全局dist-packages文件夹),第三个选项更好,因为使用第一个选项,您必须为.pth您将使用的每个 virtualenv 创建文件(使用一些外部 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()
于 2014-06-20T12:37:46.217 回答