Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个操作系统上(或为多个操作系统)创建Python发行版(EGG)的最佳实践是什么_Python_Setuptools_Egg_Software Packaging - Fatal编程技术网

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

在多个操作系统上(或为多个操作系统)创建Python发行版(EGG)的最佳实践是什么,python,setuptools,egg,software-packaging,Python,Setuptools,Egg,Software Packaging,我们的是一家python商店。我们在内部开发了不同的python包,并将部署到客户的环境(机器)上 这就是我们的开发和发布周期是如何发生的 一旦开发人员完成了包的“测试”,就准备好包的分发(egg文件)并将其推送到一个中央归档位置。当我们想要向客户部署软件时,相同的发行版(egg文件)将被下载并安装到他们的环境中 假设“测试”在多个操作系统上进行(以检查API在不同平台上的兼容性),那么准备分发版并将其推送到中央归档位置的最佳做法是什么 最好在归档服务器上安装特定于操作系统的egg(如sampl

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

这就是我们的开发和发布周期是如何发生的

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

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


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

如果满足以下条件,您可以使用单个软件包:

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

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

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


    在任何一种情况下,阅读标准库上的文档以及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]))
    
    您也可以将这样的结构包装在.egg中,只要您指定它不是zip安全的