Saltar al contenido

¿Cómo puedes agrupar todo tu código Python en un solo archivo zip?

Hola usuario de nuestra página web, descubrimos la solución a tu búsqueda, desplázate y la hallarás un poco más abajo.

Solución:

Puede automatizar la mayor parte del trabajo con herramientas de Python habituales. Comencemos con clean virtualenv.

[[email protected] ~]$ mkdir ziplib-demo
[[email protected] ~]$ cd ziplib-demo
[[email protected] ziplib-demo]$ virtualenv .
New python executable in ./bin/python
Installing setuptools.............done.
Installing pip...............done.

Ahora instalemos un conjunto de paquetes que irán a la biblioteca comprimida. El truco consiste en forzar su instalación en un directorio específico.

(Nota: no use la opción –egg en la línea de comandos o en pip.conf / pip.ini porque romperá el diseño del archivo haciéndolo no importable en zip)

[[email protected] ziplib-demo]$ bin/pip install --install-option --install-lib=$PWD/unpacked waitress
Downloading/unpacking waitress
  Downloading waitress-0.8.5.tar.gz (112kB): 112kB downloaded
  Running setup.py egg_info for package waitress

Requirement already satisfied (use --upgrade to upgrade): setuptools in ./lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg (from waitress)
Installing collected packages: waitress
  Running setup.py install for waitress

    Installing waitress-serve script to /home/zart/ziplib-demo/bin
Successfully installed waitress
Cleaning up...

Actualizar: pip ahora tiene -t cambiar, que hace lo mismo que --install-option --install-lib=.

Ahora empaquémoslos todos en un zip

