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

如何从setup.py向Python应用代码传递自定义元数据?

在setup.py中传递自定义字典信息的标准方法

有两种无需额外写入文件或编写清单文件的标准方案,满足你的需求:

方案1:利用自定义包分类器传递信息

通过setup()函数的classifiers参数,添加带自定义前缀的分类器条目来编码字典内容,安装后通过pkg_resources读取并解析这些元数据。这种方法完全不涉及文件修改,仅依赖包的元数据机制。

setup.py示例

from setuptools import setup
import json

# 你的自定义字典信息
custom_info = {
    "build_id": "abc-123-prod",
    "supported_regions": ["us-east", "eu-west"],
    "is_stable": True
}

# 将字典转换为自定义分类器,用JSON序列化复杂值
custom_classifiers = [
    f"Custom-Package-Info: {key}={json.dumps(value)}"
    for key, value in custom_info.items()
]

setup(
    name="your-package-name",
    version="1.0.0",
    packages=["your_package"],
    classifiers=[
        "Programming Language :: Python :: 3.7",
        "License :: OSI Approved :: MIT License",
        # 注入自定义信息
        *custom_classifiers
    ]
)

应用代码中获取信息

import pkg_resources
import json

def get_package_custom_info():
    info = {}
    try:
        # 替换为你的包名
        dist = pkg_resources.get_distribution("your-package-name")
        for classifier in dist.classifiers:
            if classifier.startswith("Custom-Package-Info:"):
                _, kv_pair = classifier.split(":", 1)
                key, json_val = kv_pair.strip().split("=", 1)
                info[key] = json.loads(json_val)
        return info
    except pkg_resources.DistributionNotFound:
        # 包未安装时返回空字典
        return {}

# 使用示例
package_info = get_package_custom_info()
print(package_info["build_id"])  # 输出 abc-123-prod

方案2:动态注入模块变量到包的__init__.py

直接在setup.py中修改包的__init__.py,将字典作为模块级变量写入。这种方法无需额外文件,仅修改包本身的初始化文件,访问时更直接高效。

setup.py示例

from setuptools import setup
import os

# 你的自定义字典信息
custom_info = {
    "app_display_name": "My Awesome App",
    "version_details": {"major": 1, "minor": 0, "patch": 0},
    "release_date": "2024-05-20"
}

# 定位包的__init__.py路径
init_file_path = os.path.join("your_package", "__init__.py")

# 读取现有__init__.py内容(如果存在)
if os.path.exists(init_file_path):
    with open(init_file_path, "r") as f:
        init_content = f.read()
else:
    init_content = ""

# 避免重复写入变量
if "PACKAGE_CUSTOM_INFO" not in init_content:
    # 追加自定义信息变量
    init_content += f"\n\n# Auto-generated package metadata\nPACKAGE_CUSTOM_INFO = {custom_info!r}\n"
    with open(init_file_path, "w") as f:
        f.write(init_content)

setup(
    name="your-package-name",
    version="1.0.0",
    packages=["your_package"]
)

应用代码中获取信息

from your_package import PACKAGE_CUSTOM_INFO

print(PACKAGE_CUSTOM_INFO["app_display_name"])  # 输出 My Awesome App

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:23:23