我们是一家蟒蛇店。我们在内部开发了不同的python包,并将部署到客户的环境(机器)上。
这就是我们的开发和发布周期。
一旦开发人员完成了包的“测试”,就会准备包的分发(egg文件)并将其推送到中央归档位置。当我们想要将我们的软件部署到客户时,相同的发行版(egg文件)将被下载并安装在他们的环境中。
假设“测试”发生在多个操作系统上(为了检查跨平台的API的兼容性),准备发行版并将其推送到中央归档位置的最佳做法是什么。
最好在归档服务器上安装特定于操作系统的鸡蛋(例如,samplepkg-1.0.0.win32.egg和samplepkg-1.0.0.linux.egg?不确定如何使用这种方式准备它们setuptools。)或者有一个鸡蛋因为API在各个平台上保持不变?社区遵循的任何其他做法?
答案 0 :(得分:5)
如果符合以下条件,您可以使用单个包:
通常最好远离所有目标平台上不可用的操作系统特定功能。在这方面,标准库有很好的文档记录。
答案 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安全的。