Como tornar um script Python independente executável para ser executado sem QUALQUER dependência?


706

Estou construindo um aplicativo Python e não quero forçar meus clientes a instalar o Python e os módulos.

Então, existe uma maneira de compilar um script Python para ser um executável independente?


307
A parte da pergunta que diz "Não quero forçar meus clientes a instalar o Python e os módulos". Não diz que os clientes não podem fazê-lo, mas diz que o desenvolvedor não deseja exigir que eles o façam. Não faz sentido debater o assunto aqui, porque os clientes não estão lendo o SO para falar por si mesmos. Eu não gostaria de instalar um ambiente de desenvolvimento Flash apenas para assistir ao youtube, ou um ambiente de desenvolvimento C apenas para reproduzir Sudoku, ou um ambiente de desenvolvimento Python para executar uma versão do Angry Birds escrita em Python. É para isso que servem os tempos de execução redistribuíveis.
Dave

Respostas:


243

Você pode usar py2exe como já respondido e usar o cython para converter seus .pyarquivos- chave em arquivos .pyccompilados em C, como .dllno Windows e .sono linux, muito mais difíceis de reverter do que os arquivos .pyoe os comuns .pyc(e também obter desempenho!)


1
Obrigado pela resposta. Eu considerei o Cython, mas parece que ainda precisa do Python para executar o executável compilado. Você quer dizer compilar script para .pyc usando Cython? (Eu não sabia se Cython tem tal característica)
Jeff

9
Quero dizer, você tem dois problemas : código fechado e sem detalhes. Para código fechado, compile seu código importante em bibliotecas C usando Cython. Para no-deps, use py2exe e crie um executável com arquivos .pyd (compilado pelo cython).
31 de janeiro

7
O que você faria com as bibliotecas (numpy, scipy, matplotlib)? Por exemplo, como os clientes poderiam usar a função ginput () no matplotlib a partir do executável, sem tê-la instalada em seu computador.
Chimpsarehungry

@chimpsarehungry e quanto à vinculação estática?
Braden Best

11
O último lançamento parece estar em 2008, isso ainda é mantido?
Zitrax 17/09/2015

302

Você pode usar o PyInstaller para empacotar programas em Python como executáveis ​​independentes. Funciona no Windows, Linux e Mac.

Início rápido do PyInstaller

Instale o PyInstaller a partir do PyPI:

pip install pyinstaller

Vá para o diretório do seu programa e execute:

pyinstaller yourprogram.py

Isso irá gerar o pacote configurável em um subdiretório chamado dist.

Para uma explicação mais detalhada, consulte o manual .


10
Vale ressaltar que o pyinstaller pode compilar em um único arquivo .exe. Também sobre qual sistema operacional ele é executado, faz que executável, ou seja .exe quando executado no Windows
Richard de Wit

2
@ ItayMoav-Malimovka Eles estão trabalhando no suporte ao Python 3. Consulte github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS

3
Como o @GeenHenk disse, se você "compila" no Windows, ele cria um exe, lembre-se de que você não pode compilar para o Windows (criar um exe) no Linux ou tornar um Linux executável no Windows. Você só pode tornar o executável da plataforma que está executando. (No Linux, você pode usar o vinho para enganar este)
PhoneixS

14
Usar 'pyinstaller' é muito mais fácil que 'py2exe'. Ele cuida de todas as dependências, incluindo numpy, pandas, qualquer coisa e fornece um único executável na plataforma de trabalho!
aks

12
Parece exatamente o que eu estava procurando. E agora suporta Python 3! Obrigado :)
Daniel Gruszczyk

83

Você pode querer investigar Nuitka . Ele pega o código-fonte python e o converte em chamadas da API C ++. Em seguida, ele compila em um binário executável (ELF no Linux). Já existe há alguns anos e suporta uma ampla variedade de versões do Python.

Você provavelmente também terá uma melhoria de desempenho se usá-lo. Recomendado.


5
Nuitka é uma ferramenta incrível. Não há necessidade de não usá-lo. Eu apenas apontaria uma coisa - não se limita apenas ao Linux - é multiplataforma - outra razão pela qual usá-lo.
sjaustirni

5
Nuitka trabalha com Python 2.6, 2.7, 3.2, 3.3 e 3.4 e é multiplataforma: (Linux, FreeBSD, NetBSD, MacOS X e Windows (32/64 bits). Outros podem também funcionar. x86_64 (amd64) e arm. Outras arquiteturas também podem funcionar, fora da caixa.)
Jonathan Hartley

Não é suportado nos mais recentes 3.6 .. e é um pesadelo para configurar no Windows
Tetora

