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 há 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 sintoma | O que o comando faz |
|---|---|---|
| import lazy | "No module named 'dataforge'" — parece falta de instalação | o lançador importa no topo, onde a análise estática enxerga |
| instalação editável | idem, e só na máquina de quem desenvolve | passa --paths com a raiz do pacote |
| só o arquivo de entrada | morre no primeiro adopt ./vizinho | empacota 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#
| Sistema | Sai | O que o usuário vê |
|---|---|---|
| macOS | dist/Nome.app e dist/Nome | o aviso do Gatekeeper até você assinar e notarizar |
| Windows | dist/Nome.exe | o SmartScreen, até o executável ter reputação ou assinatura |
| Linux | dist/Nome | depende 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,.debdo seu app) — o que sai é o executável. - Atualização automática.
- Compilação cruzada: um
.exese faz no Windows, e um.appno macOS. O PyInstaller não cruza, e nenhuma opção aqui finge que cruza.