有没有标准方法为Python程序创建Debian软件包?
网上有很多关于如何做这个的资料,但因为"杀猫的方法不止一种",而且所有的教程和手册在某些步骤上似乎都有不同的假设,所以我还是没能完全理解。
到目前为止,这是我认为我理解的内容。
- 我的最终目标是创建一个“二进制”的 .deb 包。这种包是平台无关的(32/64 位),因为所有的 Python 程序都是这样的。
- 要创建一个“二进制”包,我首先需要创建一个源包。
- 创建源包时,我可以使用
CDBS
或debhelper
。对于初学者来说,推荐使用 debhelper。 - 创建源包的核心是将一些文件放入源目录中的
DEBIAN
目录,这些文件说明了文件需要被复制到哪里、它们受什么版权和许可协议的约束、它们依赖哪些其他软件等等…… - 如果 Python 源代码中也包含 distutils 的
setup.py
脚本,步骤 #4 可以通过dh_make
命令大大简化。
现在我有一些问题:
- 我对这个过程的理解正确吗? 有没有我遗漏的地方,或者有什么我理解错了的?
- 步骤 #5 对我来说真的比较困惑:特别是让我最不明白的两个点是:
- 我该如何编写一个
setup.py
脚本来安装一个独立的程序? 编辑:我所说的独立程序是指一个面向桌面用户使用的程序(与我理解的模块不同,模块是供其他软件在导入后使用的一系列功能)。在我的具体情况下,我实际上需要两个这样的“程序”:主软件和一个单独的工具(实际上是另一个“程序”,应该和另一个放在同一个包里)。 - 这样的脚本在 DEB 包中有什么具体要求? 官方文档似乎只涉及 RPM 和 Windows 的内容……
- 我该如何编写一个
顺便说一下:这是我目前找到的最好的信息来源。如果你有比这些更好的资料,请分享! :)
- Ubuntu 的 Python 打包指南
- 从 python setup.py 创建 .deb 包(它展示了步骤,但没有足够解释,让我跟得上)
- ShowMeDo 视频:“如何从 Python 程序创建 .deb 包”(看起来不太更新,如果我没理解错的话,会生成个人使用的包,没有依赖关系,也没有签名的变更日志和其他关键数据,这会使其与 Debian 政策不兼容)。
5 个回答
这篇文章是巴里·华沙写的,帮我在这个过程中走得很远。不过,我还是花了很多时间去查找其他资料,之前我也看过大部分的Ubuntu打包指南。
有一个好的setup.py
文件真的是个很不错的建议。我觉得这两个指南写得很好:
制作deb包的正确方法是使用 dpkg-buildpackage
,但有时候这个过程会有点复杂。你可以用 dpkg -b <folder>
来创建你的Debian包,这样会简单一些。
下面是使用 dpkg -b <folder>
创建Debian包的基本步骤,适用于任何二进制文件或可以自动运行的脚本(比如Python、Bash、Perl和Ruby):
首先,创建文件和文件夹,按照下面的结构来组织:
ProgramName-Version/ ProgramName-Version/DEBIAN ProgramName-Version/DEBIAN/control ProgramName-Version/usr/ ProgramName-Version/usr/bin/ ProgramName-Version/usr/bin/your_script
放在
/usr/bin/
下的脚本可以直接从终端调用,注意我没有给脚本加扩展名。你还会发现,deb包的结构就是程序安装后的结构。所以,如果你的程序只有一个文件,可以直接放在ProgramName-Version/usr/bin/your_script
下;如果有多个文件,就应该把它们放在ProgramName-Version/usr/share/ProgramName/
下,并在/usr/bin/
下放一个文件,用来调用/usr/share/ProgramName/
下的脚本。把所有文件夹的权限改成root:
chown root:root -R /path/to/ProgramName-Version
修改脚本的权限:
chmod 0755 /path/to/the/script
最后,你可以运行:
dpkg -b /path/to/the/ProgramName-Version
,这样你的deb包就会被创建出来!(你也可以添加安装前后的脚本,和普通的Debian包一样工作)
这里有一个 control
文件的例子。你只需要把它复制粘贴到一个名为“control”的空文件中,并放到DEBIAN文件夹里。
Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://example.com
Description: Here you can put a one line description. This is the short Description.
Here you put the long description, indented by one space.
关于Debian包的完整文章可以在 这里 阅读。
看起来 stdeb 可以满足你的需求。
另外,对于安装脚本,我强烈推荐使用 distribute 的 console_scripts 入口点支持。