2012-01-21 74 views
54

Quiero importar subcarpetas como módulos. Por lo tanto, cada subcarpeta contiene un __init__.py. Mi estructura de carpetas es la siguiente:Importar módulo de la subcarpeta

src\ 
    main.py 
    dirFoo\ 
    __init__.py 
    foofactory.py 
    dirFoo1\ 
     __init__.py 
     foo1.py 
    dirFoo2\ 
     __init__.py 
     foo2.py 

En mi script principal importo

from dirFoo.foofactory import FooFactory 

En este archivo de la fábrica incluyo los submódulos:

from dirFoo1.foo1 import Foo1 
from dirFoo2.foo2 import Foo2 

Si llamo a mi foofactory I obtener el error, que python no puede importar los submódulos foo1 y foo2:

Traceback (most recent call last): 
    File "/Users/tmp/src/main.py", line 1, in <module> 
from dirFoo.foofactory import FooFactory 
    File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module> 
from dirFoo1.foo1 import Foo1 
    ImportError: No module named dirFoo1.foo1 

Respuesta

79

No hay necesidad de meterse con su PYTHONPATH o sys.path aquí.

utilizar correctamente importaciones en términos absolutos en un paquete que debe incluir el nombre de paquete "raíz", así, por ejemplo .:

from dirFoo.dirFoo1.foo1 import Foo1 
from dirFoo.dirFoo2.foo2 import Foo2 

o puede utilizar relative imports:

from .dirfoo1.foo1 import Foo1 
from .dirfoo1.foo1 import Foo2 
+24

Una cosa para recordar! agregue '__init __. py' a cada subcarpeta desde la que está importando. –

+3

Vaciar '__init __. Py' puede hacer el trabajo. – cerebrou

+0

¿Cuál sería la sintaxis si previamente 'Foo1' estaba en el directorio padre y uno codificado como' from Foo1 import * '. ¿Hay alguna manera de lograr el mismo efecto para que no tengas que prefijar todo con 'Foo1'? – jxramos

3

Establezca su variable de entorno PYTHONPATH. Por ejemplo, como este PYTHONPATH =.: .. (para la familia * nix).

También puede agregar manualmente el directorio actual (src en su caso) a PYTHONPATH:

import os 
import sys 
sys.path.insert(0, os.getcwd()) 
4

Sólo para notificar aquí. (de un bebe nuevo, keviv22)

Nunca y por el bien de su propio bien, nombre las carpetas o archivos con espacios o símbolos como "-" o "_". Si lo hizo, puede enfrentar algunos problemas. como el mío, digamos que, aunque su orden de importación es correcta, no podrá importar con éxito los archivos deseados que están disponibles dentro de dichas carpetas nombradas.

namings no válidos de carpeta como sigue:

  • genéricos-clases-Folder
  • Generic_Classes_Folder

namings carpeta válida para arriba:

  • GenericClassesFolder o Genericclassesfolder o genericClassesFolder (o así sin espacios ni s símbolos pecial entre las palabras)

Qué error que yo:

consideran la estructura de archivos.

Parent 
    . __init__.py 
    . Setup 
    .. __init__.py 
    .. Generic-Class-Folder 
     ... __init__.py 
     ... targetClass.py 
    . Check 
    .. __init__.py 
    .. testFile.py 

¿Qué quería hacer?

  • de testFile.py, quería importar el 'targetClass.Archivo py 'dentro del archivo Generic-Class-Folder para usar la función llamada "functionExecute" en el archivo' targetClass.py '

¿Qué comando hice?

  • de 'testFile.py', comando, escribió desde Core.Generic-Clase-Folder.targetClass functionExecute importación
  • Got errores como "SyntaxError: no válido"

intentado muchas búsquedas y vio muchas preguntas de stackoverflow y no pudo decidir qué salió mal. Crucé mis archivos varias veces, utilicé el archivo __init__.py, inserté la ruta del entorno y me preocupó enormemente por lo que salió mal ...

Y después de mucho, mucho tiempo, me di cuenta al hablar con un amigo de mía. Soy un poco estúpido para usar tales convenciones de nombres. Nunca debería usar espacio o símbolos especiales para definir un nombre para cualquier carpeta o archivo. Entonces, esto es lo que quería transmitir. ¡Tenga un buen día!

(lo siento por el gran mensaje sobre esto ... simplemente dejar que mis frustraciones van .... :) Gracias!)

+2

Espacios y guiones ("-") causarían esto, pero los guiones bajos ("_") deberían funcionar correctamente. – cowlinator

Cuestiones relacionadas