Python, poderoso e versátil como ele é, carece de algumas capacidades chave fora da caixa. Por um lado, o Python não fornece nenhum mecanismo nativo para compilar um programa Python em um pacote executável autônomo.

para ser justo, o caso de uso original para Python nunca foi chamado para pacotes autônomos. Os programas Python foram executados em sistemas onde uma cópia do interpretador Python viveu. Mas a crescente popularidade do Python criou uma maior demanda para executar aplicativos Python em sistemas sem tempo de execução em Python instalado.,

vários terceiros têm soluções de engenharia para a implantação de aplicativos de Python autônomos. A solução mais popular do grupo, e a mais madura, é PyInstaller. PyInstaller não faz o processo de empacotar um aplicativo Python para ir totalmente indolor, mas vai um longo caminho lá.

neste artigo vamos explorar o básico de usar o PyInstaller, incluindo como o PyInstaller funciona, como usar o PyInstaller para criar um executável independente em Python, como afinar os executáveis em Python que você cria, e como evitar algumas das armadilhas comuns que vão com o uso do PyInstaller.,

Creating a PyInstaller package

PyInstaller is a Python package, installed with pip (pip install pyinstaller). PyInstaller pode ser instalado em sua instalação padrão Python, mas é melhor criar um ambiente virtual para o projeto que você quer empacotar e instalar PyInstaller lá.

PyInstaller funciona lendo o seu programa Python, analisando todas as importações que ele faz, e agrupando cópias dessas importações com o seu programa. O PyInstaller lê no seu programa a partir do seu ponto de entrada., Por exemplo, se o ponto de entrada do seu programa for myapp.py, você executaria pyinstaller myapp.py para realizar a análise. PyInstaller pode detectar e empacotar automaticamente muitos pacotes Python comuns, como o NumPy, mas você pode precisar fornecer dicas em alguns casos. (Mais sobre isso mais tarde.)

Depois de analisar o seu código e descobrir todas as bibliotecas e módulos que ele usa, PyInstaller então gera um ” arquivo spec.”Um script em Python com a extensão .spec, este arquivo inclui detalhes sobre como seu aplicativo em Python precisa ser empacotado., A primeira vez que você executar o PyInstaller no seu aplicativo, o PyInstaller irá gerar um arquivo spec do zero e populá-lo com alguns padrões sãos. Não Descartes este ficheiro, é a chave para refinar uma instalação de PyInstaller!

finalmente, o PyInstaller tenta produzir um executável a partir do aplicativo, junto com todas as suas dependências. Quando estiver terminado, irá aparecer uma subpasta chamada dist (por omissão; poderá indicar um nome diferente) na pasta do projecto., Isto por sua vez contém um diretório que é o seu aplicativo empacotado-ele tem um id

arquivo para executar, juntamente com todas as bibliotecas e outros arquivos suplementares necessários.

tudo o que você precisa fazer para distribuir o seu programa, então, é empacotar este diretório como um id

arquivo ou algum outro pacote. O pacote normalmente precisa ser extraído em um diretório onde o usuário tem permissões de escrita para executar.

IDG

Um .o arquivo spec é usado para criar um executável com o PyInstaller., Note os espaços de nomes listados em excludes. Estes serão deixados fora do pacote criado para salvar o espaço.

testando um pacote PyInstaller

há uma chance justa de sua primeira tentativa de usar PyInstaller para empacotar um aplicativo não será completamente bem sucedida.

para verificar se o seu pacote PyInstaller funciona, navegue para a pasta que contém o executável agrupado e execute o ficheiro .exe a partir da linha de comandos., Se ele não funcionar, os erros que você verá impressos na linha de comando devem fornecer uma dica sobre o que está errado.

A razão mais comum de um pacote PyInstaller falhar é que PyInstaller não conseguiu agrupar um arquivo necessário. Tais arquivos em falta caem em algumas categorias:

  • Importações escondidas ou em falta: às vezes o PyInstaller não consegue detectar a importação de um pacote ou biblioteca, tipicamente porque é importado dinamicamente. O pacote ou biblioteca terá de ser especificado manualmente.,arquivos autônomos em falta: se o programa depende de arquivos de dados externos que precisam ser empacotados com o programa, o PyInstaller não tem como saber. Terá de incluir manualmente os ficheiros.
  • binários em falta: aqui novamente, se o seu programa depende de uma binária externa como a.Se o PyInstaller não conseguir detectar, terá de O incluir manualmente.

