ImportError: impossibile importare il nome 'six' da 'django.utils'


49

Attualmente, ho già aggiornato la versione di Django da 2.0.6a 3.0e improvvisamente dopo aver chiamato python manage.py shellil comando ottenuto questo errore:

ImportError: impossibile importare il nome 'six' da 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Traccia completa:

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

Domande simili:

Ho letto questa domanda e , nota di rilascio , ma quelle risorse non potevano aiutarmi.


2
Si utilizza un pacchetto corsheadersche utilizza ancora un modulo che è stato rimosso.
Willem Van Onsem,

1
@WillemVanOnsem Grazie mille, l'ho aggiornato.
Mohammad Masoumi,

2
@MohammadMasoumi Fondamentalmente, rimuovi le dichiarazioni esplicite come from django.utils import sixse le avessi nel tuo codice, quindi sistematicamente le versioni di tutti i pacchetti requirements.txtche si lamentano di questo. Nel mio caso ho dovuto anche sbattere django-nested-admine djangorestframework.
Raul Laasner,

Se stai lavorando con un pacchetto che non è stato aggiornato per funzionare con django 3.0, puoi risolverlo con una semplice patch .
Ripristina Monica il

1
Ciao Mohammad, il tuo problema è stato risolto? Qual è la soluzione corretta?
Mostafa Ghadimi,

Risposte:


29

Le note di rilascio di Django 3.0.0 specificano che alcune API di compatibilità private di Python 2 sono state rimosse . Tra quelli c'era django.utils.six.

Per questo errore, in particolare @WillemVanOnsem ha notato che il modulo corsheadersfaceva riferimento a questo modulo.

Per altri che incontrano la stessa cosa, guardare il percorso del file sull'ultima riga dello stacktrace può aiutare a identificare il modulo problematico. Un altro esempio di ciò che ho visto è:

...
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)

Il modulo che ha causato il problema in questo caso è stato parler. Spero che questo aiuti tutti gli altri che incontrano questo problema.


3
Installa la versione inferiore di Django, nel mio caso ho installato Django-2.1.4.
smartworld-dm,

4
@ smartworld-dm Il downgrade della versione di Django risolverà il problema, ma non puoi rimanere sempre nelle versioni precedenti, Change Is Inevitable
Arakkal Abu

@ArakkalAbu In realtà il mio progetto utilizzava Django-2.1.4 e Django 3.0.0 è stato installato per errore.
smartworld-dm,

Lower Django risolve il problema. Aspetterò fino a quando i moduli aggiorneranno le loro versioni.
Jose Luis Quichimbo,

21

Perché questo errore / eccezione?

Dalle note di rilascio di ,

django.utils.six- Rimuovere l'utilizzo di questa libreria venduta o passare a sei .

significa che il django.utils.sixmodulo è stato rimosso da poi .


La mia base di codice non utilizza il django.utils.sixmodulo " ", quindi perché questo errore?

Questo errore di importazione potrebbe essere generato per due motivi,

  1. Ancora più importante, uno qualsiasi dei pacchetti installati utilizza il django.utils.sixmodulo
  2. o forse il tuo codebase usando il django.utils.sixmodulo

NOTA: il più delle volte il primo motivo è il cattivo 😖😖


Come posso identificare quale pacchetto sta causando l'errore / eccezione?

Il modo più semplice è quello di esaminare le ultime righe di traceback degli errori e ti dirà quale pacchetto sta causando le eccezioni.

Esempi

Esempio 1

In questo esempio, il corsheadersmodulo ha causato l'errore di importazione

  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

Esempio-2

In questo esempio, il jsonfieldmodulo ha causato l'errore di importazione

  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)

Esempio-3

In questo esempio il parlermodulo ha causato l'errore di importazione

...
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)

Esempio-4

In questo esempio il django_mysqlmodulo ha causato l'errore di importazione

  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'


Qual'è la soluzione?

Se l'errore sollevato a causa di alcuni pacchetti di terze parti come django-cors-headers, django-jsonfield, ecc aggiornare le corrispondenti versioni dei pacchetti per le versioni più recenti .

Se l'errore è stato generato dal codebase, utilizzare sei pacchetti anziché django.utils.sixmodulo


7

Come accennato da Mohammad Masoumi, l'aggiornamento dei pacchetti risolverà il problema perché corsheadersora supporta Django 3.0.

pip install --upgrade django-cors-headers

Ho anche aggiornato djangorestframeworke drf_yasgper evitare questo ImportError.


7

Devi aggiornare il pacchetto delle intestazioni cors:

pip3 install six
pip3 install --upgrade django-cors-headers 

il downgrade a django == 2.2 e l'installazione di sei hanno risolto il problema per me. Perché è necessario aggiornare le intestazioni cors?
because_im_batman

1
Se hai aggiornato la tua versione di django a 3.x dovresti considerare di aggiornare cors-headers. Anche questa è un'altra alternativa.
Shedrack

6

Innanzitutto, installa sei dal pip

pip install six

Secondo, in settings.py

INSTALLED_APPS = [
  'six']

Terzo, chiama il sei

from six import text_type

Per me funziona, ho Django 3.0.4


5

Esistono diverse librerie e componenti aggiuntivi per Django che utilizzano django.utils.six, che ovviamente ora sono interrotti. Il principale motivo di preoccupazione è mysql-connettore-python (8.0.18). La soluzione semplice è quella di utilizzare la libreria esterna a Django, ma gli autori di queste librerie dovranno apportare le loro modifiche (o potresti temporaneamente apportare le modifiche da te .... sostituisci django.utils.six con sei).


4

Ho avuto lo stesso problema.

Il mio problema stava usando:

pip install django_taggit==0.22.2

Ho risolto questo quando ho fatto:

pip install django_taggit==1.2.0

perché questa è l'ultima versione.


2
Questa risposta potrebbe essere utile, ma è meglio come commento sotto il post originale poiché altre persone hanno già consigliato di aggiornare altri pacchetti.
DHerls,

3

Eccezione:

 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)

Soluzione:

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

Modificare:

from django.utils import six

Per:

import six

2

La soluzione ideale della gente è un aggiornamento e un uso pulito, ma una soluzione alternativa per le persone in difficoltà è abbastanza semplice.

In Djangoutils crea un nuovo file six.py e all'interno del file inserisci:

import six

NOTA: non una soluzione ma una soluzione alternativa per il patching immediato


1

Soluzione JSONField :

Ho usato jsonfielde jsonfiled2pacchetti. Ma in entrambi i casi, ho riscontrato lo stesso errore.

Il mio problema è stato risolto quando ho installato il django-jsonfieldpacchetto e disinstallato il resto dei pacchetti (relativi a jsonfield).

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

pip install django-jsonfield

Utilizzo :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.