¿Cómo hacer que un script de Python sea ejecutable de forma independiente para ejecutarse sin NINGUNA dependencia?


707

Estoy creando una aplicación Python y no quiero obligar a mis clientes a instalar Python y módulos.

Entonces, ¿hay alguna manera de compilar un script de Python para que sea un ejecutable independiente?


307
La parte de la pregunta que dice "No quiero obligar a mis clientes a instalar Python y módulos". No dice que los clientes no pueden hacerlo, dice que el desarrollador no quiere exigirles que lo hagan. No tiene sentido debatir el punto aquí, porque los clientes no están leyendo SO para hablar por sí mismos. No me gustaría instalar un entorno de desarrollo Flash solo para ver youtube, o un entorno de desarrollo C solo para jugar Sudoku, o un entorno de desarrollo Python para ejecutar una versión de Angry Birds escrita en Python. Para eso están los tiempos de ejecución redistribuibles.
Dave

Respuestas:


243

Puede utilizar py2exe como ya se ha respondido y el uso Cython para convertir sus claves .pyarchivos en .pyc, archivos de C compilado, al igual que .dllen Windows y .soen Linux, mucho más difícil de revertir lo común .pyoy .pycarchivos (y también la ganancia en el rendimiento!)


1
Gracias por responder. He considerado Cython, pero parece que todavía necesita Python para ejecutar el ejecutable compilado. ¿Te refieres a compilar script para .pyc usando Cython? (No sabía si Cython tiene esa función)
Jeff

99
Quiero decir que tienes dos problemas : código cerrado y no-deps. Para código cerrado, compile su código importante en bibliotecas C usando Cython. Para no-deps, use py2exe y cree un ejecutable con archivos .pyd (compilados en cython).
neurino

77
¿Qué harías con las bibliotecas (numpy, scipy, matplotlib)? Por ejemplo, ¿cómo podrían los clientes usar la función ginput () en matplotlib desde el ejecutable, sin tenerla instalada en su computadora?
chimpsarehungry

@chimpsarehungry ¿qué pasa con el enlace estático?
Braden Best

11
La última versión parece ser en 2008, ¿se mantiene?
Zitrax

302

Puede usar PyInstaller para empaquetar programas de Python como ejecutables independientes. Funciona en Windows, Linux y Mac.

Inicio rápido de PyInstaller

Instale PyInstaller desde PyPI:

pip install pyinstaller

Vaya al directorio de su programa y ejecute:

pyinstaller yourprogram.py

Esto generará el paquete en un subdirectorio llamado dist.

Para un tutorial más detallado, consulte el manual .


10
Vale la pena señalar que pyinstaller puede compilar en un solo archivo .exe. También en qué sistema operativo se ejecuta, hace que el ejecutable, es decir .exe cuando se ejecuta en Windows
Richard de Wit

2
@ ItayMoav-Malimovka Están trabajando en el soporte de Python 3. Ver github.com/pyinstaller/pyinstaller/tree/python3 .
PhoneixS

3
Como dijo @GeenHenk, si "compila" en Windows, hace un exe, tenga en cuenta que no puede compilar para Windows (hacer un exe) en Linux, o hacer un ejecutable de Linux en Windows. Solo puede hacer el ejecutable de la plataforma que está ejecutando. (En Linux puedes usar wine para engañar esto)
PhoneixS

14
usar 'pyinstaller' es mucho más fácil que 'py2exe'. ¡Se encarga de todas las dependencias, incluyendo numpy, pandas, cualquier cosa y le brinda un único ejecutable en la plataforma de trabajo!
aks

12
Parece exactamente lo que estaba buscando. ¡Y ahora es compatible con Python 3! Gracias :)
Daniel Gruszczyk

83

Es posible que desee investigar Nuitka . Toma el código fuente de Python y lo convierte en llamadas de API C ++. Luego se compila en un binario ejecutable (ELF en Linux). Ha existido durante algunos años y es compatible con una amplia gama de versiones de Python.

Probablemente también obtendrá una mejora en el rendimiento si lo usa. Recomendado.


55
Nuitka es una herramienta increíble. No es necesario no usarlo. Solo señalaría una cosa: no se limita solo a Linux, es multiplataforma , otra razón por la que se debe usar.
sjaustirni