a boa notícia é que o PyInstaller fornece uma maneira fácil de lidar com os problemas acima., The .spec file created by PyInstaller includes fields we can fill in to provide the details that PyInstaller missed.

abra o .specfile in a text editor and look for the definition of theAnalysis object. Vários dos parâmetros passados para Analysis está em branco listas, mas eles podem ser editados para especificar os detalhes que faltam:

  • hiddenimports ocultos ou falta importações: Adicionar a esta lista um ou mais strings com os nomes das bibliotecas você deseja incluídos com o aplicativo., Se você quiser adicionar pandas e bokeh, por exemplo, você poderia especificar que . Note que as bibliotecas em questão devem ser instaladas na mesma instância do Python onde você está executando o PyInstaller.
  • datas para os ficheiros independentes em falta: adicione aqui uma ou mais especificações para os ficheiros na sua árvore de projecto que deseja incluir no seu projecto., Cada ficheiro tem de ser passado como uma tupla que indique a localização relativa do ficheiro na pasta do seu projecto e a localização relativa dentro da pasta de distribuição onde deseja colocar o ficheiro. Por exemplo, se você tiver um arquivo ./models/mainmodel.dat que você queria incluir na sua aplicação, e você quer colocá-lo em uma correspondência subdiretório no diretório de distribuição, você deve usar ('./models/mainmodel.dat','./models') como uma entrada hiddenimports lista. Note que você pode usar glob-estilo wildcards para especificar mais de um arquivo.,
  • binaries falta autônomo binários: Como datas, você pode usar binaries para passar uma lista de tuplas que especifique os locais de binários na árvore de projeto e seus destinos no diretório de distribuição. Mais uma vez, você pode usar glob-estilo wildcards.

tenha em mente que qualquer uma das listas passadas para Analysis pode ser programaticamente gerada mais cedo no arquivo .spec., Afinal, o arquivo .spec é apenas um script em Python com outro nome.

Depois de fazer alterações no.spec file, reponha o PyInstaller para reconstruir o pacote. No entanto, a partir de Agora, não se esqueça de passar o arquivo modificado .speccomo o parâmetro (por exemplo,pyinstaller myapp.spec). Testar o executável como antes. Se algo ainda estiver quebrado, você pode re-editar o id

arquivo e repetir o processo até que tudo funcione.,

finalmente, quando estiver satisfeito com tudo o que funciona como previsto, poderá querer editar o ficheiro

para evitar que a sua aplicação embalada apresente uma janela da linha de comandos quando for lançada. In theEXEobject settings in the.specfile, setconsole=False. Suprimir a consola é útil se a sua aplicação tiver uma interface gráfica e não quiser uma janela espúria de linha de comandos a desviar os utilizadores. Claro, não altere esta configuração se a sua aplicação necessitar de uma linha de comando.,depois de ter o seu aplicativo embalado com PyInstaller e funcionando corretamente, a próxima coisa que você provavelmente vai querer fazer é reduzi-lo um pouco. Os pacotes PyInstaller não são conhecidos por serem svelte.

porque Python é uma linguagem dinâmica, é difícil prever o que será necessário em tempo de execução por um dado programa. Por essa razão, quando o PyInstaller detecta uma importação de pacotes, ele inclui tudo nesse pacote, quer seja ou não realmente usado em tempo de execução pelo seu programa.

Aqui está a boa notícia., PyInstaller inclui um mecanismo para excluir seletivamente pacotes inteiros, ou espaços de nomes individuais dentro de pacotes. Por exemplo, vamos dizer que o seu programa de importações pacote foo, que inclui foo.bar e foo.bip. Se você sabe por um fato que seu programa só usa lógica em foo.bar, você pode excluir com segurança foo.bip e salvar algum espaço.

