2008-10-10 13 views
28

¿Cómo puedo distribuir una aplicación Python independiente en Linux?Aplicaciones autónomas de Python en Linux

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

¿Existe una contraparte de Linux que funcione para, digamos, py2exe (que, dicho sea de paso, nunca he intentado)? ¿Hay uno gratuito, de código abierto?

Respuesta

-10

Nope.

Python es notoriamente escamosa 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 el que confía con su código. Eso probablemente funcionará.

+2

Esa no ha sido mi experiencia. Claro que puede configurar bibliotecas de terceros de forma incorrecta, o incluso instalar Python incorrectamente, pero en general nunca he tenido un problema con los programas estándar de Python. Excepto, por supuesto, pasar a una versión anterior cuando haya utilizado nuevas funciones :). ¿Quizás estabas pensando en Java (tm)? –

+0

@ A.L.Flanagan: En realidad, por mucho que odio Java, he encontrado que es bastante robusto en cuanto a la distribución de software. – Marcin

7

No puede hacerlo fácilmente en un formato de distribución neutra. Los únicos mecanismos de seguimiento de dependencias confiables están incorporados en los sistemas de administración de paquetes en las distribuciones y varían de la distribución a la distribución. De hecho, tendrá que hacer rpm para fedora, debs para ubuntu y debian, etc.

Py2exe funciona bien en Windows. Construye una distribución con todas las DLL necesarias y un contenedor para el intérprete de Python que inicia su programa. Es bastante fácil de instalar, simplemente colóquelo en un directorio, por lo que hacer un archivo msi es trivial.

9

Es posible que desee consultar las declaraciones de dependencia en setuptools. Esto podría proporcionar una forma de garantizar que los paquetes correctos estén disponibles en el entorno o que alguien más pueda instalarlos con los privilegios adecuados.

+0

Sé que @ S.Lott lo sabe, pero para otros: esta es una gran manera de distribuir una biblioteca o aplicación de Python a otros desarrolladores, a quienes no les importará tener que instalar la versión correcta de Python antes de que su aplicación funcione. Pero es absolutamente la forma incorrecta de distribuir a los usuarios finales, que no saben qué es Python, absolutamente NO irán a instalarlo para que su aplicación funcione, y para el 0.2% que lo hagan, instalarán un servidor incorrecto. versión. –

22

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

+1

+1 por sugerir la idea de un paquete de Linux –

+7

¿Alguna buena referencia para hacer esto de extremo a extremo? – fabrizioM

+0

http://showmedo.com/videotutorials/video?name=linuxJensMakingDeb&fromSeriesID=37 – bagonyi

5

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

Incluyo un directorio de "terceros" que incluye todos los requisitos previos y uso site.addsitedir para que no necesiten instalarse 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 prerregistros tienen instaladores de 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 makefile 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 [email protected] 
    cd [email protected] && python setup.py install --prefix=.. 
    rm -rf [email protected] 
10

Puede usar cx_Freeze para hacerlo. Es como py2exe (agrupa el intérprete y el guión de inicio y todas las bibliotecas y módulos necesarios), pero funciona tanto en Linux como en Windows.

Recoge 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 y desplegar en otro Debian de 32 bits, está bien.Puede manejar las diferencias de 32/64 bit construyendo múltiples versiones en entornos apropiados (por ejemplo, chroots de 32 bit y 64 bit) y distribuyendo el apropiado. Si quieres 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 tus dependencias.

Si realiza una distribución bastante sencilla (es decir, sabe que su entorno de compilación e implementación son similares), esto evita el paso bastante complejo rpm/deb/egg/etc (usar cx_Freeze es muy fácil, especialmente si estás familiarizado con py2exe). De lo contrario, cualquier cosa, desde instalar tu propio instalador de dependencias hasta el edificio deb/rpm/egg/etc, funcionará, dependiendo de la cantidad de trabajo que quieras hacer, la flexibilidad con las versiones requeridas que quieras ofrecer y las dependencias.

0

Creo que se puede dar por hecho que python es compatible con la mayoría de las distribuciones Linux modernas; para las que no lo tienen, siempre que se proporcione un mensaje de error, los usuarios deberían poder trabajar cómo hacerlo 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 
Cuestiones relacionadas