如何在一个位置处理多个平台的Python包?
我们有一个公共的Python安装,目的是为了确保所有系统使用相同的Python版本,这样可以减少配置上的问题。这个安装在一个共享的驱动器上。我们还有多个平台共享这个安装。为了避免不同平台的文件冲突,我们在编译Python时设置了一个叫做--exec-prefix的选项。
现在我遇到的问题是,我想用easy_install(或者其他方式)安装一个依赖于平台的包。easy_install会把这个包放在安装的与平台无关的部分的site-packages目录里。这个包的名字里包含了平台的信息,所以理论上应该不会有冲突。但是Python只会加载它找到的第一个包。(比如在Solaris上,它可能会尝试加载Linux的包)。虽然可以通过修改easy-install.pth文件来改变它找到的包,但这样做其实没什么用。
我可以把.egg文件移动到一个与平台相关的包目录里,然后用pkg_resources.require()来加载它们(或者手动调整路径)。不过看起来我不应该这样做,因为包的名字里已经包含了平台的信息。
有没有什么更通用的方法可以确保Python加载正确平台的包呢?
4 个回答
Python有很多可以让你实现这个功能的方式,但这样做可能不是个明智的选择。如果你真的想尝试,可以看看PEP 302,然后开始研究一下easy_install
或者distribute
的源代码。正如你所知道的,easy-install.pth
里面其实没有什么逻辑。
你可能更好的一种做法是,简单地记录下你想安装的Python包。比如,你可以自己写一个Python包,只依赖于你想要的那些包。
试试使用 virtualenv ... http://pypi.python.org/pypi/virtualenv ... 它可以帮助你创建一个独立的环境,这个环境里有自己的 Python 解释器和一个专门的包文件夹。这样一来,你就不会和本地路径下安装的其他包发生冲突了。
最后我选择了手动把和平台相关的包移动到特定平台的 site-packages 目录里(具体位置可以参考 http://docs.python.org/install/index.html)。然后我在那个目录里又创建了一个 easy-install.pth 文件,里面列出了要安装的包。
如果 easy_install 能够识别 exec_prefix,并把和平台相关的包放到正确的“非纯模块分发”位置,那就方便多了。也许我会向 easy_install 的开发者提这个建议。