martes, junio 25, 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 &39;Error de importaci√≥n: intento de importaci√≥n relativa sin paquete principal conocido&39; 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 &39;ImportError: intento de importaci√≥n relativa sin paquete principal conocido&39;.
  • 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 &39;nombre&39;)

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 &39;nombre&39;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:  10 mejores guantes quir√ļrgicos

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

  &39;ImportError: Intento de importación relativa sin paquete principal conocido&39;: 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:

importargr√°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:  Mira como AI aprende a jugar el cl√°sico juego de la serpiente

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(&39;¬ŅCu√°l es tu nombre?\n&39;) | devolver hola(nombre) + &39;\ n¬°Encantado de conocerte!&39; | __ 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(&39;¬ŅCu√°l es tu nombre?\n&39;) return hola(nombre) + &39;\ n¬°Encantado de conocerte!&39; if __name__ == &39;__main__&39;: afirmar &39;Alex&39; en hola(&39;Alex&39;) print(&39;¬°Prueba aprobada!&39;)

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(&39;¬ŅCu√°l es tu nombre?\n&39;) return hola(nombre) + &39;\ n¬°Encantado de conocerte!&39; if __name__ == &39;__main__&39;: afirmar &39;Alex&39; en hola(&39;Alex&39;) print(&39;¬°Prueba aprobada!&39;)

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(&39;¬ŅCu√°l es tu nombre?\n&39;) | devolver hola(nombre) + &39;\ n¬°Encantado de conocerte!&39; | __ 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(&39;¬ŅCu√°l es tu nombre?\n&39;) print(hola(nombre) + &39;\n¬°Encantado de conocerte! &39;) if __name__ == &39;__main__&39;: afirmar &39;Alex&39; en hola(&39;Alex&39;) print(&39;¬°Prueba aprobada!&39;)

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