No puedo hacer que una importación absoluta funcione con Python 3.7.0.
Tengo una carpeta principal llamada dumdum que contiene un archivo init y una carpeta llamada foo. Dentro de foo se encuentran un archivo ini y dos módulos, foo1 y foo6.
Quiero que foo6 funcione cuando se llama solo y cuando se llama desde un módulo principal en la carpeta principal dumdum, así que he estado tratando de descubrir cómo hacer que foo6 funcione en todos los casos, es decir, quiero que foo6 funcione solo y cuando no sea el archivo principal. Ejecuto foo6 desde un IDE.
Foo6 llama a foo1, pero cuando lo hago, obtengo un error:
Error de Módulo no encontrado, no hay carpeta llamada ‘foo’
Como foo es la carpeta primaria tanto para foo1 como para foo6, no puedo entender por qué está sucediendo esto.
foo1.py:
def printy(msg):
print(msg)
def printing_mystr(mystr):
printy(mystr)
if __name__ == "__main__":
print(__name__)
printing_mystr(r"Soy una cadena en foo_1")
foo6.py
import sys, pathlib
import os
if __name__ == "__main__":
# si foo es la carpeta principal
print(os.getcwd())
print(str(pathlib.Path(__file__).parent))
sys.path.append(str(pathlib.Path(__file__).parent))
#for i in sys.path:
#print(i)
from foo.foo1 import printy, printing_mystr
if __name__ == "__main__":
print(__name__)
printing_mystr("Oh soy una cadena pasada a foo_1")
Cuando ejecuto:
import sys
for i in sys.path:
print(i)
Obtengo:
C:\Users\priper\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\priper\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\priper\AppData\Local\Programs\Python\Python37\Lib
C:\Users\priper\AppData\Local\Programs\Python\Python37
C:\Users\priper\AppData\Local\Programs\Python\Python37\Lib\site-packages
C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\win32
C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\win32\lib
C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\Pythonwin
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
C:\Users\priper\Desktop\dumdum\foo
Traceback:
Error de Módulo no encontrado, no hay módulo llamado ‘foo’
en foo6.py…Línea 12
davy.ai
Para resolver el error
ModuleNotFoundError
al llamarfoo1
desdefoo6
, debemos agregar el directorio padre (es decir,dumdum
) a la listasys.path
para que Python pueda encontrar el paquetefoo
.En
foo6.py
, podemos agregar las siguientes líneas antes de la declaración de importación defoo1
para incluir el directorio padre:Esto agregará la ruta absoluta del directorio padre a la lista
sys.path
, por lo que Python puede encontrar el paquetefoo
e importar el módulofoo1
correctamente.Con estos cambios,
foo6
debería funcionar correctamente al llamarse por sí mismo o al importarse como un módulo en el paquetedumdum
.