Funciona como um encanto no macOS High Sierra + Python 3.5.2. Obrigado!
Anthony L.

Isso cria um executável independente?
vozes

31

Gostaria de compilar algumas informações úteis sobre a criação de arquivos autônomos no Windows usando o Python 2.7.

Eu usei py2exe e funciona, mas tive alguns problemas.

Esta última razão me fez tentar PyInstaller http://www.pyinstaller.org/ .

Na minha opinião, é muito melhor porque:

  • É mais fácil de usar.

Sugiro a criação de um arquivo .bat com as seguintes linhas, por exemplo (pyinstaller.exe deve estar no caminho do Windows):

pyinstaller.exe --onefile MyCode.py

Então, acho que, pelo menos para o python 2.7, uma opção melhor e mais simples é o PyInstaller.


3
O --onefilesinalizador não ajudará você a torná-lo portátil no Windows, porque o executável ainda deseja vincular à api-ms-win-crt-runtime-l1-1-0.dllbiblioteca (ou outras) que deve ser instalada através do vcredistpacote. Portanto, uma dependência ainda existe e deve ser instalada antes da execução.
Andry

27

Sim, é possível compilar scripts Python em executável independente.

O PyInstaller pode ser usado para converter programas Python em executáveis ​​independentes, no Windows , Linux , Mac OS X , FreeBSD , Solaris e AIX . É um dos conversores recomendados.

py2exe converte scripts Python em apenas executável na plataforma Windows.

Cython é um compilador estático para a linguagem de programação Python e a linguagem de programação estendida Cython.


2
Obrigado por isso. Eu estava usando py2exe, e não conseguia obter os ícones trabalhando com ele. PyInstaller trabalhou pela primeira vez e parece ótimo!
precisa

Posso criar um executável independente do Windows para Linux e macOS? Ou devo instalar o Linux e o macOS no VirtualBox? Não tenho espaço livre suficiente no meu laptop.
precisa saber é o seguinte

1
Eu encontrei resposta sobre minha pergunta na documentação aqui: pyinstaller.readthedocs.io/en/stable/...
8Observer8

26

E uma terceira opção é cx_Freeze, que é multiplataforma.


1
Aqui estamos em fevereiro de 2019 e não há cx_Freezelançamentos listados no pypi desde o final de 2017. Este projeto foi abandonado?
user9074332

17

você pode gostar de py2exe . você também encontrará informações sobre como fazê-lo no linux


2
Mas você precisará dar a opção all do pacote.
precisa

14

Use py2exe .... use os arquivos de configuração abaixo:

 from distutils.core import setup
 import py2exe

 from distutils.filelist import findall
 import matplotlib

 setup(
       console=['PlotMemInfo.py'],

       options={
                'py2exe': {
                'packages' : ['matplotlib'],
            'dll_excludes': ['libgdk-win32-2.0-0.dll',
                                 'libgobject-2.0-0.dll',
                 'libgdk_pixbuf-2.0-0.dll']
                          }
                },
       data_files = matplotlib.get_py2exe_datafiles()
     )

Eu fiz isso e ele criou um arquivo python27.dll e ainda é necessário. Mudei o arquivo .exe para fora da pasta que contém o arquivo python27.dll e o arquivo .exe não é mais executado.
Mjwrazor

Você poderia mostrar esse script para Linux e macOS? Quero criar arquivos executáveis ​​independentes do Windows para Linux e macOS.
precisa saber é o seguinte

13

Eu gosto do pyinstaller - especialmente a variante "windowed":

pyinstaller --onefile --windowed myscript.py

Ele criará um único arquivo * .exe em uma pasta dist /.


11

Eu também recomendo o pyinstaller para melhor compatibilidade com versões anteriores, como o python 2.3 - 2.7.
para py2exe , você precisa ter o python 2.6


O pyinstaller tem problemas de importação. Por exemplo: no meu caso, eu estou neste diretório ~ / Documents / python101 / e ex50_pycomp.py & ex50.py estão neste diretório. ex50_pycomp.py importando ex50.py. Eu corro pyinstaller ex50_pycomp.py e eu vejo tudo em conformidade, produzido dist. Tudo bem, certo? Eu cd para dist / ex50_pycomp / e executo ex50_pycomp, ele funciona. Uma vez que eu colocar isso ex50_pycom em uma máquina virtual, então isso diz erro de importação e em outra outra caixa linux ele diz que "-bash: ./ex_50_pycom: não é possível executar o arquivo binário: erro de formato Exec"
driven_spider

