¿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?

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

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

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

Cdarke
fuente
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.

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

furia matanza
fuente
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.

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

te puede gustar py2exe . también encontrarás información para hacerlo en Linux

usuario237419
fuente
2
Pero deberá darle al paquete todas las opciones.
Jakob Bowyer
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()
     )
Anand
fuente
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 /.

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

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

ravi.chunduru
fuente
6

py2exe creará el archivo exe que desea, pero debe tener la misma versión de MSVCR90.dll en la máquina en la que va a usar su nuevo exe. Consulte http://www.py2exe.org/index.cgi/Tutorial para obtener más información.

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

Joe
fuente
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í

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

Freeformz
fuente
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.

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

F.Moure
fuente
1

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

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