Условные настройки

Возможно ли иметь условные точки входа, определенные в 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 суб-команда. Обратите внимание, как waitressextras_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 чтобы получить особенность над этим.

Другие вопросы по тегам