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)
fonte
Respostas:
Eu sofri com esse problema para executar scripts Python no QGIS, que depende de uma biblioteca Python externa. A solução mais direta é instalar o Boundless Desktop que acompanha a linha de comando e instala seu próprio python. Usando a linha de comando, você pode executar e instalar (usando pip) qualquer pacote externo de python.
fonte
Eu trabalhei nisso um pouco em um projeto recentemente. Infelizmente, não há realmente uma ótima maneira de conseguir isso. Sua solução é muito semelhante à que eu criei, mas não há garantia de que o usuário tenha o pip instalado.
Acabei incluindo uma cópia de get_pip.py e usando execfile () para executá-la no caso em que não está disponível.
Semelhante à sua solução final:
Uma alternativa, é claro, seria incluir a própria biblioteca no diretório do seu plugin. Você corre o risco de fornecer uma versão antiga, mas teoricamente isso não importa.
fonte
Talvez você possa tentar o virtualenv para instalar dependências externas. Dessa forma, você não precisa se preocupar (tanto) com o ambiente do sistema.
https://www.fullstackpython.com/application-dependencies.html
fonte
Isso funcionou para mim (em def run (self)):
e configurando um virtualenv.
No Windows, parece ser uma história diferente. Tive problemas para instalar o matplotlib.
fonte