【问题标题】:Ubuntu + virtualenv = a mess? virtualenv hates dist-packages, wants site-packagesUbuntu + virtualenv = 一团糟? virtualenv 讨厌 dist-packages,想要 site-packages
【发布时间】:2010-11-15 23:33:39
【问题描述】:

有人可以向我解释一下 ubuntu 9.04 中的 python 是怎么回事吗?

我正在尝试启动virtualenv,而--no-site-packages 标志似乎对ubuntu 没有任何作用。我安装了virtualenv 1.3.3easy_install(我已经升级到setuptools 0.6c9),一切似乎都安装到/usr/local/lib/python2.6/dist-packages

假设使用 apt-get 安装软件包时,它被放置在 /usr/lib/python2.6/dist-packages/ 中?

问题是,还有一个/usr/local/lib/python2.6/site-packages 只是空着坐在那里。看起来(通过查看virtualenv 中的path)这是 virtualenv 用作备份的文件夹。因此,即使我省略了--no-site-packages,我也无法从我的任何 virtualenv 访问我的本地系统包。

所以我的问题是:

  1. 如何让virtualenv 指向dist-packages 之一?
  2. 我应该将它指向哪个 dist-packages? /usr/lib/python2.6/dist-packages/usr/local/lib/python2.6/dist-packages/
  3. /usr/lib/python2.6/site-packages 的意义何在?里面什么都没有!
  4. 是先到先得吗?如果我在/usr/local/lib/python2.6/dist-packages/ 中安装了更新版本的包 XYZ 并且在/usr/lib/python2.6/dist-packages 中安装了旧版本(来自 ubuntu repos/apt-get),当我import xyz 时会导入哪个包?我假设这是基于路径列表,是吗?
  5. 这到底是怎么回事?我这里有什么遗漏吗?
  6. 在哪里定义easy_install应该安装到/usr/local/lib/python2.6/dist-packages
  7. 这是否也会影响pip

感谢任何可以解决此问题的人!

【问题讨论】:

  • 我怀疑 Ubuntu 在这里坏了:将站点包重命名为 dist-packages 绝对没有意义或理由(这就是 /usr/local 的用途)。不过,在 virtualenv 方面无法为您提供帮助。
  • 使用PYTHONPATH 变量。 [见这里][1] [1]:stackoverflow.com/questions/19210964/…
  • 7 岁?为什么这个问题还贴出来?

标签: python ubuntu setuptools virtualenv


【解决方案1】:

我相信 the virtual-env mailing list 的 Mike Orr 的回答似乎是最好的。请注意 OP 在两个地方都发布了这个问题。

邮件原文内容:

几年前 Debian 创建了 /usr/local/lib/pythonVERSION/site-packages, 并编译 Python 二进制文件以将其包含在默认搜索中 小路。 Ubuntu 像往常一样追随 Debian。蟒蛇 开发人员不喜欢这样,因为你会受到干扰 本地安装的 /usr/local/bin/python 使用相同的站点包 目录。 Ubuntu 最终决定放弃 site-packages 并使用 dist-packages 是他们发明的名字,所以它不会 干涉任何事情。故事就在某个地方,如果 你在 Python 错误跟踪器或 distutils SIG 的某个地方搜索它,或者 这样的。

系统工作,至少如果你使用 Ubuntu virtualenv 包。 有些人在使用本地安装的 virtualenv 时遇到问题 Ubuntu,因为没有添加魔法 sys.path 条目或 某物。我不确定 --no-site-packages 因为我从不使用 该选项:我从 Ubuntu 软件包中运行 PIL 和 mysqldb,因为它 有时很难编译它们的 C 依赖项。 (需要 正确的头文件,Python忽略头文件等)

所以 Ubuntu Python 包进入 /usr/lib/pythonVERSION/dist-packages.或者那个python支持 出于某种原因的目录。本地安装的 Python 包进入 /usr/local/lib/pythonVERSION/dist-packages 默认情况下。每当我 安装我运行的 Ubuntu 9.04 系统:

$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip install virtualenvwrapper

virtualenvs 以这种方式工作得很好,虽然我没有尝试过 --no-site-packages。

我正在尝试启动 virtualenv 和 --no-site-packages 标志 似乎与ubuntu无关。我安装了 virtualenv 1.3.3 easy_install(我已经升级到 setuptools 0.6c9)

这些版本都在 Ubuntu 9.04 中,所以你让它变得更难了 自己安装在本地。

和一切 好像安装到/usr/local/lib/python2.6/dist-packages

是的

我假设在使用 apt-get 安装软件包时,它被放置在 / usr/lib/python2.6/dist-packages/ ?

是的

  1. 是先到先得吗?如果我有更新的 安装在 /usr/local/lib/python2.6/dist- 中的软件包 XYZ 的版本 /usr/lib/ 中的 packages/ 和旧版本(来自 ubuntu repos/apt-get) python2.6/dist-packages,当我导入 xyz 时会导入哪一个? 我假设这是基于路径列表,是吗?

