条件设置工具entry_points

时间:2016-03-15 08:24:36

标签: python setuptools entry-point

是否可以在setup.py中定义条件entry_points?我注意到可以使用extras 标记一个入口点,但即使安装包没有这个额外功能,该入口点也可用。

setup(name='my.package',
      ...
      extras_require={
          'special': [
              'dependency1',
              'dependency2',
          ],
      },
      ...
      entry_points="""
      [custom_entrypoint]
      handlername = my.package.special:feature [special]
      """,
  )

即使在没有custom_entrypoint功能(special)的情况下安装软件包,pip install my.package[special]也可用。是否有一种简单的方法来获得这样的工作?

2 个答案:

答案 0 :(得分:1)

入口点将写入package.dist-info/entry_points.txt。我建议在setup.py中查看系统上安装了哪些软件包,但这可能无济于事,因为在dist-info安装其他软件包之前可能会处理pip;稍后,即使您安装了其他软件包,这些入口点也不会神奇地显示,除非您使用正确的参数为setup.py运行my.package

我建议你重构,以便有一个名为my.package的包和另一个名为my.package.special的可安装包;后者将my.packagedependency1dependency2作为依赖项,以及入口点。现在,如果你想安装my.package,它会在没有特价的情况下这样做; pip install my.package.special以获得特殊功能。

答案 1 :(得分:1)

在你的"插件加载器" (无论是通过名称还是通过枚举给定命名空间的完整可用入口点集来找到入口点,都需要执行以下操作:

import pkg_resources

# Get a reference to an EntryPoint, somehow.
plug = pkg_resources.get_entry_info('pip', 'console_scripts', 'pip')

# This is sub-optimal because it raises on the first failure.
# Can't capture a full list of failed dependencies.
# plug.require()

# Instead, we find the individual dependencies.

failed = []

for extra in sorted(plug.extras):
    if extra not in plug.dist._dep_map:
        continue  # Not actually a valid extras_require dependency?

    for requirement in i.dist._dep_map[extra]:
        try:
            pkg_resources.require(str(requirement))
        except pkg_resources.DistributionNotFound:
            failed.append((plug.name, extra, str(requirement)))

我们走了;对于给定的插件,您将获得失败的依赖项列表(或成功时为not failed)列出entry_point插件名称,[foo]额外标记和特定的未满足的包要求。

此实例的一个示例来自web.command包的web versions --namespace子命令。请注意waitress extras_require是如何满足的,gevent显式指定gevent包缺失的地方:

Sample usage.

不幸的是,我实际上并没有多个依赖性entry_point示例,因此需要注意的是,该软件包列为"缺少"可能并不总是与extras_require的名称匹配。