如何检测Python代码是否从已安装包运行并获取setup.py定义的包元数据
解决方案
完全可以实现需求,Python标准库提供了对应能力无需额外依赖(3.8及以上版本),可以直接在my_pack_name/app.py中实现检测和元数据获取逻辑。
实现逻辑
- 用
importlib.metadata模块尝试读取当前模块对应包的发布信息 - 若读取失败说明当前运行的是未安装的源码
- 若读取成功,可进一步校验包路径是否在Python的
site-packages/dist-packages安装目录下,排除开发模式(pip install -e)安装的情况 - 读取到的元数据就是你构建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
相关产品推荐
相关产品推荐

