python - entry_point 用法示例

标签 python hook setuptools

我发现了 setuptools 的入口点:

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

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

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

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

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

最佳答案

负载的例子。例如,任何定义控制台脚本的项目都会使用它们。 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,在 babel.messages.frontend 模块中运行可调用的 main()

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

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

关于python - entry_point 用法示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19356881/

相关文章:

python - 在Python中绘制列表中的数据

python - 将列表解析为 url 字符串

python - 欧拉计划 #17 的意外结果(Python 3 与 Python 2.7)

c++ - 防止 Qt 窗口在 Hook 的应用程序中关闭,Eventfilter 不执行任何操作

python - Plon 4 : Broken Product. 缺少依赖错误

Java:如何通过反射获取构造函数的钩子(Hook)/回调?

windows - 函数 Hook 实际上是如何工作的? WinAPI, C++

python setup.py bdist_egg 未设置包的要求

Python Setuptools 和 PBR - 如何使用 git 标签作为版本创建包版本?

python setuptools包括来自父目录的文件