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

如何检测Python代码是否从已安装包运行并获取setup.py定义的包元数据

解决方案

完全可以实现需求,Python标准库提供了对应能力无需额外依赖(3.8及以上版本),可以直接在my_pack_name/app.py中实现检测和元数据获取逻辑。

实现逻辑

  1. 用importlib.metadata模块尝试读取当前模块对应包的发布信息
  2. 若读取失败说明当前运行的是未安装的源码
  3. 若读取成功,可进一步校验包路径是否在Python的site-packages/dist-packages安装目录下,排除开发模式(pip install -e)安装的情况
  4. 读取到的元数据就是你构建wheel时setup.py执行时注入的固化值,不会再动态执行setup.py

完整代码示例

try:
    # Python 3.8+ 直接使用标准库
    from importlib.metadata import (
        PackageNotFoundError,
        DistributionNotFound,
        distribution
    )
except ImportError:
    # Python 3.8以下版本需先执行 `pip install importlib-metadata`
    from importlib_metadata import (
        PackageNotFoundError,
        DistributionNotFound,
        distribution
    )
import sys
from pathlib import Path


def get_installed_pkg_metadata():
    # 获取当前文件所属的根包名
    root_pkg_name = __package__.split(".")[0]
    try:
        # 获取包的发布信息
        pkg_dist = distribution(root_pkg_name)
    except (PackageNotFoundError, DistributionNotFound):
        # 未找到对应安装包,说明直接运行源码
        return None

    # 可选:排除开发模式安装的包,只匹配正常安装的wheel包
    site_pkg_dirs = [
        Path(p).resolve() for p in sys.path
        if "site-packages" in p.lower() or "dist-packages" in p.lower()
    ]
    pkg_install_path = Path(pkg_dist.location).resolve()
    if pkg_install_path not in site_pkg_dirs:
        return None

    # 返回你需要的元数据
    return {
        "name": pkg_dist.metadata["Name"],
        "version": pkg_dist.version,
        "description": pkg_dist.metadata["Summary"]
    }


# 测试调用
if __name__ == "__main__":
    metadata = get_installed_pkg_metadata()
    if metadata:
        print("当前运行自已安装的包,元数据如下:")
        print(f"包名:{metadata['name']}")
        print(f"版本:{metadata['version']}")
        print(f"描述:{metadata['description']}")
    else:
        print("当前运行的是未安装的源码")

注意事项

  • setup.py中定义的description字段对应元数据中的Summary键,不要混淆字段名
  • 如果你认为开发模式安装也属于"已安装的包",直接删除路径校验逻辑即可,只要能获取到pkg_dist就返回元数据
  • 构建wheel时注入的环境变量值(GIT_COMMIT、BUILD_VERSION)会固化到包的元数据文件中,安装后读取的就是构建时的数值,不会再重新读取环境变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:54:03