Para fazer isso, você pode usar o excludes parâmetro passado para o Analysis objeto .spec arquivo., Você pode passar uma lista de nomes — módulos de nível superior, ou espaços de nomes pontilhados-para excluir do seu pacote. Por exemplo, para excluir foo.bip, você simplesmente especificaria .

IDG

a pasta de entrega criada pelo PyInstaller. Devido ao grande número de arquivos no diretório, um projeto de Instalador de terceiros como NSIS pode ser usado para empacotar o diretório em um arquivo de auto-extração, e criar automaticamente um atalho para o executável.,

uma exclusão comum que você pode fazer étkinter, a biblioteca Python para criar interfaces gráficas multi-plataforma simples. Por padrão, tkinter e todos os seus arquivos de suporte são embalados com um projeto PyInstaller. Se você não estiver usando o tkinter no seu projeto, você pode excluí-la adicionando 'tkinter' excludes lista. Omitir tkinter reduzirá o tamanho da embalagem em cerca de 7 MB.outra exclusão comum é as suites de teste., Se um pacote que o seu programa importa tem um conjunto de testes, o conjunto de testes pode acabar por ser incluído no seu pacote PyInstaller. A menos que você realmente executar a suíte de teste em seu programa implantado, você pode excluí-lo com segurança.

tenha em mente que as embalagens criadas com exclusões devem ser cuidadosamente testadas antes de serem utilizadas. Se você acabar excluindo a funcionalidade que é usada em algum cenário futuro que você não antecipou, seu aplicativo vai quebrar.

dicas de PyInstaller

  • Construa o seu pacote de PyInstaller no sistema operacional em que pretende implantar., O PyInstaller não suporta compilações multi-plataforma. Se você precisar implantar seu aplicativo de Python autônomo em MacOS, Linux e sistemas Windows, então você precisará instalar o PyInstaller e construir versões separadas do aplicativo em cada um desses sistemas operacionais.
  • Construa o seu pacote PyInstaller à medida que desenvolve a sua aplicação. Assim que souber que irá implantar o seu projecto com o PyInstaller, construa o seu ficheiro .spec e comece a refinar o pacote PyInstaller em paralelo com o desenvolvimento do seu aplicativo., Desta forma, você pode adicionar exclusões ou inclusões à medida que você vai, e testar a forma como novos recursos são implantados com o aplicativo enquanto você os escreve.
  • Não utilize o modo do PyInstaller --onefile. O PyInstaller inclui um comutador de linha de comando, --onefile, que embala toda a sua aplicação num único executável de auto-extracção. Isto soa como uma grande idéia-você só tem que entregar um arquivo! – mas tem algumas armadilhas. Sempre que você executar o aplicativo, ele deve primeiro desempacotar todos os arquivos dentro do executável para um diretório temporário., Se o aplicativo é grande (200MB, por exemplo), desempacotar pode significar um atraso de vários segundos. Use o modo de diretório único padrão em vez disso, e basta empacotar tudo como um id

    arquivo.

  • crie um instalador para a sua aplicação PyInstaller. Se você quiser alguma maneira de implantar sua aplicação que não a.zip file, considere usar um utilitário instalador como o open source Nullsoft Scriptable Install System. Ele adiciona muito pouco overhead para o tamanho do entregável e permite que você configure muitos aspectos do processo de instalação, como criar atalhos para o seu executável.,
  • Não espere speedups. PyInstaller é um sistema de embalagem, não um compilador ou um otimizador. O código empacotado com o PyInstaller não é executado mais rápido do que seria quando executado no sistema original. Se você quiser acelerar o código Python, use uma biblioteca C-acelerada adequada para a tarefa, ou um projeto como Cython.,w para acelerar Python
  • Como instalar o Python de maneira inteligente
  • Melhor Python gerenciamento de projetos com a Poesia
  • Virtualenv e venv: Python ambientes virtuais explicado
  • Python virtualenv e venv de fazer e não fazer
  • Python threading e subprocessos explicado
  • Como usar o depurador Python
  • Como usar timeit de perfil de código Python
  • Como usar cProfile de perfil de código Python
  • Começar com assíncrona em Python
  • Como usar asyncio em Python
  • Como converter Python para JavaScript (e de volta)