如何为Linux打包Python应用程序

学习如何使用dh_virtualenv使您的Python应用程序可以作为.deb包安装。

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

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

用dh_virtualenv打包

首先,您需要安装dh_virtualenv所需的工具。dh_virtualenv的文档(链接:https://dh-virtualenv.readthedocs.io/en/1.1/tutorial.html)提供了所有安装选项。 在基于Debian的系统上,我输入:

apt-get install dh-virtualenv devscripts

尽管不需要devscripts软件包(链接:http://man.he.net/man1/devscripts),但它将简化后续操作。

现在,创建一个目录来保存源。因为这是一个本地的、非官方的HTTPie打包包,所以我把它称为myhttp。接下来,让我们在myhttp中创建一些文件,以便为Debian构建系统提供元数据。

首先,创建debian/control文件:

Source: myhttp
Section: python
Priority: extra
Maintainer: Jan Doe <jandoe@example.org>
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文档(链接:https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#control)所述:

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

这里是我采用的方法:

1)在我们的案例中,section值对大多数情况没有意义,但必须存在。将信息提供给引导式UI安装程序很有意义,而该信息与该软件包无关。

2)额外的Priority值对于像这样的第三方包来说是正确的优先级。

3)强烈建议在Maintainer字段中放置真实的联系信息。但是,它不必是您的个人电子邮件。例如,如果包由团队维护,并且您希望问题被发送到团队的邮件别名,则可以使用“Infrastructure Team < infra-teamlist@company.example.com >”。

4)build-depends字段指示您需要debhelper,python和dh-virtualenv来构建软件包:软件包构建过程将确保在软件包构建时安装了这些依赖项。

5)standards version指示您正在遵循的指南。本指南基于dh-virtualenv的官方文档,该文档基于Debian的3.9.5指南。将二进制包和源包命名为相同名称几乎总是最佳选择。

6)Architecture字段应该是Any,因为虚拟环境可能包含一些特定于体系结构的文件:否则,最好将该字段选择为all。

7)保持pre-depends列表不变:pre-depends是一种非常严格的依赖关系形式,很少有您需要的内容超出此处建议的最低要求。依赖关系通常由构建系统准确计算,因此没有理由手动指定它们。

8)如果您的软件包主要供内部使用,则Description可能仅指定最少的信息和指向公司Wiki的链接。否则,更多细节可能会有用。

然后创建debian/compat文件:

$ echo "9" > debian/compat

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

填写后,看起来像这样:

myhttp (2.0.0-1) stable; urgency=medium

  * Initial release.

 -- Jan Doe <jandoe@example.org>  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中的解释器,即python2,但是您应该使用受支持的Python版本。

写完了;剩下的就是构建包:

$ debuild -b -us -uc

这将在父目录中生成一个文件,其名称类似于myhttp_2.0.0-1_amd64.deb。该文件可以安装在任何兼容的操作系统上。

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

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

结论

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

六一编程网

发表评论

Next Post

为未来教育孩子的5种方法

周日 6月 14 , 2020
许多父母开始问自己一个问题,即使在10年前,这个问题似乎也是不可想象的。机器人真的能让我的孩子失业吗 […]