Estou desenvolvendo um plug-in Python, o objetivo é integrar ao QGIS as funcionalidades de uma biblioteca PyPI Python chamada 'elevação'.
Existe uma maneira independente do SO de instalar bibliotecas externas do Python e disponibilizá-las para os plugins do Python?
Eu já conheço os diferentes procedimentos específicos do sistema para instalar uma dependência externa do Python. O que eu gostaria de fazer é distribuir meu plug-in em diferentes ambientes sem deixar as pessoas loucas.
O que eu já sei
Pesquisando na web e outras perguntas semelhantes, parece que não há uma solução independente do SO.
Usuários do Windows
O Python é empacotado e distribuído dentro do pacote QGIS; portanto, para instalar bibliotecas externas do Python, você precisa passar pelo OSGeo4W Shell e usar o pip a partir daí.
Links Relacionados:
- Módulos independentes do QGIS e Python
- Instalando as ferramentas de instalação do Python no OSGeo4W Python
- Como instalar bibliotecas python de terceiros para QGIS no Windows?
Usuários do OS X
Nesse caso, o QGIS usa o Python embutido, pré-empacotado no OS X e localizado em:
/usr/bin/python
O problema aqui é que o pip instalado padrão tem algumas limitações e requer muitos privilégios.
Uma solução rápida é usar o home-brew para instalar o Python, para que seu pip possa ser executado em uma estrutura Python modificável pelo usuário. Veja os detalhes dessa abordagem aqui .
Após instalar todas as bibliotecas Python via pip, você só precisa adicionar seus diretórios à variável PATH.
Maneira alternativa para usuários do OS X
Dentro do código Python do plug-in, você pode usar o pip fornecido pelo sistema para instalar os pacotes necessários. Então você pode tornar acessível o pacote recém-instalado, adicionando-o ao caminho.
import sys
import pip
pip.main(['install','--target=/Devel/test', 'elevation'])
sys.path.append("/Devel/test")
Solução caseira, mas funcional (testada no Linux e OS X)
Decidi seguir o caminho alternativo, pois permite manter a atualização e a manutenção da biblioteca separadas do plug-in. Sempre que um novo usuário instala o plug-in, a versão mais recente da biblioteca de elevação é baixada e instalada diretamente pelo pip dentro de um subdiretório do plug-in.
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)