如何从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
相关产品推荐
相关产品推荐

