Importar módulo desde subcarpeta


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

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 fábrica incluyo los módulos secundarios:

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

Si llamo a mi foofactory obtengo 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
Author: Razer, 2012-01-21

4 answers

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

Para usar correctamente las importaciones absolutas en un paquete, debe incluir también el nombre de paquete" root", por ejemplo:

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

O puedes usar importaciones relativas :

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
 93
Author: Rob Wouters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-21 16:18:01

Solo para notificar aquí. (de un newbee, keviv22)

Nunca y nunca por tu propio bien, nombra las carpetas o archivos con espacios o símbolos como "-" o "_". Si lo hizo, puede enfrentar pocos problemas. como el mío, digamos, aunque su comando para importar es correcto, no podrá importar con éxito los archivos deseados que están disponibles dentro de dichas carpetas con nombre.

Nombres de carpeta no válidos como sigue:

  • Generic-Classes-Folder
  • Generic_Classes_Folder

Nombres de carpeta válidos para arriba:

  • GenericClassesFolder o Genericclassesfolder o genericClassesFolder (o como este sin espacios o símbolos especiales entre las palabras)

Qué error cometí:

Considere la estructura del archivo.

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.py' archivo dentro el archivo Generic-Class-Folder para usar la función llamada "functionExecute" en 'targetClass.py" file

¿Qué orden hice?

  • de "testFile.py', escribió el comando, desde el Núcleo.Generic-Class-Folder.targetClass import functionExecute
  • Tiene errores como"SyntaxError: invalid syntax"

Intentó muchas búsquedas y vio muchas preguntas de stackoverflow y no pudo decidir qué salió mal. He cruzado mis archivos varias veces, he utilizado __init__.py archivo, inserta la ruta del entorno y enormemente preocupado por lo que salió mal......

Y después de mucho, mucho, mucho tiempo, me di cuenta de esto mientras hablaba con un amigo mío. 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. Por lo tanto, esto es lo que quería transmitir. ¡Que tengas un buen día!

(lo siento por el enorme post sobre esto... solo dejo ir mis frustraciones.... :) Gracias!)

 14
Author: Vivek22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-27 12:10:08

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

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

import os
import sys
sys.path.insert(0, os.getcwd())
 3
Author: Maxim Kamenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-21 16:06:42

Digamos que tu proyecto está estructurado de esta manera:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

Dentro de run.py, puede importar scripts uno y dos mediante:

from subscripts import script_one as One
from subscripts import script_two as Two

Ahora, todavía dentro de run.py, podrás llamar a sus métodos con:

One.method_from_one(param)
Two.method_from_two(other_param)
 0
Author: Flavio Wuensche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-25 20:34:20