背景

我正要尝试从GitHub下载的Python包,并意识到它没有setup.py,所以我无法安装它

pip install -e <folder>

相反,这个包有一个pyproject。Toml文件中似乎有与setup.py通常有非常相似的条目。

我发现

谷歌引导我进入PEP-518,它在基本原理部分对setup.py给出了一些评论。然而,它并没有清楚地说明应该避免使用setup.py,或者pyproject. py。Toml将完全取代setup.py。

问题

是pyproject。Toml是用来代替setup.py的?或者一个包应该两者都有,一个pyproject。Toml和setup.py? 如何使用pyproject安装项目?Toml处于可编辑状态?


是的,pyproject。toml是PEP 518指定的文件格式,其中包含Python项目的构建系统需求。

这解决了构建工具依赖鸡和蛋的问题,即pip可以读取pyproject。Toml和setuptools或wheel的版本可能需要。

如果你需要一个setup.py来进行可编辑的安装,你可以在setup.py中使用一个shim:

#!/usr/bin/env python

import setuptools

if __name__ == "__main__":
    setuptools.setup()

pyproject。toml是新的统一的Python项目设置文件,它取代了setup.py。 可编辑安装仍然需要setup.py: import setuptools;setuptools.setup ()

使用pyproject。Toml,执行python -m PIP install。

然后,如果项目使用的是poetry而不是pip,你可以像这样安装依赖(到%USERPROFILE%\AppData\Local\pypoetry\Cache\virtualenvs中):

poetry install

然后运行依赖项,如pytest:

poetry run pytest tests/

预提交(使用.pre-commit-config.yaml):

poetry run pre-commit install
poetry run pre-commit run --all-files

这是干什么用的?

目前在Python社区中有多种流行的打包工具,虽然setuptools似乎仍然很流行,但它不再是事实上的标准。这种情况给最终用户和开发人员带来了许多麻烦:

For setuptools-based packages installation from source / build of a distribution can fail if one doesn't have setuptools installed; pip doesn't support the installation of packages based on other packaging tools from source, so these tools had to generate a setup.py file to produce a compatible package. To build a distribution package one has to install the packaging tool first and then use tool-specific commands; If package author decides to change the packaging tool, workflows must be changed as well to use different tool-specific commands.

pyproject。toml是PEP 517和PEP 518为解决这些问题而引入的新配置文件:

…想想为一个项目生成一个构建工件所需的(粗略的)步骤: 项目的源代码检出。 构建系统的安装。 执行构建系统。 这个PEP[518]涵盖了步骤#2。PEP 517涵盖步骤#3…

任何工具也可以用自己的部分(表)扩展这个文件,以接受特定于工具的选项,但这取决于它们,而不是必需的。

PEP 621建议使用pyproject。以静态的、与工具无关的方式指定包核心元数据。下表显示了当前支持该功能的后端:

它会取代setup.py吗?

对于基于setuptools的包,pyproject。Toml并不是严格意义上的替换setup.py,而是在仍然需要时确保它的正确执行。对于其他打包工具-是的,它是:

如果存在build-backend键,则优先使用它,并且源树遵循指定后端的格式和约定(因此,除非后端需要,否则不需要setup.py)。项目可能仍然希望包含一个setup.py,以便与不使用此规范的工具兼容。

如何在可编辑模式下安装包?

最初“可编辑安装”是setuptools特有的特性,因此PEP 517不支持它。后来PEP 660将这个概念扩展到使用pyproject.toml的包。

使用pip在可编辑模式下安装包有两种可能的条件:

现代的: 前端(pip)和后端都必须支持PEP 660。 PIP从版本21.3开始支持它; 遗留问题: 打包工具必须提供一个支持develop命令的setup.py文件。 从21.1版本开始,pip也可以在可编辑模式下仅使用setup.cfg文件安装包。

下表描述了各种后端对可编辑安装的支持:


只回答这一部分,其他人已经很好地解释了其他部分:

如何使用pyproject安装项目?Toml处于可编辑状态?

解决方案(工作)

Clone the project and run poetry install to created a normal installation of it first. Get the path of the virtualenv that poetry has created using poetry env info -p. It will probably be something like <absolute path of your cloned project/.venv. Then check what is the path to site-packages directory inside it. It depends on your Python version and will be something like <absolute path of your cloned project/.venv/lib/python3.9/site-packages. Create a .pth file inside this site-packages. It should contain a single line of text with the full path of the package to install in editable mode:

echo "<absolute path of your cloned project>" > "<absolute path of your cloned project/.venv/lib/python3.9/site-packages/package_name.pth"

适当的修复(截至2021年8月未实施)

2021年6月,PEP-660描述了pyproject的可编辑安装。基于tom的构建已经被接受。

在这个公共关系中,它对诗歌的实施正在进行中。

所以我们需要等待它完成,合并和一个新的诗歌版本发布。

来源

除了上面链接的那些,我的主要来源是“pip install -e”。等效?”-在github.com/python-poetry/poetry的第34期。


pyproject。toml可以在python包中声明文件,并在PyPi中显示它的所有元数据。

像flit这样的工具可以处理pyproject。toml文件可以上传到PyPi,也可以安装在pip上。

其他工具使用pyproject。Toml的其他用途。例如,pytest存储关于在哪里查找以及如何运行测试的信息,以及关于在运行测试之前修改pythonpath (sys.path)的指令。许多ide可以使用这一点来帮助开发人员方便地运行测试。