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
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
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!)
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())
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)
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