ImportError: nie można zaimportować nazwy „six” z „django.utils”

48

Obecnie zaktualizowałem już wersję Django z 2.0.6do 3.0i nagle po wywołaniu python manage.py shellpolecenia dostałem następujący błąd:

ImportError: nie można zaimportować nazwy „six” z „django.utils” (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Pełny ślad:

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

Podobne pytania:

Przeczytałem to Pytanie i , informację o wersji , ale te zasoby nie mogły mi pomóc.

Mohammad Masoumi
źródło
2
Używasz pakietu, corsheadersktóry nadal korzysta z modułu, który został usunięty.
Willem Van Onsem,
1
@WillemVanOnsem Dziękuję bardzo, zaktualizowałem to.
Mohammad Masoumi,
2
@MohammadMasoumi Zasadniczo usuń jawne instrukcje, np. from django.utils import sixJeśli masz je w kodzie, a następnie systematycznie podbijaj wersje wszystkich pakietów, requirements.txtktóre na to narzekają. W moim przypadku musiałem też uderzyć django-nested-admini djangorestframework.
Raul Laasner,
Jeśli pracujesz z pakietem, który nie został zaktualizowany do pracy z django 3.0, możesz to naprawić za pomocą prostej poprawki .
Przywróć Monikę
1
Cześć Mohammad, Czy twój problem został rozwiązany? Jakie jest właściwe rozwiązanie?
Mostafa Ghadimi

Odpowiedzi:

29

Informacje o wersji Django 3.0.0 podają, że niektóre prywatne interfejsy API kompatybilne z Python 2 zostały usunięte . Wśród nich był django.utils.six.

W przypadku tego błędu konkretnie @WillemVanOnsem zauważył, że moduł corsheadersodwołuje się do tego modułu.

W przypadku innych osób spotykających się z tą samą rzeczą patrzenie na ścieżkę pliku w ostatnim wierszu stacktrace może pomóc w identyfikacji problematycznego modułu. Innym przykładem tego, co widziałem, jest:

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

Moduł powodujący problem w tym przypadku to parler. Mam nadzieję, że pomoże to wszystkim, którzy napotkają ten problem.

Brand0R
źródło
3
Zainstaluj niższą wersję Django, w moim przypadku zainstalowałem Django-2.1.4.
smartworld-dm
4
@ smartworld-dm Obniżenie wersji Django rozwiąże problem, ale nie możesz pozostać w starszych wersjach zawsze, zmiana jest nieunikniona
Arakkal Abu
@ArakkalAbu Właściwie mój projekt używał Django-2.1.4, a Django 3.0.0 został przypadkowo zainstalowany.
smartworld-dm
Dolny Django rozwiązuje problem. Zaczekam, aż moduły zaktualizują swoje wersje.
Jose Luis Quichimbo
21

Dlaczego ten błąd / wyjątek?

Od Release Notes ,

django.utils.six- Usuń użycie tej sprzedanej biblioteki lub przełącz na sześć .

znaczy, django.utils.six moduł został usunięty z roku .


Moja baza kodów nie używa django.utils.sixmodułu „ ”, więc dlaczego ten błąd?

Ten błąd importu może zostać zgłoszony z dwóch powodów:

  1. Co najważniejsze, każdy z zainstalowanych pakietów korzysta z django.utils.sixmodułu
  2. a może twoja baza kodów za pomocą django.utils.six modułu

UWAGA: W większości przypadków pierwszym powodem jest czarny charakter 😖😖


Jak mogę ustalić, który pakiet powoduje błąd / wyjątek?

Najprostszym sposobem jest przejrzeć kilka ostatnich linii śledzenia błędów , a dowiesz się, który pakiet powoduje wyjątki.

Przykłady

Przykład 1

W tym przykładzie corsheadersmoduł spowodował błąd importu

  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

Przykład 2

W tym przykładzie jsonfieldmoduł spowodował błąd importu

  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)

Przykład 3

W tym przykładzie parlermoduł spowodował błąd importu

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

Przykład 4

W tym przykładzie django_mysqlmoduł spowodował błąd importu

  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'


Jakie jest rozwiązanie?

Jeśli błąd podniesiony z powodu niektórych opakowaniach zewnętrznych, takich jak django-cors-headers, django-jsonfielditp uaktualnić odpowiednie wersje pakietów do najnowszych wersji .

Jeśli błąd wystąpił z powodu bazy kodu, użyj sześciu pakietów zamiast django.utils.sixmodułu

JPG
źródło
7

Jak wspomniano Mohammad Masoumi, aktualizacja pakietów rozwiąże problem, ponieważ corsheadersobsługuje teraz Django 3.0.

pip install --upgrade django-cors-headers

Zaktualizowałem również djangorestframeworki drf_yasgaby uniknąć tego ImportError.

Jun Zhou
źródło
7

Musisz zaktualizować pakiet nagłówków cors:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
źródło
po prostu przejście na django == 2.2 i instalacja tylko sześciu rozwiązało problem. Dlaczego musimy aktualizować nagłówki cors-headers?
because_im_batman
1
Jeśli zaktualizowałeś wersję django do 3.x, powinieneś rozważyć aktualizację cors-headers. To także inna alternatywa.
Shedrack
6

Najpierw zainstaluj sześć z pip

pip install six

Po drugie, w settings.py

INSTALLED_APPS = [
  'six']

Po trzecie, zadzwoń pod sześć

from six import text_type

Dla mnie działa, mam Django 3.0.4

Diego Bianchi
źródło
5

Istnieje wiele bibliotek i dodatków do Django, które używają django.utils.six, które oczywiście są teraz uszkodzone. Głównym problemem jest mysql-connector-python (8.0.18). Prostym rozwiązaniem jest użycie biblioteki zewnętrznej w stosunku do Django, ale autorzy tych bibliotek będą musieli dokonać ich zmian (lub możesz tymczasowo wprowadzić zmiany samodzielnie ... zastąp django.utils.six sześcioma).

Lee Harding
źródło
4

Miałem ten sam problem.

Mój problem polegał na użyciu:

pip install django_taggit==0.22.2

Rozwiązałem to, gdy:

pip install django_taggit==1.2.0

ponieważ to jest najnowsza wersja.

Natalia
źródło
2
Ta odpowiedź może być przydatna, ale lepiej jako komentarz pod oryginalnym postem, ponieważ inne osoby już zaleciły aktualizację innych pakietów.
DHerls,
3

Wyjątek:

 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)

Rozwiązanie:

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

Zmiana:

from django.utils import six

Do:

import six
Kevin
źródło
2

Idealnym rozwiązaniem dla ludzi jest ulepszenie i czyste użytkowanie, ale obejście dla osób w trudnych warunkach jest dość proste.

W Djangoutils utwórz nowy plik six.py, a w pliku umieść:

import six

UWAGA: Nie rozwiązanie, ale obejście umożliwiające natychmiastowe załatanie

AMIT ARORA
źródło
1

Rozwiązanie JSONField :

Użyłem jsonfieldi jsonfiled2paczek. Ale w obu przypadkach napotkałem ten sam błąd.

Mój problem został rozwiązany, gdy zainstalowałem django-jsonfieldpakiet i odinstalowałem resztę pakietów (związanych z jsonfield).

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

pip install django-jsonfield

Zastosowanie :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()
Mostafa Ghadimi
źródło