如何处理位于同一位置的多个平台的Python eggs?

6
我们为了确保每个系统都有相同的Python安装并减轻配置问题,为所有系统提供了一个通用的Python安装。这个安装位于共享驱动器上。我们还有多个平台共享此安装。我们通过在编译Python时设置--exec-prefix配置选项来解决冲突的特定于平台的文件。
我的问题是,我现在想安装一个使用easy_install(或其他方式)的平台相关的egg。 easy_install将该egg放置在安装的平台无关部分的site-packages目录中。 egg的名称中包含平台信息,因此不应该存在冲突。但是Python只会加载它找到的第一个egg。(因此,在Solaris上,它可能会尝试加载Linux egg)。修改easy-install.pth文件可以更改它找到的内容,但这没什么用。
我可以将.egg文件移动到平台相关的软件包目录中,然后使用pkg_resources.require()来加载它们(或手动调整路径)。但似乎我不应该这样做,因为egg的名称中已经包含了平台信息。
有没有更通用的方法可以确保Python加载正确平台的egg?

这个 egg 包含 C 扩展吗,还是纯 Python 的? - codeape
是的,有一个C扩展。否则,代码就不会依赖于平台。具体来说,它是PyPerforce模块,如果你好奇的话。 - Philbert
4个回答

2
尝试使用Virtualenv,它可以帮助您创建具有自己的Python解释器+site_packages文件夹的隔离环境。这样,您就不会与在本地路径中安装的软件包发生任何冲突。 http://pypi.python.org/pypi/virtualenv

2
我最终采取的方法是手动将与平台有关的egg移动到特定于平台的site-packages目录中(如在http://docs.python.org/install/index.html中指定)。然后我在同一目录中创建了另一个easy-install.pth,列出要安装的egg。
如果easy_install能够遵循exec_prefix并将平台相关的egg放在正确的“非纯模块分发”位置,这将更加方便。也许我会向easy_install的开发人员提出这个请求。

1

Python有足够的钩子来实现这一点,但这可能不明智。如果您真的想要实现这一点,请查看PEP 302并开始破解easy_installdistribute源代码。正如您所知,easy-install.pth中实际上没有任何逻辑。

您可能最好只是跟踪您想要安装的Python软件包。例如,您可以编写自己的Python软件包,该软件包仅依赖于所需的软件集合。


使用Python的virtualenv包来管理你的项目中的软件包。 - RyanWilcox

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接