{"id":74,"date":"2020-06-02T17:24:08","date_gmt":"2020-06-02T17:24:08","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=74"},"modified":"2020-06-02T17:33:17","modified_gmt":"2020-06-02T17:33:17","slug":"ejecutables-python","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=74","title":{"rendered":"Ejecutables Python"},"content":{"rendered":"\n<p>Se pueden empaquetar los scripts Python para formar ejecutables, a veces independientes, que funcionen bajo un sistema operativo concreto. Para eso se usan paquetes que recopilan las dependencias del c\u00f3digo, buscando los paquetes y ejecutables nativos correspondientes para proveernos del ejecutable. Hay otros paquetes que compilan el script para obtener c\u00f3digo nativo.<\/p>\n\n\n\n<p>Algunos de estos paquetes pueden funcionar en Windows, Linux o Mac.<\/p>\n\n\n\n<p>Para utilizarlos, lo recomendado es crear un entorno virtual con la versi\u00f3n de Python adecuada e instalar en ella los m\u00f3dulos de los que depende la aplicaci\u00f3n. Posteriormente se pueden instalar y hacer uso de algunos de los paquetes o aplicaciones que se enumeran a continuaci\u00f3n.<\/p>\n\n\n\n<p>Hay que tener en cuenta que algunos de estos paquetes solo funcionan con determinadas versiones de Python e incluso con ciertos paquetes de Python, por lo que podr\u00eda ser posible que alguna de ellas no funcionase con la \u00faltima versi\u00f3n de Python o con alg\u00fan paquete que use la aplicaci\u00f3n. Es conveniente leer la documentaci\u00f3n antes de seleccionar el adecuado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a>Pyinstaller<\/a><\/h2>\n\n\n\n<p>Pyinstaller funciona en Windows, Mac y Linux y convierte la aplicaci\u00f3n Python y sus dependencias en un ejecutable. Lo que hace Pyinstaller es leer y analizar el script, buscando todas las dependencias del mismo y empaquetandolas junto al script en una carpeta llamada <strong>dist<\/strong>. Soporta Python 2.7 y 3.5 o superior, adem\u00e1s de algunas de los paquetes mas conocidos como PyQT, Django, wxPython, etc.<\/p>\n\n\n\n<p>Pyinstaller no genera un ejecutable para cada sistema operativo, sino que genera el ejecutable para el sistema operativo donde est\u00e9 instalado.<\/p>\n\n\n\n<p>Para instalar Pyinstaller se debe ejecutar el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pip install pyinstaller<\/code><\/pre>\n\n\n\n<p>La ayuda sobre el paquete se encuentra en la p\u00e1gina web del proyecto: <a href=\"https:\/\/www.pyinstaller.org\">https:\/\/www.pyinstaller.org<\/a> o ejecutando el comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pyinstaller -h<\/code><\/pre>\n\n\n\n<p>Se usa el par\u00e1metro <strong>-F<\/strong> o <strong>&#8211;onefile<\/strong> para que la aplicaci\u00f3n y dependencias se empaqueten en un solo fichero ejecutable, adem\u00e1s si la aplicaci\u00f3n se ejecutar\u00e1 en un entorno gr\u00e1fico y no en consola, habr\u00eda que a\u00f1adir el par\u00e1metro <strong>-w<\/strong>, <strong>&#8211;windowed<\/strong> o <strong>&#8211;noconsole<\/strong>.<\/p>\n\n\n\n<p>La primera vez que se ejecuta pyinstaller, se genera un fichero con el nombre de la aplicaci\u00f3n y extensi\u00f3n .spec, este fichero se puede editar para proporcionarle mas informaci\u00f3n sobre la ruta a m\u00f3dulos concretos que empaquetar\u00e1 junto al programa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a>Ejemplo:<\/a><\/h3>\n\n\n\n<p>Suponiendo que el script se llame holamundo.py y el c\u00f3digo funcione en la consola o terminal, se puede crear un fichero ejecutable con el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pyinstaller --onefile holamundo.py<\/code><\/pre>\n\n\n\n<p>Si el script funcionara en una ventana gr\u00e1fica, porque hiciera uso de tkinter, PyQT o wxPython, el comando ser\u00eda algo parecido al siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pyinstaller -onefile -w holamundo.py<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><a>Py2APP<\/a><\/h2>\n\n\n\n<p>Py2App se utiliza en sistemas operativos MacOS ya que es uno con el que se obtiene mejores resultados. Se puede obtener informaci\u00f3n en su web: <a href=\"https:\/\/py2app.readthedocs.io\">https:\/\/py2app.readthedocs.io<\/a>.<\/p>\n\n\n\n<p>Para utilizarlo, el primer paso es generar un fichero llamado <strong>setup.py<\/strong> donde se tendr\u00e1n que incluir los par\u00e1metros que configurar\u00e1n el programa, como son los iconos, gr\u00e1ficos u otras opciones que usa el script. Gracias a esta informaci\u00f3n el paquete ejecutable contendr\u00e1 todos los recursos proporcionados y el resultado ser\u00e1 una aplicaci\u00f3n MacOS lista para usar.<\/p>\n\n\n\n<p>Se instala escribiendo el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pip install py2app<\/code><\/pre>\n\n\n\n<p>Para crear el fichero <strong>setup.py<\/strong> se ejecuta el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">py2applet --make-setup nombre_app.py<\/code><\/pre>\n\n\n\n<p>El fichero <strong>setup.py<\/strong> generado es algo parecido a este:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">\"\"\"\nThis is a setup.py script generated by py2applet\nUsage:\n    python setup.py py2app\n\"\"\"\nfrom setuptools import setup\nAPP = [temporizador.py']\nDATA_FILES = []\nOPTIONS = {}\nsetup(\n    app=APP,\n    data_files=DATA_FILES,\n    options={'py2app': OPTIONS},\n    setup_requires=['py2app'],\n)<\/code><\/pre>\n\n\n\n<p>Tras modificarlo para a\u00f1adir el icono de la aplicaci\u00f3n, im\u00e1genes, etc., quedar\u00eda algo parecido a esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">\"\"\nThis is a setup.py script generated by py2applet\nUsage:\n    python setup.py py2app\n\"\"\"\nfrom setuptools import setup\nAPP = ['temporizador.py']\nDATA_FILES = ['temporizador.icns','arrow_up_green.png','arrow_down_green.png','clock_run.png','document_plain.png','clock_pause.png','folder_out.png','clock_stop.png','disk_blue.png','clock_refresh.png']\nOPTIONS = {\n    'argv_emulation': False,\n    'iconfile': 'temporizador.icns'\n    }\nsetup(\n    app=APP,\n    data_files=DATA_FILES,\n    options={'py2app': OPTIONS},\n    setup_requires=['py2app'],\n)<\/code><\/pre>\n\n\n\n<p>Para generar la aplicaci\u00f3n se usa el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">python setup.py py2app<\/code><\/pre>\n\n\n\n<p>Py2app crea dos carpetas, una llamada <strong>build<\/strong> donde copia todos los archivos necesarios para empaquetar la aplicaci\u00f3n y otra llamada <strong>dist<\/strong> donde copia la aplicaci\u00f3n. Una vez finalizada la generaci\u00f3n del ejecutable, se puede probar su ejecuci\u00f3n escribiendo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">open nombre_app.app<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><a>Nuitka<\/a><\/h2>\n\n\n\n<p>Tal como indican en su web <a href=\"https:\/\/nuitka.net\/\">https:\/\/nuitka.net\/<\/a>, Nuitka es un compilador Python hecho en Python. Actualmente es compatible con las versiones 2.6, 2.7 y 3.3-3.8. Lo que hace Nuitka es compilar el script Python en c\u00f3digo nativo, mas r\u00e1pido en ejecuci\u00f3n que el original, para ello convierte los m\u00f3dulos Python en C y los compila tambi\u00e9n, es por eso por lo que necesita que el compilador gcc o g++ est\u00e9 instalado en el sistema operativo. En Windows se puede instalar MinGW64 que se puede descargar de la siguiente p\u00e1gina: <a href=\"https:\/\/mingw-w64.org\/doku.php\/download\">https:\/\/mingw-w64.org\/doku.php\/download<\/a>.<\/p>\n\n\n\n<p>Para instalar Nuitka hay que ejecutar el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">pip install nuitka<\/code><\/pre>\n\n\n\n<p>Si se quiere usar Nuitka para genera un ejecutable dependiente del Python del sistema, se ejecuta el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">nuitka3 nombre_app.py<\/code><\/pre>\n\n\n\n<p>En caso de querer un ejecutable que contenga todas las dependencias a los paquetes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">nuitka3 --follow-imports nombre_app.py<\/code><\/pre>\n\n\n\n<p>Para obtener un ejecutable capaz de ejecutarse en otros ordenadores habr\u00e1 que ejecutar el siguiente comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">nuitka3 --standalone programa.py<\/code><\/pre>\n\n\n\n<p>Tras la finalizaci\u00f3n de la compilaci\u00f3n hay que copiar al otro dispositivo tanto el ejecutable <strong>programa.exe<\/strong> o <strong>programa.bin<\/strong>, dependiendo de la plataforma, como la carpeta <strong>programa.dist<\/strong>, para asegurar que funcionar\u00e1.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se pueden empaquetar los scripts Python para formar ejecutables, a veces independientes, que funcionen bajo un sistema operativo concreto. Para &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,37,4],"tags":[43,42,41,2,6],"class_list":["post-74","post","type-post","status-publish","format-standard","hentry","category-compiladores","category-ejecutables-python","category-python","tag-nuitka","tag-py2app","tag-pyinstaller","tag-python","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=74"}],"version-history":[{"count":3,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/74\/revisions"}],"predecessor-version":[{"id":77,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/74\/revisions\/77"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}