py2exe

[parcialmente reescrito em 04 de abril de 2015]
[revisado em 05 de dezembro de 2015]

Essencialmente programar envolve escrever comandos usando códigos (às vezes nem tão) estranhos e clicar em alguma coisa pra ver os comandos fazendo alguma coisa.

Quem conhece a linguagem C está familiarizado com o arquivo com os tais códigos estranhos gerando um outro arquivo, com extensão *.exe após uma compilação (às vezes nem tão) bem sucedida.
A compilação é a etapa que transforma o código (às vezes nem tão) humano em um conjunto de instruções mais primitivas, digamos. No fim das contas tudo vai ser traduzido para cadeias de 0 e 1. Essa é a única linguagem que a estrutura elétrica do computador entende.
Em última análise o computador não tem ideia do que “printf(“Texto!”);” significa. O que ele entende se aproxima mais de “000101010001101111101010101101001“. Então esse é o papel do compilador, servir como um Google Tradutor da linguagem que você tá programando para a linguagem de máquina.
Outra coisa interessante é que o arquivo *.exe é um tipo de arquivo relacionado à sistemas baseados em DOS, como o Windows. Sistemas como Ubuntu são baseados em Unix. Quando você compila um código escrito em C no Ubuntu, um código com extensão *.o é gerado.

O processo acima é comum pra qualquer linguagem de programação, mas a diferença entre um programa *.c e um *.py é que pra executar o código escrito em C é preciso compilar, o que vai gerar o tal arquivo executável. No Python esse arquivo executável não é gerado, basta (em Windows) dar um duplo clique no arquivo e já era.
Acontece que Python é uma linguagem de scripting, e basicamente só precisa de um interpretador pra ser executada. O interpretador faz o papel de tradutor (compilador).

Uma linguagem de scripting como Python tem a vantagem de permitir que qualquer máquina com um instalador consiga executar qualquer script, independente do sistema onde ele foi desenvolvido. Isso é ótimo pra portabilidade.
No entanto não é comum que máquinas tenham o interpretador de Python (conhecido como IDLE, de Interface Integrated DeveLopment Environment), enquanto que em versões mais recentes do Ubuntu o Python não apenas vem instalado como é parte essencial de alguns recursos do sistema.
Como temos bem mais usuários de Windows no mundo que de outros sistemas muitas vezes pode parecer interessante tornar a execução de um determinado script mais fácil na vida de um usuário Windows. Um arquivo *.exe seria a solução. Felizmente existe um programa que faz isso.

Assim como o Py2Sys (que eu já citei num outro post), o Py2Exe faz algumas bruxarias bem complexas – de modo que eu não tenho a menor condição de explicar – mas essencialmente todo essa magia vai transformar seu arquivo *.py em *.exe via linhas de comando do Windows (isso já dá a dica que esse programa é feito para Windows, portanto deve ser executado em Windows e não, infelizmente não tem versão pra qualquer distribuição baseada em Linux – pelo menos não que eu saiba).

Escolha uma versão do py2exe compatível com a versão do Python instalada em sua máquina (que por sua vez deve ser compatível com a arquitetura do seu sistema operacional). Feito isso, vamos ao processo:

(1) Crie um arquivo *.py com um código qualquer (que funcione.) No meu caso eu acrescentei o módulo Tkinter¹, que é standard, para tornar o resultado final mais “apresentável”, digamos.

#arquivo: test.py

from Tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()

(2) Depois crie um outro arquivo *.py. O padrão é que esse arquivo tenha o nome “setup.py”. O conteúdo desse outro arquivo é o que vai falar pro py2exe qual script será transformado em *.exe.


#arquivo: setup.py

from distutils.core import setup
import py2exe

setup(console=["test.py"])

(3) Pronto! Agora abra o Prompt de comando do Windows ( Winkey + R > cmd > [ENTER].)
Depois vá para o diretório onde estão seus scripts (mais detalhes, logo abaixo). No meu caso os arquivos estão no Desktop e são test.py e setup.py.
Veja como a tela tem que ficar ao fim deste passo:

cd Desktopcd é o comando do prompt que me faz navegar entre as pastas. No caso o Desktop, por padrão,  é uma pasta contida na pasta de usuário do diretório Documents and Settings.
Em outras palavras, eu usei o comando cd pra me mover de C:\Documents and Settings\Usuário para C:\Documents and Settings\Usuário\Desktop, que é onde meus scripts estão.

python setup.py py2exe – No caso, python é o comando que chama o programa Python, setup.py indica que o Python tem que executá-lo e py2exe invoca o programa que faz a conversão seguindo as instruções contidas no setup.py.

(4) Depois de pressionar Enter, se tudo der certo, algumas letras vão subir (os processos) e assim que parar, dois novos diretórios vão surgir no diretório onde os scripts estavam inicialmente. Um chamado build e outro chamado dist.
É no dist que estará o seu executável. Ele terá o mesmo nome do script principal (o que não é o setup) porém agora será *.exe. Para executar você pode tanto clicar duas vezes sob o arquivo ou navegar até a página via linha de comando e executar o programa por lá mesmo. Veja abaixo.

