Я розробляю плагін Python, метою є інтеграція в QGIS функцій бібліотеки PyPI Python під назвою 'elevation'.
Чи існує незалежний для ОС спосіб встановлення зовнішніх бібліотек 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
Проблема тут полягає в тому, що встановлений за замовчуванням pip має деякі обмеження та вимагає занадто багато привілеїв.
Швидке вирішення проблеми полягає у використанні домашньої заварки для встановлення 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)