viernes, mayo 17, 2024
No menu items!
InicioBlogsCómo resolver ImportError: intento de importación relativa sin un paquete principal conocido...

Cómo resolver ImportError: intento de importación relativa sin un paquete principal conocido (Python)

¿Tiene problemas con el 'Error de importación: intento de importación relativa sin paquete principal conocido' en Python? Descubra la guía esencial para comprender y corregir este error común de Python. En este artículo, aprenderá:

  • La explicación detallada del error 'ImportError: intento de importación relativa sin paquete principal conocido'.
  • Soluciones paso a paso para resolver este problema de importación en su código Python.
  • Información sobre las importaciones relativas de Python y las mejores prácticas para la gestión de paquetes.

Esta guía es perfecta para los desarrolladores de Python que buscan mejorar sus habilidades de codificación y solucionar errores de importación de manera efectiva. ¡Sumérgete en nuestro completo tutorial y domina el arte de resolver errores de importación de Python hoy!

Cómo resolver ImportError: intento de importación relativa sin paquete principal conocido (ModuleNotFoundError: ningún módulo llamado 'nombre')

Por ejemplo, aparece el error al ejecutar un archivo dentro de un paquete como un script.

Programador destacó mientras analizaba códigos en su computadora.

Para deshacerse del error ImportError: intento de importación relativa sin paquete principal conocido Tienes dos formas de probar las funciones del paquete:

  • Ejecute un script con el modificador -m.
  • Utilice la importación global dentro de los archivos del paquete que planea ejecutar como scripts.

Para deshacerse de la versión anterior de este error ModuleNotFoundError: ningún módulo llamado 'nombre'la ruta a la carpeta del paquete debe estar en el CAMINO variable del sistema. Puedes hacer esto de diferentes maneras, por ejemplo:

  • Mueva la carpeta del paquete a un directorio que ya esté en CAMINO.
  • Agregue la carpeta donde se encuentra el paquete CAMINO por su cuenta a través de la consola o la configuración del sistema.
  • Instale el paquete en el sistema usando el herramientas de configuración módulo.
  • Agregue la dirección de la carpeta del paquete a CAMINO utilizando el sistema y rutalib módulos en aquellos archivos de paquete que planea ejecutar como un script separado.

Profundicemos en:

Comprenda el error ImportError: intento de importación relativa sin un paquete principal conocido

Una de las ventajas clave del lenguaje Python es su infraestructura. Puede encontrar un módulo listo para usar para casi cualquiera de sus tareas.

🔥 Leer:  ¿Cómo permitir puertos IPsec a través del Firewall Windows 10?

El meme de xkcd A continuación se muestra una buena ilustración de esta afirmación:

  'ImportError: Intento de importación relativa sin paquete principal conocido': commic

En este cómic, un hombre dice que volar es una tarea sencilla; solo necesitas escribir importar antigravedad. ¡ADVERTENCIA! No intente importar antigravedad en casa sin asegurar los artículos frágiles.

Es sencillo crear sus módulos y paquetes para Python. Sin embargo, esto también tiene una desventaja. A medida que los paquetes evolucionaron, algunos de los nombres internos de los paquetes comenzaron a duplicar los globales.

Por ejemplo, existe un paquete llamado gráficos, pero esta es una palabra bastante común e inevitablemente se usa en otros paquetes relacionados con gráficos.

Digamos que creó un paquete de supergráficos con la siguiente estructura:

supergráficos | – gráficos | | –rectángulos.py | | –circles.py | – utiles | | –cambiar tamaño | | | –shrink.py | | | –stretch.py ​​| | –screen.py | | –impresora.py | –unittests.py

¿Cómo se puede determinar cuándo llamar a importar gráficos dentro del pruebas unitarias.py archivo, ya sea que se refiera a un paquete de PyPI (Índice de paquetes de Python) (supongamos que lo ha instalado) o a un módulo local dentro de su biblioteca.

Una forma es utilizar siempre una importación absoluta:

importar supergraphics.graphics

Pero en Python puedes usar la llamada importación relativa. Su capacidad y uso se especifican en pep328.

Las importaciones relativas se implementan de la siguiente manera: puedes usar un punto . para importar un paquete desde el mismo nivel donde te encuentras. Si importa gráficos desde prueba unitaria.py, escribirías esto:

importar .gráficos

Si necesitas importar algo de otra carpeta, le pondrías un punto para subir a un nivel superior.

Por ejemplo, para importar gráficos desde el encoger.py archivo, escribirías esto:

importar…gráficos Imaginar

Puedes considerar que la palabra invisible padre precede a cada punto:

importar __parent__.__parent__.__parent__.graphics

Esto aclara un poco el principio, pero escribir esto, por supuesto, no es muy conveniente. Al final, puedes utilizar importaciones globales.

Gracias a las importaciones relativas, puede agregar nuevas carpetas a la estructura del paquete. Esto no siempre requerirá que rehagas todas las importaciones.

Primer plano de la mano escribiendo en un teclado, concepto de trabajo de oficina.

Por ejemplo, si desea mover todas sus carpetas y archivos actuales a una carpeta de nivel superior, esto no provocará cambios en los archivos secundarios.

Las importaciones relativas sólo se permiten dentro de un paquete. Esto es consistente con el sentido común y la seguridad. Sólo se puede garantizar la estructura de carpetas dentro del paquete.

Un paquete es una unidad estructural independiente y sus componentes no deben interactuar con rutas relativas con los paquetes vecinos.

🔥 Leer:  Cómo configurar y ajustar la configuración de pantalla de Mac para un proyector

Es muy fácil crear un paquete Python; solo necesitas crear un __init__.py archivo en la raíz de la carpeta para importar esta carpeta como un paquete.

