2009-07-11 17 views
57

Estoy desarrollando/probando un paquete en mi directorio local. Quiero importarlo en el intérprete (v2.5), pero sys.path no incluye el directorio actual. En este momento escribo sys.path.insert(0,'.'). ¿Hay una mejor manera?Importe el paquete python desde el directorio local al intérprete

Además,

from . import mypackage 

produce este error:

ValueError: Attempted relative import in non-package 
+0

Dónde leíste eso "" era un módulo de Python? –

+9

@Lott: es una ruta de importación relativa que se describe aquí: http://docs.python.org/reference/simple_stmts.html#the-import-statement – projectshave

Respuesta

28

Puede utilizar las importaciones relativas solo desde un módulo que a su vez se importó como parte de un paquete; su script o intérprete interactivo no, por supuesto from . import (lo que significa "importar desde el mismo paquete que obtuve importado de ") no funciona. import mypackage estará bien una vez que asegure que el directorio principal de mypackage está en sys.path (cómo logró obtener su directorio actual lejos de sys.path No sé - ¿tiene algo extraño en site.py, o ... ?)

Para obtener su directorio actual de nuevo en sys.path, de hecho, no hay mejor manera que ponerlo allí ;-).

+0

Python 2.5 para Ubuntu 8.10 no tiene el directorio actual (cadena vacía) en sys.path para el intérprete. No cambié nada, así que de alguna manera fue enviado de esa manera. Acabo de instalar 3.0 y sys.path DOES have '' en sys.path. – projectshave

+0

@projectshave, OK, ¡sin dudas, Ubuntu tiene sus razones! No me di cuenta de eso en 8.04 (lo que usamos actualmente en el trabajo) pero quizás no estaba prestando suficiente atención. –

+1

Estoy parcialmente equivocado. Python invocado desde un shell tiene el directorio actual en sys.path. Python invocado desde Emacs no tiene el directorio actual. Extraño. – projectshave

2

Usando sys.path debe incluir el directorio actual ya.

Probar:

import . 

o:

from . import sth 

sin embargo, puede no ser una buena práctica, ¿por qué no sólo tiene que utilizar:

import mypackage 
+1

El problema con es que cargará el paquete desde el servidor global python env, podría cargar el paquete/archivo desde la carpeta local, pero también podría cargar algún otro mypackge aleatorio que esté en el entorno de trabajo. –

12

consulte la documentación de sys. ruta:

http://docs.python.org/library/sys.html#sys.path

Para citar:

If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

Por lo tanto, no hay necesidad de mono con sys.path si estás empezando el intérprete de Python desde el directorio que contiene el módulo.

Además, para importar el paquete, simplemente:

import mypackage 

Desde el directorio que contiene el paquete ya está en sys.path, que debería funcionar bien.

+0

Fallará si existe un nombre de archivo similar en otro lugar en el entorno de trabajo. –

+0

@ JAR.JAR.beans el directorio de trabajo actual debe ser lo primero en 'sys.path' para que los archivos se encuentren antes de los archivos en cualquier otro lugar en el entorno de trabajo. – SpoonMeiser

+0

Buen punto. Es decir, si ejecutamos el archivo desde el directorio local. En el caso de que se trate de alguna otra carpeta, y en el caso de que se necesite un cambio en sys.path, significa 'sys.path.insert (0, new_path)' en lugar de 'sys.path.append (new_path)'. –

4

Una forma sencilla de hacerlo funcionar es ejecutar su secuencia de comandos desde el directorio principal utilizando el indicador -m de python, p. Ej. python -m packagename.scriptname. Obviamente, en esta situación necesita un archivo __init__.py para convertir su directorio en un paquete.

4

Que sea sencillo:

try: 
    from . import mymodule  # "myapp" case 
except: 
    import mymodule   # "__main__" case 
+3

Me gusta esta solución, es la más simple. La única pregunta que queda es por qué la regla de "solo una forma de hacerlo" se consideró opcional al implementar las importaciones ... En serio, hay alrededor de 15 formas de declarar y organizar los paquetes, todas las cuales tienen inconvenientes –

5

Si desea ejecutar un script en Python, sin modificar lo que importa bibliotecas desde un directorio local específico puede establecer la variable de entorno PYTHONPATH - por ejemplo,en bash:

export PYTHONPATH=/home/user/my_libs 
python myscript.py 

Si sólo quieren que importar del directorio de trabajo actual utilice la notación .:

export PYTHONPATH=. 
python myscript.py 
Cuestiones relacionadas