跳转到主要内容

Python到Debian包转换器

项目描述

https://travis-ci.org/paylogic/py2deb.svg?branch=master https://coveralls.io/repos/paylogic/py2deb/badge.svg?branch=master

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上的文档。

安装

py2deb包可在PyPI上找到,因此安装非常简单

$ 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相似,例如我知道 stdebdh-virtualenvfpm。文档包括与每个项目的详细比较

联系方式

py2deb的最新版本可在 PyPIGitHub 上获得。文档托管在 Read the Docs 上,包括变更日志。有关问题、错误报告、建议等,请在 GitHub 上创建问题。

许可证

本软件受 MIT 许可证 的许可。

© 2020 Peter Odding, Arjan Verwer 和 Paylogic International。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

py2deb-5.0.tar.gz (81.5 kB 查看散列)

上传时间

构建分布

py2deb-5.0-py2.py3-none-any.whl (54.2 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持