2009-06-16 8 views
10

Medio Ambiente: Debian 4.0PYTHONPATH ignorado

Python 2.4

Mi 'proyecto' se instala en:

/usr/lib/python2.4/site-packages/project.

Pero yo quiero usar mi copia de trabajo en lugar de la instalada, que se encuentra en:

/home/me/dev/proyecto/src

Así que lo que hago es:

PYTHONPATH exportación =/home/me/dev/proyecto/src

ipython

importación foo # que está en src

foo.__file__

*/usr/lib/python2.4/site-packages/project/foo.py* 

en lugar de:

/home/me/dev/proyecto/src/proyecto/foo .py

¿Cómo es que vino? Trato de comprobar los pathes (después de haber hecho la exportación arriba) y lo que veo es: sys

importación, os

sys.path

[ '', '/ usr/bin ', ' /usr/lib/python2.4/site-packages ', '/home/me/dev/project/src ', ' /usr/lib/python24.zip ', '/usr/lib/python2.4 ', ' /usr/lib/python2.4/plat-linux2 ', ' /usr/lib/python2.4/lib-tk ', '/u sr/lib/python2.4/lib-dynload ', ' /usr/local/lib/python2.4/site-packages ', ' /usr/lib/python2.4/site-packages/PIL ', '/var/lib/python-support/python2.4', '/usr/lib/python2.4/site-packages/IPython/Extensions', '/home/me/.ipython']

os.environ [ 'PYTHONPATH']

/home/me/dev/proyecto/src

+1

máquina funciona correctamente: > exportación PYTHONPATH = foo > ipython > import sys > * sys.path = [ '/etc/python2.4', '/ home/me/foo ', ' /usr/lib/python24.zip ', ' /usr/lib/python2.4 ', ' /usr/lib/python2.4/plat-linux2 ', '/usr/lib/python2 .4/lib-tk ', ' /usr/lib/python2.4/lib-dynload ', ' /usr/local/lib/python2.4/site-packages ', '/usr/lib/python2 .4/site-packages ', '/var/lib/python-support/python2.4', ] * En la máquina no funciona correctamente, */usr/lib/python2.4/site-packages * va antes en la lista ... –

+0

Vamos a hacer algunas preguntas precisas en su lugar: Todo el mundo está de acuerdo en que si configuro PYTHONPATH en una ruta de módulo válida, ¿debería cargar este módulo primero independientemente? Todo el mundo está de acuerdo con que python intente cargar módulos siguiendo el orden de sys.path? Si el aboce es correcto, ¿por qué python no inserta PYTHONPATH al comienzo de sys.path (después de los huevos)? –

Respuesta

0

creo que configura PYTHONPATH a/home/me/construcción/PR oject/src desde/home/me/dev/project/src no aparece en sys.path, pero/home/me/build/project/src sí.

+0

Gracias David. sys.path incluye/home/me/dev/project/src en su lugar/home/me/build/project/src (ya que he cambiado el nombre de algunas de las cosas que hubo un error allí). El problema persiste –

1

Veo '/usr/lib/python2.4/site-packages' en su camino antes de '/ home/me/dev/project/src', ¿eso importa?¿Qué pasa cuando cambias los dos?

A partir de los documentos:

Cuando PYTHONPATH no está establecido, o cuando el archivo no se encuentra allí, continúa la búsqueda de una ruta predeterminada dependiente de la instalación

Así que tal vez no lo hiciste ¿Encontraste tu copia de trabajo en tu PYTHONPATH como pensabas?

+0

Creo que John tiene razón, Python usará el módulo con el índice más bajo en sys.path – wodemoneke

+0

Sí, eso importa. PYTHON, AFAIK, debe insertar la PYTHONPATH primero (o justo después de '.') Mi PYTHONPATH es correcta. –

+1

Pero si cometió un error, como omitir el archivo __init__.py en/home/me/dev/project/src, entonces python continuará para encontrar el paquete prod en site-packages –

4

No creo que tenga ningún control sobre dónde se inserta PYTHONPATH en la lista de ruta real. Pero esa no es la única forma de modificar la ruta: puede actualizar sys.path usted mismo antes de intentar importar el proyecto.

Editar: Comportamiento En su caso específico, se puede modificar la ruta con

import sys 
sys.path.insert(2, '/home/me/dev/project/src') 
+1

Entonces, ¿no puedo forzar a Python a buscar módulos? –

+0

Lo sé. Pero no quiero tocar el código. –

+0

esto funcionó para mí usando un cuaderno ipython, mientras que establecer PYTHONPATH en el shell de comando no. Gracias. – darKoram

6

Según la documentación pitón, Se espera: https://docs.python.org/2.4/lib/module-sys.html:

en cuenta que la secuencia de comandos directorio es insertado antes las entradas insertadas como resultado de PYTHONPATH .

Bajo python-2.6 es diferente: http://docs.python.org/tutorial/modules.html#the-module-search-path

+1

Estoy bien con los huevos. :) Pero ¿por qué '/usr/lib/python2.4/site-packages' viene antes de mi ruta de Python? ¿Cómo puedo forzar que PYTHONPATH tenga más prioridad que el '/usr/lib/python2.4/site-packages' sin cambiar el sys.path dentro del archivo python? –

+0

@joseph: actualizó la respuesta. – van

+0

@van. No lo entiendo Establecí el PYTHONPATH en algo correcto y carga primero lo que está en los paquetes del sitio. ¡Extraño! –

0

Suena como el directorio src no tiene un archivo __init__.py. No es un paquete apropiado.

+0

Como verás arriba, hay uno. –

+0

@ S.lott lo siento. Lo que dije fue "__init __. Py' está ahí (en'/home/me/dev/project/src') " –

1

No es una respuesta directa a su pregunta, pero también podría usar un virtualenv para crear un entorno de desarrollo. En ese virtualenv, puede instalar su producto en/home/me/dev/project/src como un paquete de desarrollo: "python setup.py develop".

De esta manera no tiene que cambiar su PYTHONPATH manualmente. Simplemente active el virtualenv si quiere usar el código de desarrollo.

5

Encontré el problema (me he perdido al principio cuando alguien me indicó Where is Python's sys.path initialized from?).

Parece que easy_install crea un pth file /usr/lib/python2.4/site-packages/easy-install.pth que luego es cargado por site.py. Esto inserta la ruta de paquetes de sitio en la ruta sys antes de PYTHONPATH. No está bien.