gpt4 book ai didi

python - 如何在我的主项目中添加 setuptools entry_point 作为示例?

转载 作者:太空狗 更新时间:2023-10-29 22:16:26 25 4
gpt4 key购买 nike

我想让我的程序可插入。我想使用 setuptools 方法,使用 eggs。

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

我想选择在运行时使用的类;我的核心模块或任何插件中的那个。我想使用 pkg_resources 查询这些类的方式:

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

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

最佳答案

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正是这样做的;在里面 setup.py它列出了 babel.checkersbabel.extractors 的入口点,这些由 babel.messages.checkers:_find_checkers 查找。和 babel.messages.extract:extract , 分别。

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

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

出于您的目的,Distribution 实例可能相当稀少,但我至少会包括项目名称。不过,您需要在其上有一个入口点 map :

yourdistribution = Distribution(project_name='package.name')
yourdistribution._ep_map = {'myapp.myclasses', {
'classentry1': entrypointinstance_for_classentry1,
'classentry2': entrypointinstance_for_classentry2,
}}

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

请注意,这完全依赖于可以在版本之间更改的未记录的内部数据结构。换句话说,你在这里独自一人。我会生成一个 setup.py 文件,然后运行 ​​python setup.py develop 来生成 egg 元数据。

关于python - 如何在我的主项目中添加 setuptools entry_point 作为示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13545289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com