有人打包过python cli程序吗

我想把这个仓库打成deb包,在调用教程里的debmake以后,调用dh-python3没能自动生成依赖,看了dh-python的邮件列表好像也没有这种问题,有人遇到过这种事吗

附上日志

dh_python3 -v           
D: dh_python3 dh_python3:180: version: 6.20240824
D: dh_python3 dh_python3:181: argv: ['/usr/bin/dh_python3', '-v']
D: dh_python3 dh_python3:182: options: Namespace(guess_deps=True, skip_private=False, verbose=True, arch=None, package=None, no_package=None, remaining_packages=False, compile_all=False, vrange=None, regexpr=None, accept_upstream_versions=False, depends=None, depends_section=None, recommends=None, recommends_section=None, suggests=None, suggests_section=None, requires=None, shebang=None, ignore_shebangs=False, clean_dbg_pkg=True, no_ext_rename=False, no_shebang_rewrite=False, private_dir=None, O=None)
D: dh_python3 dh_python3:183: supported Python versions: 3.12 (default=3.12)
D: dh_python3 debhelper:174: source=ssfconv, binary packages=['ssfconv']
D: dh_python3 dh_python3:205: processing package ssfconv...
D: dh_python3 fs:335: package ssfconv details = {'requires.txt': set(), 'egg-info': set(), 'dist-info': set(), 'nsp.txt': set(), 'shebangs': set(), 'public_vers': set(), 'private_dirs': {}, 'compile': False, 'ext_vers': set(), 'ext_no_version': set()}
D: dh_python3 depends:103: generating dependencies for package ssfconv
D: dh_python3 depends:253: D=set(); R=[]; S=[]; E=[], B=[]; RT=[]

在 binary package dependency 一栏中生成依赖的前提是这些包出现在 source package build-dependency 中。所以操作上应该将 pyproject.toml 中的 depends 先用人脑映射到 Debian 的包名,然后将这些包名(python3-numpy, python3-pil 和 python3-pycryptodome)放入 Build-Depends 中,然后再指望 binary dependency 能自动填写。

其次,你的打包脚本在哪里?建议把链接发来大家看看。

我又看了一遍教程,看来起来 dh-python3 不是用来手动调用的,但我还是没能打包成功

#首先获取源码
debmake -b':py3' -x1
editor debian/rules
在 dh $@ --with python3 后面加上 --buildsystem=pybuild

apt install python3-numpy #不装它debuild就报错找不到numpy模块
debuild

这样操作以后,确实打出来了“二进制”包,但是在control文件里依赖那一行不全

Depends: python3-numpy, python3-pil, python3:any

我把 python3-pycryptodome 手动填到了Build-Depends: 中,可生成的包中 controlDepends: 依旧是上方这样没有变

所以最终我得到了一个看起来能用,但需要额外手动装依赖的deb包
为什么会这样呢,有没有更适合初学者的打包教程推荐,现在我仍然对整个打包过程感到非常困惑:cry:

首先要明确的是 debmake 只是一个自动模板生成工具,具体生成的对不对得用肉眼检查。

python 包依赖关系的自动推导一直以来没有共享链接库的自动推导来得稳定。如果按照教程,打包构建时会出现这样的提示:

I: dh_python3 pydist:316: Cannot find package that provides pycryptodome. Please add package that provides it to Build-Depends or add “pycryptodome python3-pycryptodome” line to debian/py3dist-overrides or add proper dependency to Depends by hand and ignore this info.

这个就是依赖自动推导失败的结果。依赖关系的自动推导不是魔法,它只能通过软件包的名字猜测这个依赖是由谁提供的。既然 pyproject.toml 中写了 pycryptodome,上游说明安装也是 pip install pycryptodome,那么猜测自然也是猜测存在可以直接 Python import pycryptodome 得到的文件。遗憾的是这个库的上游作者不走寻常路,根据 pycryptodome · PyPI 来看这个库需要 import Crypto 来使用,因此依赖关系的自动推导就失败了,需要手动在 binary Dependency 中添加依赖关系(或者按照提示信息写一个 debian/py3dist-overrides 把依赖的自动推导手动调整一下。

打包工作繁杂的一面就在这里:通用工具可以解决90%的情况,但一旦遇到边边角角的场景就得像上面那样具体问题具体分析。我放了一份自己写的打包用的文件在 GitHub - hosiet/ssfconv at example-deb-package 这里。