在(和多个操作系统)上创建Python分发(鸡蛋)的最佳实践是什么?

时间:2012-02-17 11:40:37

标签: python setuptools egg software-packaging

我们是一家蟒蛇店。我们在内部开发了不同的python包,并将部署到客户的环境(机器)上。

这就是我们的开发和发布周期。

一旦开发人员完成了包的“测试”,就会准备包的分发(egg文件)并将其推送到中央归档位置。当我们想要将我们的软件部署到客户时,相同的发行版(egg文件)将被下载并安装在他们的环境中。

假设“测试”发生在多个操作系统上(为了检查跨平台的API的兼容性),准备发行版并将其推送到中央归档位置的最佳做法是什么。

最好在归档服务器上安装特定于操作系统的鸡蛋(例如,samplepkg-1.0.0.win32.egg和samplepkg-1.0.0.linux.egg?不确定如何使用这种方式准备它们setuptools。)或者有一个鸡蛋因为API在各个平台上保持不变?社区遵循的任何其他做法?

4 个答案:

答案 0 :(得分:5)

如果符合以下条件,您可以使用单个包:

  1. 该软件包不使用所有目标平台上都不可用的函数/类(参见例如版本2.7.2的Python标准库参考的第36-39章,了解在这种情况下不应使用的内容)
  2. 您没有使用需要针对每个平台编译的C / C ++编写的扩展。
  3. 通常最好远离所有目标平台上不可用的操作系统特定功能。在这方面,标准库有很好的文档记录。

答案 1 :(得分:2)

我认为在这种情况下,由于Roland提到的原因,使用单个包会更复杂。在您的开发环境中,您可以为不同的平台提供单独的文件夹,每个文件夹都有特定于平台的代码(例如用C / C ++编写的扩展/库)。您需要模仿这些文件夹中的setuptools来生成单独的egg,但最终会变得不那么复杂(我想,不知道您实际使用的代码的更多内容),而不是尝试将所有内容放入一个包中。

在任何一种情况下,阅读标准库上的文档以及distutils(http://docs.python.org/distutils/)都可以帮助您找到解决方案。

答案 2 :(得分:1)

特定于平台的鸡蛋仅用于分发包含C代码的包;否则鸡蛋文件本身与平台无关,你只需要分发一个独立于平台的鸡蛋。

如果您使用自动安装工具或pkg_resources的运行时API来查找库和插件,您实际上只需将所有鸡蛋转储到一个目录中,安装工具或运行时API将选择要安装或导入的鸡蛋。

tl; dr版本:setuptools构建egg的方式是它们应该分发的方式;如果你试图让一个跨平台的蛋变成一个平台依赖的蛋,反之亦然,你可能会遇到一些痛苦。 ; - )

答案 3 :(得分:0)

如果你只有python模块,请保留python中隐藏的所有区别,相同的文件(python std lib)或单独的文件(pyserial)。

如果你有编译模块,那就有点棘手了。

我对需要编译扩展名的项目使用以下目录结构:

./lib/display.py  # frontend, platform-independent
./lib.linux-x86_64-2.6/_display.so
./lib.linux-armv5tejl-2.6/_display.so

这段代码在程序开头的开头:

sys.path.append("lib.%s-%s-%s.%s" % ((posix.uname()[0].lower(),
                                      posix.uname()[4])
                                     +sys.version_info[:2]))

你也可以在.egg中包装这样的结构,只要你指定它不是zip安全的。