em Github, Português, programação, Python, windows

Como criar um programa com Auto-Update utilizando Python e Esky

Essa é a segunda parte da série de Posts Distribuir Programas em Python para Desktops Windows. Se quiser, veja o primeiro post: Como criar um executável com Instalador MSI em Python

Sempre que um programa precisa ser atualizado parece um parto. Lembre-se de todas as vezes você teve que baixar a versão atualizada do Java, lembra bem dessa raiva que você sentiu ao ter que fazer isso e imagine que seu usuário sinta a mesma raiva que você, então seja legal e faça um auto-update no seu programa para que ninguém precise baixar as versões novas. Para aprender como criar um programa com Auto-Update utilizando Python e Esky eu vou usar o aplicativo boneca criado na parte 1.

Até aqui tudo normal, o programa está feito, foi compilado mas não tem auto-update, você simplesmente gerou um instalador da boneca e nunca mais vai atualizar esse programa no cliente que o instalou, então você precisa fazer alterações e gerar um novo executável.

Bom, vamos ter que instalar um package chamado Esky:

pip install esky

Agora vamos fazer alterações no código, primeiro no script da Boneca.py precisamos importar o esky e pedir pra ele procurar por atualizações na internet quando estiverem disponíveis.

#Coloque abaixo de import win32con
import esky

if hasattr(sys,"frozen"):
    app = esky.Esky(sys.executable,"http://teenspirit.com.br/exemplo_boneca/")
    app.auto_update()

Toda vez que você iniciar o programa ele vai procurar no site se tem alguma atualização pra baixar. Ele conseguirá reconhecer pelo número da versão. Eu simplesmente deixei esse diretório (http://teenspirit.com.br/exemplo_boneca/) pra fazer listagem no Apache.

Agora vamos fazer alterações no programa, eu vou colocar outra imagem no lugar da boneca, nesse caso, usarei o chuck.jpg

chuck


#Troque o texto de boneca.jpg para chuck.jpg
os.startfile(os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])),"chuck.jpg"))

 

Agora, vamos alterar o setup.py:

#setup.py
import esky.bdist_esky
from esky.bdist_esky import Executable as Executable_Esky
from cx_Freeze import setup, Executable

include_files = ['boneca.jpg','chuck.jpg']

setup(
    name = 'boneca',
    version = '1.0.1',
    options = {
        'build_exe': {
            'packages': ['os','sys','ctypes','win32con'],
            'excludes': ['tkinter','tcl','ttk'],
            'include_files': include_files,
            'include_msvcr': True,
        },
        'bdist_esky': {
            'freezer_module': 'cx_freeze',
        }
    },
    data_files = include_files,
    scripts = [
        Executable_Esky(
            "boneca.py",
            gui_only = True,
            #icon = XPTO #Coloque um icone aqui se quiser ,
            ),
    ],
    executables = [Executable('boneca.py',base='Win32GUI')]
    )

Reparem que eu mudei o número da Versão para 1.0.1, e a partir dessa versão o programa terá o auto-update. Esse arquivo ficou bem diferente, vou tentar explicar tudo que aconteceu nele:

1. Importei a opção de setup bdist_esky e um tipo de executável do próprio Esky

import esky.bdist_esky
from esky.bdist_esky import Executable as Executable_Esky

2. Coloquei as opções para o novo argumento bdist_esky:

        'bdist_esky': {
            'freezer_module': 'cx_freeze',
        }

3. Adicionei o data_files, porquê é isso que o Esky usa para ver quais arquivos também precisam ir para a pasta do programa

      data_files = include_files,

4. Coloquei o scripts porque é daí que o Esky vê quais scripts se tornaram os executáveis.

    scripts = [
        Executable_Esky(
            "boneca.py",
            gui_only = True,
            #icon = XPTO #Coloque um icone aqui se quiser ,
            ),
    ],

Agora para executar você precisa usar o setup.py com o argumento bdist_esky

python setup.py bdist_esky

Ele vai gerar um arquivo compactado que vai ficar na sua pasta dist:

