Pular para o conteúdo

Empacotar

.app, .exe e binário — e as três coisas que o PyInstaller cobra sem avisar.

dataforge desktop empacotar gera o lançador e chama o PyInstaller. É a mesma escolha do iot carregar, que chama o arduino-cli: empacotar um interpretador Python é um problema resolvido, e resolvê-lo de novo daria um subconjunto pior amarrado a esta linguagem.

bash
$ dataforge desktop doctor
   Tk                   versão 8.6
   display               para onde desenhar
   PyInstaller          /usr/local/bin/pyinstaller
   alvo desta máquina   .app (macOS)

$ dataforge desktop empacotar src/main.df --nome=Caixa
empacotando 'Caixa'…
pronto: dist/

As três coisas que ele cobra sem avisar#

O quêO sintomaO que o comando faz
import lazy"No module named 'dataforge'" — parece falta de instalaçãoo lançador importa no topo, onde a análise estática enxerga
instalação editávelidem, e só na máquina de quem desenvolvepassa --paths com a raiz do pacote
só o arquivo de entradamorre no primeiro adopt ./vizinhoempacota a pasta inteira do programa

As três produzem o mesmo tipo de falha: o executável monta, abre e morre — e a mensagem fala de uma biblioteca que quem escreveu nunca viu. Foram os três defeitos desta implementação, nesta ordem.

E a guarda do `__main__`#

dataforge
// O lançador gerado tem isto, e não é decoração:
//
//     if __name__ == "__main__":
//         multiprocessing.freeze_support()
//         main()
//
// Sem ela, o 'spawn' de map_processos reexecuta o APLICATIVO INTEIRO
// em cada trabalhador — e a mensagem fala de "bootstrapping phase",
// vocabulário do multiprocessing, três camadas longe de quem chamou.
adopt Arcane.Concurrent as C
assert C.nucleos() >= 1
out "num executável congelado, freeze_support() vem ANTES de main()"

O que sai, por sistema#

SistemaSaiO que o usuário vê
macOSdist/Nome.app e dist/Nomeo aviso do Gatekeeper até você assinar e notarizar
Windowsdist/Nome.exeo SmartScreen, até o executável ter reputação ou assinatura
Linuxdist/Nomedepende da libc de quem construiu — construa na distro mais antiga que você suporta

O que NÃO existe#

  • Assinatura e notarização — é conta de desenvolvedor da Apple, e o comando não a pede nem a esconde.
  • Instalador (.dmg, .msi, .deb do seu app) — o que sai é o executável.
  • Atualização automática.
  • Compilação cruzada: um .exe se faz no Windows, e um .app no macOS. O PyInstaller não cruza, e nenhuma opção aqui finge que cruza.