pyproject.toml setuptools:如何指定可选脚本(和模块)?

问题描述 投票:0回答:1

我有一个带有一些模块、脚本和可选依赖项的 python 项目:

[project.optional-dependencies]
extra = [ "tqdm", "antspyx>=0.4.2", "scikit-image", "mpi4py", "scipy" ]

[project.scripts]
reg = "myproject._cmd.reg:main"
conv = "myproject._cmd.conv:main"

[tool.setuptools.packages.find]
where = ["src"]
include = ["myproject*"]

现在我想安装脚本,仅用于

pip install myproject[extra]
。到目前为止,这些脚本甚至已安装为
pip install myproject

如果能够像这样拆分我的模块,那就太好了。

src/myproject/extra/
中的模块只能为
pip install myproject[extra]
安装。如果调用
pip install myproject
,则仅应安装
src/myproject/modules/
中的模块。

那么,如何在 pyproject.toml 中声明可选模块和可选脚本?

python setuptools dependency-management pyproject.toml
1个回答
0
投票

理论上,语法是这样的:

[project.scripts]
# This is always available.
run = "test_project.launcher:run"
# This, theoretically, depends on the 'extra' feature:
run_extra = "test_project.launcher:run_gui [extra]"

但是,从 PyPA 用户指南来看,这已被弃用:

还有一个可选属性:额外属性是一组字符串,用于标识提供入口点的发行版的可选功能。如果指定了这些,则入口点需要这些“额外”的依赖项。请参阅元数据字段 Provides-Extra(多次使用)。

不再建议使用额外的入口点。消费者应该支持从现有发行版中解析它们,但随后可能会忽略它们。新的发布工具不需要支持指定额外内容。处理额外功能的功能与 setuptools 管理“egg”包的模型相关,但 pip 和 virtualenv 等较新的工具使用不同的模型。

在实践中,我尝试过的所有构建系统总是会提供 run_extra 脚本,无论依赖关系如何。

python 留言板上的这个帖子是我能找到的最广泛的讨论,看起来主要的建议是:

获取入口点打印安装说明:

def run_extra():
    try:
        import optional_dependency
    except ImportError:
        print(f"Please install 'myproject[extra]' to use this command.")
        sys.exit(0)

    _run_extra()

分成两个包

如果您有大量代码、入口点和依赖项,仅在安装了某个选项后才需要存在,也许您真正想要的是拥有一个“core”或“lib”包以及一个“cli”或“gui” “依赖于lib的包。通过可编辑安装,导入将在您开发时工作。

我相信这是特定于构建系统的。 UV 有一个“工作空间”概念。或者您可以有一个requirements.txt 文件: -e ./core -e ./extras

	
© www.soinside.com 2019 - 2024. All rights reserved.