55
Nuitka funciona en Python 2.6, 2.7, 3.2, 3.3 y 3.4, y es multiplataforma: (Linux, FreeBSD, NetBSD, MacOS X y Windows (32/64 bits). Otros pueden funcionar también. Arquitecturas: x86, x86_64 (amd64) y arm. Otras arquitecturas también pueden funcionar, fuera de la caja.)
Jonathan Hartley

No es compatible con la versión 3.6 más reciente y es una pesadilla configurarlo en Windows
Tetora

Funciona de maravilla en macOS High Sierra + Python 3.5.2. ¡Gracias!
Anthony L.

¿Esto crea un ejecutable independiente?
voces

31

Me gustaría recopilar información útil sobre la creación de archivos independientes en Windows con Python 2.7.

He usado py2exe y funciona, pero tuve algunos problemas.

Esta última razón me hizo probar PyInstaller http://www.pyinstaller.org/ .

En mi opinión, es mucho mejor porque:

  • Es más fácil de usar.

Sugiero crear un archivo .bat con las siguientes líneas, por ejemplo (pyinstaller.exe debe estar en la ruta de Windows):

pyinstaller.exe --onefile MyCode.py

Entonces, creo que, al menos para Python 2.7, una opción mejor y más simple es PyInstaller.


3
El --onefileindicador no lo ayudará a hacerlo portátil en Windows, porque el ejecutable aún desea vincularse con la api-ms-win-crt-runtime-l1-1-0.dllbiblioteca (u otras) que deben instalarse a través del vcredistpaquete. Por lo tanto, todavía existe una dependencia y debe instalarse antes de la ejecución.
Andry

27

Sí, es posible compilar scripts de Python en un ejecutable independiente.

PyInstaller se puede utilizar para convertir programas de Python en ejecutables independientes, en Windows , Linux , Mac OS X , FreeBSD , Solaris y AIX . Es uno de los convertidores recomendados.

py2exe convierte los scripts de Python en solo ejecutables en la plataforma Windows.

Cython es un compilador estático tanto para el lenguaje de programación Python como para el lenguaje de programación extendido Cython.


2
Gracias por esto. Estaba usando py2exe, y no pude conseguir que los íconos funcionaran en absoluto. PyInstaller trabajó por primera vez, ¡y se ve genial!
Chud37

¿Puedo crear un ejecutable independiente desde Windows para Linux y macOS? ¿O debería instalar Linux y macOS en VirtualBox? No tengo suficiente espacio libre en mi computadora portátil.
8Observer8

1
Encontré la respuesta a mi pregunta en la documentación aquí: pyinstaller.readthedocs.io/en/stable/…
8Observer8

26

Y una tercera opción es cx_Freeze, que es multiplataforma.


1
Aquí estamos en febrero de 2019 y no hay cx_Freezelanzamientos listados en pypi desde finales de 2017. ¿Se abandonó este proyecto?
user9074332


14

Use py2exe ... use los archivos de configuración a continuación:

 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()
     )

Hice esto y creó un archivo python27.dll y todavía es necesario. Moví el archivo .exe fuera de la carpeta que contenía el archivo python27.dll y el archivo .exe ya no se ejecuta.
mjwrazor

¿Podría mostrar ese script para Linux y macOS? Quiero crear archivos ejecutables independientes desde Windows para Linux y macOS.
8Observer8

13

Me gusta pyinstaller , especialmente la variante "en ventana":

pyinstaller --onefile --windowed myscript.py

Creará un solo archivo * .exe en una carpeta dist /.


11

También recomiendo pyinstaller para una mejor compatibilidad con versiones anteriores, como python 2.3 - 2.7.
para py2exe , debes tener python 2.6


Pyinstaller tiene problemas de importación. Por ejemplo: en mi caso, estoy en este DIR ~ / Documents / python101 / y ex50_pycomp.py y ex50.py están en este directorio. ex50_pycomp.py importando ex50.py. Ejecuto pyinstaller ex50_pycomp.py y veo todo cumplido, producido dist. Todo bien ¿verdad? Cd en dist / ex50_pycomp / y ejecuto ex50_pycomp funciona. Una vez que puse este ex50_pycom en una máquina virtual, esto dice error de importación y en otro cuadro de linux dice "-bash: ./ex_50_pycom: no se puede ejecutar el archivo binario: error de formato de
ejecución

prob1: estaba usando python2.7 pero pyinstaller estaba hablando con python3 python3 setup.py build python3 setup.py instale su python3 obtendrá todos los pkg_resources prob 3: si usar sys_path se convierte en un problema, entonces proporcione su ruta como este pyinstaller --hidden- import = pkg_resources --onefile file.py --path = my_path rw-rw-r-- my_path: python3's folder folder 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 los scripts Python 3.2, la única opción es Cxfreeze. Construirlo a partir de fuentes de lo contrario no funcionará.

