Solucione el error de importación: no se puede importar el nombre en Python

Salman Mehmood 15 febrero 2024
  1. Causa del error ImportError: no se puede importar el nombre en Python
  2. Solucione el error ImportError: no se puede importar el nombre en Python
Solucione el error de importación: no se puede importar el nombre en Python

Con esta explicación, aprenderemos por qué nos sale un error que es ImportError: no se puede importar el nombre. También aprenderemos cómo corregir este tipo de error en Python.

Causa del error ImportError: no se puede importar el nombre en Python

Podemos usar un par de formas de solucionar este error, pero antes de profundizar en las formas de solucionar este error, intentemos entender por qué ocurre este error y cuándo ocurre generalmente el ImportError.

Se produce un ImportError en Python si la instrucción importar dentro de su código experimenta dificultades para importar un módulo con éxito.

Este problema suele ocurrir debido a una instalación defectuosa de una biblioteca externa o una ruta no válida al módulo que está tratando de importar.

Se plantea la pregunta: ¿cuándo ocurre el ImportError: no se puede importar el nombre (xyz)? Este tipo de ImportError generalmente ocurre cuando la clase que intentas importar está en una dependencia circular.

¿Qué significa eso? ¿Qué es una dependencia circular? La dependencia circular generalmente ocurre cuando dos módulos intentan importarse entre sí simultáneamente, de modo que ambos dependen el uno del otro.

Para explicar más esto, necesitamos mirar un ejemplo para entender cómo y cuándo ocurre este error. Digamos que tenemos un par de módulos: demo1.py y demo2.py.

Antes de pasar a las sentencias de importación, veamos el contenido de estos módulos y luego las sentencias de importación.

Como podemos ver, el módulo demo2 tiene un par de funciones: demo2_func1() y demo2_func2(). De manera similar, el módulo demo1 tiene una única función llamada demo1_func1().

Como vemos, dentro del módulo demo2, estamos importando demo1_func1 del módulo demo1. De manera similar, dentro del módulo demo1, estamos tratando de importar la función llamada demo2_func2(), que es parte del módulo demo2.

Python ImportError no puede importar el ejemplo de nombre

Centrémonos en el módulo demo2.

Podemos ver que la función demo2_func1() imprime una cadena y luego carga la función demo1_func1(), que hemos importado desde el módulo demo1. Cuando llama demo1_func1(), imprimirá una cadena.

En la siguiente línea, dentro de la función demo1_func1(), llamamos al método demo2_func2(), por lo que podemos ver que el método demo2_func2() también forma parte del módulo demo1. Podemos ver que estos dos módulos son interdependientes.

En este caso, cuando usamos una sentencia como from demo1 import demo1_func1 y from demo2 import demo2_func2, se produce una dependencia circular.

Si ejecutamos el módulo demo2, entonces el resultado esperado debería ser algo como esto ya que demo2_func1() se llama inicialmente, luego pasamos a la función demo1_func1() y así sucesivamente. Después de la ejecución, tenemos un ImportError que dice (no se puede importar el nombre 'demo1_func1').

ImportError: cannot import name 'demo1_func1' from partially initialized module 'demo1' (most likely
due to a circular import)

Esto ocurre principalmente porque estamos tratando de acceder al contenido de un módulo desde otro y viceversa. Si miramos el módulo demo2.py, intentamos importar la función demo1_func1 desde demo1 antes de que se inicializara demo1_func1; ahí es cuando comienza el programa.

Python todavía está inicializando el contenido del módulo demo1, pero no le damos suficiente tiempo a Python para inicializar la función demo1_func1. Lo estamos llamando directamente, por lo que encontramos este ImportError.

Solucione el error ImportError: no se puede importar el nombre en Python

Ahora veremos cómo podemos solucionar este error. Podemos arreglar este error de dos formas, pero usaremos la forma más fácil: evitar la dependencia circular, y Python puede hacerlo por sí mismo.

Para resolver el problema, debemos hacer ciertos cambios en el código.

Tenemos que modificar la declaración de importación, y en lugar de importar el contenido del módulo, importamos el módulo completo en ambos archivos.

El código fuente del archivo demo1.py:

import demo2


def demo1_func1():
    print("demo1_func1")
    demo2.demo2_func2()

El código del archivo demo2.py:

import demo1


def demo2_func1():
    print("demo2_func1")
    demo1.demo1_func1()


def demo2_func2():
    print("demo2_func2")


if __name__ == "__main__":
    demo2_func1()

Producción :

demo2_func1
demo1_func1
demo2_func2

La mayoría de las veces, este error ocurre cuando estamos desarrollando la aplicación Flask utilizando el enfoque de blueprint, por lo que si está creando una estructura Flask, es posible que deba seguir este enlace.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Python Error