You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python包入口点中读取pyproject.toml的[project.urls]元数据

如何在Python包入口点脚本中读取pyproject.toml的[project.urls]元数据

先确认你的pyproject.toml配置

首先确保你的pyproject.toml使用setuptools作为构建后端,并且包含[project.urls]字段,示例配置如下:

[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "spam"
version = "0.1.0"
description = "示例Python包"
entry-points = {
  console_scripts = [
    "spam-cli = spam:main_cli",
  ]
}

[project.urls]
Homepage = "https://example.com"
Documentation = "https://example.com/docs"

在入口点函数中获取Homepage URL

方法1:使用Python 3.8+内置的importlib.metadata

这是官方推荐的方式,不需要额外安装依赖:

在你的spam包模块(比如spam/__init__.py或者单独的spam/cli.py)中编写main_cli函数:

import importlib.metadata

def main_cli():
    try:
        # 获取已安装包的元数据
        pkg_meta = importlib.metadata.metadata("spam")
        # 注意这里的键是"Home-page"(连字符形式),对应pyproject.toml里的"Homepage"
        homepage = pkg_meta.get("Home-page")
        print(f"项目主页地址:{homepage}")
        # 后续可以用这个URL做其他操作,比如打印、跳转等
    except importlib.metadata.PackageNotFoundError:
        print("错误:未找到包元数据,请确保包已安装(可使用pip install -e .安装开发版本)")

if __name__ == "__main__":
    main_cli()

方法2:兼容Python 3.7及以下(使用pkg_resources)

如果需要支持更旧的Python版本,可以用setuptools自带的pkg_resources:

import pkg_resources

def main_cli():
    try:
        pkg_dist = pkg_resources.get_distribution("spam")
        # 直接通过键名"Homepage"获取对应URL
        homepage = pkg_dist.get_urls().get("Homepage")
        print(f"项目主页地址:{homepage}")
    except pkg_resources.DistributionNotFound:
        print("错误:未找到包元数据,请确保包已安装")

if __name__ == "__main__":
    main_cli()

重要注意事项

  • 必须确保包已通过pip install .或pip install -e .(开发模式)安装,因为元数据是从已安装的包中读取的,而非直接读取本地的pyproject.toml文件。
  • 如果直接运行脚本而不安装包,上述方法会失败,这种场景下可以考虑直接解析pyproject.toml文件(比如用tomllib模块),但这种方法不推荐用于生产环境,因为包安装后pyproject.toml可能不在运行路径中。

内容的提问来源于stack exchange,提问作者bad_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:06:13