(→Generar un EXE para Windows con py2exe) |
|||
Línea 22: | Línea 22: | ||
Finalmente, dentro del directorio donde está el módulo Python que se desea convertir, es necesario modificar el archivo setup.py agregando "import py2exe" y agregando a la invocación a "setup" el argumento "console". Este argumento console debe recibir como valor una lista con los módulos Python que deben ser ejecutables, generalmente en esta lista deberá estar al menos el programa principal. | Finalmente, dentro del directorio donde está el módulo Python que se desea convertir, es necesario modificar el archivo setup.py agregando "import py2exe" y agregando a la invocación a "setup" el argumento "console". Este argumento console debe recibir como valor una lista con los módulos Python que deben ser ejecutables, generalmente en esta lista deberá estar al menos el programa principal. | ||
+ | |||
+ | === Ejemplo de uso de py2exe empaquetando DuinoBot === | ||
+ | |||
+ | Primero es necesario descargar el código fuente de [https://github.com/Robots-Linti/duinobot|DuinoBot] y ver sus dependencias. Las mismas se encuentran en el archivo setup.py: | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- encoding: utf-8 -*- | ||
+ | from distutils.core import setup | ||
+ | import os.path | ||
+ | import glob | ||
+ | |||
+ | setup(name='duinobot', | ||
+ | version='0.13-8', | ||
+ | description='API en Python para el robot Multiplo N6', | ||
+ | author='Joaquin Bogado, Fernando Lopez, Sofia Martin', | ||
+ | author_email='soportelihuen@linti.unlp.edu.ar', | ||
+ | url='http://lihuen.linti.unlp.edu.ar', | ||
+ | packages=['duinobot', 'duinobot.pyfirmata'], | ||
+ | package_dir={'duinobot': '.'}, | ||
+ | data_files=[('usr/share/doc/duinobot/ejemplos', | ||
+ | glob.glob(os.path.join('ejemplos', '*.py')))], | ||
+ | requires=['pyserial', 'pygame'], | ||
+ | classifiers=[ | ||
+ | "Environment :: Console", | ||
+ | "Intended Audience :: Developers", | ||
+ | "Intended Audience :: Education", | ||
+ | "Operating System :: OS Independent", | ||
+ | "Programming Language :: Python", | ||
+ | "Topic :: Education", | ||
+ | "Programming Language :: Python :: 2.6", | ||
+ | "Programming Language :: Python :: 2.7" | ||
+ | ]) | ||
+ | </source> | ||
+ | |||
+ | El campo "requires" indica que el paquete necesita los módulos "pyserial" y "pygame". Según corresponda será necesario instalar estos módulos descargando un instalador para Windows desde el sitio oficial o usando "pip". Para estos casos se optó por descargar el instalador de "pygame" (que no se puede instalar con pip) e instalar "pyserial" con pip: | ||
+ | |||
+ | python -m pip install pyserial | ||
+ | |||
+ | Luego de instaladas las dependencias se puede probar el paquete para ver si funciona: | ||
+ | |||
+ | python27 | ||
+ | >>> import duinobot | ||
+ | >>> ... | ||
+ | |||
+ | Luego es necesario determinar cual será el programa a ejecutar al hacer doble click en el archivo .exe, en este caso crearemos un script que mueve el robot 1, este archivo tendrá el nombre "mover.py": | ||
+ | |||
+ | <source lang="python"> | ||
+ | from duinobot import * | ||
+ | b = Board() | ||
+ | r = Robot(b, 1) | ||
+ | r.forward(100, 1) | ||
+ | r.turnLeft(100, 1) | ||
+ | </source> | ||
+ | |||
+ | El siguiente paso es modificar el archivo "setup.py" para poder utilizar py2exe, esta modificación consta en agregar "import py2exe" y agregar el argumento "console" que indique que hay que generar un ".exe" para "mover.py": | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- encoding: utf-8 -*- | ||
+ | from distutils.core import setup | ||
+ | import os.path | ||
+ | import glob | ||
+ | import py2exe | ||
+ | |||
+ | setup(name='duinobot', | ||
+ | console=['mover.py'], | ||
+ | version='0.13-8', | ||
+ | description='API en Python para el robot Multiplo N6', | ||
+ | author='Joaquin Bogado, Fernando Lopez, Sofia Martin', | ||
+ | author_email='soportelihuen@linti.unlp.edu.ar', | ||
+ | url='http://lihuen.linti.unlp.edu.ar', | ||
+ | packages=['duinobot', 'duinobot.pyfirmata'], | ||
+ | package_dir={'duinobot': '.'}, | ||
+ | data_files=[('usr/share/doc/duinobot/ejemplos', | ||
+ | glob.glob(os.path.join('ejemplos', '*.py')))], | ||
+ | requires=['pyserial', 'pygame'], | ||
+ | classifiers=[ | ||
+ | "Environment :: Console", | ||
+ | "Intended Audience :: Developers", | ||
+ | "Intended Audience :: Education", | ||
+ | "Operating System :: OS Independent", | ||
+ | "Programming Language :: Python", | ||
+ | "Topic :: Education", | ||
+ | "Programming Language :: Python :: 2.6", | ||
+ | "Programming Language :: Python :: 2.7" | ||
+ | ]) | ||
+ | </source> | ||
+ | |||
+ | El último paso consiste en generar la carpeta con el proyecto ejecutando: | ||
+ | python setup.py py2exe | ||
+ | |||
+ | La carpeta resultante será "dist/duinobot", en ella se podrá encontrar "mover.exe" y todas las bibliotecas y modulos requeridos por el proyecto. |
Hoy en día existen distintas formas de distribuir programas y módulos Python:
En este artículo se exploran las 2 últimas posibilidades que permiten distribuir módulos Python "autosuficientes" que ni siquiera requieren un intérprete de Python instalado en la máquina para funcionar.
Para generar estas distribuciones existen distintas herramientas py2exe (específica para Windows) y PyInstaller (para Linux, Windows, Mac OS X y otros...).
Instalar [3] para Windows. En muchas distribuciones GNU/Linux Python viene preinstalado o es instalable usando el gestor de paquetes correspondiente.
El primer paso es instalar [4] (la versión debe coincidir con la versión de Python instalada).
Luego, usando pip es necesario instalar las dependencias del paquete que se desea convertir:
python -m pip install <nombre_paquete>
Finalmente, dentro del directorio donde está el módulo Python que se desea convertir, es necesario modificar el archivo setup.py agregando "import py2exe" y agregando a la invocación a "setup" el argumento "console". Este argumento console debe recibir como valor una lista con los módulos Python que deben ser ejecutables, generalmente en esta lista deberá estar al menos el programa principal.
Primero es necesario descargar el código fuente de [5] y ver sus dependencias. Las mismas se encuentran en el archivo setup.py:
#!/usr/bin/env python # -*- encoding: utf-8 -*- from distutils.core import setup import os.path import glob setup(name='duinobot', version='0.13-8', description='API en Python para el robot Multiplo N6', author='Joaquin Bogado, Fernando Lopez, Sofia Martin', author_email='soportelihuen@linti.unlp.edu.ar', url='http://lihuen.linti.unlp.edu.ar', packages=['duinobot', 'duinobot.pyfirmata'], package_dir={'duinobot': '.'}, data_files=[('usr/share/doc/duinobot/ejemplos', glob.glob(os.path.join('ejemplos', '*.py')))], requires=['pyserial', 'pygame'], classifiers=[ "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Education", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Education", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7" ])
El campo "requires" indica que el paquete necesita los módulos "pyserial" y "pygame". Según corresponda será necesario instalar estos módulos descargando un instalador para Windows desde el sitio oficial o usando "pip". Para estos casos se optó por descargar el instalador de "pygame" (que no se puede instalar con pip) e instalar "pyserial" con pip:
python -m pip install pyserial
Luego de instaladas las dependencias se puede probar el paquete para ver si funciona:
python27 >>> import duinobot >>> ...
Luego es necesario determinar cual será el programa a ejecutar al hacer doble click en el archivo .exe, en este caso crearemos un script que mueve el robot 1, este archivo tendrá el nombre "mover.py":
from duinobot import * b = Board() r = Robot(b, 1) r.forward(100, 1) r.turnLeft(100, 1)
El siguiente paso es modificar el archivo "setup.py" para poder utilizar py2exe, esta modificación consta en agregar "import py2exe" y agregar el argumento "console" que indique que hay que generar un ".exe" para "mover.py":
#!/usr/bin/env python # -*- encoding: utf-8 -*- from distutils.core import setup import os.path import glob import py2exe setup(name='duinobot', console=['mover.py'], version='0.13-8', description='API en Python para el robot Multiplo N6', author='Joaquin Bogado, Fernando Lopez, Sofia Martin', author_email='soportelihuen@linti.unlp.edu.ar', url='http://lihuen.linti.unlp.edu.ar', packages=['duinobot', 'duinobot.pyfirmata'], package_dir={'duinobot': '.'}, data_files=[('usr/share/doc/duinobot/ejemplos', glob.glob(os.path.join('ejemplos', '*.py')))], requires=['pyserial', 'pygame'], classifiers=[ "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Education", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Education", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7" ])
El último paso consiste en generar la carpeta con el proyecto ejecutando:
python setup.py py2exe
La carpeta resultante será "dist/duinobot", en ella se podrá encontrar "mover.exe" y todas las bibliotecas y modulos requeridos por el proyecto.