Розробка плагіна, який залежить від зовнішньої бібліотеки Python


29

Я розробляю плагін Python, метою є інтеграція в QGIS функцій бібліотеки PyPI Python під назвою 'elevation'.

Чи існує незалежний для ОС спосіб встановлення зовнішніх бібліотек Python та надання їх доступним для плагінів Python?

Я вже знаю різні специфічні для системи процедури встановлення зовнішньої залежності від Python, що я хотів би зробити, це розповсюджувати свій плагін по різних середовищах, не змушуючи людей сходити з розуму.

Що я вже знаю

Шукаючи в Інтернеті та інші подібні запитання, здається, що не існує незалежного рішення для ОС.

Користувачі Windows

Python упакований і розповсюджується всередині пакета QGIS, тому для того, щоб встановити зовнішні бібліотеки Python, вам потрібно пройти через оболонку OSGeo4W та використовувати pip звідти.

пов'язані посилання:

Користувачі 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)

Ця процедура призначена лише для Windows, оскільки Unix OS (Linux, Mac OS X) використовує встановлену стандартну версію Python
ген

Я знаю це, я "збагачував" своє запитання, зараз є розділ користувачів OS X, який пояснює, як це зробити на mac.
Інженер-Г

1
Ви можете ідеально встановити pip в Apple Python. QGIS використовує цю версію, а не інші версії (Homebrew, Anaconda та інші). Якщо ви хочете використовувати Homebrew Python, вам потрібно встановити Homebrew версію QGIS
ген

Також дивіться на Plugin залежності , pipinstall плагін можливо? По-перше: Яка різниця між оболонкою Osgeo4w? та багато інших публікацій у списках QGIS
ген

3
Якщо це чиста бібліотека пітона, ви можете просто поширити сторонню бібліотеку за допомогою свого плагіна як підпакет / модуль.
користувач2856

Відповіді:


2

Я постраждав через це питання, щоб запустити сценарії Python в QGIS, що залежить від зовнішньої бібліотеки Python. Найпростішим рішенням є встановлення Boundless Desktop, який поставляється з командним рядком та встановлює власний python. За допомогою командного рядка можна запустити та встановити (використовуючи pip) будь-який зовнішній пакет python.


1

Нещодавно я над цим працював над проектом. На жаль, дійсно не чудовий спосіб досягти цього. Ваше рішення дуже схоже на те, що я придумав, але немає гарантії, що користувач навіть встановив pip.

У кінцевому підсумку я включив копію get_pip.py та використовую execfile (), щоб запустити її у випадку, коли вона недоступна.

Подібно до вашого остаточного рішення:

self.plugin_dir = os.path.dirname(__file__)

try:
    import pip
except:
    execfile(os.path.join(self.plugin_dir, get_pip.py))
    import pip
    # just in case the included version is old
    pip.main(['install','--upgrade','pip'])

try:
    import somelibrary
except:
    pip.main(['install', 'somelibrary'])

Альтернативою, звичайно, було б включення самої бібліотеки до каталогу вашого плагіна. Ви ризикуєте надати стару версію, але теоретично це не має значення.



1

Це працювало для мене (в дефініції (само)):

    def load_libraries(self):
        import_path = os.path.join(self.plugin_dir, 'lib/python2.7/site-packages')
        sys.path.insert(0, import_path)

і встановлення virtualenv.

З Windows, мабуть, це вже інша історія. У мене виникли проблеми з установкою matplotlib.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.