2012-06-28 22 views
11

Estoy mirando para crear lo siguiente:La creación de un Portable Python (instalación local) para Linux

Una versión portátil de Python que se puede ejecutar en cualquier sistema (con cualquier versión anterior de Python o no instalado Python) y tenerlo preconfigurado con varios paquetes de python (es decir, django, lxml, pysqlite, etc.)

Lo más parecido que he encontrado al anterior es virtualenv, pero esto solo va tan lejos.

Si empaqueté un buen virtualenv para python en una máquina, contiene enlaces simbólicos a muchas de las bibliotecas que necesita. Puedo tomar esos enlaces sym y convertirlos a sus archivos reales, pero si trato de mover todo este directorio a otra máquina, recibo un fallo seg después de un fallo seg.

Para iniciar el pitón en una máquina diferente, estoy usando:

LD_LIBRARY_PATH=lib/ ./bin/python 

y en lib/tengo todas las bibliotecas compartidas he copiado de la máquina original. El problema aquí es que estas bibliotecas compartidas pueden depender de otras bibliotecas compartidas que no estoy incluyendo, por lo que ejecutar esto en otras distribuciones de Linux no funciona. Probablemente debido a que se está recurriendo a bibliotecas compartidas más antiguas instaladas en el sistema que no funcionan con lo que copié.

¿Alguien tiene una idea de cómo hacerlo funcionar? ¿Esto es posible?

EDIT:

Para aclarar, el resultado deseado es crear un tar.gz de un binario pitón y paquetes asociados (Django, lxml, pysqlite, etc) que se puede extraer y ejecutar en cualquier Linux sistema basado, es decir (ubuntu 8.04, redhat 5, suse 11, etc.), todas las distribuciones de 32 bits, donde la versión localmente instalada de python no afecta lo que está en el tar.gz.

+1

