有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?
Posted
技术标签:
【中文标题】有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?【英文标题】:Is there a standard way to create Debian packages for distributing Python programs? 【发布时间】:2011-10-29 22:48:08 【问题描述】:有大量关于如何做到这一点的信息,但是由于“给猫剥皮的方法不止一种”,所有的教程/手册都涵盖了这个过程似乎做了一些与其他教程不同的假设,我仍然没有掌握它。
到目前为止,这是我认为我理解的。
-
我的最终目标应该是创建一个“二进制”.deb 包。这样的包将是平台无关的(32/64 位),因为所有 Python 程序都是如此。
要创建“二进制”包,我首先需要创建一个源包。
要创建源包,我可以使用
CDBS
或debhelper
。 Debhelper 是初学者的推荐方式。
创建源包的核心是在源目录中的DEBIAN
目录中填充许多文件,这些文件说明需要复制文件的位置、它们受制于什么版权和许可方案、它们具有什么依赖项等...
第 4 步可以在很大程度上自动化 dh_make
command 如果 Python 源代码还带有 distutils 的 setup.py
脚本。
现在我的问题:
-
我对流程的理解是否正确?我是否遗漏了什么,或者我做错了什么?
第 5 步确实让我更加困惑:特别是对我来说最模糊的两点是:
我如何编写一个安装独立程序的
setup.py
脚本? 编辑: 独立程序我的意思是一个程序旨在由桌面用户使用(与 module 不同,我理解它是导入后由其他软件使用的功能集合)。在我的具体情况下,我实际上需要两个这样的“程序”:主软件和一个单独的实用程序(实际上是第二个“程序”,它应该与另一个程序在同一个包中)。
这种 DEB 包脚本的特殊性是什么?官方文档似乎只处理 RPM 和 Windows 的东西......
顺便说一句:这些是迄今为止我能找到的最好的信息来源。如果你有什么比这更好的,请分享! :)
Ubuntu's Python packaging guide Creating a .deb package from a python setup.py(它显示这些步骤,但它解释不足以让我跟随) ShowMeDo video on "creating a .deb package out of a python program"(它似乎不是最新的,并且 - 如果我做对了 - 将生成供个人使用的包,没有依赖关系 并且没有签名的变更日志和其他使其与 Debian 政策不兼容的关键数据)。【问题讨论】:
在为二进制打包准备一个python程序之前,您需要为一般分发做好准备。那是setup.py
位。这与许多 GNU C/C++ 项目使用的 autotools
步骤相当,但特定于 python。这比听起来容易,阅读docs.python.org/distutils/index.html
@TokenMacGuy - 谢谢,我已经大致了解(我的措辞可能不正确,但这是我描述的过程的第 5 部分)。令我困惑的是,在官方文档中,我找不到关于如何分发独立程序而不是模块的明确方法。也许这只是一个术语问题,而我所说的“独立程序”是一种特定类型的模块?
@mac:您可以安装脚本,即可执行文件来启动您的程序。见docs.python.org/distutils/setupscript.html#installing-scripts
@Thomas - 我以前读过,但我仍然感到困惑:我的程序有一个 main.py
文件(我想你可能称之为“脚本”)和一系列模块和其他一些YAML 和 SVG 文件...我仍在努力寻找有关如何实现这一目标的明确文档。到目前为止我能找到的最好的是distutils tutorial,我还在学习...
独立程序是指没有python作为依赖项的东西吗? Debian 和 Ubuntu 的最新版本都至少带有 python 2.6,因此如果您的代码与 2.6 兼容,那么正如您所建议的,“独立程序”实际上可能只是模块的一个特例。
【参考方案1】:
看起来stdeb 会做你想做的事。
另外,对于安装脚本,我强烈推荐distribute's console_scripts 入口点支持。
【讨论】:
非常非常非常有用,谢谢! (+1) 我将在未来几天测试这条路并报告。 这确实是要走的路(至少对我来说)。再次感谢您,回答已接受。 “分发的控制台脚本”链接不起作用。 @CzarekTomczak,也许是this will help。 我有一个手写的DEBIAN/control
。有没有办法让stdeb
使用它?【参考方案2】:
构建deb包的正确方法是使用dpkg-buildpackage
,但有时会有点复杂。相反,您可以使用 dpkg -b <folder>
,它会创建您的 Debian 软件包。
这些是使用dpkg -b <folder>
使用任何二进制文件或任何无需手动编译自动运行的脚本(Python、Bash、Perl 和 Ruby)创建 Debian 软件包的基础知识:
创建文件和文件夹以重新创建以下结构:
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/all your files
下,只把一个文件放在/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 包将被创建! (你也可以添加 post/pre inst 脚本和你想要的一切,它就像一个普通的 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软件包的完整文章可以阅读here。
【讨论】:
这个解决方案正是我在尝试使用stdeb 构建需要pyqt5 的python3 包后遇到的障碍。非常感谢拉斐尔。此外,对于不小心点击了此解决方案上的否决投票按钮,我深表歉意——我似乎无法更改我的投票。 我刚刚尝试再次单击反对票(以及赞成票),我收到以下消息:您最后一次对此答案投票是 11 月 17 日 21:25。除非编辑答案,否则您的投票现在已锁定。 也许如果您编辑了答案,我可以更改我的投票?再次感谢@rsm 的回答。它帮助我为 manuskript 创建了一个 DEB 包。 有没有办法用这种方法改变安装路径?我只能找到一种更改前缀的方法(在规则文件中使用override_dh_auto_install
),但不能自定义整个路径
@ignacio 正如我所说,deb 包的结构将被部署到安装中。您完全无需使用任何您想要的路径。【参考方案3】:
This article by Barry Warsaw 帮助我完成了整个过程。不过,我仍然需要进行大量搜索,而且我在过去的某个时间阅读了大部分 Ubuntu packaging guide。
拥有一个好的setup.py
是一个非常好的建议。我发现这两个指南非常好:
【讨论】:
请注意,Hitchhiker's Guide 已被 Python Packaging User Guide 取代。 哦,谢谢!虽然,它们都只涵盖了 distutils 的非常简单的基础知识。 Distribute 文档有更多详细信息,地址为 the recommended solution(在撰写此评论时)。 Barry 的博客已更新并推荐 wiki.debian.org/Python/LibraryStyleGuide 指南。它对我有用。 适用于 python 的 Ubuntu 打包指南不再起作用。【参考方案4】:那里有几个库可以抽象出所有必要的步骤,让您只需一个命令即可将 Python 包转换为 Debian 包。
假设你的python包已经有了setup.py
,在setup.py
所在的目录下,你可以使用:
stdeb(已在此answer 中提及,使用pip install stdeb
安装)。要创建 Debian 软件包,请运行:
python setup.py --command-packages=stdeb.command bdist_deb
输出的.deb
文件将位于bdist_deb
目录中。
fpm(使用gem install --no-ri --no-rdoc fpm
安装)。要创建 Debian 软件包,请运行:
fpm -s python -t deb setup.py
py2deb(使用pip install py2deb
安装)。要创建 Debian 软件包,请运行:
py2deb -r . .
这些库中的每一个都有自己的注意事项,因此您可能想尝试最适合您的方法。
【讨论】:
【参考方案5】:这个方法对我有用。
安装标准数据库。 (pip install stdeb)
创建 setup.py。我正在使用 PyCharm。这将 (https://www.jetbrains.com/help/pycharm/creating-and-running-setup-py.html) 将这些命令写入您的项目目录中。
sudo apt-get install python3-stdeb fakeroot python-all python3 setup.py sdist sudo python3 setup.py --command-packages=stdeb.command bdist_deb 您的 deb 文件位于项目中的 deb_dist 目录中【讨论】:
以上是关于有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?的主要内容,如果未能解决你的问题,请参考以下文章