Tanto clicando quanto digitando os comandos, se tudo foi feito sem qualquer erro, o programa será executado. Detalhe: em qualquer computador e sem a necessidade de se instalar o Python.

Resultado final.

É isso! Como disse no início, se você fez um script simples, apenas prompt será aberto exibindo dados ou aguardando comandos, igual a programas compilados em C. No meu caso, o Tkinter fez o código ser aberto na janelinha.


¹(Tkinter é um módulo que serve para criar interface gráfica, ou GUI, Graphic User Interface. Resumindo: eu usei este módulo para criar a janelinha, caso contrário, o resultado ia aparecer no prompt do Windows, o que poderia causar certa confusão ou ofuscar a beleza do Py2exe.)

Anúncios

30 comentários sobre “py2exe

  1. Quando vou criar o executável pelo cmd recebo este erro:
    ImportError: No module named py2exe
    Eu edito os arquivos pelo Idle do Python e lá eu consigo importar o py2exe sem problemas.
    O que pode ter acontecido?

    Curtir

  2. Oi, quando tento converter meu arquivo python ele dá vários erros com relação a Dll’s principalmente na parte da interface gráfica. Você sabe o que pode ser? A interface gráfica que eu utilizo é o QtDesigner. Meu computador é um win64bits e a versão do python 2.7
    Obrigada

    Curtir

  3. Esse é o erro que aparece:
    File “OpenOPC.pyc”, line 40, in
    File “win32com\client\gencache.pyc”, line 649, in Rebuild
    File “win32com\client\gencache.pyc”, line 65, in _SaveDicts
    File “win32com\client\gencache.pyc”, line 141, in GetGeneratePath
    IOError: [Errno 2] No such file or directory: ‘C:\\….\\dist\\library.zip\\win32com\\gen_py\\__init__.py’

    Muito obrigada pela sua ajuda!

    Curtir

    1. Dei uma pesquisada e encontrei alguém com o mesmo problema que você envolvendo algo relacionado ao iTunes. A resposta seria algo como:

      ” Esse erro é causado por um aplicativo py2exe; tais aplicativos são incapazes de gerar arquivos *.py de typelibs COM, mas eles são capazes de gerá-los durante a compilação e distribuí-los com o aplicativo. Você deveria pedir para quem colocou o arquivo para ler documentos py2exe para aprender como incorporar os arquivos gerados para iTunes diretamente dentro do aplicativo.”

      Infelizmente por não saber muito sobre OpenOPC e por nunca ter tentado nada mais avançado com py2exe, não consegui achar mais nada significativo.
      Vi na página do OpenOPC que a versão 1.2 teve os arquivos opc.py e OpenOPCService.py modificados para poder serem compilados tanto com py2exe quanto por PyInstaller. Espero que você tenha sorte com o py2exe, mas se não tiver jeito mesmo de corrigir o problema acho que vale a pena tentar o PyInstaller.

      Boa sorte, qualquer coisa é estamos aí!

      Curtir

  4. estou a obter o seguinte erro como resolvo?

    running py2exe
    Traceback (most recent call last):
    File “setup.py”, line 6, in
    setup(console=[“test.py”])
    File “C:\Python3\lib\distutils\core.py”, line 148, in setup
    dist.run_commands()
    File “C:\Python3\lib\distutils\dist.py”, line 955, in run_commands
    self.run_command(cmd)
    File “C:\Python3\lib\distutils\dist.py”, line 974, in run_command
    cmd_obj.run()
    File “C:\Python3\lib\site-packages\py2exe\distutils_buildexe.py”, line 188, in run
    self._run()
    File “C:\Python3\lib\site-packages\py2exe\distutils_buildexe.py”, line 267, in _run
    builder.analyze()
    File “C:\Python3\lib\site-packages\py2exe\runtime.py”, line 160, in analyze
    self.mf.import_hook(modname)
    File “C:\Python3\lib\site-packages\py2exe\mf3.py”, line 120, in import_hook
    module = self._gcd_import(name)
    File “C:\Python3\lib\site-packages\py2exe\mf3.py”, line 274, in _gcd_import
    return self._find_and_load(name)
    File “C:\Python3\lib\site-packages\py2exe\mf3.py”, line 357, in _find_and_load
    self._scan_code(module.__code__, module)
    File “C:\Python3\lib\site-packages\py2exe\mf3.py”, line 388, in _scan_code
    for what, args in self._scan_opcodes(code):
    File “C:\Python3\lib\site-packages\py2exe\mf3.py”, line 417, in _scan_opcodes
    yield “store”, (names[oparg],)
    IndexError: tuple index out of range

    Curtir

    1. Olá, em qual etapa do processo esse erro ocorre? (lembrando que o texto está baseado em Python 2.7, você está usando Python 3, não tenho ideia se os procedimentos são iguais)

      Curtir

Comentário:

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s