如何在主项目中添加setuptools入口点作为示例?

2024-05-17 06:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个可插拔的程序。我想用setuptools的方法,用鸡蛋。在

我已经能够制作一个插件来为一些功能提供一个替代类,我可以使用它。在

我想选择在运行时使用的类;要么是核心模块中的类,要么是任何插件中的类。我想使用pkg_resources方法查询这些类:

for entrypoint in pkg_resources.iter_entry_points("myapp.myclasses"):

我如何在core中为我的类创建一个EntryPoint对象,并注册它,这样iter_entry_points将以与我的.egg插件类相同的方式返回它?在


Tags: 模块方法程序功能插件插拔核心for
1条回答
网友
1楼 · 发布于 2024-05-17 06:22:33

pkg_resources.iter_entry_points列出任何egg中给定名称的任何入口点,包括您自己的包。因此,如果您在setup.py中的entry_points条目列出了以下、您运行了setup.py develop来生成元数据,那么您自己的入口点将包括在内:

[myapp.myclasses]
classentry1 = myapp.mymodule:myclassname1
classentry2 = myapp.mymodule:myclassname2

Babel project正是这样做的;在它的^{}中,它列出了babel.checkers和{}的入口点,它们分别由^{}和{a4}查找。在

如果您不想拥有setup.py文件(这很容易创建和/或从模板生成),那么您将不得不改变pkg_resources.working_set的内部状态:

  • working_set.entries是一个鸡蛋列表。您必须将项目的顶级目录的路径添加到此。在
  • working_set.entry_keys是从{}中的路径到包名列表的映射。将项目添加为“正在工作”_set.entry_键[路径]=['包.名称']
  • working_set.by_key是从包名到pkg_resources.Distribution实例的映射。您需要创建一个Distribution实例,并将其存储在您的包名下:working_set.by_key['package.name'] = yourdistribution。在

出于您的目的,Distribution实例可以是相当稀疏的,但我至少要包括项目名称。但您需要有一个入口点地图:

^{pr2}$

内部结构_ep_map通常根据需要从egg-info元数据进行解析。在

请注意,这完全依赖于无文档的内部数据结构,这些数据结构可以在不同版本之间更改。换句话说,你在这里是自己一个人。我将生成一个setup.py文件,然后运行python setup.py develop来生成egg元数据。在

相关问题 更多 >