sys.path 按顺序扫描。唯一有趣的是 .pth 鸡蛋 比某些人预期的更早或更晚地进入道路。但如果 您将 pip 用于它可以做的所有事情(即除了安装 pip 本身,预编译的鸡蛋,以及本地目录的快照 复制而不是鸡蛋链接),无论如何你不会有很多 .pth 鸡蛋。

  1. 这到底是怎么回事?我有什么东西吗 错过了吗?

没有很好的记录。我通过扫描网络弄清楚了。

  1. 这也会影响点子吗?

是的,pip 会自动安装到 /usr/local/lib/pythonVERSION/site-packages.使用“pip install -E $VIRTUAL_ENV packagename" 安装到虚拟环境中。

【讨论】:

    【解决方案2】:

    我很想通过将 site-packages 设置为 dist-packages 的链接来破解它,但我想这可能会影响您想要安装某些扩展而不是从 ubuntu dist 安装的其他情况。除了调整 virtualenv 的源代码(ubuntu 和 virtualenv 都很受欢迎,如果发现调整后的版本已经存在,我不会感到惊讶),我想不出另一个答案。

    Re 2,如果您使用的是 /usr/local/bin/python,您应该使用 lib 的 /usr/local 版本(包括站点包),反之,如果您使用的是 /usr/bin/python .

    Re 3,如果您从源代码(不是通过 easy_install 或从 ubuntu 的发行版)安装 /usr/bin/python 的扩展,将会有一些东西。

    关于 4,是的,路径上较早的条目优先。

    Re 5,easy_install 仅以它的名字简单——它做了这么多的黑暗魔法,尽管它很方便,但它被小心地排除在标准 python 库之外,因为我们 python 提交者之间的共识是,为了方便,深度黑暗魔法是“简单”只是表面上的。

    Re 6,我认为这是对 easy_install 的 ubuntu 修改——如果这是正确的,那么它是在 Canonical 或其他 ubuntu 维护者做出集体决定的地方定义的。

    Re 7,抱歉,不知道——我手头没有最近的 ubuntu 可供检查。

    【讨论】:

    • re1,我希望能够继续使用 easy_install/pip 进行更新。 re2,在我的系统上没有/usr/local/bin/python,只有/usr/bin/python。似乎 easy_install 将所有内容安装到 /usr/local/lib/python2.x/ 并且 apt-get 将所有内容安装到 /usr/lib/python2.x/。 re6,我已经使用easy_install -U setuptools 更新了easy_install。它应该使用源包,而不是 ubuntu 的了。希望有 9.04 盒子的人能对此有所了解。
    【解决方案3】:

    你真的不应该接触 Ubuntu 的 Python 安装,除非你正在构建系统管理工具,或者构建一些可以被视为新系统服务的东西。

    如果您使用 Ubuntu 开发或部署 Python 应用程序,请始终从源代码构建您自己的 Python,将其打包并用于部署。这样,您将所有目录都放在正确的位置,并且 virtualenv 将正常工作。如果您将在服务器上部署多个 Python 应用程序,则让您的 Python 存在于某个地方,例如 /home/python/opt/python 或您的主目录之外的某个地方。确保您拥有开发者组 (users?) 的写入权限,以便人们可以轻松添加包。

    这还允许您拥有两层包。作为您内部标准工具的工具可以安装在您的 Python 发行版中,并成为您部署的 tarball 的一部分,并且只有特定于应用程序的包才会在 virtualenv 中。

    不要升级或修改Ubuntu系统安装的Python。

    【讨论】:

      【解决方案4】:

      好吧,我有一个 Ubuntu 9.04,并很快尝试设置几个带有站点包的沙箱,一个没有。一切正常。

      我采用的方法的唯一区别是我使用了 Ubuntu 的 python-virtualenv 包 (1.3.3)。并假设它由 Ubuntu 团队进行了调整以适应 Ubuntu 设置。

      总结一下暂时禁用easy_installed virtualenv,使用打包的python-virtualenv,看看是否符合你的期望。

      事实上,我们使用类似的设置进行生产没有任何问题。休息已经被亚历克斯回答了。

      【讨论】:

      • 发行版维护者需要停止搞乱这样的事情。我应该能够开箱即用地使用众所周知的包,比如 virtualenv :(
      • 这不能回答问题。站点包不是问题。 dist-packages 是。
      【解决方案5】:

      另一种解决方法:
      https://stackoverflow.com/a/17265840/202168

      必须记住在您需要的每个 virtualenv 中执行此操作,但不依赖于 hack 或特殊版本的 virtualenv

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2017-02-19
        • 2011-03-23
        • 2020-07-02
        • 2012-03-12
        • 1970-01-01
        • 2012-09-17
        相关资源
        最近更新 更多