ImportError: Name 'Sechs' kann nicht aus 'django.utils' importiert werden

49

Zur Zeit habe ich bereits die Version von Django ein Upgrade von 2.0.6auf 3.0und plötzlich nach dem Aufruf python manage.py shellBefehl bekam diese Fehlermeldung:

ImportError: Der Name 'six' kann nicht aus 'django.utils' importiert werden (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py).

Vollständige Spur:

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

Ähnliche Fragen:

Ich lese diese Frage und , Release-Info , aber diese Ressourcen können mir nicht helfen.

Mohammad Masoumi
quelle
2
Sie verwenden ein Paket corsheaders, das noch ein Modul verwendet, das entfernt wurde.
Willem Van Onsem
1
@ WillemVanOnsem Vielen Dank, aktualisiert das.
Mohammad Masoumi
2
@MohammadMasoumi Entfernen Sie grundsätzlich explizite Anweisungen, z. B. from django.utils import sixwenn Sie sie in Ihrem Code haben, und stoßen Sie dann systematisch die Versionen aller Pakete an requirements.txt, die sich darüber beschweren. In meinem Fall musste ich auch stoßen django-nested-adminund djangorestframework.
Raul Laasner
Wenn Sie mit einem Paket arbeiten, das nicht für Django 3.0 aktualisiert wurde, können Sie dies mit einem einfachen Patch beheben .
Setzen Sie Monica
1
Hallo Mohammad, ist dein Problem gelöst? Was ist die richtige Lösung?
Mostafa Ghadimi

Antworten:

29

In den Versionshinweisen zu Django 3.0.0 wird angegeben, dass bestimmte private Python 2-Kompatibilitäts-APIs entfernt wurden . Unter diesen war django.utils.six.

Für diesen Fehler hat @WillemVanOnsem speziell festgestellt, dass das Modul corsheadersauf dieses Modul verweist.

Für andere, die auf dasselbe Problem stoßen, kann das Betrachten des Dateipfads in der letzten Zeile des Stacktraces bei der Identifizierung des problematischen Moduls hilfreich sein. Ein anderes Beispiel dafür, das ich gesehen habe, ist:

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

Das Modul, das das Problem in diesem Fall verursacht hat, war parler. Hoffe, dies hilft allen anderen, die auf dieses Problem stoßen.

Brand0R
quelle
3
Bitte installieren Sie die niedrigere Django-Version. In meinem Fall habe ich Django-2.1.4 installiert.
smartworld-dm
4
@ smartworld-dm Durch ein Downgrade der Django-Version wird das Problem behoben, aber Sie können nicht immer in älteren Versionen bleiben. Änderung ist unvermeidlich
Arakkal Abu
@ArakkalAbu Eigentlich verwendete mein Projekt Django-2.1.4 und Django 3.0.0 wurde versehentlich installiert.
smartworld-dm
Lower Django lösen mi Problem. Ich werde warten, bis die Module ihre Versionen aktualisieren.
Jose Luis Quichimbo
21

Warum dieser Fehler / diese Ausnahme?

Von Release Notes ,

django.utils.six- Entfernen Sie die Verwendung dieser verkauften Bibliothek oder wechseln Sie zu sechs .

bedeutet, dass das django.utils.sixModul ab wurde .


Meine Codebasis verwendet kein " django.utils.six" Modul. Warum dann dieser Fehler?

Dieser Importfehler kann aus zwei Gründen auftreten:

  1. Am wichtigsten ist, dass alle installierten Pakete das django.utils.sixModul verwenden
  2. oder vielleicht Ihre Codebasis mit dem django.utils.sixModul

HINWEIS: Meistens ist der erste Grund der Bösewicht 😖😖


Wie kann ich feststellen, welches Paket den Fehler / die Ausnahme verursacht?

Der einfache Weg ist, in die letzten Zeilen des Fehler-Tracebacks zu schauen und zu erfahren , welches Paket die Ausnahmen verursacht.

Beispiele

