我发现了 setuptools 的 entry_points:
http://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins
引用: setuptools 支持创建“插入”到可扩展应用程序和框架的库,方法是让您在项目中注册可由应用程序或框架导入的“入口点”。
但我还没有看到使用它们的项目。
是否有使用它们的项目示例?
如果不是,为什么不使用它们?
我发现了 setuptools 的 entry_points:
http://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins
引用: setuptools 支持创建“插入”到可扩展应用程序和框架的库,方法是让您在项目中注册可由应用程序或框架导入的“入口点”。
但我还没有看到使用它们的项目。
是否有使用它们的项目示例?
如果不是,为什么不使用它们?
有很多例子。例如,任何定义控制台脚本的项目都会使用它们。在GitHub 上快速搜索可以让您浏览大量内容。
我将专注于一个特定的例子(一个不在GitHub 上的例子):Babel。
Babel 既entry_points
用于控制台脚本,也用于定义可翻译文本提取的扩展点。查看他们的setup.py
来源:
if have_setuptools:
extra_arguments = dict(
zip_safe = False,
test_suite = 'babel.tests.suite',
tests_require = ['pytz'],
entry_points = """
[console_scripts]
pybabel = babel.messages.frontend:main
[distutils.commands]
compile_catalog = babel.messages.frontend:compile_catalog
extract_messages = babel.messages.frontend:extract_messages
init_catalog = babel.messages.frontend:init_catalog
update_catalog = babel.messages.frontend:update_catalog
[distutils.setup_keywords]
message_extractors = babel.messages.frontend:check_message_extractors
[babel.checkers]
num_plurals = babel.messages.checkers:num_plurals
python_format = babel.messages.checkers:python_format
[babel.extractors]
ignore = babel.messages.extract:extract_nothing
python = babel.messages.extract:extract_python
javascript = babel.messages.extract:extract_javascript
""",
)
工具喜欢pip
并zc.buildout
使用console_scripts
入口点来创建命令行脚本(一个叫做pybabel
,在模块中运行main()
可调用文件babel.messages.frontend
)。
distutils.commands
入口点定义了运行时可以使用的附加命令setup.py
;这些可以在您自己的项目中用于直接从您的设置脚本调用 Babel 命令行实用程序。
最后但同样重要的是,它注册了自己的检查器和提取器。babel.extractors
入口点由babel.messages.extract.extract
function加载,使用setuptools
pkg_resources
module,可以访问注册该入口点的所有已安装 Python 项目。以下代码在这些条目中查找特定的提取器:
try:
from pkg_resources import working_set
except ImportError:
pass
else:
for entry_point in working_set.iter_entry_points(GROUP_NAME,
method):
func = entry_point.load(require=True)
break
这让任何项目都可以注册额外的提取器;只需在你的和 Babel 中添加一个入口点setup.py
就可以使用它。