Ya existe [Portable Python] (http://www.portablepython.com) O, más simple aún, utilizar Python en varios entornos sin instalación, con [python everywhere] (http://www.pythonanywhere.com) – Dhara

Respuesta

6

No sé cómo esto es posible. Si fuera así, no necesitarían distribuir paquetes binarios de python para diferentes plataformas. No se puede simplemente distribuir python que se ejecutará en cualquier plataforma. Tiene que ser construido desde la fuente para ese arco. Virtualenv esperará que le diga qué sistema de python usar (usando enlaces).

Esto se aplica prácticamente a cualquier paquete binario que se vincule con libs del sistema. De nuevo, si fuera posible, no necesitaríamos ninguna distribución binaria específica de la plataforma.

Sin embargo, puede lograr parte de lo que desea. Es decir, ejecutar python en otra máquina que no tenga Python instalado siempre que sea el mismo arco. Este es el mismo concepto detrás de freezing o py2exe/py2app/pyinstaller. Un intérprete está incluido en un entorno independiente. Entonces, la aplicación puede ejecutarse en cualquier plataforma similar.

Editar

me he dado cuenta de que, si bien su pregunta habla de "sistema" agnóstico, el título contiene la referencia "Linux". Existen diferentes sabores de Linux, por lo tanto, para que funcione, tendría que construirlo para varios archios y también contener completamente los enlaces independientes. Puede intentar crear un paquete con pyinstaller y usarlo para incluirlo en su proyecto.

Usted puede tratar sólo la construcción de pitón de la fuente, en su virtualenv:

$ ./configure --prefix=/path/to/virtualenv && make && make install 

Si todavía tiene problemas con los enlaces a bibliotecas, también se puede investigar building it statically

1

No estoy seguro de que trabajar únicamente en Python es el camino a seguir aquí. Puede tener mejor suerte con Puppet of Chef, que son herramientas de configuración que se pueden usar para crear un entorno local. Hay muchos códigos para instalar virtualenv y python en casi cualquier Linux más OSX (probablemente no en Windows).

Su flujo de trabajo consistiría en instalar Chef o Puppet (a su elección), ejecutar un script para instalar el Python que desea, luego ingresar un virtualenv y pip instalar los paquetes que pueda necesitar.

Lo siento, esto no es tan fácil como virtualenv solo, pero es mucho más robusto.

1

Bueno, como rara vez acepto que "no se puede hacer", hay una manera de hacerlo. Advertencia: no es bonito y probablemente deberías mirar en un escenario diferente.

Lo que deberá hacer es determinar una ubicación estándar para este directorio de nivel superior. Segundo, usando ese directorio como su raíz necesitará compilar Python en cada distribución de Linux en la que quiera ejecutar esto. Para esto, usaría algo como "/ usr/local/myappname/platform /" para configurar y compilar Python para vivir. En cada caso, sustituya "platform" con el nombre de la plataforma como "/ usr/local/rhel/". Si la memoria sirve para la opción de configuración que está buscando aquí es --prefix.

Una vez que haya compilado cada distribución, necesitará una secuencia de comandos para determinar cuál usar y establecer variables de entorno o hacer que cree enlaces simbólicos a la "instalación" apropiada de python. Luego utilizaría virtualenv y bootstrap en ese árbol para mantener las bibliotecas de python "en uso" aún más específicas.

No puedo pensar en una distribución de Linux común que no tenga Python por defecto. Como tal, podría usar setup.py y/o scripts básicos de Python para guiar esto, ya que debería poder confiar en que Python esté presente, incluso si se instala su antigua versión como en RHEL. Personalmente, considero que el método anterior es demasiado complicado, pero cumple con los requisitos establecidos con la asignación para un guión final. Por supuesto, puede usar shar (SHell ARchive) para convertir todo esto en un script de shell ejecutable para realizar la instalación y evitar la necesidad de scripts secundarios. Si descomprime el archivo shel resultante, puede descomprimirlo en los sistemas de destino y ejecutarlo para configurar todo.

Dicho todo esto, no lo recomendaría. Recomendaría determinar la versión mínima de Python en la que pueda ejecutar y asegurarse de que la distribución la instale siempre que sea posible, y si es necesario bajar de un repositorio e instalarlo. Luego, use virtualenv y bootstrap con un requirements.txt para instalar las bibliotecas y aplicaciones necesarias de python en virutalenv. Para que vea this documentation

7

Acabo de probar esto y funciona muy bien.

Obtenga la copia de Python que desea instalar y descomprímala y cd primero en la carpeta sin marcar.

También obtenga una copia de setuptools y desmarque eso.

/opt/portapy utilizado a continuación es, por supuesto, el nombre que se me ocurrió para esta publicación, podría ser cualquier ruta y la ruta completa debe ser alquilada y la misma ruta se debe utilizar en cualquier sistema que ponga esto debido a enlace de ruta absoluta.

mkdir /opt/portapy 
cd <python source dir> 
./configure --prefix=/opt/portapy && make && make install 
cd <setuptools source dir> 
/opt/portapy/bin/python ./setup.py install 

Cree la carpeta de env virtual dentro de la carpeta portapy.

mkdir /opt/portapy/virtenv 
/opt/portapy/bin/virtualenv /opt/portapy/virtenv 
cd /opt/portapy/virtenv 
source bin/activate 

Hecho. Está listo para instalar todas sus bibliotecas aquí y tiene la opción de crear múltiples envs virtuales de esta manera.

Puede cargar toda la carpeta /opt/portapy y transportarla a cualquier sistema Linux del mismo arco, dentro de lo que sospeche.

Recopilé 2.7.5 y CentOS 5.8 a 64 bits y moví la carpeta a un sistema Cent6.9 y funciona perfectamente.

+0

Se ve limpio y prometedor, necesito algo como esto para un entorno sin raíces, ¡espero que funcione! – jmoreno

+0

@tahoe, ¿es posible poner la carpeta con python en el directorio con otro nombre, no el mismo que uno en la primera computadora? ¿Hay alguna solución? –

+0

Debería ser posible, pero necesitaría editar el script de activación para apuntar al directorio correcto, creo. También debo señalar que esto funciona mejor si se hace en sistemas muy similares ya que tuve un problema al hacerlo de esta manera entre Ubuntu y CentOS donde los paquetes SSL se compilaron contra versiones bastante diferentes y no se cargarían. – tahoe

Cuestiones relacionadas