如何使用pyproject.toml以可编辑模式使用pip安装软件包?

90

当一个项目仅通过pyproject.toml指定(即没有setup.{py,cfg}文件),如何通过pip以可编辑模式安装它(即python -m pip install -e .)?

我尝试了setuptoolspoetry作为构建系统,但都没有成功:

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

对于这两个构建系统,我得到了相同的错误:

ERROR: Project file:///tmp/demo has a 'pyproject.toml' and its build backend is missing the 'build_editable' hook. Since it does not have a 'setup.py' nor a 'setup.cfg', it cannot be installed in editable mode. Consider using a build backend that supports PEP 660.

我正在一个 conda 环境中使用这个,以下是我版本的 setuptoolspip:

$ conda list | grep setuptools
setuptools                58.3.0                   pypi_0    pypi
$ python -m pip --version
pip 21.3.1
5个回答

76

PEP 660 - 基于pyproject.toml的可编辑安装定义了如何构建只使用pyproject.toml的项目。必须实现PEP 660才能进行可编辑安装。您需要一个前端(例如pip ≥ 21.3)和一个后端。一些流行后端的状态如下:

注意:要能够对用户站点(pip install -e --user)进行可编辑安装,您需要安装系统中的setuptoolsv62.0.0或更高版本


2
感谢您提供的良好概述和各种建议。最终,我通过 flit 成功进行了可编辑的安装。 - a_guest
7
我发现“实现PEP 660”似乎意味着“支持符合PEP 660的后端的前端”,这让我感到非常困惑。实际上,人们需要同时拥有前端和后端。到目前为止,我唯一能找到的符合要求的后端是Flit。Poetry实现仍未发布。据我所知,pip只是一个前端。似乎setuptools尚未有实现 - Ben Mares
3
PEP 660 已在 poetry 1.0.8 中实现。 - dyoll
6
21.3 版本开始,Pip 支持从 pyproject.toml 文件进行可编辑安装。 - dyoll
4
也许hatchpdmwhey可以列入此清单。据我所知,它们都兼容PEP 660。 - sinoroc
显示剩余4条评论

54

当我搜索错误字符串“(A "pyproject.toml" file was found, but editable mode currently requires a setuptools-based build.)”时,我偶然来到这里。

在我的情况下,我只需要更新pip:

python3 -m pip install --upgrade pip

然后安装工作得很好。


22
注意:此解决方法不再需要。自2022年8月的v64.0.0版本起,Setuptools支持可编辑安装。下面的旧答案仍然适用于因某种原因而卡在较旧Setuptools版本上的人...

作为一个临时解决方案,直到setuptools实现PEP 660 (#2816),您可以创建一个空的setup文件,只用于可编辑安装。

touch setup.cfg
pip install -e .
rm setup.cfg

注意:这实际上并没有调用任何build_editable钩子(在setuptools的后端目前甚至不存在),而是触发了pip中的一个代码路径,该代码路径创建一个临时的setup.py,然后执行setup.py develop。因此,这是一种“传统”的可编辑安装方式,通过在路径配置文件(如.venv/lib/python3.XY/site-packages/easy-install.pth)中放置指向源代码的链接来完成。Poetry和flit也做类似的事情,只不过它们创建了单独的路径文件,如站点目录中的mypkg.pth,而不是使用easy-install.pth中的行。

由于setup.py develop是一种路径文件黑客技术,因此适用于这种开发安装的常规警告都适用,例如,它会公开源目录中存在的任何.py文件,即使它们在创建发布时实际上没有打包成真正的分发包。


谢谢!它似乎确实起作用了,但是为什么呢?你有任何解释吗? - jonas

2
从诗歌1.2.0b3开始,当您运行poetry install时,“当前项目”将自动以可编辑模式安装。
$ pip uninstall virtualenv # or via apt if you installed that way
$ sudo apt install python3-dev python3-pip python3-setuptools
$ wget install.python-poetry.org -o get-poetry.py
$ python3 get-poetry.py --preview
$ cd /you/project/folder
$ poetry install
$ pip list
Package            Version  Editable project location
------------------ -------- -------------------------------------------
...
your-project       0.1.0    /you/project/folder
pip                22.2.2
...

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接