Python到Debian包转换器
项目描述
Python包py2deb将Python源代码分发转换为Debian二进制包(用于安装)。它使用pip-accel(基于pip)来下载、解包和编译Python包。由于这个原因,py2deb与“pip install”命令的命令行界面兼容。例如,您可以将要转换的包指定为命令行参数,但也可以使用需求文件,如果需要的话。
在转换过程中,会自动考虑依赖项并将其一起转换,因此您实际上不需要使用包括传递依赖项在内的需求文件。实际上,您可能更喜欢不在需求文件中显式列出传递依赖项,因为py2deb会将Python包的版本约束转换为Debian包关系。
py2deb包目前已在CPython 2.7、3.5、3.6、3.7和PyPy 2和3上进行测试。不幸的是,目前还不支持Python 3.8+(见下文)。有关使用说明,请参阅Read The Docs上的文档。
安装
$ pip install py2deb
还有一些系统依赖项需要安装
$ sudo apt-get install dpkg-dev fakeroot
可选地,您还可以安装Lintian(这不是强制依赖项,而更像是一个“最好有”的选项)
$ sudo apt-get install lintian
当安装Lintian时,它将自动运行以检查转换后的软件包是否正常。这会稍微减慢转换过程,但非常有用,尤其是在处理py2deb本身时。目前py2deb在Lintian报告错误时不会失败,这是由于py2deb可以使用的非常规方式。随着py2deb的日益成熟,这可能在将来发生变化。
使用
使用py2deb包有两种方式:作为命令行程序py2deb和作为Python API。有关Python API的详细信息,请参阅Read the Docs上的API文档。以下是命令行界面的说明。
命令行
使用: py2deb [OPTIONS] …
根据给定的命令行选项将Python包转换为Debian包(见下文)。命令行参数与“pip install”命令接受的参数相同,因为py2deb在转换过程中会调用pip。这意味着您可以在命令行上指定要转换的包名,但也可以使用“需求文件”。
如果您想将命令行选项传递给pip(例如,因为您想使用自定义索引URL或需求文件),那么您需要告诉py2debpy2deb选项和pip选项的分界点。在这种情况下,您可以使用以下语法
$ py2deb -r /tmp -- -r requirements.txt
因此,“–”标记将py2deb选项与pip选项分开。
支持选项
选项 |
描述 |
---|---|
-c, --config=FILENAME |
加载配置文件。由于命令行参数按给定顺序处理,您有选择和责任决定是命令行选项覆盖配置文件选项,还是相反。有关配置文件格式的详细信息,请参阅文档。 默认配置文件/etc/py2deb.ini和~/.py2deb.ini会自动加载,如果它们存在。这发生在环境变量和命令行选项处理之前。 也可以使用环境变量$PY2DEB_CONFIG设置。 |
-r, --repository=DIRECTORY |
更改存储*.deb存档的目录。默认为系统全局临时目录(通常是/tmp)。如果该目录不存在,py2deb将拒绝运行。 也可以使用环境变量$PY2DEB_REPOSITORY设置。 |
--use-system-package=PYTHON_PACKAGE_NAME,DEBIAN_PACKAGE_NAME |
排除Python包(逗号前的名称)的转换,并用特定的Debian包名替换对Python包的引用。这允许您为特定的Python需求使用系统包。 |
--name-prefix=PREFIX |
设置在从Python到Debian包的名称转换期间使用的名称前缀。默认为“python”。名称前缀和包名称始终由破折号分隔。 也可以使用环境变量$PY2DEB_NAME_PREFIX设置。 |
--no-name-prefix=PYTHON_PACKAGE_NAME |
在包名转换过程中排除具有名称前缀的Python包。这可以避免尴尬的重复。 |
--rename=PYTHON_PACKAGE_NAME,DEBIAN_PACKAGE_NAME |
覆盖给定包名对的包名转换算法。如果您不同意该算法,这很有用。 |
--install-prefix=DIRECTORY |
覆盖默认的全局安装前缀。通过将其设置为“/usr”或“/usr/local”以外的任何内容,您将改变py2deb的工作方式。它将构建具有类似Python虚拟环境文件系统布局的包,但不会包含Python可执行文件:这些包旨在通过修改Python的模块搜索路径来加载。有关详细信息,请参阅文档。 也可以通过环境变量$PY2DEB_INSTALL_PREFIX设置。 |
--install-alternative=LINK,PATH |
使用Debian的“update-alternatives”系统将安装在自定义安装前缀(见上文)的可执行文件添加到系统级可执行文件搜索路径。有关详细信息,请参阅文档。 |
--python-callback=EXPRESSION |
在转换过程中设置Python回调。有关使用此功能和EXPRESSION语法的详细信息,请参阅文档。 也可以通过环境变量$PY2DEB_CALLBACK设置。 |
--report-dependencies=FILENAME |
将依赖于转换后的包所需的Debian关系添加到指定的控制文件中。如果控制文件已经包含关系,则将添加附加关系到控制文件;它们不会覆盖现有关系。 |
-y, --yes |
指示pip-accel尽可能自动安装构建时依赖项。有关详细信息,请参阅pip-accel文档。 也可以通过环境变量$PY2DEB_AUTO_INSTALL设置。 |
-v, --verbose |
产生更多噪音。 |
-h, --help |
显示此消息并退出。 |
未来改进
以下部分列出了对项目的可能改进
Python 3.8+ 兼容性
py2deb项目建立在pip-accel之上,后者在2013年至2015年间基于pip >= 7.0, < 7.2开发。从那时起,pip已经发展壮大:截至撰写本文时(2020年8月),我们现在是pip 20!
pip 7-20之间做出的改进在pip-accel和py2deb中均不可用,这已成为一个明显的、许多用户都遇到的问题(参见#17、#18、#27和#31)。
由此引起的问题包括
旧的pip版本阻止Python 3.8+兼容性。
旧的pip版本不了解PyPI提供的python_requires元数据,这迫使用户自己维护约束文件,尽管这不应该有必要。
虽然pip-accel支持从wheel安装,但它从未通过Python API公开,因此py2deb缺乏对转换wheel的支持(它目前需要源分布)。
目前的情况最好在此评论中总结。我希望能完成升级到较新的pip和pip-accel版本,但这周内无法承诺具体日期。
系统文件安装
寻找一种方法,基于Python发行版,简化系统级文件(与Python本身无关)的(显式/同意)安装?这可以显著减少“包装包”的需求,“包装包”基本上只是将经过py2deb转换的包拉入其中,并将一些配置文件放置到位。
- 相关问题:
请参阅问题 #7 以获取相关讨论。
二进制轮转换
调查支持转换二进制轮子的可行性。慢慢地,Python社区似乎正在向(二进制)轮子倾斜,一旦重力发生变化,我们不希望被落在后面!😉
完整的PEP-440兼容性
深入研究 PEP-440 并查看它是否可以得到全面支持?然后 Reddit上的这个问题 可以最终得到一个令人满意的答案 :)。
类似项目
有多个项目与py2deb相似,例如我知道 stdeb、dh-virtualenv 和 fpm。文档包括与每个项目的详细比较。
联系方式
py2deb的最新版本可在 PyPI 和 GitHub 上获得。文档托管在 Read the Docs 上,包括变更日志。有关问题、错误报告、建议等,请在 GitHub 上创建问题。
许可证
本软件受 MIT 许可证 的许可。
© 2020 Peter Odding, Arjan Verwer 和 Paylogic International。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。