不使用setup.py,开发Python包的首选方式是什么?

10

我正在开发一个Python包,我不想每次更改代码后都要运行pip install .来重新安装我的包。使用-e--editable似乎不起作用,除非我有一个setup.py文件,而--no-use-pep517也不行。现在我有一个pyproject.toml,如果我没有弄错的话,这是现在首选的方式。那么,现在最好的方法是什么呢?

我的包只是一个CLI脚本,但它从同一目录下的另一个文件utils.py中导入了一些函数。在开发过程中,我不能只是从终端手动运行脚本,因为这样会从from name_of_package.utils import function这一行得到"name_of_package不是一个包"的错误提示。而如果我只写from utils import function,我可以从终端运行脚本,但当我pip install时,它会说"没有名为utils的模块"。

我已经安装了poetry并安装了我的依赖项,运行了poetry shell,然后尝试使用poetry run /path/to/script.py运行我的脚本,但我不断收到一个错误消息,说我的包不是个包。


2
setup.py有什么问题? - sinoroc
1
还有,从你的描述来看,您的打包方式可能存在问题,或者启动CLI脚本的方式不对。例如,请确保使用python -m package.cli表示法而不是python package/cli.py - sinoroc
1
我的程序包只是一个CLI脚本,但它导入了同一目录下的另一个文件。这个看起来有问题。你的程序包要么应该只是一个CLI脚本,要么应该是一个包含所有辅助库及脚本的完整程序包。通常通过目录结构导入模块不是一种良好的程序包结构方式。你的CLI脚本是一个独立的可直接运行的文件,还是你程序包中的一个合适的控制台脚本 - MisterMiyagi
@MisterMiyagi,我运行的脚本在我的setup.cfg中被列为控制台脚本,然后还有另一个我从中导入一些东西的脚本。 - Christoffer Corfield Aakre
@sinoroc 我不确定,我只是在网上看到大多数人都不鼓励使用 setup.py - Christoffer Corfield Aakre
1个回答

11

现在,使用setuptools作为构建后端,您可以选择使用setup.pysetup.cfgpyproject.toml或这三个文件的任意组合来声明项目的元数据并配置项目的打包。其中,pyproject.toml是首选,因为它是标准化的(请参见下文)。所有这些都与可编辑安装兼容(python -m pip install --editable .)。

可编辑安装机制有一个标准规范(由PEP 660 document发起)。除了setuptools之外,许多构建后端也支持它。以下是我知道支持标准化可编辑安装机制的构建后端:

  • enscons
  • flit-core(请参见{{link2:flit}})
  • hatchling(请参见{{link3:hatch}})
  • {{link4:maturin}}
  • {{link5:meson-python}}
  • pdm-backend(请参见{{link6:pdm}})
  • poetry-core(请参见{{link7:poetry}})
  • {{link8:setuptools}}
  • {{link9:whey}}

所有这些构建后端都可以将其配置存储在pyproject.toml中(包括对标准化的[build-system]部分(即PEP 517)的支持),除了Poetry之外的所有后端都支持标准化的[project] 部分(也称为PEP 621)。我在这里有一个比较表


谢谢,我会看一下这个。 - Christoffer Corfield Aakre

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