prob1: Eu estava usando python2.7, mas pyinstaller estava conversando com python3 python3 setup.py build python3 setup.py instale seu python3 obterá todos os pkg_resources prob 3: se usar sys_path se tornar um problema, informe seu caminho como este pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: pasta dist do python3 pyinstaller --hidden-import = pkg_resources --onefile file.py --path = / usr / local / lib /python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--
driven_spider

8

Para scripts Python 3.2, a única opção é o Cxfreeze. Construa a partir de fontes, caso contrário não funcionará.

Para o python 2.x, sugiro o pyinstaller, pois ele pode empacotar um programa python em um único executável, ao contrário do CxFreeze, que também gera bibliotecas.



6

Você pode encontrar a lista de utilitários de distribuição listados em https://wiki.python.org/moin/DistributionUtilities .

Eu uso o bbfreeze e tem funcionado muito bem (ainda para ter suporte ao python 3).


stackoverflow.com/questions/33683133/… Eu uso o pacote muito bom do bbfreeze.
user914425

Ele cuida de dependências e instala módulos py relevantes?
Volatil3

@ Volatil3 Sim, todas as dependências são resolvidas. WRT para instalação de módulos no sistema host - existem diferentes tipos de compilações. O bbfreeze compila tudo em vários .soarquivos ou copia os arquivos .egg diretamente e eles devem estar presentes em um único diretório (ou como um único arquivo). Não é necessária instalação.
31416 Joe

6
pyinstaller yourfile.py -F --onefile

Isso cria um arquivo EXE autônomo no Windows. NOTA IMPORTANTE: O arquivo exe será gerado em uma pasta chamada 'dist'

você pode instalar o pyinstaller usando pip install PyInstaller

insira a descrição da imagem aqui

insira a descrição da imagem aqui


4

Não é exatamente um empacotamento do código python, mas agora também existe um rabugento do google, que transpila o código para o Go. Ele não suporta a api C do python, portanto, pode não funcionar para todos os projetos.


4

Usando pyinstaller, encontrei um método melhor usando o atalho para o .exe em vez de fazer --onefile. De qualquer forma, provavelmente existem alguns arquivos de dados e, se você estiver executando um aplicativo baseado em site, seu programa também depende de arquivos html, js, css. Não adianta mover todos esses arquivos para algum lugar. Em vez disso, se movermos o caminho de trabalho para cima.

Faça um atalho para o exe, mova-o para cima e defina os caminhos de destino e de inicialização, conforme especificado, para ter caminhos relativos indo para dist \ folder: É Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\" possível renomear o atalho para qualquer coisa que seja renomeada para "GTFS-Manager"
Agora, quando eu dobro -clique no atalho, é como se eu tivesse executado o arquivo em python! Achei essa abordagem melhor que a seguinte --onefile:

  1. No caso de onefile, há um problema com uma .dll ausente para o sistema operacional win7, que precisa de instalação prévia, etc. Bocejo. Com a compilação usual com vários arquivos, não há problemas.
  2. Todos os arquivos que meu script python usa (ele está implantando um servidor da Web tornado e precisa de um site inteiro e cheio de arquivos para estar lá!) Não precisam ser movidos para nenhum lugar: simplesmente crio o atalho na parte superior.
  3. Na verdade, eu posso usar exatamente essa mesma pasta no ubuntu (execute python3 myfile.py) e no Windows (clique duas vezes no atalho).
  4. Não preciso me preocupar com o hackeamento muito complicado do arquivo .spec para incluir arquivos de dados etc.

Ah, lembre-se de excluir a pasta de compilação após a compilação, economizará tamanho.


Oi, apenas atualizando .. Decidi renunciar à compactação UPX e seguir o caminho --onefile finalmente. Tinha que escolher um, porque o UPX atualmente possui um erro ao compactar uma DLL específica.
Nikhil VJ

3

Use o Cython para converter para c, compilar e vincular ao gcc. Outra poderia ser: criar as funções principais em c (aquelas que você deseja dificultar a reversão), compilá-las e usar o python boost para importar o código compilado (além de obter uma execução de código muito mais rápida). depois use qualquer ferramenta mencionada para distribuir.


1

Disseram-me que o PyRun, https://www.egenix.com/products/python/PyRun/ , também é uma opção.


5
Um link para uma solução é bem-vindo, mas garanta que sua resposta seja útil sem ela: adicione contexto ao link para que seus colegas usuários tenham uma idéia do que é e por que está lá; depois cite a parte mais relevante da página que você ' reencaminhando para o caso de a página de destino estar indisponível. Respostas que são pouco mais que um link podem ser excluídas.
Petter Friberg 28/03

Esta opção atualmente não suporta Windows.
bob
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.