Python para Desenvolvedores

2ª edição, revisada e ampliada

Capítulo 40: Empacotamento e distribuição


Geralmente é bem mais simples distribuir aplicações na forma de binário, em que basta rodar um executável para iniciar a aplicação, do que instalar todas as dependências necessárias em cada máquina em que se deseja executar a aplicação.

Existem vários softwares que permitem gerar executáveis a partir de um programa feito em Python, como o Py2exe e cx_Freeze.

Empacotamento

O Py2exe só funciona na plataforma Windows, porém possui muitos recursos, podendo gerar executáveis com interface de texto, gráficos, serviços (programas que rodam sem intervenção do usuário, de forma semelhante aos daemons nos sistemas UNIX) e servidores COM (arquitetura de componentes da Microsoft).

O cx_Freeze é portável, podendo rodar em ambientes UNIX, porém é bem menos versátil que o Py2exe.

Para usar o Py2exe, é preciso criar um script, que normalmente se chama setup.py, que diz ao Py2exe o que é necessário para gerar o executável.

Exemplo de setup.py:

In [ ]:
"""
Exemplo de uso do py2exe
"""
from distutils.core import setup
import py2exe

setup(name = 'SIM - Sistema Interativo de Música',
    service = ['simservice'],
    console = ['sim.py', 'simimport.py'],
    windows = ['simgtk.py'],
    options = {'py2exe': {
        'optimize': 2,
        'includes': ['atk', 'gobject', 'gtk','gtk.glade',
        'pango', 'cairo', 'pangocairo']
    }},
    data_files=[('',['janela.glade', 'sim.ico'])],
    description = 'Primeira Versão...',
    version = '1.0')

No exemplo, temos um sistema que é composto por dois utilitários de linha comando, um aplicativo com interface gráfica e um serviço. O aplicativo com GUI depende do GTK+ para funcionar e foi desenvolvido usando Glade.

Entre os parâmetros do Py2exe, os mais usuais são:

  • name: nome da aplicação.
  • service: lista de serviços.
  • console: lista de programas com interface de texto.
  • windows: lista de programas com interface gráfica.
  • options['py2exe']: dicionário com opções que alteram o comportamento do Py2exe:
  • optimize: 0 (otimização desativada, bytecode padrão), 1 (otimização ativada, equivale ao parâmetro -O do interpretador) ou 2 (otimização com remoção de Doc Strings ativada, equivale ao parâmetro -OO do interpretador).
  • includes: lista de módulos que serão incluídos como dependências. Geralmente, o Py2exe detecta as dependências sem necessidade de usar esta opção.
  • data_files: outros arquivos que fazem parte da aplicação, tais como imagens, ícones e arquivos de configuração.
  • description: comentário.
  • version: versão da aplicação, como string.

Para gerar o executável, o comando é:

python setup.py py2exe

O Py2exe criará duas pastas:

  • build: arquivos temporários.
  • dist: arquivos para distribuição.

Entre os arquivos para distribuição, w9xpopen.exe é necessário apenas para as versões antigas do Windows (95 e 98) e pode ser removido sem problemas em versões mais recentes.

Pela linha de comando também é possível passar algumas opções interessantes, como o parâmetro -b1, para gerar menos arquivos para a distribuição.

O cx_Freeze é um utilitário de linha de comando.

FreezePython -OO -c sim.py

A opção -c faz com que o bytecode seja comprimido no formato zip.

FreezePython -OO --include-modules=atk,cairo,pango,pangocairo simgtk.py

A opção --include-modules, permite passar uma lista de módulos que serão incluídos na distribuição.

Tanto o Py2exe quanto o cx_Freeze não são compiladores. O que eles fazem é empacotar os bytecodes da aplicação, suas dependências e o interpretador em (pelo menos) um arquivo executável (e arquivos auxiliares) que não dependem do ambiente em que foram gerados. Com isso, a distribuição do aplicativo se torna bem mais simples. Entretanto, não há ganho de performance em gerar executáveis, exceto pela carga da aplicação para a memória em alguns casos.

Eles também não geram programas de instalação. Para isso, é necessário o uso de um software específico. Os instaladores são gerados por aplicativos que se encarregam de automatizar tarefas comuns do processo de instalação. São exemplos de softwares dessa categoria: Inno Setup e NSIS.

In [1]:
 
Out[1]: