Как зарегистрировать точки входа для установки сетевого пакета 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