在Ubuntu系统中使用distutils和deb部署Python模块

8 投票
2 回答
836 浏览
提问于 2025-04-17 12:32

我正在用distutils把一些库打包成deb文件。

我想我需要把setup.py配置好,还需要准备好合适的/debian文件来制作deb。

现在,这个仓库大概是这样的:

library_name/
 __init__.py
 liba.py
 libb.py
 ...

这个库会被其他程序作为依赖添加,这样它们就可以执行from library_name import liba了。

在网上搜索后发现,关于在Ubuntu上部署的方法有3到5种,当然这不包括easy_install的方式;而且相关文档大多零散且过时。

我特别想确保无论Python版本是什么,这个库都能放在正确的系统目录里。当然,我也希望它能顺利地被卸载或升级。

我的最终目标是在本地服务器上有一个deb文件,它能作为我们其他程序的包依赖。

那么,有没有简单直接的方法可以做到这一点呢?

2 个回答

2

我之前也在Ubuntu/Debian上和Python打包斗争过,我同意,文档真是一团糟,根本没有或者误导性很强:他们真的需要一个快速入门指南,来处理最简单的情况。

好吧,这里有一个!

先安装你的工具。虽然这可能有点多余:

sudo apt-get install build-essential python-all dh-make devscripts fakeroot

首先,把你的代码放在一个名为 $packagename-$version 的目录里,比如 library_name-0.6.0/,然后用 cd 命令进入这个目录。接着运行类似 dh_make -i -c gpl3 -e nfirvine@example.com 的命令(可以查看 dh_make --help 获取其他选项)。如果一切顺利,你不会看到错误,并且会在 ./debian 目录下生成一堆文件。你可以忽略或删除 ./debian/*.{ex,EX};那些只是示例文件。

你可能应该在某个时候检查一下这些文件,但至少你 需要 编辑 ./debian/control./debian/rules。你应该在控制文件中填写所有模板字段,特别是 DescriptionHomepage。把 Package 行改成 python-$libname,然后把 control 中的 Depends 行改成:

Depends: ${misc:Depends}, ${python:Depends}

这确保我们的二进制包 python-$libname 依赖于它所需的Python版本。(${python:Depends} 是一个“替换变量”;在我们构建时会创建;你可以在第一次构建后查看它们的值,路径是 ./debian/$packagename.substvars。)

接着,把 rules 中的 dh $@ 改成 dh $@ --with python2,记得保留前面的制表符(这是一个Makefile)。这样做会让debhelper使用它的python2插件;默认情况下还是使用pysupport(记得这是过时的)。

然后,在源代码根目录下运行以下命令:

debuild -us -uc

这会构建包,但不进行签名(这点你 应该 后面学会!)。你应该能看到一些熟悉的setuptools的输出(出现两次:一次是2.6,一次是2.7),还有一堆dh_的插件和其他构建杂项。最后会有lintian的输出,它可以检测一些常见的打包问题;你应该修复这些问题。lintian和其他工具所抱怨的很多内容只是遵循打包规则而已,如果你的库只是内部使用,随意点也没关系。

顺便提一下,这个页面讨论了 python-supportpython-central 的弃用

2

你可以使用 pkgme 来快速创建 Debian 文件。根据我所知,和其他类似的工具比如 dh-make 不同,pkgme 的设计是基于插件的,这意味着当它检测到 Python 时,会正确提取你 setup.py 文件中的信息。

想了解更多信息,可以看看这场在 最近的讲座,它是在 Ubuntu 开发者周 这个活动上进行的。

撰写回答