ImportError: no se puede importar el nombre 'seis' de 'django.utils'

49

Actualmente, ya he actualizado la versión de Django de 2.0.6a 3.0y de repente después de llamar al python manage.py shellcomando recibí este error:

ImportError: no se puede importar el nombre 'seis' de 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Rastro completo:

Traceback (most recent call last):
  File "manage.py", line 13, in <module>
    execute_from_command_line(sys.argv)
  File "/path-to-project/project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/path-to-project/project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/path-to-project/project/venv/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/path-to-project/project/venv/lib/python3.7/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "/path-to-project/project/venv/lib/python3.7/site-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
  File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/__init__.py", line 1, in <module>
    from .checks import check_settings  # noqa: F401
  File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
    from django.utils import six

Preguntas similares:

Leí esta Pregunta y , nota de lanzamiento , pero esos recursos no pudieron ayudarme.

Mohammad Masoumi
fuente
2
Utiliza un paquete corsheadersque todavía utiliza un módulo que se eliminó.
Willem Van Onsem
1
@WillemVanOnsem Muchas gracias, actualicé eso.
Mohammad Masoumi
2
@MohammadMasoumi Básicamente, elimine las declaraciones explícitas como from django.utils import sixsi las tuviera en su código, y luego elimine sistemáticamente las versiones de todos los paquetes requirements.txtque se quejan de esto. En mi caso tuve que chocar también django-nested-adminy djangorestframework.
Raul Laasner, el
Si está trabajando con un paquete que no se ha actualizado para que funcione con django 3.0, puede solucionarlo con un simple parche .
Restablece a Mónica el
1
Hola Mohammad, ¿se resuelve tu problema? ¿Cuál es la solución adecuada?
Mostafa Ghadimi

Respuestas:

29

Las notas de la versión Django 3.0.0 especifican que se eliminaron ciertas API privadas de compatibilidad con Python 2 . Entre esos estaba django.utils.six.

Para este error específicamente, @WillemVanOnsem señaló que el módulo corsheadersestaba haciendo referencia a este módulo.

Para otros que se encuentran con lo mismo, mirar la ruta del archivo en la última línea del stacktrace puede ayudar a identificar el módulo problemático. Otro ejemplo de esto que he visto es:

...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in <module>
    from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)

El módulo que causó el problema en este caso fue parler. Espero que esto ayude a cualquier otro que se encuentre con este problema.

Brand0R
fuente
3
Instale una versión inferior de Django, en mi caso instalé Django-2.1.4.
smartworld-dm
44
@ smartworld-dm La versión anterior de Django resolverá el problema, pero no puedes quedarte en versiones anteriores siempre, Change Is Inevitable
Arakkal Abu
@ArakkalAbu En realidad, mi proyecto estaba usando Django-2.1.4 y Django 3.0.0 se instaló accidentalmente.
smartworld-dm
Baja Django resuelve mi problema. Esperaré hasta que los módulos actualicen sus versiones.
José Luis Quichimbo
21

¿Por qué este error / excepción?

De las notas de la versión ,

django.utils.six- Elimine el uso de esta biblioteca vendida o cambie a seis .

significa que el django.utils.sixmódulo se eliminó de adelante .


Mi base de código no está usando el django.utils.sixmódulo " ", entonces ¿por qué este error?

Este error de importación se puede generar debido a dos razones,

  1. Lo más importante, cualquiera de sus paquetes instalados está usando el django.utils.sixmódulo
  2. o tal vez tu base de código usando el django.utils.sixmódulo

NOTA: La mayoría de las veces la primera razón es el villano 😖😖


¿Cómo puedo identificar qué paquete está causando el error / excepción?

La manera fácil es buscar en las últimas líneas de rastreo de errores y le dirá qué paquete está causando las excepciones.

Ejemplos

Ejemplo 1

En este ejemplo, el corsheadersmódulo causó el error de importación

  File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/__init__.py", line 1, in 
    from .checks import check_settings  # noqa: F401
  File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in 
    from django.utils import six

Ejemplo 2

En este ejemplo, el jsonfieldmódulo causó el error de importación

  File "d:\production\myproject\venv\lib\site-packages\jsonfield\fields.py", line 21, in 
    from .encoder import JSONEncoder
  File "d:\production\myproject\venv\lib\site-packages\jsonfield\encoder.py", line 2, in 
    from django.utils import six, timezone
