[Resolvido] No module named ‘pandas.*’ in PyInstaller. (Python)

[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:

  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!