如何为Linux打包Python应用程序

使python应用程序可安装在基于Debian的操作系统(例如Debian或Elementary OS )上的一种方法是使用dh_virtualenv工具。 它构建了一个.deb软件包,该软件包将Python虚拟环境包装在应用程序周围,并在安装时进行部署。

在本文中,我将以构建包含HTTPie工具的程序包为例来说明如何使用它,以从命令行测试HTTP API,而无需激活虚拟环境。

用dh_virtualenv包装

首先,您需要安装dh_virtualenv所需的工具。 dh_virtualenv的文档提供了所有安装选项。 在基于Debian的系统上,我输入:

 apt-get install dh-virtualenv devscripts 

尽管不需要devscripts软件包,但它将简化后续操作。

现在,创建一个目录来保留源。 由于这是HTTPie的本地,非官方打包,因此我将其称为myhttp 接下来,让我们在myhttp内创建一些文件,以向Debian构建系统提供元数据。

首先,创建debian / control文件:


     
     
     
     
Source: myhttp
Section: python
Priority: extra
Maintainer: Jan Doe
Build-Depends: debhelper (>= 9), python3.7, dh-virtualenv (>= 0.8)
Standards-Version: 3.9.5

Package: myhttp
Architecture: any
Pre-Depends: dpkg (>= 1.16.1), python3.7, ${misc:Pre-Depends}
Depends: ${misc:Depends}
Description: http client
 Useful for doing stuff

那么所有这些信息是关于什么的呢? 正如Debian文档所述 :

“第1-7行是源程序包的控制信息。第9-13行是二进制程序包的控制信息。”

这是我的看法:

  • 在我们的案例中, section值大部分没有意义,但必须存在。 将信息提供给引导式UI安装程序很有意义,而该信息与该软件包无关。
  • 额外的“ 优先级”值是此类第三方套餐的正确优先级。
  • 强烈建议在“ 维护者”字段中输入真实的联系方式。 但是,它不必一定是您的个人电子邮件-例如,“ Infrastructure Team < [email protected] >”,如果该软件包是由团队维护的,并且您希望解决该问题,被发送到团队的邮件别名。
  • build-depends字段指示您需要debhelper,python和dh-virtualenv来构建软件包:软件包构建过程将确保在软件包构建时安装了这些依赖项。
  • 标准版本主要供人类使用。 它指示您正在遵循的指南。 本指南基于dh-virtualenv的官方文档,该文档基于Debian的3.9.5指南。 将二进制包和源包命名为相同名称几乎总是最佳选择。
  • 架构”字段应为“ 任意”,因为虚拟环境可能包含一些特定于架构的文件;否则,最好将其选为全部
  • 保持pre-depends列表不变:pre-depends是一种非常严格的依赖关系形式,很少有您需要的内容超出此处建议的最低要求。 依赖关系通常由构建系统准确计算,因此没有理由手动指定它们。
  • 如果您的软件包主要供内部使用,则说明可能只指定最少的信息和指向公司Wiki的链接。 否则,更多细节可能会有用。

然后创建debian / compat文件,该文件主要出于历史目的存在 :

 $  echo "9" > debian / compat 

接下来,创建更改日志以告知软件包用户自上一发行版以来发生了什么变化。 最简单的方法是使用dch --create创建模板,然后填写值。

填写后,看起来像:


     
     
     
     
myhttp (2.0.0-1) stable; urgency=medium

  * Initial release.

 -- Jan Doe  Fri, 27 Mar 2020 01:09:22 +0000

现在您需要告诉该工具安装HTTPie,但是哪个版本?

在版本宽松的文件中创建一个requirements.in文件:

 httpie 

通常,宽松的需求文件将仅包含项目的直接依赖项,并在需要时指定最低版本。 不一定总是需要指定最低版本:这些工具通常偏向于将依赖关系严格化为“可能的最新版本”。 如果您的Debian软件包与一个内部Python软件包相对应,这是内部应用程序中的一种常见情况,则松散的需求文件看起来将很相似:软件包名称仅一行。

然后使用pip-compile (可通过安装PyPI软件包pip-tools获得 ):

 $  pip-compile requirements.in > requirements.txt 

这将产生一个严格的依赖文件,称为requirements.txt


     
     
     
     
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile requirements.in
#
certifi==2019.11.28       # via requests
chardet==3.0.4            # via requests
httpie==2.0.0             # via -r requirements.in
idna==2.9                 # via requests
pygments==2.6.1           # via httpie
requests==2.23.0          # via httpie
urllib3==1.25.8           # via requests

最后,编写一个debian / rules文件来创建软件包。 由于dh_virtualenv做了所有艰苦的工作,所以rules文件很简单:


     
     
     
     
#!/usr/bin/make -f

%:
        dh $@ --with python-virtualenv --python /usr/bin/python3.7

确保指定Python解释器。 默认情况下,它将在/ usr / bin / python中使用解释器,该解释器为Python 2,但是您应该使用受支持的Python版本 。

写作结束了。 剩下的就是构建软件包:

 $  debuild -b -us -uc  
myhttp_2.0.0-1_amd64.deb 该文件可以安装在任何兼容的操作系统上。

通常,最好在同一平台上构建用于特定平台(例如Debian 10.0)的Debian软件包。

您可以将此Debian软件包存储在存储库中,并使用例如Ansible将其安装在所有相关系统上。

结论

基于Debian的操作系统的打包应用程序是一个多步骤的过程。 使用dh_virtualenv将使过程变得简单。

翻译自: https://opensource.com/article/20/4/package-python-applications-linux

你可能感兴趣的:(如何为Linux打包Python应用程序)