entry_points 是 setuptools 安装包时写入 dist-info 的键值对,声明包提供的可查找入口;它不是插件框架或自动加载机制,真正调用需第三方代码读取元数据后显式导入。

entry_points 是什么,不是什么
它不是 Python 的插件“框架”,也不是运行时自动加载机制;它是 setuptools 在安装包时写入 dist-info 元数据的一组键值对,本质是声明“我这个包提供了哪些可被其他代码按名查找的入口”。真正触发调用的是第三方代码(比如 importlib.metadata 或 pkg_resources)去读取这些声明并导入对应对象。
定义 entry_points 的两种写法及坑点
最常见错误是混淆 setup.py 和 pyproject.toml 的语法,导致声明不生效:
-
setup.py中必须用字典嵌套:entry_points={'console_scripts': ['mycmd = mypkg.cli:main']}—— 键名必须是标准组名(如console_scripts、pytest11),值必须是字符串列表,不能是 dict 或 tuple -
pyproject.toml中要用[project.entry-points."group-name"]表格,且等号右边必须是module:attr形式,不能带括号或参数:mycmd = "mypkg.cli:main",写成mycmd = "mypkg.cli:main()"会静默失败 - 路径分隔符统一用英文冒号
:,不是点号;模块路径必须能被 Python 导入(即所在目录有__init__.py或已加进PYTHONPATH)
如何在运行时安全读取和调用
别直接依赖 pkg_resources(已弃用),优先用 importlib.metadata(Python 3.8+)或兼容层 importlib_metadata(旧版本):
from importlib import metadata
try:
eps = metadata.entry_points(group="console_scripts")
except KeyError:
eps = [] # group 不存在时不抛异常
for ep in eps:
if ep.name == "mycmd":
func = ep.load() # 这里才真正 import 并获取函数对象
func()
注意:ep.load() 可能抛 ImportError(模块找不到)、AttributeError(函数不存在),必须捕获;metadata.entry_points() 返回的是 EntryPoints 对象(不是 list),不能用下标访问,得用 .select() 或遍历。
系统特点:技术领先:系统基于被广泛使用的Windows平台开发,集百家之所长,技术领先、功能完备; 快速建店:只需简单设置,3分钟即可以建立一个功能完备的网上商城; 操作简便:软件操作界面由专业设计人员设计,采用人性化的布局,界面规范,操作简捷; 安装方便:只需传到您的虚拟空间即可; HTML编辑器:内置优秀的HTML在线编辑器; 可扩展性:软件构架灵活,考虑未来功能扩充之需要,具有较强的可扩展性
立即学习“Python免费学习笔记(深入)”;
为什么 console_scripts 自动变命令行,其他组不行
console_scripts 是 setuptools 硬编码支持的特殊组:安装时它会生成一个同名 shell 脚本(Linux/macOS)或 .exe 包装器(Windows),内容就是调用你指定的函数。其他组(如 myplugin)只是元数据,没有任何自动行为 —— 是否加载、何时加载、怎么用,全由你自己代码决定。
常见误区是以为定义了 myplugin 组就能“自动发现插件”,其实只是把字符串存进了 MYPROJ-*.dist-info/entry_points.txt;如果你的主程序没写逻辑去读它,那它就只是个注释。
跨平台路径处理、Windows 下脚本编码、开发期未安装时的调试——这些才是实际项目里最常卡住的地方。









