Una excelente opción en base a mis experiencias con diferentes paquetes, es con la librería Pyinstaller. El problema de otras librerías como por ejemplo py2exe es que conllevan mayores complicaciones cuando se tienen módulos externos en el código fuente.
En mi caso, recuerdo haber utilizado py2exe para generar algún ejecutable pero pude hacerlo sólo para programas muy sencillos. Si por ejemplo la aplicación involucraba algún paquete gráfico como Matplotlib ya en ese momento el proceso daba errores.
En el caso de Pyinstaller afortunadamente, éste considera esa muy probable circunstancia. Lo que realiza es un proceso de búsqueda sobre las dependencias que el código fuente posee ( cuando digo código fuente me estoy refiriendo al programa al que deseamos crear el archivo ejecutable). Sólo en casos específicos Pyinstaller necesita algunas especificaciones para indicar la ubicación y/o existencia de módulos externos, pero en mi caso no fue necesario y de hecho trabajó muy bien con diferentes módulos que estaban contenidos en mi programa (creí que no podría hacerlo tan rápidamente)
Se puede descargar Pyinstaller via pip:
pip install pyinstaller
También lo pueden descargar en su página oficial:
Pyinstaller es multiplataforma. Particularmente solo lo he utilizado en Linux (Linux Mint) y Windows 7.
Su utilización es sencilla, simplemente en el caso de Linux se abre la terminal en la ubicación donde está el archivo .py al que queremos hacer el ejecutable. Por ejemplo tenemos el siguiente código:
import time from PyQt4 import QtCore, QtGui class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) layout = QtGui.QVBoxLayout(self) self.label = QtGui.QLabel(self) layout.addWidget(self.label) self.buttonStart = QtGui.QPushButton('Start', self) self.buttonStart.clicked.connect(self.handleStart) layout.addWidget(self.buttonStart) self.buttonStop = QtGui.QPushButton('Stop', self) self.buttonStop.clicked.connect(self.handleStop) layout.addWidget(self.buttonStop) self._running = False def handleStart(self): self.buttonStart.setDisabled(True) self._running = True while self._running: self.label.setText(str(time.clock())) QtGui.qApp.processEvents() time.sleep(0.05) self.buttonStart.setDisabled(False) def handleStop(self): self._running = False if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.setGeometry(500, 300, 200, 100) window.show() sys.exit(app.exec_())
Dicho código se guarda en un archivo .py y ejecutamos la terminal (en el caso de Linux) con la dirección del archivo. Luego escribimos:
pyinstaller --onefile nombre_archivo.py
Esto generará dos carpetas que contienen toda la información necesaria para ejecutar el programa en cuestión, es de suponer que están todos los módulos dependientes de la aplicación. El commando --onefile es para que Pyinstaller procure empaquetar archivos, eso es lo que provoca que dentro de la carpeta dist esté el ejecutable solo.
Finalmente para ejecutar el programa ahora solo es necesario hacer doble clic sobre el archivo contenido en la carpeta dist, este debe tener el mismo nombre que el archivo original en Python. El ejecutable quita el requisito de tener Python para poder correr el programa, pues ya el archivo resultante es un archivo compilado.
Muy buen blog, hice un script en python y quiero pasarlo a exe pero no he podido, he buscado en internet pero no encontrado como hacerlo usando PyInstaller 3.1 y claro desde windows porque siempre encuentro ejemplos pero todos para usar desde linux.
ResponderEliminarAgradezco su ayuda, mi correo es andres_garcia1996@hotmail.com
muy buena información, el unico que en verdad me sirvio para poder crear un ejecutable de python
ResponderEliminarHola Hugo, Saludos desde Merida-Venezuela, excelente el código. estoy enteresado en Empaquetando programas de Python para Windows desde Linux, si tienes alguna idea se agradece.
ResponderEliminarFrancisco Duran
Hola Francisco, no había visto tu mensaje. Hasta ahora no sé como hacer lo que mencionas, pero si se de algo, te lo haría saber. Saludos.
EliminarHola se que es viejo este post pero tengo un inconveniente tengo un app en python con 2 carpetas una tiene imágenes y la otra archivos html. mi app es básicamente un navegador web solo que no navega sino que abre un grupo de archivos ya el app esta creada en pagina web y mi problema es compilar eso en un .exe no lo e logrado de ninguna manera tengo xubuntu 16.04 y desde la terminal escribo ./cgr.py y funciona bien pero cuando uso pyinstaller me crea un ejecutable al ejecutarlo solo sale la cmd de window y ya.
ResponderEliminarHola, ¿que mensaje o información te sale en la cmd de windows cuando se intenta abrir el programa?
Eliminar