Tworzę wtyczkę Python, celem jest zintegrowanie z QGIS funkcjonalności biblioteki Python PyPI o nazwie „elewacja”.
Czy istnieje niezależny od systemu operacyjnego sposób instalowania zewnętrznych bibliotek Python i udostępniania ich wtyczkom Python?
Znam już różne specyficzne dla systemu procedury instalowania zewnętrznej zależności Pythona. Chciałbym rozpowszechniać moją wtyczkę w różnych środowiskach, nie doprowadzając ludzi do szaleństwa.
Co ja już wiem
Przeszukując Internet i inne podobne pytania, wydaje się, że nie ma rozwiązania niezależnego od systemu operacyjnego.
Użytkownicy systemu Windows
Python jest pakowany i dystrybuowany w pakiecie QGIS, więc aby zainstalować zewnętrzne biblioteki Pythona, musisz przejść przez powłokę OSGeo4W i użyć stamtąd pip.
powiązane linki:
- Samodzielne moduły QGIS i moduły Python
- Instalowanie setuptools Pythona w OSGeo4W Python
- Jak zainstalować zewnętrzne biblioteki python dla QGIS w systemie Windows?
Użytkownicy OS X
W tym przypadku QGIS korzysta z wbudowanego Pythona, który jest wstępnie zapakowany w OS X i znajduje się w:
/usr/bin/python
Problem polega na tym, że domyślnie zainstalowany pip ma pewne ograniczenia i wymaga zbyt wielu uprawnień.
Szybkim obejściem jest użycie home-brew do zainstalowania Pythona, aby Twój pip mógł działać na modyfikowalnym przez użytkownika środowisku Python. Zobacz szczegóły tego podejścia tutaj .
Po zainstalowaniu wszystkich bibliotek Pythona przez pip, wystarczy dodać ich katalogi do zmiennej PATH.
Alternatywny sposób dla użytkowników OS X
Wewnątrz wtyczki kodu Python możesz użyć pip dostarczonego przez system, aby zainstalować wymagane pakiety. Następnie możesz sprawić, że właśnie zainstalowany pakiet będzie dostępny, dodając go do ścieżki.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Domowe, ale działające rozwiązanie (przetestowane zarówno na systemie Linux, jak i OS X)
Zdecydowałem się na alternatywny sposób, ponieważ pozwala on na oddzielenie aktualizacji biblioteki i konserwacji od wtyczki. Za każdym razem, gdy nowy użytkownik instaluje wtyczkę, najnowsza wersja biblioteki elewacji jest bezpośrednio pobierana i instalowana przez pip w podkatalogu wtyczki.
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)