Как зарегистрировать точки входа для установки сетевого пакета python?

У меня есть пользовательская среда, в которой большинство пакетов Python установлены на общем сетевом ресурсе и доступны через PYTHONPATH переменная окружения. Сам Python все еще установлен локально. Некоторые из этих пакетов должны зарегистрировать точки входа setuptools. Обычно это происходит при запуске setup.py файл для пакета, но поскольку они установлены в сетевом расположении, это setup.py никогда не запускается с локальной установкой python.

Есть ли способ зарегистрировать точки входа без установки пакета в локальной установке Python?

Пример точки входа, которая регистрирует обратный вызов для системы плагинов

setup(
    ...
    entry_points={
        'xx_plugin': ['value = package.module:func'],
    }
) 

1 ответ

Решение

Бежать setup.py

console_scripts а также gui_scripts точки входа создают автономные сценарии, которые обертывают вызываемый объект. coverage пакет является хорошим примером этого. Для удобства он имеет точку входа для создания сценария оболочки. пример setup.py фрагмент для создания консольного скрипта:

setup(
    ...
    entry_points = {
        'console_scripts': [
            'script_name = package.module:function'
        ]
    }
)

Установить скрипты в указанную директорию можно только через setup.py, Существующий сценарий не будет перезаписан, если только --force аргумент пройден.

python setup.py install_scripts --install-dir /some/alternate/location

Для плагина точка входа хранится в виде метаданных в яйце, которое обычно устанавливается вместе с пакетом. Пример точки входа плагина:

setup(
    ...
    entry_points = {
        'group_name': [
            'plugin_name = package.module:function'
        ]
    }
)

Установить метаданные пакета (включая любые точки входа) можно только в указанный каталог через setup.py,

python setup.py egg_info --egg-base $PYTHONPATH

Ролл свой

Если setup.py не может быть запущен для записи метаданных яйца, вполне возможно свернуть ваши собственные, так как это всего лишь текстовый файл в каталоге. Пример метаданных на основе вышеуказанной точки входа:

# $PYTHONPATH/entry_points.egg-info/entry_points.txt
[group_name]
plugin_name = package.module:function

Чтобы проверить поиск точки входа:

import pkg_resources as pkg

for entry_point in pkg.iter_entry_points('group_name'):
    plugin_name = entry_point.name
    plugin_module_name = entry_point.module_name
    plugin_callable = entry_point.load()
    # do something with plugin
Другие вопросы по тегам