在Python轮中包含运行时依赖项

时间:2014-09-24 14:47:02

标签: python python-2.7 python-wheel

我想发布一个完整的virtualenv,或者一堆具有运行时依赖性的精确版本的Python轮,例如:

  • pycurl
    • pycurl.so
      • libcurl.so
        • libz.so
        • libssl.so
        • libcrypto.so
        • libgssapi_krb5.so
          • libkrb5.so
            • libresolv.so

我想我可以依赖系统安装libssl.so,但肯定不是正确版本的libcurl.so而且可能不是Kerberos。

在具有所有运行时依赖性的轮中打包一个库的最简单方法是什么?

或者这是一个傻瓜的差事,我应该打包整个virtualenv? 如何可靠地做到这一点?

P.S。动态编译不是一种选择,有些模块是修补的。

2 个答案:

答案 0 :(得分:10)

AFAIK,没有很好的标准方法可以在您的软件包中可移植地安装依赖项。 Continuum有made conda for precisely this purpose。 numpy人在他们的包中编写了自己的distutils子模块来安装一些复杂的依赖项,现在at least some of them advocate conda as a solution。不幸的是,您可能必须自己为其中一些依赖项制作conda包。

如果您没有可移植性,那么定位目标计算机的软件包管理器显然会有效。否则,对于便携式包管理器,conda是我所知道的唯一选择。

或者,来自您的帖子("动态编译不是一个选项")听起来便携性对您来说可能不是问题,在这种情况下您也可以将所有要求安装到前缀目录(我遇到的大多数安装程序都支持configure --prefix=/some/dir/选项)。如果您有一个有保证的单一体系结构,您可以将所有依赖项前缀 - 安装到单个目录中,并像文件一样传递它。 conda方法可能更干净,但我已经使用了相当多的前缀安装,它们往往是最容易实现的解决方案之一。

编辑: 至于conda,它同时是一个包管理器和一个类似环境/ python安装的类似环境/ python安装。虽然virtualenv是在现有python安装的基础上添加的,但conda会接管整个安装,因此您可以更加确定所有依赖项都会被考虑在内。与pip相比,它被设计用于添加通用的非Python依赖项,而不仅仅是编译C / Cpp exentions。有关详细信息,我会看到:

至于如何将conda用于您的目的,the docs解释了如何创建食谱:

  

Conda构建框架

     

构建包需要配方。食谱是平面目录   包含以下文件:

     
      
  • meta.yaml(元数据文件)
  •   
  • build.sh(使用bash执行的Unix构建脚本)
  •   
  • bld.bat(使用cmd执行的Windows构建脚本)
  •   
  • run_test.py(可选的Python测试文件)
  •   
  • 补丁到源(可选,见下文)
  •   
  • 其他资源,不包含在源中,也不能包含在内   由构建脚本生成。
  •   
     

应该使用相同的配方在所有平台上构建包。

     

构建包时,将调用以下步骤:

     
      
  1. 阅读元数据
  2.   
  3. 下载源(进入缓存)
  4.   
  5. 源目录中提取源
  6.   
  7. 应用补丁
  8.   
  9. 创建构建环境(此处安装构建依赖项)
  10.   
  11. 运行实际的构建脚本。当前工作目录是源   设置了环境变量的目录。构建脚本安装到   构建环境
  12.   
  13. 做一些必要的后处理步骤:shebang,rpath等。
  14.   
  15. 将conda元数据添加到构建环境
  16.   
  17. 将构建环境中的新文件打包成conda包
  18.   
  19. 测试新的conda包:      
        
    • 使用包(及其依赖项)
    • 创建测试环境   
    • 运行测试脚本
    •   
  20.         

    conda-recipes <https://github.com/continuumio/conda-recipes> _ repo。

    中有许多conda包的示例配方      

    :ref:conda skeleton <skeleton_ref>命令可以帮助制作常见的骨架配方   存储库,例如PyPI <https://pypi.python.org/pypi> _。

然后,作为客户端,您将安装包similar to how you would install from pip

最后,docker也可能对您感兴趣,但我还没有看到它用于Python。

答案 1 :(得分:2)

您可能需要查看PEX:https://pex.readthedocs.io/en/stable/whatispex.html

&#39;扩展名为.pex的文件 - “PEX文件”或“.pex文件” - 是自包含的可执行Python虚拟环境。 PEX文件可以轻松部署Python应用程序:部署过程变得简单scp。&#39;