2010-02-24 22 views
77

¿Cuál es la forma correcta de corregir este error ImportError?Cómo reparar el error "ImportError: No module named ..." en Python?

que tienen la siguiente estructura de directorios:

/home/bodacydo 
/home/bodacydo/work 
/home/bodacydo/work/project 
/home/bodacydo/work/project/programs 
/home/bodacydo/work/project/foo 

Y estoy en el directorio

/home/bodacydo/work/project 

Ahora si escribo

python ./programs/my_python_program.py 

instante me sale

ImportError: No module named foo.tasks 

El ./programs/my_python_program.py contiene la siguiente línea:

from foo.tasks import my_function 

no puedo entender por qué Python no encontrará ./foo/tasks.py - que está ahí.

Si lo hago desde la terminal de Python, entonces funciona:

python 
>>> from foo.tasks import my_function 

Sólo no funciona si la llamo través python ./programs/my_python_program.py guión.

Respuesta

81

Python no añade el directorio actual a sys.path, sino más bien el directorio que el script se encuentra en. Añadir a /home/bodacydo/work/project ya sea sys.path o $PYTHONPATH.

+1

Entonces, ¿cuál es el punto de tener __init__.py en la carpeta raíz? Parece que no sirve para nada si edita sys.path o pythonpath. –

+7

@Editor: '__init __. Py' solo indica que el directorio debe tratarse como un paquete, cuando su elemento primario está en' sys.path' o es un paquete en sí mismo. –

+1

Además, verifique los permisos en la carpeta. Ese fue el problema en mi caso. – SidJ

31

¿Tiene un archivo llamado __init__.py en el directorio foo? Si no, entonces python no reconocerá a foo como un paquete de Python.

Consulte el section on packages en el tutorial de Python para obtener más información.

+0

Gracias y sí, tuve '__init __. py'. El problema esta vez fue con '$ PYTHONPATH'. La solución de Ignacio funcionó. – bodacydo

+1

Los archivos __init__.py son necesarios para que Python considere que los directorios contienen paquetes; esto se hace para evitar que los directorios con un nombre común, como una cadena, oculten involuntariamente los módulos válidos que ocurren más adelante en la ruta de búsqueda del módulo. En el caso más simple, __init__.py solo puede ser un archivo vacío – panofish

+0

Gracias por salvarme alguna vez. –

2

En mi opinión, tengo que considerar que la carpeta foo es una biblioteca independiente. Es posible que desee considerar moverlo a la carpeta Lib\site-packages dentro de una instalación de Python. Me gustaría considerar agregar un archivo foo.pth allí.

sé que es una biblioteca ya que el ./programs/my_python_program.py contiene la siguiente línea:

from foo.tasks import my_function

Por lo tanto, no importa que ./programs es una carpeta de hermanos a ./foo. Es el hecho de que my_python_program.py se ejecuta como un script como el siguiente:

python ./programs/my_python_program.py

7

Aquí está una solución paso a paso:

  1. Añadir un script llamado run.py en /home/bodacydo/work/project y editarlo como esto:

    import programs.my_python_program 
    programs.my_python_program.main() 
    

    (main() sustituir con su método equivalente en my_python_program.)

  2. Ir a /home/bodacydo/work/project
  3. Run run.py

Explicación: Desde pitón añade a PYTHONPATH el camino de el script desde el que se ejecuta, corriendo run.py anexará /home/bodacydo/work/project. Y voilà, import foo.tasks serán encontrados.

7

Ejemplo de solución para agregar la biblioteca a su PYTHONPATH.

  1. Añadir la siguiente línea en su archivo ~/.bashrc o simplemente ejecutarlo directamente:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python" 
    
  2. entonces Enlace su biblioteca requerida en la carpeta ~/.python, por ejemplo,

    ln -s /home/user/work/project/foo ~/.python/ 
    
0

Un mejor solución que el establecimiento de PYTHONPATH es utilizar python -m module.path

Esto ajustado correctamente sys.path[0] y es una manera más fiable para ejecutar módulos.

Tengo un quick writeup acerca de este problema, como otros han mencionado que responden al razón de esto es python path/to/file.py pone path/to en el comienzo de la PYTHONPATH (sys.path).

Cuestiones relacionadas