pkg_resources.iter_entry_points
列出任何egg中给定名称的任何入口点,包括您自己的包。因此,如果您的entry_points
条目setup.py
列出以下内容,并且您已经运行setup.py develop
以生成元数据,那么您自己的入口点将被包括在内:
[myapp.myclasses]
classentry1 = myapp.mymodule:myclassname1
classentry2 = myapp.mymodule:myclassname2
Babel 项目正是这样做的。它setup.py
列出了babel.checkers
和的入口点,这些入口点分别由和babel.extractors
查找。babel.messages.checkers:_find_checkers
babel.messages.extract:extract
如果您不想拥有一个setup.py
文件(这很容易从模板创建和/或生成),那么您将不得不改变内部状态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
实例可能相当稀疏,但我至少会包含项目名称。不过,您需要有一个入口点地图:
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 元数据。