Creemos un pequeño módulo con la siguiente estructura de carpetas y contenido de archivos:

hola | – di_hola.py | def hola(nombre): | return f”¡Hola, {nombre}!” | – introducir.py | desde .say_hello importar hola | def hola_to(): | nombre = input('¿Cuál es tu nombre?\n') | devolver hola(nombre) + '\ n¡Encantado de conocerte!' | –__ inicio__.py

Ahora puedes usar tu paquete desde la terminal Python:

>>> from hi.introduce import hello_to >>> print(hello_to()) ¿Cuál es tu nombre? Robot ¡Hola robot! ¡Encantado de conocerlo!

Ahora agreguemos pruebas al introducir.py archivo. Se verá así:

from .say_hello import hola def hola_to(): nombre = input('¿Cuál es tu nombre?\n') return hola(nombre) + '\ n¡Encantado de conocerte!' if __name__ == '__main__': afirmar 'Alex' en hola('Alex') print('¡Prueba aprobada!')

Ahora puedes importar el Hola a() funcionar a partir de él. Si ejecutas el presentar.py archivo como un script, comprobará si el valor devuelto por el Hola() La función contiene el nombre que envió como argumento.

Si intenta ejecutar este archivo como un script, obtendrá un ImportError: intento de importación relativa sin paquete principal conocido:

(venv)> python hi\introduce.py Traceback (última llamada más reciente): archivo “hi\introduce.py”, línea 1, en de .say_hello import hello ImportError: intento de importación relativa sin paquete principal conocido

Otra solución sería no utilizar importaciones relativas.

cambiemos el presentar.py archivo de la siguiente manera:

(venv)> python -m hi.introduce ¡Prueba aprobada!

Ahora puede ejecutar este archivo como un script sin el -metro llave:

from hi.say_hello import hola def hola_to(): nombre = input('¿Cuál es tu nombre?\n') return hola(nombre) + '\ n¡Encantado de conocerte!' if __name__ == '__main__': afirmar 'Alex' en hola('Alex') print('¡Prueba aprobada!')

Otro problema puede ser que Python no sepa dónde se encuentra el paquete.

Bajemos el paquete un nivel dentro de la carpeta Proyecto e intentemos nuevamente ejecutarlo. presentar.py:

Proyecto | –hola | – di_hola.py | def hola(nombre): | return f”¡Hola, {nombre}!” | – introducir.py | desde .say_hello importar hola | def hola_to(): | nombre = input('¿Cuál es tu nombre?\n') | devolver hola(nombre) + '\ n¡Encantado de conocerte!' | –__ init__.py (venv)\Project> python hi\introduce.py Traceback (última llamada más reciente): Archivo “hi\introduce.py”, línea 1, en de hi.say_hello import hello ModuleNotFoundError: Ningún módulo llamado “hola”

Para deshacerse de este problema, debe agregar la ruta de la carpeta del paquete a CAMINO o coloque el paquete en una carpeta que ya esté en CAMINO. Por ejemplo, /lib/site-packages.

Antes de agregar la dirección de un módulo a CAMINO o copiarlo a una carpeta que ya existe en CAMINOdebe asegurarse de que el nombre de su paquete sea único.

De lo contrario, uno de los paquetes no funcionará, ya sea el suyo o el que ya está instalado con el mismo nombre.

importerror: intento de importación relativa sin paquete principal conocido

Para que su paquete esté disponible globalmente, Python tiene un mecanismo especial.
Puede instalar su paquete usando las utilidades del herramientas de configuración módulo.

vamos a crear un configuración.py archivo con el siguiente contenido en la carpeta raíz del paquete:

desde setuptools importar configuración, find_packages setup(name=”hola”, paquetes = find_packages())

A continuación, comience a instalar el paquete con el siguiente comando. Por cierto, siempre debes utilizar un entorno virtual; no instale ningún paquete en el intérprete global.

Para Python 3, hay una utilidad venv incorporada. Esto es muy útil si, por ejemplo, tienes que utilizar diferentes versiones de bibliotecas en tus diferentes proyectos:

(venv)> python hi\setup.py instalar

Después del inicio, obtendrá un largo registro de instalación. Si no hubiera errores, podría utilizar el hola módulo globalmente.

Si por alguna razón no desea instalar su módulo en el sistema, puede agregar el directorio actual a la ruta.

Asegúrese de hacer esto antes de todas las importaciones desde el módulo. Añade un bloque que modificará CAMINO hacia introducir.py archivo:

importar sistema desde pathlib importar archivo de ruta = ruta (__ archivo __). resolver() directorio_raíz_paquete = archivo.padres [1]
sys.path.append(str(package_root_directory)) from hi.say_hello import hola def hello_to(): nombre = input('¿Cuál es tu nombre?\n') print(hola(nombre) + '\n¡Encantado de conocerte! ') if __name__ == '__main__': afirmar 'Alex' en hola('Alex') print('¡Prueba aprobada!')

Ahora puedes usar la importación global en tu presentar.py archivo incluso si el módulo hi no está instalado en el sistema a través de setuptools.

Tenga en cuenta que archivo.padres[1] se utiliza aquí porque necesitas subir un nivel para el hola paquete estar disponible.

Es decir, debes dirigirte a la carpeta donde se encuentra la carpeta con el paquete. En el caso actual, este es el Proyecto:

Proyecto | –hola | – di_hola.py | – introducir.py | –__ init__.py archivo.padres[0] =.\Proyecto\hi archivo.padres[1] =.\Proyecto

Si la estructura del árbol fuera más profunda, entonces se tendrían que utilizar los padres con índices más altos.

Aquí hay más soporte para Python:

Recomendamos

Populares