[Resolvido] No module named ‘pandas.*’ in PyInstaller. (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:

  1. No diretório de instalação do Python (geralmente “c:\program files\Python“), acesse o caminho: Lib\site-packages\PyInstaller\hooks;
  2. 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);
  3. Adicione a seguinte linha no arquivo: hiddenimports = [“pandas._libs.tslibs.np_datetime”]
  4. 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!

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , .