在多个操作系统上创建Python发行版(eggs)的最佳实践是什么?

7
我们的团队使用Python编程语言。我们有不同的Python包是自主开发的,并将被部署到客户的环境(机器)上。
以下是我们的开发和发布周期:
一旦开发人员完成对一个软件包的“测试”,该软件包的分发(egg文件)将被准备并推送到一个中央归档位置。当我们想要将我们的软件部署到客户端时,相同的分发(egg文件)将被下载并安装在他们的环境中。
假设“测试”在多个操作系统上进行(以检查API在各个平台上的兼容性),那么准备分发并将其推送到中央归档位置的最佳实践是什么?
是在归档服务器上使用特定于操作系统的egg文件(例如,samplepkg-1.0.0.win32.egg和samplepkg-1.0.0.linux.egg)?不确定如何使用setuptools以这种方式准备它们。还是只有一个egg文件,因为API在各个平台上都保持不变?社区中是否还有其他实践方法?
4个回答

5

如果符合以下情况之一,您可以使用单个软件包:

  1. 该软件包没有使用所有目标平台上都不可用的函数/类(例如,请参见Python标准库版本2.7.2的36-39章,了解在这种情况下不应使用的内容)
  2. 您没有使用需要为每个平台编译的C/C++编写的扩展。

通常最好避免使用在所有目标平台上都不可用的特定于操作系统的函数。 在这方面,标准库有很好的文档记录。


2
我认为在这种情况下,由于Roland上面提到的原因,使用单一的软件包会更加复杂。在您的开发环境中,您可以为不同的平台设置单独的文件夹,每个文件夹都有特定于该平台的代码(例如用C/C++编写的扩展/库)。您需要在这些文件夹中模仿setuptools以生成单独的egg,但最终比尝试将所有内容放入一个软件包要简单得多(我认为,不知道您实际使用的代码是什么)。无论哪种情况,阅读标准库以及distutils(http://docs.python.org/distutils/)的文档应该有助于找到解决方案。

1

平台特定的 egg 文件仅用于分发包含 C 代码的软件包;否则,egg 文件本身是平台无关的,您只需要分发一个平台无关的 egg 文件。

如果您正在使用自动化安装工具或 pkg_resources 的运行时 API 查找库和插件,您实际上可以将所有 egg 文件都放在单个目录中,安装工具或运行时 API 将选择要安装或导入的 egg 文件。

简而言之:setuptools 构建 egg 的方式就是应该分发 egg 的方式;如果您尝试将跨平台的 egg 变成特定平台的 egg 或反之,则可能会遇到一些问题。 ;-)


0

如果你只有Python模块,那么请将所有的差异隐藏在Python中,可以是相同的文件(Python标准库),也可以是不同的文件(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 安全的。


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