ImportError: cannot import name 'six' from 'django.utils' (d:\production\myproject\venv\lib\site-packages\django\utils\__init__.py)

Ejemplo 3

En este ejemplo, el parlermódulo causó el error de importación

...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in 
    from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)

Ejemplo 4

En este ejemplo, el django_mysqlmódulo causó el error de importación

  File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/checks.py", line 9, in 
    from django_mysql.utils import collapse_spaces
  File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/utils.py", line 17, in 
    from django.utils import six
ImportError: cannot import name 'six'


¿Cuál es la solución?

Si el error generado debido a algunos paquetes de terceros como django-cors-headers, django-jsonfield, etc. actualizar las versiones de los paquetes correspondientes a las versiones más recientes .

Si el error se debe a su código base, use seis paquetes en lugar del django.utils.sixmódulo

JPG
fuente
7

Como mencionó Mohammad Masoumi, la actualización de los paquetes resolverá el problema porque ahora corsheaderses compatible con Django 3.0.

pip install --upgrade django-cors-headers

También actualicé djangorestframeworky drf_yasgpara evitar este ImportError.

Jun Zhou
fuente
7

Necesita actualizar el paquete de encabezados cors:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
fuente
simplemente bajar a django == 2.2 y solo instalar seis resolvió el problema para mí. ¿Por qué necesitamos actualizar los encabezados de cors?
because_im_batman
1
Si actualizó su versión de django a 3.x, debería considerar actualizar los encabezados de cors. Esa es otra alternativa también.
Shedrack
6

Primero, instala seis desde pip

pip install six

Segundo, en settings.py

INSTALLED_APPS = [
  'six']

Tercero, llama seis

from six import text_type

Para mí funciona, tengo Django 3.0.4

Diego Bianchi
fuente
5

Hay varias bibliotecas y complementos para Django que usan django.utils.six, que por supuesto ahora están rotos. El principal motivo de preocupación es mysql-connector-python (8.0.18). La solución simple es usar la biblioteca externa a Django, pero los autores de estas bibliotecas necesitarán hacer sus cambios (o usted mismo podría hacer los cambios temporalmente ... reemplace django.utils.six por seis).

Lee Harding
fuente
4

Yo tuve el mismo problema.

Mi problema estaba usando:

pip install django_taggit==0.22.2

Resolví esto cuando lo hice:

pip install django_taggit==1.2.0

porque esa es la última versión

Nataliia
fuente
2
Esta respuesta podría ser útil, pero es mejor como comentario debajo de la publicación original, ya que otras personas ya han recomendado actualizar otros paquetes.
DHerls
3

Excepción:

 File "/usr/local/lib/python3.8/dist-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/usr/local/lib/python3.8/dist-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python3.8/dist-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/usr/local/lib/python3.8/dist-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/lib/python3.8/dist-packages/django_celery_beat/models.py", line 6, in <module>
    import timezone_field
  File "/usr/local/lib/python3.8/dist-packages/timezone_field/__init__.py", line 1, in <module>
    from timezone_field.fields import TimeZoneField
  File "/usr/local/lib/python3.8/dist-packages/timezone_field/fields.py", line 5, in <module>
    from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/usr/local/lib/python3.8/dist-packages/django/utils/__init__.py)

Solución:

 vi /usr/local/lib/python3.8/dist-packages/timezone_field/fields.py

Cambio:

from django.utils import six

A:

import six
Kevin
fuente
2

La solución ideal de la gente es una actualización y un uso limpio, pero una solución alternativa para la gente en una situación desesperada es bastante simple.

En Djangoutils crea un nuevo archivo six.py y dentro del archivo pon:

import six

NOTA: no es una solución, sino una solución alternativa para parches inmediatos

AMIT ARORA
fuente
1

Solución JSONField :

Usé jsonfieldy jsonfiled2paquetes. Pero en ambos casos, me enfrenté al mismo error.

Mi problema se resolvió cuando instalé el django-jsonfieldpaquete y desinstalé el resto de los paquetes (relacionados con jsonfield).

# In case you have installed the following packages, otherwise ignore them.
pip uninstall jsonfield
pip uninstall jsonfield2

pip install django-jsonfield

Uso :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()
Mostafa Ghadimi
fuente