是否可以在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]
也可用。是否有一种简单的方法来获得这样的工作?
答案 0 :(得分:1)
入口点将写入package.dist-info/entry_points.txt
。我建议在setup.py
中查看系统上安装了哪些软件包,但这可能无济于事,因为在dist-info
安装其他软件包之前可能会处理pip
;稍后,即使您安装了其他软件包,这些入口点也不会神奇地显示,除非您使用正确的参数为setup.py
运行my.package
。
我建议你重构,以便有一个名为my.package
的包和另一个名为my.package.special
的可安装包;后者将my.package
,dependency1
和dependency2
作为依赖项,以及入口点。现在,如果你想安装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
包缺失的地方:
不幸的是,我实际上并没有多个依赖性entry_point
示例,因此需要注意的是,该软件包列为"缺少"可能并不总是与extras_require
的名称匹配。