[[email protected] ziplib-demo]$ cd unpacked
[[email protected] unpacked]$ ls
waitress  waitress-0.8.5-py2.7.egg-info
[[email protected] unpacked]$ zip -r9 ../library.zip *
  adding: waitress/ (stored 0%)
  adding: waitress/receiver.py (deflated 71%)
  adding: waitress/server.pyc (deflated 64%)
  adding: waitress/utilities.py (deflated 62%)
  adding: waitress/trigger.pyc (deflated 63%)
  adding: waitress/trigger.py (deflated 61%)
  adding: waitress/receiver.pyc (deflated 60%)
  adding: waitress/adjustments.pyc (deflated 51%)
  adding: waitress/compat.pyc (deflated 56%)
  adding: waitress/adjustments.py (deflated 60%)
  adding: waitress/server.py (deflated 68%)
  adding: waitress/channel.py (deflated 72%)
  adding: waitress/task.pyc (deflated 57%)
  adding: waitress/tests/ (stored 0%)
  adding: waitress/tests/test_regression.py (deflated 63%)
  adding: waitress/tests/test_functional.py (deflated 88%)
  adding: waitress/tests/test_parser.pyc (deflated 76%)
  adding: waitress/tests/test_trigger.pyc (deflated 73%)
  adding: waitress/tests/test_init.py (deflated 72%)
  adding: waitress/tests/test_utilities.pyc (deflated 78%)
  adding: waitress/tests/test_buffers.pyc (deflated 79%)
  adding: waitress/tests/test_trigger.py (deflated 82%)
  adding: waitress/tests/test_buffers.py (deflated 86%)
  adding: waitress/tests/test_runner.py (deflated 75%)
  adding: waitress/tests/test_init.pyc (deflated 69%)
  adding: waitress/tests/__init__.pyc (deflated 21%)
  adding: waitress/tests/support.pyc (deflated 48%)
  adding: waitress/tests/test_utilities.py (deflated 73%)
  adding: waitress/tests/test_channel.py (deflated 87%)
  adding: waitress/tests/test_task.py (deflated 87%)
  adding: waitress/tests/test_functional.pyc (deflated 82%)
  adding: waitress/tests/__init__.py (deflated 5%)
  adding: waitress/tests/test_compat.pyc (deflated 53%)
  adding: waitress/tests/test_receiver.pyc (deflated 79%)
  adding: waitress/tests/test_adjustments.py (deflated 78%)
  adding: waitress/tests/test_adjustments.pyc (deflated 74%)
  adding: waitress/tests/test_server.pyc (deflated 73%)
  adding: waitress/tests/fixtureapps/ (stored 0%)
  adding: waitress/tests/fixtureapps/filewrapper.pyc (deflated 59%)
  adding: waitress/tests/fixtureapps/getline.py (deflated 37%)
  adding: waitress/tests/fixtureapps/nocl.py (deflated 47%)
  adding: waitress/tests/fixtureapps/sleepy.pyc (deflated 44%)
  adding: waitress/tests/fixtureapps/echo.py (deflated 40%)
  adding: waitress/tests/fixtureapps/error.py (deflated 52%)
  adding: waitress/tests/fixtureapps/nocl.pyc (deflated 48%)
  adding: waitress/tests/fixtureapps/getline.pyc (deflated 32%)
  adding: waitress/tests/fixtureapps/writecb.pyc (deflated 42%)
  adding: waitress/tests/fixtureapps/toolarge.py (deflated 37%)
  adding: waitress/tests/fixtureapps/__init__.pyc (deflated 20%)
  adding: waitress/tests/fixtureapps/writecb.py (deflated 50%)
  adding: waitress/tests/fixtureapps/badcl.pyc (deflated 44%)
  adding: waitress/tests/fixtureapps/runner.pyc (deflated 58%)
  adding: waitress/tests/fixtureapps/__init__.py (stored 0%)
  adding: waitress/tests/fixtureapps/filewrapper.py (deflated 74%)
  adding: waitress/tests/fixtureapps/runner.py (deflated 41%)
  adding: waitress/tests/fixtureapps/echo.pyc (deflated 42%)
  adding: waitress/tests/fixtureapps/groundhog1.jpg (deflated 24%)
  adding: waitress/tests/fixtureapps/error.pyc (deflated 48%)
  adding: waitress/tests/fixtureapps/sleepy.py (deflated 42%)
  adding: waitress/tests/fixtureapps/toolarge.pyc (deflated 43%)
  adding: waitress/tests/fixtureapps/badcl.py (deflated 45%)
  adding: waitress/tests/support.py (deflated 52%)
  adding: waitress/tests/test_task.pyc (deflated 78%)
  adding: waitress/tests/test_channel.pyc (deflated 78%)
  adding: waitress/tests/test_regression.pyc (deflated 68%)
  adding: waitress/tests/test_parser.py (deflated 80%)
  adding: waitress/tests/test_server.py (deflated 78%)
  adding: waitress/tests/test_receiver.py (deflated 87%)
  adding: waitress/tests/test_compat.py (deflated 51%)
  adding: waitress/tests/test_runner.pyc (deflated 72%)
  adding: waitress/__init__.pyc (deflated 50%)
  adding: waitress/channel.pyc (deflated 58%)
  adding: waitress/runner.pyc (deflated 54%)
  adding: waitress/buffers.py (deflated 74%)
  adding: waitress/__init__.py (deflated 61%)
  adding: waitress/runner.py (deflated 58%)
  adding: waitress/parser.py (deflated 69%)
  adding: waitress/compat.py (deflated 69%)
  adding: waitress/buffers.pyc (deflated 69%)
  adding: waitress/utilities.pyc (deflated 60%)
  adding: waitress/parser.pyc (deflated 53%)
  adding: waitress/task.py (deflated 72%)
  adding: waitress-0.8.5-py2.7.egg-info/ (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/dependency_links.txt (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/installed-files.txt (deflated 83%)
  adding: waitress-0.8.5-py2.7.egg-info/top_level.txt (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/PKG-INFO (deflated 65%)
  adding: waitress-0.8.5-py2.7.egg-info/not-zip-safe (stored 0%)
  adding: waitress-0.8.5-py2.7.egg-info/SOURCES.txt (deflated 71%)
  adding: waitress-0.8.5-py2.7.egg-info/entry_points.txt (deflated 33%)
  adding: waitress-0.8.5-py2.7.egg-info/requires.txt (deflated 5%)
[[email protected] unpacked]$ cd ..

Tenga en cuenta que esos archivos deben estar en la parte superior del zip, no puede simplemente zip -r9 library.zip unpacked

Comprobando el resultado:

[[email protected] ziplib-demo]$ PYTHONPATH=library.zip python
Python 2.7.1 (r271:86832, Apr 12 2011, 16:15:16)
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import waitress
>>> waitress

>>>
>>> from wsgiref.simple_server import demo_app
>>> waitress.serve(demo_app)
serving on http://0.0.0.0:8080
^C>>>

Actualizar: desde python 3.5 también hay un módulo zipapp que puede ayudar a empaquetar todo el paquete en un archivo .pyz. Para necesidades más complejas, pyinstaller, py2exe o py2app podrían ajustarse mejor a la factura.

Python ejecutará archivos zip como si fueran scripts únicos si contienen un __main__.py[c] archivo en el interior en el nivel superior. Las importaciones de paquetes también comprobarán dentro del zip que __main__ se está ejecutando desde dentro.

Así que crea tu setup.py (py_modules = ['__main__'] es importante aquí junto con la especificación de todos sus paquetes y otros módulos).

Entonces corre python setup.py bdist --format zip para crear el archivo zip. Ahora, si desea que sea ejecutable, puede hacer lo siguiente. En este punto, puede ejecutar el archivo zip resultante como cualquier otro script de Python.

Un paso más para los usuarios de Linux / Mac que lean esto para mejorar la conveniencia (aunque probablemente no sea su escenario ya que menciona py2exe)

echo '#!/usr/bin/env python' > my_executable_zip
cat output_of_setup_py_bdist.zip >> my_executable_zip
chmod +x my_executable_zip

¡Esto solo antepone un #! línea al archivo zip para que cuando se ejecute desde el shell no necesite especificar el intérprete. En este punto, puede ejecutarlo como cualquier otro binario en el sistema, aunque en secreto es un archivo zip lleno de Python. Normalmente creo un archivo MAKE para ejecutar setup.py y luego hago esta conversión.

Puede usar el módulo zipapp de la biblioteca estándar para crear archivos zip Python ejecutables. Está disponible desde Python 3.5 en adelante.

Una forma de crear un paquete es agregar un archivo de nivel superior llamado __main__.py, que será el script que Python ejecutará cuando se ejecute el archivo ejecutable zip.

Suponga que la estructura de su directorio ahora es así:

└── myapp
    ├── __main__.py
    ├── myprog1.py
    └── myprog2.py

Si su código tiene dependencias externas (por ejemplo, enumeradas en un archivo llamado requirements.txt), instálelos en el directorio usando:

pip3 install -r requirements.txt --target myapp/

nota 1: Esto llenará el myapp/ directorio con las dependencias externas.

nota 2: los usuarios de Debian / Ubuntu pueden necesitar usar el --system opción para pip3, porque la versión Debian / Ubuntu de pip parece usar por defecto --user por defecto.

Luego, cree el archivo ejecutable zip usando:

python3 -m zipapp myapp/

Esto creará un archivo ejecutable zip llamado myapp.pyz, que puede ejecutar ejecutando:

python3 myapp.pyz

Cuando se ejecuta el archivo ejecutable zip, es __main__.py que se ejecuta.

Si, además de los scripts de Python, necesita incluir otros archivos de datos (por ejemplo, archivos de texto, imágenes PNG, etc.) utilizados por los scripts de Python, consulte: python: ¿los archivos zip ejecutables pueden incluir archivos de datos?

Comentarios y calificaciones

Si aceptas, eres capaz de dejar un tutorial acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *