entry_point用法的示例

gue*_*tli 5 python hook setuptools

我发现了setuptools的entry_points:

http://pythonhosted.org/setuptools/setuptools.html#dynamic-discovery-of-services-and-plugins

引用:setuptools支持创建"插入"可扩展应用程序和框架的库,方法是让您在项目中注册可由应用程序或框架导入的"入口点".

但我还没有看到使用它们的项目.

是否有使用它们的项目示例?

如果没有,为什么不使用它们?

Mar*_*ers 4

很多例子。例如,任何定义控制台脚本的项目都会使用它们。在 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
        """,
    )
Run Code Online (Sandbox Code Playgroud)

pip诸如和之类的工具zc.buildout使用console_scripts入口点来创建命令行脚本(一种称为,在模块中pybabel运行可调用文件)。main()babel.messages.frontend

入口distutils.commands点定义了运行时可以使用的附加命令setup.py;这些可以在您自己的项目中使用,以便直接从您的安装脚本调用 Babel 命令行实用程序。

最后但并非最不重要的一点是,它注册自己的检查器和提取器。入口点由函数使用modulebabel.extractors加载,从而可以访问注册该入口点的所有已安装的 Python 项目。以下代码在这些条目中查找特定的提取器:babel.messages.extract.extractsetuptools pkg_resources

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
Run Code Online (Sandbox Code Playgroud)

这使得任何项目都可以注册额外的提取器;只需在你的文件中添加一个入口点setup.py,Babel 就可以使用它。