boneca_esky
E dentro desse arquivo você tem isso aqui:

boneca-esky-conteudo

 

O que aconteceu? O Esky criou um programa, boneca.exe que vai ser responsável pela atualização do seu programa, inclusive dele mesmo. Quando ele for aberto ele vai buscar no endereço que eu coloquei (http://teenspirit.com.br/exemplo_boneca/) e se achar um outro arquivo compactado com uma versão mais recente ele vai baixar o arquivo e trocar o conteúdo, então na próxima vez que ele for aberto ele abrirá com a versão mais nova e limpará a versão mais antiga.

O bom é que se der algum problema no pacote, ou na internet ou na energia o Esky gerencia isso para que o programa sempre funcione. (só não pode subir uma versão bichada).

Então, quem de agora em diante for baixar o seu programa terá que baixar essa versão do Esky, que tem o arquivo zipado, aquele que geramos na Parte 1 não tem auto-update. E é por isso que vou mostrar na Parte 3 como fazer uma distribuição bem mais legal com o instalador do Inno Setup. Outra coisa que não é muito legal é que essa versão que criamos não tem o suporte ao MSVCR, mais um motivo para você ter um instalador customizado que vai incluir isso pra você.

Pra testar a atualização eu vou criar mais uma nova versão, que vou chamar de 1.0.2, nela vou trocar a foto, para isso mudo o boneca.py:

os.startfile(os.path.join(os.path.realpath(os.path.dirname(sys.argv[0])),"seu-boneco.jpg"))

e vou adicionar esse novo arquivo seu-boneco.jpg no include_files do setup.py:

include_files = ['boneca.jpg','chuck.jpg', 'seu-boneco.jpg']

Agora é só gerar o novo arquivo do Esky:

python setup.py bdist_esky

Na sua pasta dist vai aparecer o arquivo boneca-1.0.2.win32.zip. É só colocá-lo no link informado e na próxima vez que seus usuários abrirem o programa, ele será atualizado.

Se você quiser testar esse programa, faça o seguinte: baixe o boneca-1.0.1.win32.zip, descompacte o arquivo em uma pasta e abra o boneca.exe .

Quando você apertar o Print Screen ele vai mostrar a foto do Chuck, mas perceba que ele também já estará fazendo a atualização para a versão 1.0.2 e depois de fechado, na próxima vez que o programa rodar ele exibirá a foto do Seu Boneco.

seu-boneco

 

O código continua no Github.

E segura que em breve posto a Parte 3.

Escreva um comentário

Comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

  1. Seria possível fazer o auto-update usando o github?
    Ou tem que realmente ter um repositório online (google drive serve?) para por o arquivo físico para atualizar?

    Obrigado

    • Cara, com o Esky não rola fazer pelo github. Nesse caso seria bom você criar sua própria solução de auto-update. Na verdade, o Esky parou no tempo. Hoje existe o PyUpdater, que ouvi dizer ser promissor, mas nunca usei. Talvez tenha algo que sirva para você.

  2. MUITO OBRIGADO, MUITO OBRIGADO MESMO!
    Isso vai economizar, por baixo, algumas centenas de horas de trabalho no meu serviço.

    • Fala Diego, fico muito feliz que o artigo tenha te ajudado.
      A finalidade de escrever foi essa, demorei semanas tentando buscar formas de fazer.

      Mas, acredito que hoje em dia é capaz de existir alguma coisa nova e mais eficiente. Se conseguir fazer, dá um toque!

      Um abraço

Webmentions

  • How to create an application with auto-update using Python and Esky - Fernando Alves abril 12, 2020

    […] Originally published on portuguese! […]

  • Como criar um instalador MSI utilizando o Inno Setup - Fernando Alves abril 12, 2020

    […] Como criar um programa com Auto-Update utilizando Python e Esky […]

  • Distribuir Programas em Python para Desktops Windows abril 12, 2020

    […] Como criar um programa com Auto-Update utilizando Python e Esky […]