Aplicaciones de Python independientes en Linux

¿Cómo puedo distribuir una aplicación Python independiente en Linux?

Creo que puedo dar por sentada la presencia de un intérprete de Python reciente en cualquier distribución moderna. El problema es tratar con aquellas bibliotecas que no pertenecen a la biblioteca estándar, es decir, wxPython, scipy, kit de herramientas criptográficas de Python, reportlab, etc.

¿Existe una contraparte de Linux que funcione, por ejemplo, py2exe (que, por cierto, nunca he probado)? ¿Hay uno gratuito, de código abierto?

Cree un deb (para todo lo derivado de Debian) y un rpm (para Fedora / SuSE). Agregue las dependencias correctas al paquete y puede estar razonablemente seguro de que funcionará.

Puedes usar cx_Freeze para hacer esto. Es como py2exe (reúne el intérprete y el script de inicio y todas las bibliotecas y módulos necesarios), pero funciona tanto en Linux como en Windows.

Recostack las dependencias del entorno en el que se ejecuta, lo que significa que también deben ser adecuadas para el destino. Si está haciendo algo como construir en Debian de 32 bits e implementarlo en otro Debian de 32 bits, entonces está bien. Puede manejar las diferencias de 32/64 bits creando varias versiones en entornos apropiados (por ejemplo, chroots de 32 y 64 bits) y distribuyendo la adecuada. Si desea algo más genérico (por ejemplo, construir en Debian, implementar en cualquier distribución), entonces esto se vuelve un poco turbio, dependiendo de cuáles sean exactamente sus dependencias.

Si está realizando una distribución bastante sencilla (es decir, sabe que su entorno de comstackción e implementación son similares), esto evita el paso complejo de rpm / deb / egg / etc (usar cx_Freeze es muy fácil, especialmente si familiarizado con py2exe). Si no, entonces cualquier cosa, desde la instalación de su propio instalador de dependencias hasta la construcción deb / rpm / egg / etc, funcionará, dependiendo de la cantidad de trabajo que desee realizar, la flexibilidad con las versiones requeridas que desee ofrecer y las dependencias.

Es posible que desee ver las declaraciones de dependencia en setuptools . Esto podría proporcionar una manera de asegurar que los paquetes correctos estén disponibles en el entorno o que alguien con los privilegios apropiados puedan instalarlos.

No puedes hacerlo fácilmente en un formato de distribución neutral. Los únicos mecanismos de seguimiento de dependencia confiables están integrados en los sistemas de administración de paquetes en las distribuciones y variarán de una distribución a otra. De hecho, tendrá que hacer rpm para fedora, debs para ubuntu y debian, etc.

Py2exe funciona bien en Windows. Crea una distribución con todas las DLL necesarias y una envoltura para el intérprete de python que inicia su progtwig. Es bastante sencillo de instalar, simplemente colóquelo en un directorio, por lo que crear un archivo msi es trivial.

Setuptools es demasiado para mí ya que el uso de mi progtwig es bastante limitado, así que aquí está mi alternativa de cosecha propia.

Agrupo un directorio de “terceros” que incluye todos los requisitos previos, y uso site.addsitedir para que no sea necesario instalarlos globalmente.

# program startup code import os import sys import site path = os.path.abspath(os.path.dirname(__file__)) ver = 'python%d.%d' % sys.version_info[:2] thirdparty = os.path.join(path, 'third-party', 'lib', ver, 'site-packages') site.addsitedir(thirdparty) 

La mayoría de mis prereqs tienen instaladores setup.py. Cada módulo incluido tiene su propio proceso de “instalación”, por lo que cualquier material personalizado (por ejemplo, ./configure) se puede ejecutar automáticamente. Mi script de instalación ejecuta este archivo make como parte del proceso de instalación.

 # sample third-party/Makefile PYTHON_VER = `python -c "import sys; \ print 'python%d.%d' % sys.version_info[:2]"` PYTHON_PATH = lib/$(PYTHON_VER)/site-packages MODS = egenix-mx-base-3.0.0 # etc .PHONY: all init clean realclean $(MODS) all: $(MODS) $(MODS): init init: mkdir -p bin mkdir -p $(PYTHON_PATH) clean: rm -rf $(MODS) realclean: clean rm -rf bin rm -rf lib egenix-mx-base-3.0.0: tar xzf $@.tar.gz cd $@ && python setup.py install --prefix=.. rm -rf $@ 

La forma estándar de python es crear un “Huevo” de python.

Puede echar un vistazo a este tutorial o a esta página sobre setuptools .

Creo que puede dar por sentado con seguridad el soporte de Python en la mayoría de las distribuciones de Linux modernas, para las que no lo tienen, siempre que se proporcione un mensaje de error sensato, los usuarios probablemente deberían poder trabajar para obtenerlo por su cuenta (puede usar un script de inicio bash simple para esto):

 #!/bin/bash if [ -e /usr/bin/python ] then echo "Python found!" else echo "Python missing!" fi 

No

Python es notoriamente escamoso con respecto a diferentes configuraciones. La única forma sensata de implementar una aplicación de Python es enviar todo el paquete de intérpretes y bibliotecas en los que confía con su código. Eso probablemente funcionará.

Actualización 2019: Estoy de acuerdo con esto. Virtualenv es una forma de empaquetar bibliotecas e intérpretes juntos. Tox es una herramienta de prueba para probar esa matriz de intérprete / dependencia. Docker es una forma muy utilizada de implementar el paquete.