entry_point用法的示例

时间:2013-10-14 09:09:31

标签: python hook setuptools

我发现了setuptools的entry_points:

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

加载的示例。例如,定义控制台脚本的任何项目都使用它们。 quick search on GitHub为您提供了大量的浏览功能。

我将专注于一个特定的例子(在GitHub上):Babel

Babel对两个控制台脚本都使用entry_points,并为可翻译文本提取定义扩展点。查看他们的setup.py source

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
        """,
    )

pipzc.buildout这样的工具使用console_scripts入口点来创建命令行脚本(一个名为pybabel,在{{中运行main()可调用脚本1}}模块)。

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

最后,但并非最不重要的是,它注册了自己的检查器和提取器。 babel.messages.extract.extract function使用setuptools pkg_resources module加载setup.py入口点,允许访问已注册该入口点的所有已安装的Python项目。以下代码在这些条目中查找特定的提取器:

babel.extractors

这允许任何项目注册其他提取器;只需在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就可以使用它。

答案 1 :(得分:1)

Sentry就是一个很好的例子。 Sentry的作者甚至创建了一个名为Logan的django包,用于将标准django管理命令转换为控制台脚本。