在Ubuntu系统中使用distutils和deb部署Python模块
我正在用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 个回答
我之前也在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
。你应该在控制文件中填写所有模板字段,特别是 Description
和 Homepage
。把 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和其他工具所抱怨的很多内容只是遵循打包规则而已,如果你的库只是内部使用,随意点也没关系。
你可以使用 pkgme
来快速创建 Debian 文件。根据我所知,和其他类似的工具比如 dh-make
不同,pkgme
的设计是基于插件的,这意味着当它检测到 Python 时,会正确提取你 setup.py
文件中的信息。
想了解更多信息,可以看看这场在 最近的讲座,它是在 Ubuntu 开发者周 这个活动上进行的。