{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Cap\u00edtulo 40: Empacotamento e distribui\u00e7\u00e3o\n",
"=============================\n",
"_____________________________\n",
"Geralmente \u00e9 bem mais simples distribuir aplica\u00e7\u00f5es na forma de bin\u00e1rio, em que basta rodar um execut\u00e1vel para iniciar a aplica\u00e7\u00e3o, do que instalar todas as depend\u00eancias necess\u00e1rias em cada m\u00e1quina em que se deseja executar a aplica\u00e7\u00e3o.\n",
"\n",
"Existem v\u00e1rios softwares que permitem gerar execut\u00e1veis a partir de um programa feito em Python, como o [Py2exe](http://www.py2exe.org/) e [cx_Freeze](http://starship.python.net/crew/atuining/cx_Freeze/).\n",
"\n",
"![Empacotamento](files/bpypd_diags35.png)\n",
"\n",
"O Py2exe s\u00f3 funciona na plataforma Windows, por\u00e9m possui muitos recursos, podendo gerar execut\u00e1veis com interface de texto, gr\u00e1ficos, servi\u00e7os (programas que rodam sem interven\u00e7\u00e3o do usu\u00e1rio, de forma semelhante aos *daemons* nos sistemas UNIX) e servidores COM (arquitetura de componentes da Microsoft).\n",
"\n",
"O cx_Freeze \u00e9 port\u00e1vel, podendo rodar em ambientes UNIX, por\u00e9m \u00e9 bem menos vers\u00e1til que o Py2exe.\n",
"\n",
"Para usar o Py2exe, \u00e9 preciso criar um *script*, que normalmente se chama `setup.py`, que diz ao Py2exe o que \u00e9 necess\u00e1rio para gerar o execut\u00e1vel.\n",
"\n",
"Exemplo de `setup.py`:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"\"\"\n",
"Exemplo de uso do py2exe\n",
"\"\"\"\n",
"from distutils.core import setup\n",
"import py2exe\n",
"\n",
"setup(name = 'SIM - Sistema Interativo de M\u00fasica',\n",
" service = ['simservice'],\n",
" console = ['sim.py', 'simimport.py'],\n",
" windows = ['simgtk.py'],\n",
" options = {'py2exe': {\n",
" 'optimize': 2,\n",
" 'includes': ['atk', 'gobject', 'gtk','gtk.glade',\n",
" 'pango', 'cairo', 'pangocairo']\n",
" }},\n",
" data_files=[('',['janela.glade', 'sim.ico'])],\n",
" description = 'Primeira Vers\u00e3o...',\n",
" version = '1.0')"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"No exemplo, temos um sistema que \u00e9 composto por dois utilit\u00e1rios de linha comando, um aplicativo com interface gr\u00e1fica e um servi\u00e7o. O aplicativo com GUI depende do GTK+ para funcionar e foi desenvolvido usando Glade.\n",
"\n",
"Entre os par\u00e2metros do Py2exe, os mais usuais s\u00e3o:\n",
"\n",
"+ *name*: nome da aplica\u00e7\u00e3o.\n",
"+ *service*: lista de servi\u00e7os.\n",
"+ *console*: lista de programas com interface de texto.\n",
"+ *windows*: lista de programas com interface gr\u00e1fica.\n",
"+ *options['py2exe']*: dicion\u00e1rio com op\u00e7\u00f5es que alteram o comportamento do Py2exe:\n",
"+ *optimize*: 0 (otimiza\u00e7\u00e3o desativada, bytecode padr\u00e3o), 1 (otimiza\u00e7\u00e3o ativada, equivale ao par\u00e2metro `-O` do interpretador) ou 2 (otimiza\u00e7\u00e3o com remo\u00e7\u00e3o de Doc Strings ativada, equivale ao par\u00e2metro `-OO` do interpretador).\n",
"+ *includes*: lista de m\u00f3dulos que ser\u00e3o inclu\u00eddos como depend\u00eancias. Geralmente, o Py2exe detecta as depend\u00eancias sem necessidade de usar esta op\u00e7\u00e3o.\n",
"+ *data_files*: outros arquivos que fazem parte da aplica\u00e7\u00e3o, tais como imagens, \u00edcones e arquivos de configura\u00e7\u00e3o.\n",
"+ *description*: coment\u00e1rio.\n",
"+ *version*: vers\u00e3o da aplica\u00e7\u00e3o, como string.\n",
"\n",
"Para gerar o execut\u00e1vel, o comando \u00e9:\n",
"\n",
" python setup.py py2exe\n",
" \n",
"O Py2exe criar\u00e1 duas pastas:\n",
"\n",
"+ build: arquivos tempor\u00e1rios.\n",
"+ dist: arquivos para distribui\u00e7\u00e3o.\n",
"\n",
"Entre os arquivos para distribui\u00e7\u00e3o, `w9xpopen.exe` \u00e9 necess\u00e1rio apenas para as vers\u00f5es antigas do Windows (95 e 98) e pode ser removido sem problemas em vers\u00f5es mais recentes.\n",
"\n",
"Pela linha de comando tamb\u00e9m \u00e9 poss\u00edvel passar algumas op\u00e7\u00f5es interessantes, como o par\u00e2metro `-b1`, para gerar menos arquivos para a distribui\u00e7\u00e3o.\n",
"\n",
"O cx_Freeze \u00e9 um utilit\u00e1rio de linha de comando.\n",
"\n",
" FreezePython -OO -c sim.py\n",
" \n",
"A op\u00e7\u00e3o `-c` faz com que o *bytecode* seja comprimido no formato *zip*.\n",
"\n",
" FreezePython -OO --include-modules=atk,cairo,pango,pangocairo simgtk.py\n",
" \n",
"A op\u00e7\u00e3o `--include-modules`, permite passar uma lista de m\u00f3dulos que ser\u00e3o inclu\u00eddos na distribui\u00e7\u00e3o.\n",
"\n",
"Tanto o Py2exe quanto o cx_Freeze n\u00e3o s\u00e3o compiladores. O que eles fazem \u00e9 empacotar os *bytecodes* da aplica\u00e7\u00e3o, suas depend\u00eancias e o interpretador em (pelo menos) um arquivo execut\u00e1vel (e arquivos auxiliares) que n\u00e3o dependem do ambiente em que foram gerados. Com isso, a distribui\u00e7\u00e3o do aplicativo se torna bem mais simples. Entretanto, n\u00e3o h\u00e1 ganho de performance em gerar execut\u00e1veis, exceto pela carga da aplica\u00e7\u00e3o para a mem\u00f3ria em alguns casos.\n",
"\n",
"Eles tamb\u00e9m n\u00e3o geram programas de instala\u00e7\u00e3o. Para isso, \u00e9 necess\u00e1rio o uso de um software espec\u00edfico. Os instaladores s\u00e3o gerados por aplicativos que se encarregam de automatizar tarefas comuns do processo de instala\u00e7\u00e3o. S\u00e3o exemplos de softwares dessa categoria: [Inno Setup](http://www.jrsoftware.org/isinfo.php) e [NSIS](http://www.jrsoftware.org/isinfo.php)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}