Para python 2.x, sugiero pyinstaller, ya que puede empaquetar un programa de python en un único ejecutable, a diferencia de CxFreeze, que también genera bibliotecas.



6

Puede encontrar la lista de utilidades de distribución enumeradas en @ https://wiki.python.org/moin/DistributionUtilities .

Utilizo bbfreeze y ha funcionado muy bien (aunque todavía tengo soporte para python 3).


stackoverflow.com/questions/33683133/… Yo uso bbfreeze paquete muy agradable.
user914425

¿Se encarga de las dependencias e instala los módulos py relevantes?
Volatil3

@ Volatil3 Sí, se atienden todas las dependencias. WRT para la instalación de módulos en el sistema host: existen diferentes tipos de compilaciones. El bbfreeze compilará todo en múltiples .soarchivos, o copiará los archivos .egg directamente y todos estarán presentes en un solo directorio (o como un solo archivo). No se requiere instalación.
Joe

6
pyinstaller yourfile.py -F --onefile

Esto crea un archivo EXE independiente en Windows NOTA IMPORTANTE: El archivo exe se generará en una carpeta llamada 'dist'

puedes instalar pyinstaller usando pip install PyInstaller

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí


4

No es exactamente un paquete del código de Python, pero ahora también está malhumorado de Google, que transpila el código para ir. No es compatible con la API de Python C, por lo que puede no funcionar para todos los proyectos.


4

Usando pyinstaller, encontré un mejor método usando el acceso directo al .exe en lugar de hacer --onefile . De todos modos, es probable que haya algunos archivos de datos y si está ejecutando una aplicación basada en el sitio, su programa también depende de los archivos html, js, css. No tiene sentido mover todos estos archivos a algún lugar ... en cambio, ¿qué pasa si movemos la ruta de trabajo hacia arriba?

Haga un acceso directo al exe, muévalo en la parte superior y establezca el destino y las rutas de inicio como se especifica, para que las rutas relativas vayan a 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\" puede cambiar el nombre del acceso directo a cualquier cosa, así que cambie el nombre a "GTFS-Manager"
ahora cuando doblo -Haga clic en el acceso directo, ¡es como si hubiera ejecutado el archivo en Python! Encontré este enfoque mejor que el --onefilesiguiente:

  1. En el caso de onefile, hay un problema con la falta de un archivo .dll para el sistema operativo win7 que necesita instalación previa, etc. Bostezo. Con la compilación habitual con múltiples archivos, no hay tales problemas.
  2. Todos los archivos que utiliza mi secuencia de comandos de Python (está implementando un servidor web tornado y necesita un sitio web con todos los archivos para estar allí). No es necesario moverlos a ninguna parte: simplemente creo el acceso directo en la parte superior.
  3. De hecho, puedo usar esta misma carpeta en ubuntu (ejecutar python3 myfile.py) y windows (hacer doble clic en el acceso directo).
  4. No necesito molestarme con el pirateo excesivamente complicado del archivo .spec para incluir archivos de datos, etc.

Ah, recuerde eliminar la carpeta de compilación después de compilar, ahorrará en tamaño.


Hola, solo estoy actualizando. Decidí renunciar a la compresión UPX y finalmente ir por el camino de un archivo. Tuve que elegir uno, porque UPX actualmente tiene un error al comprimir una DLL en particular.
Nikhil VJ

3

Use Cython para convertir a c, compilar y vincular con gcc. Otro podría ser, hacer las funciones centrales en c (las que desea dificultar la reversión), compilarlas y usar python boost para importar el código compilado (además obtendrá una ejecución de código mucho más rápida). luego use cualquier herramienta mencionada para distribuir.


1

Me dicen que PyRun, https://www.egenix.com/products/python/PyRun/ , también es una opción.


55
Un enlace a una solución es bienvenido, pero asegúrese de que su respuesta sea útil sin él: agregue contexto alrededor del enlace para que sus otros usuarios tengan una idea de qué es y por qué está allí, luego cite la parte más relevante de la página volver a vincular en caso de que la página de destino no esté disponible. Se pueden eliminar las respuestas que son poco más que un enlace.
Petter Friberg

Esta opción no es compatible actualmente con Windows.
bob
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.