Python 2.x versiones múltiples problemas con PYTHONPATH

Hay Python 2.6 instalado en el sistema.

Ahora quiero usar los módulos introducidos en Python 2.7. Como no tengo privilegios de root, he creado e instalado 2.7 en mi directorio principal ($ HOME / local /)

Agregué lo siguiente a mi $ HOME / .bashrc:

export PATH=$HOME/local/bin:$PATH export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH 

Ahora me encontré con los dos problemas que quiero pedir soluciones alternativas.

1. Invocando Python 2.7

Python 2.7 recién instalado no encuentra módulos 2.6 en la ruta de la biblioteca del sistema (/usr/lib/python2.6/site-packages/).

¿Debo agregarlo a PYTHONPATH manualmente? ¿Hay alguna solución mejor?

2. Invocando Python 2.6

Python 2.6 se queja en el inicio:

 'import site' failed; use -v for traceback 

Supongo que está intentando cargar 2.7 módulos (en $ HOME / local / lib / python2.7). ¿Es posible cargar solo 2.6 módulos cuando se invoca Python 2.6?

Gracias.

1) Invocando Python 2.7

En resumen: no hagas esto. Hay razones por las que la ruta se llama ‘/ usr / lib / python * 2.6 * / site-packages /’.

Una razón es que en este directorio normalmente se almacenan los archivos de Python ‘comstackdos’ (.pyc). Los archivos python 2.6 y python 2.7 .pyc no son compatibles:

 $ python2.7 /usr/lib/python2.6/sitecustomize.pyc RuntimeError: Bad magic number in .pyc file 

python omitirá los archivos pyc que no puede entender, pero perderá al menos los beneficios de los archivos precomstackdos.

Otra razón es que las cosas pueden confundirse:

 $ strace -f python2.7 /usr/lib/python2.6/sitecustomize.py ... stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat("/etc/python2.6", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat("/etc/python2.6/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory) open("/etc/python2.6/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/python2.6/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/python2.6/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/python2.6/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory) stat("/usr/lib/python2.7/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory) open("/usr/lib/python2.7/apport_python_hook.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/lib/python2.7/apport_python_hookmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/lib/python2.7/apport_python_hook.py", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/lib/python2.7/apport_python_hook.pyc", O_RDONLY) = -1 ENOENT (No such file or directory) stat("/usr/lib/python2.7/plat-linux2/apport_python_hook", 0x7fffa15601f0) = -1 ENOENT (No such file or directory) ... 

En su caso, yo instalaría los módulos necesarios también para python 2.7 en el directorio python2.7.

2) Invocando Python 2.6

Es posible que desee echar un vistazo a la parte de la página del manual donde se describe PYTHONHOME:

PYTHONHOME: cambia la ubicación de las bibliotecas estándar de Python. De manera predeterminada, las bibliotecas se buscan en $ {prefix} / lib / python [versión] y $ {exec_prefix} / lib / python [versión], donde $ {prefix} y $ {exec_prefix} son directorios dependientes de la instalación, ambos predeterminados a / usr / local

Puede almacenar los archivos / módulos específicos de python 2.7 en el directorio apropiado en su instalación local. Esos archivos / módulos solo se recogerán cuando ejecute la versión específica de python. En este caso, no debe establecer el PYTHONPATH (o PYTHONHOME).

Nota: esta es exactamente la forma en que Debian (y quizás otras distribuciones) administran diferentes versiones de Python instaladas simultáneamente.

[Editar: se agregó la sección 1 después de recibir un comentario de niboshi.]

En el inicio, Python toma la variable de entorno PYTHONPATH y la coloca en la variable sys.path . Cuando intenta importar un módulo, busca las rutas en sys.path

Porque:

 export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH 

sus rutas de Python 2.7 están al principio de sys.path , antes de las rutas de Python 2.6 (puede print sys.path para verificar). Eso significa que los módulos de $HOME/local/lib/python2.7 tendrán una prioridad.

Para personalizar las rutas para algunos de sus scripts, configure PYTHONPATH por script o modifique sys.path ( sys.path.insert(0, '/home/user/local/lib/python2.7') directamente en su script antes Se realiza cualquier importación.

O copie un módulo específico a su proyecto con un nombre diferente. Por ejemplo, copié el módulo de collections de Python 2.7 a mi proyecto con como collections27.py , y en los lugares donde necesito OrderedDict hago from collection27 import OrderedDict

¿Es posible cargar solo 2.6 módulos cuando se invoca Python 2.6?

Sí, supongo. Solo asegúrate de que solo haya módulos de Python 2.6 en la ruta, no uses:

 export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH 

Puedo sugerir Pythonbrew como una alternativa más fácil.

Una vez que tengas Pythonbrew instalado:

 $ pythonbrew install 2.7.2 $ pythonbrew switch 2.7.2