Beispiel 1

In diesem Beispiel hat das corsheadersModul den Importfehler verursacht

  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

Beispiel-2

In diesem Beispiel hat das jsonfieldModul den Importfehler verursacht

  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)

Beispiel-3

In diesem Beispiel hat das parlerModul den Importfehler verursacht

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

Beispiel-4

In diesem Beispiel hat das django_mysqlModul den Importfehler verursacht

  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'


Was ist die Lösung?

Wenn der Fehler ausgelöst , weil einige Pakete von Drittanbietern wie django-cors-headers, django-jsonfieldusw. aktualisieren die entsprechenden Paketversionen zu aktuellen Versionen .

Wenn der Fehler aufgrund Ihrer Codebasis aufgetreten ist, verwenden Sie sechs Pakete anstelle des django.utils.sixModuls

JPG
quelle
7

Wie von Mohammad Masoumi erwähnt, wird das Problem durch ein Upgrade der Pakete behoben, da corsheadersDjango 3.0 jetzt unterstützt wird.

pip install --upgrade django-cors-headers

Ich habe auch aufgerüstet djangorestframeworkund drf_yasgdiesen Import zu vermeiden.

Jun Zhou
quelle
7

Sie müssen das cors-Header-Paket aktualisieren:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
quelle
Nur ein Downgrade auf django == 2.2 und die Installation von sechs haben das Problem für mich gelöst. Warum müssen wir Cors-Header aktualisieren?
weil_im_batman
1
Wenn Sie Ihre Django-Version auf 3.x aktualisiert haben, sollten Sie in Betracht ziehen, Cors-Header zu aktualisieren. Das ist auch eine andere Alternative.
Shedrack
6

Installieren Sie zuerst sechs von pip

pip install six

Zweitens in settings.py

INSTALLED_APPS = [
  'six']

Drittens rufen Sie sechs

from six import text_type

Für mich funktioniert, ich habe Django 3.0.4

Diego Bianchi
quelle
5

Es gibt eine Reihe von Bibliotheken und Add-Ons zu Django, die django.utils.six verwenden, die jetzt natürlich kaputt sind. Das Hauptproblem ist mysql-connector-python (8.0.18). Die einfache Lösung besteht darin, die Bibliothek außerhalb von Django zu verwenden. Die Autoren dieser Bibliotheken müssen jedoch ihre Änderungen vornehmen (oder Sie können die Änderungen vorübergehend selbst vornehmen. Ersetzen Sie django.utils.six durch sechs).

Lee Harding
quelle
4

Ich hatte das gleiche Problem.

Mein Problem war:

pip install django_taggit==0.22.2

Ich habe das gelöst, als ich es tat:

pip install django_taggit==1.2.0

denn das ist die neueste Version.

Nataliia
quelle
2
Diese Antwort könnte nützlich sein, ist aber besser als Kommentar unter dem ursprünglichen Beitrag, da andere Leute bereits empfohlen haben, andere Pakete zu aktualisieren.
DHerls
3

Ausnahme:

 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)

Lösung:

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

Veränderung:

from django.utils import six

Zu:

import six
Kevin
quelle
2

Die ideale Lösung für Leute ist ein Upgrade und eine saubere Nutzung, aber eine Problemumgehung für Leute in Not ist einfach genug.

In Djangoutils erstellen Sie eine neue Datei six.py und setzen Sie in die Datei:

import six

HINWEIS: Keine Lösung, sondern eine Problemumgehung für sofortiges Patchen

AMIT ARORA
quelle
1

JSONField-Lösung :

Ich habe jsonfieldund jsonfiled2Pakete verwendet. In beiden Fällen hatte ich jedoch den gleichen Fehler.

Mein Problem wurde behoben, wenn ich das django-jsonfieldPaket installiert und den Rest der Pakete deinstalliert habe (im Zusammenhang mit jsonfield).

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

pip install django-jsonfield

Verwendung :

from django.db import models
from jsonfield import JSONField

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