Pergunta

Eu mantenho uma aplicação multi-plataforma, com base em PyQt que roda em Linux Mac e Windows.

As janelas e versões para Mac são distribuídos usando py2exe e py2app, que produz muito grandes feixes (~ 40 MB).

Eu gostaria de adicionar uma funcionalidade "atualização automática", baseado em patches para o tamanho limite de downloads:

  • Verificar se há novas versões em um servidor HTTP
  • baixar os patches necessários para atualização para a última versão
  • aplicar a lista de patches e reiniciar o aplicativo

Eu tenho algumas perguntas:

  • O que é a forma preferida para atualizar um aplicativo do Windows já que os arquivos abertos estão bloqueados e não podem ser substituídos?
  • como faço para preparar e aplicar os patches? talvez usando bsdiff / pspatch ?

[update]

Eu fiz uma classe simples de fazer patches com bsdiff , que é muito eficiente como anunciados no seu local: um diff em duas versões py2Exe de meu aplicativo (~ 75 MB não comprimido) produz um patch 44 kB! Pequena o suficiente para mim, eu vou ficar com este formato.

O código está disponível no pacote 'update' de pyflu , uma pequena biblioteca de Python código.

Foi útil?

Solução

Eu não acredito suportes Py2Exe remendado atualizações. No entanto, se você não agrupar todo o pacote em um único EXE ( py2exe website exemplo - inferior da página), você pode sair com atualizações menores, apenas substituindo determinados arquivos , como o arquivo EXE, por exemplo. Isso pode reduzir o tamanho de suas atualizações de forma significativa.

Você pode escrever um atualizador aplicativo , que pode ser baixado / correu separado de dentro de sua aplicação. Este aplicativo pode ser diferente para cada atualização, como os arquivos que precisam ser atualizados podem mudar.

Uma vez que o aplicativo é iniciado o programa de actualização, terá de fechar-se para que os arquivos podem ser substituídos. Uma vez que o atualizador estiver completa, você pode tê-lo reabrir o aplicativo antes de fechar em si.

Outras dicas

Eu não sei sobre os patches, mas no OS X o "padrão" para este com aplicativos de cacau é faísca . Basicamente, significa "appcasting". Ele baixa o aplicativo completo de cada vez. Pode valer a pena olhar para ele em busca de inspiração.

Eu imagino no OS X provavelmente você pode apenas baixar a parte real de seu pacote aplicativo que contém o código específico (não o libs etc que são embalados em) e que seria relativamente pequeno e fácil de substituir no pacote.

No Windows, você provavelmente será capaz de fazer um truque semelhante por não agrupar seu aplicativo em um exe -. Permitindo, assim, alterar a um arquivo que mudou realmente

Eu imagino o seu código Python real seria muito menos do que 40Mb, por isso é provavelmente o caminho a percorrer.

Como para substituir o aplicativo em execução, bem primeiro você precisa encontrar sua localização, para que você possa usar sys.executable para obter um ponto de partida, então você provavelmente poderia desembolsar um processo filho para, matar o processo pai e ter a criança a fazer a substituição real?

Atualmente estou a brincar com um pequeno aplicativo wxPython e se perguntando sobre exatamente este problema. Eu adoraria ouvir sobre o que você venha com.

Além disso quão grande é que você aplicativo quando comprimido? Se ele comprime bem, então talvez você ainda pode dar ao luxo de enviar a coisa toda.

Este é de 4 anos de idade agora, mas que sobre Esky ?

Uma vez que coloca Py2Exe todos os módulos compilados de seu aplicativo em um arquivo ZIP, você pode tentar atualizar esse arquivo, criando um script que atualiza-lo de um determinado conjunto de arquivos. Em seguida, substitua os arquivos restantes que foram alteradas (que deve ser poucas, se houver).

Um post antigo, mas eu pensei que eu iria falar pyupdater com pyinstaller.

Ele suporta Amazon e scp.

No futuro, de acordo com as mensagens github recentes, que pretendem apoiar alternativas livres.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top