116

背景

我正准备尝试从GitHub下载的Python包,发现它没有setup.py,所以我无法安装它

pip install -e <folder>

相反,该软件包有一个pyproject.toml文件,该文件似乎具有与setup.py通常非常相似的条目。

我发现了什么

谷歌搜索引导我进入PEP-518setup.py ,它在基本原理部分给出了一些批评。但是,它并没有明确说明setup.py应该避免使用 of ,或者这样pyproject.toml会完全取代setup.py.

问题

pyproject.toml是用来代替的东西setup.py吗?或者一个包应该同时带有 apyproject.toml和 asetup.py吗?
如何pyproject.toml以可编辑状态安装项目?

4

4 回答 4

59

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

这解决了构建工具依赖鸡和蛋的问题,即pip可以读取pyproject.toml以及可能需要什么setuptools版本wheel

如果您需要一个setup.py可编辑的安装,您可以在以下位置使用 shim setup.py

#!/usr/bin/env python

import setuptools

if __name__ == "__main__":
    setuptools.setup()
于 2020-07-19T18:05:21.627 回答
43

pyproject.toml是新的统一 Python 项目设置文件,它取代了setup.py. 可编辑安装仍然需要setup.pyimport 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
于 2020-12-05T23:01:33.710 回答
21

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

  1. 对于setuptools-based 软件包,如果尚未安装,则从发行版的源代码/构建安装可能会失败setuptools
  2. 基于其他打包工具的包不能使用pip. 必须先安装打包工具,然后使用工具特定的命令来安装/构建分发包;
  3. 如果包作者决定更改打包工具,则还必须更改工作流以使用不同的工具特定命令。

pyproject.tomlPEP 517PEP 518为解决这些问题而引入的新配置文件:

...想想为项目生成构建工件所需的(粗略)步骤:

  1. 项目的源代码签出。
  2. 安装构建系统。
  3. 执行构建系统。

此 PEP [518] 涵盖步骤 #2。PEP 517涵盖步骤 #3 ...

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


基于forsetuptools的包pyproject.toml并不严格意味着要替换setup.py,而是在仍然需要时确保其正确执行。对于其他打包工具——是的,它是:

如果build-backend存在密钥,则优先,源代码树遵循指定后端的格式和约定(因此 nosetup.py是必需的,除非后端需要它)。项目可能仍希望包含setup.py与不使用此规范的工具的兼容性。


“可编辑安装”是一项特定功能,因此PEP 517setuptools不支持它:

Install Options:
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools "develop mode")

要以可编辑模式安装setuptools-based 包,它需要有一个setup.py至少包含最少内容的文件:

from setuptools import setup

setup()
于 2021-03-04T10:05:29.583 回答
8

仅回答这一部分,因为其他人已经很好地解释了其余部分:

如何在可编辑状态下安装带有 pyproject.toml 的项目?

解决方法(工作)

  1. 克隆项目并运行poetry install以首先创建它的正常安装。

  2. 获取诗歌使用创建的 virtualenv 的路径poetry env info -p。它可能会是类似的东西<absolute path of your cloned project/.venvsite-packages然后检查其中目录的路径是什么。这取决于您的 Python 版本,类似于<absolute path of your cloned project/.venv/lib/python3.9/site-packages.

  3. 在这个里面创建一个.pth文件site-packages。它应该包含一行文本,其中包含要在可编辑模式下安装的包的完整路径:

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-660pyproject.toml已被接受。

它的实现poetry正在这个 PR中进行。

所以我们需要等待它完成,合并并poetry发布新版本。

来源

除了上面链接的那些,我的主要来源是“pip install -e .equivalent?” - github.com/python-poetry/poetry 中的问题 #34

于 2021-08-04T20:07:43.067 回答