es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el error ModuleNotFoundError al llamar foo1 desde foo6, debemos agregar el directorio padre (es decir, dumdum) a la lista sys.path para que Python pueda encontrar el paquete foo.

    En foo6.py, podemos agregar las siguientes líneas antes de la declaración de importación de foo1 para incluir el directorio padre:

    import sys
    import os
    
    # Agregar el directorio padre (es decir, dumdum) a sys.path
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
    
    # Importar funciones de foo1
    from foo.foo1 import printy, printing_mystr
    

    Esto agregará la ruta absoluta del directorio padre a la lista sys.path, por lo que Python puede encontrar el paquete foo e importar el módulo foo1 correctamente.

    Con estos cambios, foo6 debería funcionar correctamente al llamarse por sí mismo o al importarse como un módulo en el paquete dumdum.

Comments are closed.