La importación del paquete instalado desde el script con el mismo nombre genera “AttributeError: el módulo no tiene atributo” o “ImportError: no se puede importar el nombre”

3 minutos de lectura

avatar de usuario
idjaw

tengo un script llamado requests.py que importa el paquete de solicitudes. El script no puede acceder a los atributos del paquete o no puede importarlos. ¿Por qué no funciona esto y cómo lo soluciono?

El siguiente código genera un AttributeError.

import requests

res = requests.get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    import requests
  File "/Users/me/dev/rough/requests.py", line 3, in <module>
    requests.get('http://www.google.ca')
AttributeError: module 'requests' has no attribute 'get'

El siguiente código genera un ImportError.

from requests import get

res = get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests import get
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests import get
ImportError: cannot import name 'get'

O código que importa desde un módulo dentro del requests paquete:

from requests.auth import AuthBase
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests.auth import AuthBase
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests.auth import AuthBase
ImportError: No module named 'requests.auth'; 'requests' is not a package

  • Tenga en cuenta que esto pretende ser una respuesta canónica a una pregunta común… no cierre como duplicado a menos que esté seguro de que la otra pregunta tiene una respuesta mejor y más completa.

    – Ffisegydd

    27/03/2016 a las 18:01

avatar de usuario
idjaw

Esto sucede porque su módulo local llamado requests.py sombrea lo instalado requests módulo que está tratando de usar. El directorio actual se antepone a sys.pathpor lo que el nombre local tiene prioridad sobre el nombre instalado.

Un consejo adicional de depuración cuando esto suceda es mirar cuidadosamente el Traceback y darse cuenta de que el nombre de su secuencia de comandos en cuestión coincide con el módulo que está tratando de importar:

Fíjate en el nombre que usaste en tu script:

File "/Users/me/dev/rough/requests.py", line 1, in <module>

El módulo que está tratando de importar: requests

Cambie el nombre de su módulo a otra cosa para evitar la colisión de nombres.

Python puede generar un requests.pyc archivo junto a su requests.py archivo (en el __pycache__ directorio en Python 3). Elimine eso también después de cambiar el nombre, ya que el intérprete seguirá haciendo referencia a ese archivo, reproduciendo el error. sin embargo, el pyc presentar en __pycache__ debería no afectará su código si el py el archivo ha sido eliminado.

En el ejemplo, cambiar el nombre del archivo a my_requests.pyquitando requests.pycy se ejecuta de nuevo con éxito imprime <Response [200]>.

avatar de usuario
dave rove

El error ocurre porque una secuencia de comandos creada por el usuario tiene un conflicto de nombres con un nombre de archivo de biblioteca. Tenga en cuenta, sin embargo, que el problema puede ser causado indirectamente. Puede ser necesario un poco de trabajo de detective para averiguar qué archivo está causando el problema.

Por ejemplo: suponga que tiene un script mydecimal.py eso incluye import decimalcon la intención de utilizar la biblioteca estándar decimal biblioteca para cálculos precisos de coma flotante con números decimales. Eso no causa ningún problema, porque no hay una biblioteca estándar. mydecimal. Sin embargo, sucede que decimal importaciones numbers (otro módulo de biblioteca estándar) para uso interno, por lo que un script llamado numbers.py en su proyecto causaría el problema.

Si aún encuentra problemas como este después de realizar un seguimiento propio y cambiar el nombre o eliminar el .py archivos en su proyecto, también verifique .pyc archivos que Python usa para almacenar en caché la compilación de códigos de bytes al importar módulos. En 3.x, estos se almacenarán en carpetas con el nombre especial __pycache__; es seguro eliminar tales carpetas y archivos, y es posible suprimirlos (pero normalmente no querrá hacerlo).

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad