【问题标题】:How can I deal with python eggs for multiple platforms in one location?如何在一个位置处理多个平台的 python 鸡蛋?
【发布时间】:2009-12-14 21:33:11
【问题描述】:

我们的所有系统都有一个通用的 python 安装,以确保每个系统都有相同的 python 安装并缓解配置问题。此安装位于共享驱动器上。我们还有多个共享此安装的平台。我们通过在编译 python 时设置 --exec-prefix 配置选项来解决冲突的特定于平台的文件。

我的问题是我现在想使用与平台相关的 easy_install(或其他方式)安装一个 egg。 easy_install 将 egg 放在安装的平台无关部分的 site-packages 目录中。鸡蛋的名字里面有平台,所以应该没有冲突。但是 python 只会加载它找到的第一个。 (因此,在 Solaris 上,它可能会尝试加载 Linux egg)。修改 easy-install.pth 文件可以改变它找到的那个,但这没什么用。

我可以将 .egg 文件移动到依赖于平台的包目录中,然后使用 pkg_resources.require() 加载它们(或手动调整路径)。但似乎我不应该这样做,因为平台是以鸡蛋的名义。

有没有更通用的方法可以确保 python 为正确的平台加载鸡蛋?

【问题讨论】:

  • egg是包含C扩展的,还是纯python的?
  • 是的,有一个 C 扩展。否则没关系,因为代码不会依赖于平台。具体来说,它是 PyPerforce 模块,以防你好奇。

标签: python easy-install pkg-resources


【解决方案1】:

试试 virtualenv ...http://pypi.python.org/pypi/virtualenv ... 帮助您使用它自己的 python 解释器 + site_packages 文件夹创建隔离环境。因此,您永远不会与安装在本地路径中的软件包发生任何冲突。

【讨论】:

    【解决方案2】:

    我最终将依赖于平台的 egg 手动移动到特定于平台的站点包目录(如 http://docs.python.org/install/index.html 中指定的那样)。然后我在同一个目录中创建了另一个easy-install.pth,列出了要安装的鸡蛋。

    如果 easy_install 遵循 exec_prefix 并将平台相关的鸡蛋放在正确的“非纯模块分发”位置,这将更加方便。也许我会向 easy_install 人员提出这个要求。

    【讨论】:

      【解决方案3】:

      Python 有足够多的钩子使这成为可能,但这可能并不明智。如果你真的想实现它,请查看PEP 302 并开始破解easy_installdistribute 源代码。如您所知,easy-install.pth 中没有任何逻辑。

      您最好只跟踪要安装的 Python 包。例如,您可以编写自己的 Python 包,该包仅取决于所需的集合。

      【讨论】:

      • 和/或使用 python virtualenv 包为该项目管理你的包
      【解决方案4】:

      使用“easy_install -m”安装所有平台特定的包,这样sys.path 上就没有默认版本。这样,版本解析会在运行时进行,并且会考虑平台信息。

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 2011-09-02
        • 2011-01-02
        • 1970-01-01
        • 2011-02-27
        • 2017-02-28
        • 2017-03-08
        • 2016-03-03
        • 2011-02-13
        相关资源
        最近更新 更多