我们的商店是一家python商店。我们在内部开发了不同的python包,并将部署到客户的环境(机器)中。
这就是我们的开发和发布周期。
一旦开发人员完成了包的"测试",就准备好了包的分发版(egg文件),并将其推送到中央归档位置。当我们想向客户部署我们的软件时,相同的发行版(egg文件)将被下载并安装在他们的环境中。
假设"测试"发生在多个操作系统上(以检查API跨平台的兼容性),那么准备分发版并将其推送到中心归档位置的最佳做法是什么。
在归档服务器上最好有特定于操作系统的彩蛋(例如,samplepkg-1.0.0.win32.egg和samplepkg-1-00.linux.egg?不确定如何使用setuptools以这种方式准备它们。)还是因为API在各个平台上保持不变而只有一个彩蛋?社区还遵循其他做法吗?
如果:,则可以使用单个包
- 该包不使用在所有目标平台上都不可用的函数/类(例如,请参阅2.7.2版Python标准库参考的第36-39章,了解在这种情况下不应该使用的内容)
- 您没有使用C/C++编写的扩展,这些扩展需要针对每个平台进行编译
通常,远离并非所有目标平台上都可用的操作系统特定功能是一个好主意。标准库在这方面有很好的记录。
我认为在这种情况下,由于Roland上面提到的原因,使用单个包会更加复杂。在您的开发环境中,您可以为不同的平台提供单独的文件夹,每个文件夹都有特定于平台的代码(例如用C/C++编写的扩展/库)。你需要在这些文件夹中模仿你的设置工具来生成单独的鸡蛋,但最终会比把所有东西都放在一个包里复杂得多(我认为,在不了解你实际使用的代码的情况下)。
在任何一种情况下,阅读标准库上的文档以及distutils(http://docs.python.org/distutils/)应该可以帮助您找到解决方案。
特定于平台的彩蛋仅用于分发包含C代码的包;否则egg文件本身是独立于平台的,您只需要分发一个独立于平台上的egg。
如果您使用自动安装工具或pkg_resources的运行时API来查找库和插件,实际上您可以将所有鸡蛋转储到一个目录中,安装工具或运行时API将选择要安装或导入的鸡蛋。
tl;dr版本:setuptools构建鸡蛋的方式是它们应该被分发的方式;如果你试图把一个跨平台的鸡蛋变成一个依赖平台的鸡蛋,或者反之亦然,你可能会经历一些痛苦
如果您只有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]))
你也可以把这样的结构包在一个鸡蛋里,只要你指定它不安全。