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?

Jeff
fonte
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!)

neurino
fonte
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 .

Rumple Stiltskin
fonte
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.

cdarke
fonte
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.

Diego
fonte
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.

fury.slay
fonte
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.

Katriel
fonte
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

user237419
fonte
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()
     )
Anand
fonte
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 /.

cslotty
fonte
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

yantaq
fonte
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.

ravi.chunduru
fonte
6

O py2exe criará o arquivo exe que você deseja, mas você precisa da mesma versão do MSVCR90.dll na máquina em que irá usar o seu novo exe. Consulte http://www.py2exe.org/index.cgi/Tutorial para obter mais informações.

Belial
fonte
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).

Joe
fonte
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

ShadyMBA
fonte
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.

freeformz
fonte
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.

Nikhil VJ
fonte
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.

F.Moure
fonte
1

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

Kraig Brockschmidt - MSFT
fonte
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