Como posso distribuir programas python?

102

Meu aplicativo é parecido com este:

main.py
janelas/
    __init__.py
    mainwindow.py
    ...
modelo/
    __init__.py
    orders.py
    ...
Recursos/
    image1.png
    logo.jpg
    ...

O programa é iniciado com main.py. Existe uma boa maneira de criar um aplicativo 'final' a partir disso? Estou pensando em algo como py2exe / py2app, mas sem copiar o interpretador / módulos python para o aplicativo onde se tem apenas um executável.

Dei uma olhada no distutils, mas parece que ele instala um programa no diretório Python, o que não é comum em plataformas não linux.

No momento, eu apenas copio a pasta de origem inteira para a máquina de destino e crio um alias main.pywno windows. Alguns inconvenientes:

  • O ícone é o ícone python padrão.
  • Tenho que criar o alias manualmente.
  • No meu diretório de origem, há muitos arquivos adicionais, como a pasta de controle de origem.
  • Tenho que renomear main.pypara main.pywmanualmente.
  • Seria bom se apenas os arquivos `.pyo * estivessem na máquina de destino. Não há uma razão real para isso, eu simplesmente não gosto de arquivos desnecessários.

Como criar uma boa distribuição automatizada?

  • para Windows? (Essa é a única plataforma para a qual tenho suporte no momento.)
  • para mac?
  • para linux?
Georg Schölly
fonte
2
“Eu dei uma olhada no distutils, mas parece que ele instala um programa no diretório Python, o que não é comum em plataformas não Linux.” Por que você está dizendo isso? Que texto você leu que dizia isso? Certamente não é verdade, de onde você tirou essa impressão?
S.Lott
Possível duplicata de programas
SebasSBM

Respostas:

37

A maneira normal de distribuir aplicativos Python é com distutils . Ele é feito para distribuir módulos de tipo de biblioteca python e aplicativos python, embora eu não saiba como funciona no Windows. No Windows, você teria que instalar o Python separadamente se usar distutils, em qualquer caso.

Eu provavelmente recomendo que você o distribua com disutils para Linux e Py2exe ou algo semelhante para Windows. Para OS XI não sei. Se for um aplicativo de usuário final, você provavelmente gostaria de um tipo de imagem de disco, não sei como fazer isso. Mas leia esta postagem para obter mais informações sobre a experiência do usuário. Para um aplicativo feito para programadores, você provavelmente concorda com uma instalação do tipo distutils no OS X também.

Lennart Regebro
fonte
1
Mac e Linux não são tão importantes no momento. Py2app faz pacotes .app. E eu acho que o envio de aplicativos mac em .dmg está desatualizado, deve-se usar .zip. É possível usar distutils apenas para criar um diretório diste copiar todos os arquivos relevantes nele ?
Georg Schölly
1
@gs: o comando sdist criará um arquivo tar de todos os arquivos fonte.
Martin v. Löwis
5
@gs: O envio de aplicativos para Mac em .dmg é extremamente comum. .dmg são imagens de disco e não um formato para aplicativos (que seria .app). Portanto, geralmente você encontra um único .app dentro de um .dmg, junto com algum arquivo README.
Eric O Lebigot,
2
@gs Não sei por que você quer que distutils apenas crie um diretório dist e copie os arquivos lá, você pode fazer isso sozinho. O Distutils faz muitas coisas, incluindo fazer instaladores do Windows e, a partir do Python 2.6, também cria links no menu Iniciar. No entanto, será necessário instalar o Python separadamente, portanto, para um aplicativo de usuário final, acho que o py2exe é uma solução melhor, porque inclui seu próprio Python. O envio / instalação do OS X é discutido em detalhes por Alexander Limi em seu blog, então eu me refiro a ele.
Lennart Regebro
61

Eu recomendo fortemente o Pyinstaller , que suporta todas as principais plataformas perfeitamente. Como o py2exe e o py2app, ele produz um executável padrão no Windows e um pacote de aplicativos no OS X, mas tem a vantagem de também fazer um trabalho fantástico de resolução automática de dependências comuns e incluí-las sem ajustes extras de configuração.

Observe também que, se estiver implantando o Python 2.6 no Windows, você deve aplicar este patch ao tronco Pyinstaller.

Você indicou que não precisa de um instalador, mas o Inno Setup é uma opção fácil de usar e rápida de configurar para a plataforma Windows.

Daniel Naab
fonte
3
Não tenho certeza se é um exagero. Empacotar um aplicativo com o Pyinstaller pode realmente ser mais fácil do que outros métodos, especialmente aqueles com dependências em extensões c ... tão simples quanto uma chamada de linha de comando de uma linha na maioria dos casos. Instalar Python + dependências + o próprio aplicativo (seja através de distutils, etc, ou apenas um arquivo zip) é mais complicado, especialmente se o desenvolvedor não for capaz de configurar manualmente a máquina de destino e precisar fornecer instruções ao cliente. Pelo menos no Windows, acho que esse estilo de distribuição faz sentido.
Daniel Naab
1
Um pouco inconveniente com o pyinstaller, ao usar o executável criado com o pyinstaller, o início da execução demora alguns segundos.
JuanPablo
1
Exatamente o que eu estava procurando. Às vezes, preciso permitir que meus scripts sejam executados em computadores onde não consigo instalar nada. Um único executável sem dependências externas é o que eu preciso. Posso poupar alguns segundos para a inicialização. Obrigado!
CodeMonkey
Não recomendado para aplicativos pequenos, já que um Hello worldprograma simples ocuparia 500 MB de espaço e tempo de inicialização de 3-5 segundos.
Raf de
Você pode evitar essa quantidade de espaço usando um ambiente separado para distribuir seu aplicativo (usando venv ou pyenv, por exemplo)
Alexander Santos
4

Fredrik Lundh squeeze.pypode criar um único arquivo que não contém o interpretador Python, mas em vez disso contém bytecode. Com os argumentos corretos, você pode incluir outros arquivos, módulos, etc. no arquivo de resultado. Usei-o com sucesso em um projeto. O programa resultante rodou em OS X, Linux e Windows sem nenhum problema!

PS : Cada máquina precisa ter um interpretador Python que seja compatível com o bytecode gerado pelo squeeze.py. Você pode gerar diferentes versões de bytecode para diferentes versões do Python, se necessário (apenas execute squeeze.py com a versão correta do Python).

Eric O Lebigot
fonte
4

Acho que vale a pena mencionar também o PEX (considerando mais a atenção que essa pergunta recebeu e menos a própria pergunta). De acordo com sua própria descrição :

Os arquivos PEX são ambientes virtuais Python executáveis ​​autocontidos. Mais especificamente, eles são arquivos zip cuidadosamente construídos com um #!/usr/bin/env pythone especial __main__.pyque permite que você interaja com o tempo de execução PEX. Para obter mais informações sobre aplicativos zip, consulte PEP 441 .

Eu me deparei com isso quando li uma visão geral do pacote para python . Eles postaram esta bela foto lá: insira a descrição da imagem aqui

Para resumir: se você pode contar com o python sendo instalado na máquina de destino, use o PEX para produzir um »executável« autocontido que provavelmente terá um tamanho de arquivo menor do que um executável produzido pelo PyInstaller, por exemplo.

user3389669
fonte
1

Se você estiver distribuindo no Windows, use um instalador para instalar todos os arquivos / interpretadores relevantes, o que for necessário. Distribua um setup.exe. Essa é a melhor maneira no windows. Caso contrário, os usuários reclamarão.

Byron Whitlock
fonte
1
Não preciso de um instalador porque só existe um usuário que usará o programa. Mas é claro que, ao escrever um programa para mais usuários, isso é obrigatório no Windows.
Georg Schölly
1
@gs: Oh, apenas um usuário. Tudo bem, então eu recomendaria fazer um pacote distutils básico, uma distribuição de código-fonte ou um instalador binário do Windows. Essa é definitivamente uma maneira fácil e agradável de distribuir um módulo Python.
Lennart Regebro
0

A maneira mais conveniente * de plataforma cruzada de distribuir aplicativos de desktop Python é contar com o gerenciador de pacotes conda de plataforma cruzada. Existem várias ferramentas que o utilizam:

  • Miniconda-Install - scripts powershell / bash que baixam automaticamente o Miniconda e criam um ambiente conda isolado para o aplicativo. Suporta pip, mas parece não ter manutenção e tem problemas de download de https.
  • Projeto Anaconda e construtor (conda) por Continuum. Ambos usam conda. O construtor (conda) parece ser capaz de criar instaladores autocontidos e até mesmo instaladores NSIS no Windows, mas não suporta pip. Parecem se comportar como os instaladores Anaconda / Miniconda.
  • PyAppShare - o usuário final instala o Miniconda / Anaconda primeiro (como um ambiente de execução). Em seguida, o script de lote / bash de instalação única cria um ambiente conda isolado das especificações yaml. O aplicativo também é um pacote conda / pip que é instalado no ambiente e um ponto de entrada executável é criado. Atalhos multiplataformas de Desktop e Programas criados automaticamente. Eles ativam o ambiente e iniciam o aplicativo. Suporta pip.

* O mais conveniente para o desenvolvedor. Suficientemente conveniente para o usuário final.

Peter Zagubisalo
fonte