Я разрабатываю плагин Python, целью которого является интеграция в QGIS функциональности библиотеки PyPI Python, называемой «возвышением».
Существует ли независимый от ОС способ установки внешних библиотек Python и обеспечения их доступности для плагинов Python?
Я уже знаю различные системные процедуры для установки внешних зависимостей Python, и я хотел бы распространить свой плагин в разных средах, не заставляя людей сходить с ума.
Что я уже знаю
Поиски в Интернете и другие подобные вопросы, похоже, не существует независимого от ОС решения.
Пользователи Windows
Python упакован и распространяется внутри пакета QGIS, поэтому для установки внешних библиотек Python вам нужно пройти через оболочку OSGeo4W и использовать pip оттуда.
Ссылки по теме:
- Автономные модули QGIS и Python
- Установка установочных инструментов Python в OSGeo4W Python
- Как установить сторонние библиотеки Python для QGIS в Windows?
Пользователи OS X
В этом случае QGIS использует встроенный Python, который предварительно упакован в OS X и расположен по адресу:
/usr/bin/python
Проблема здесь в том, что установленный по умолчанию пункт имеет некоторые ограничения и требует слишком много привилегий.
Быстрый обходной путь - использовать home-brew для установки Python, чтобы ваш пип мог работать с изменяемой пользователем платформой Python. Подробности этого подхода смотрите здесь .
После установки всех библиотек Python через pip, вам просто нужно добавить их каталоги в переменную PATH.
Альтернативный способ для пользователей OS X
Внутри плагина Python-кода вы можете использовать пип, предоставленный системой, для установки необходимых пакетов. Затем вы можете сделать доступным только что установленный пакет, добавив его в путь.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Самодельное, но работающее решение (протестировано на Linux и OS X)
Я решил пойти по другому пути, поскольку он позволяет отделить обновление библиотеки и обслуживание от плагина. Каждый раз, когда новый пользователь устанавливает плагин, последняя версия библиотеки высот напрямую загружается и устанавливается с помощью pip в подкаталоге плагина.
self.plugin_dir = os.path.dirname(__file__)
self.elevation_dir = os.path.join(self.plugin_dir, 'elevation')
# Checking the presence of elevation library
try:
import elevation
except:
pip.main(['install', '--target=%s' % self.elevation_dir, 'elevation'])
if self.elevation_dir not in sys.path:
sys.path.append(self.elevation_dir)