[Resolvido] No module named ‘pandas.*’ in PyInstaller. (Python)
Overview
Já se deparou com aquele erro frustrante de módulo não encontrado ao tentar transformar seu script Python em um executável, especialmente envolvendo o Pandas? Não se preocupe, este post traz uma luz no fim do túnel! Com uma pitada de humor e seriedade, vamos explorar duas soluções simples para garantir que sua aplicação rode liso, abordando tanto o uso de parâmetros específicos na linha de comando quanto a criação de hooks de importação. Prepare-se para deixar esses erros para trás e garantir um futuro sem complicações para seus projetos em Python!
Então você transforma seu script Python em uma aplicação binária, mas quando tenta executa-lo, aparece um erro falando que o modulo pandas._libs.<algumacoisa>.<algumacoisa> não existe. Você não se lembra nem de ter usado (explicitamente) esta biblioteca, mas ela está impedindo sua aplicação de executar corretamente. A solução para este problema é bem fácil e pode ser aplicada a outros packages além do Pandas.
O que acontece é que, em algum lugar da sua aplicação (ou em algum ponto de um pacote que você está utilizando como, por exemplo, o Pandas) foi feita uma “importação escondida”.
Se você (ou qualquer pacote) utilizar __import__, exec ou eval, o pyinstaller não vai saber que você precisa daquela biblioteca, ela não será incluída no arquivo que está sendo criado e você será agraciado pelo erro de modulo não encontrado.
Consegui resolver este problema de duas formas…
Para fins didáticos, vamos supor que o erro ocorreu na biblioteca pandas._libs.tslibs.np_datetime.
1. Utilizando o parametro –hidden-imports
A primeira forma é utilizando o parâmetro –hidden-imports na sua linha de comando, que ficaria assim:
pyinstaller applicacao.py --hidden-import=pandas._libs.tslibs.np_datetime
Obviamente, você pode incluir outros argumentos como, por exemplo, –onefile, –console, –clean, etc…
Este comando vai fazer com que o pyinstaller busque esta biblioteca mesmo sem achar que precisa dela.
Se quiser saber todos os imports que precisam ser incluídos, utilize o argumento -v para habilitar o modo verbose, que vai mostrar uma pancada de informações, inclusive os módulos que precisarão ser importados separadamente.
2. Criando hooks de importação
O hook (gancho) de importação é mais ou menos a mesma coisa do método acima, mas você já deixa pre-definido o que precisa ser importado quando um determinado pacote for utilizado.
Para criar/modificar um hook, siga os passos abaixo:
- No diretório de instalação do Python (geralmente “c:\program files\Python”), acesse o caminho: Lib\site-packages\PyInstaller\hooks;
- Se o arquivo hook-pandas.py não existir, crie um com este nome. (Não se preocupe, ele não possui um cabeçalho ou formato padrão que você precise seguir);
- Adicione a seguinte linha no arquivo: hiddenimports = [“pandas._libs.tslibs.np_datetime”]
- Salve o arquivo.
Pronto! Você já conseguirá utilizar o pyinstaller para gerar seu executável.
Caso precise, pode adicionar outros módulos do Pandas a este arquivo. Para conseguir gerar os executáveis dos projetos que sou responsável, utilizo a seguinte linha no arquivo hook-pandas.py:
hiddenimports = ["pandas._libs.tslibs.np_datetime", "pandas._libs.tslibs.nattype", "pandas._libs.skiplist"]
Esta mesma lógica pode ser aplicada a outros módulos que estão apresentando problemas similares. Obviamente, você vai precisar criar outro arquivo hook-<modulo>.py (ou editar, caso ele já exista).
Espero ter ajudado!