7

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

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

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

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

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

4

4 回答 4

5

在以下情况下,您可以使用单个包:

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

远离并非在所有目标平台上都可用的操作系统特定功能通常是一个好主意。标准库在这方面有很好的记录。

于 2012-02-20T23:01:53.357 回答
2

我认为在这种情况下,由于罗兰上面提到的原因,使用单个包会更复杂。在您的开发环境中,您可以为不同的平台创建不同的文件夹,每个文件夹都有特定于平台的代码(例如用 C/C++ 编写的扩展程序/库)。您需要在这些文件夹中模拟您的 setuptools 以生成单独的鸡蛋,但它最终会比尝试将所有内容放入一个包中更简单(我认为,在不了解您实际使用的代码的情况下)。

无论哪种情况,阅读标准库的文档以及 distutils ( http://docs.python.org/distutils/ ) 应该可以帮助您找到解决方案。

于 2012-02-23T05:26:05.100 回答
1

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

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

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

于 2012-02-23T20:48:30.343 回答
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 安全的。

于 2012-03-08T13:03:47.857 回答