Условные настройки
Возможно ли иметь условные точки входа, определенные в setup.py? Я заметил, что можно пометить точку входа, используя 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 ответа
В вашем "загрузчике плагинов" (что бы ни случилось, чтобы найти точку входа, либо по имени, либо путем перечисления полного набора доступных точек входа для данного пространства имен), вам нужно сделать что-то вроде следующего:
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
,
Точки входа пишутся в 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
чтобы получить особенность над этим.