ImportError: невозможно импортировать имя «шесть» из «django.utils»

49

В настоящее время я уже обновил версию Django с 2.0.6до 3.0и внезапно после вызова python manage.py shellкоманды получил эту ошибку:

ImportError: невозможно импортировать имя «шесть» из «django.utils» (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Полный след:

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

Похожие вопросы:

Я прочитал этот Вопрос и , заметку о выпуске , но эти ресурсы не могли мне помочь.

Мохаммад Масуми
источник
2
Вы используете пакет, corsheadersкоторый все еще использует модуль, который был удален.
Виллем Ван Онсем
1
@WillemVanOnsem Большое спасибо, обновил это.
Мохаммад Масуми
2
@MohammadMasoumi По сути, удалите явные операторы, например, from django.utils import sixесли они есть в вашем коде, а затем систематически поднимайте версии всех пакетов в этом, requirements.txtкоторые жалуются на это. В моем случае я должен был также поднять django-nested-adminи djangorestframework.
Рауль Лааснер
Если вы работаете с пакетом, который не был обновлен для работы с django 3.0, вы можете исправить это с помощью простого патча .
Восстановите Монику
1
Привет Мохаммед, Ваша проблема решается? Каково правильное решение?
Мостафа Гадими

Ответы:

29

В примечаниях к выпуску Django 3.0.0 указано, что некоторые частные API совместимости с Python 2 были удалены . Среди тех, кто был django.utils.six.

Для этой ошибки, в частности, @WillemVanOnsem отметил, что модуль corsheadersссылался на этот модуль.

Для других, сталкивающихся с тем же самым, просмотр пути к файлу в последней строке трассировки стека может помочь в идентификации проблемного модуля. Другой пример этого я видел:

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

Модуль, вызывающий проблему в этом случае, был parler. Надеюсь, что это поможет всем, кто сталкивается с этой проблемой.

Brand0R
источник
3
Пожалуйста, установите более низкую версию Django, в моем случае я установил Django-2.1.4.
smartworld-dm
4
@ smartworld-dm Понижение версии Django решит проблему, но вы не можете оставаться в старых версиях всегда, Изменения неизбежны
Араккал Абу
@ArakkalAbu На самом деле мой проект использовал Django-2.1.4, и Django 3.0.0 был случайно установлен.
smartworld-dm
Нижний Джанго решает проблему. Я буду ждать, пока модули обновят свои версии.
Хосе Луис Кичимбо
21

Почему эта ошибка / исключение?

Из заметок о выпуске ,

django.utils.six- Уберите использование этой библиотеки или переключитесь на шесть .

значит, django.utils.sixмодуль был удален из далее .


Моя кодовая база не использует django.utils.sixмодуль " ", тогда почему эта ошибка?

Эта ошибка импорта может быть вызвана по двум причинам:

  1. Самое главное, что любой из ваших установленных пакетов использует django.utils.sixмодуль
  2. или, может быть, ваша кодовая база с использованием django.utils.sixмодуля

ПРИМЕЧАНИЕ: в большинстве случаев первой причиной является злодей 😖😖


Как я могу определить, какой пакет вызывает ошибку / исключение?

Самый простой способ, просмотреть последние несколько строк трассировки ошибок , и она скажет вам, какой пакет вызывает исключения.

Примеры

Пример-1

В этом примере corsheadersмодуль вызвал ошибку импорта

  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

Пример-2

В этом примере jsonfieldмодуль вызвал ошибку импорта

  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)

Пример-3

В этом примере parlerмодуль вызвал ошибку импорта

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

Пример-4

В этом примере django_mysqlмодуль вызвал ошибку импорта

  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'


Каково решение?

Если ошибка возникла из-за некоторых сторонних пакетов, таких как django-cors-headers, django-jsonfieldи т. Д., Обновите соответствующие версии пакетов до последних версий .

Если ошибка возникла из-за вашей кодовой базы, используйте шесть пакетов вместо django.utils.sixмодуля

JPG
источник
7

Как отметил Мохаммад Масуми, обновление пакетов решит проблему, потому что corsheadersтеперь поддерживает Django 3.0.

pip install --upgrade django-cors-headers

Я также обновил djangorestframeworkи, drf_yasgчтобы избежать этого ImportError.

Джун Чжоу
источник
7

Вам необходимо обновить пакет заголовков cors:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
источник
просто понижение до django == 2.2 и просто установка шести решило проблему для меня. Зачем нам нужно обновлять cors-заголовки?
Потому что_im_batman
1
Если вы обновили версию django до 3.x, вам следует подумать об обновлении заголовков cors. Это еще одна альтернатива.
Шедрак
6

Во-первых, установите шесть из пипса

pip install six

Во-вторых, в settings.py

INSTALLED_APPS = [
  'six']

В-третьих, позвоните шесть

from six import text_type

У меня работает, у меня Django 3.0.4

Диего Бьянки
источник
5

Существует ряд библиотек и надстроек для Django, которые используют django.utils.six, которые теперь, конечно, не работают. Основной проблемой является mysql-connector-python (8.0.18). Простое решение состоит в том, чтобы использовать библиотеку, внешнюю по отношению к Django, но авторам этих библиотек нужно будет внести свои изменения (или вы можете временно внести изменения самостоятельно ... замените django.utils.six на шесть).

Ли Хардинг
источник
4

У меня такая же проблема.

Моя проблема использовала:

pip install django_taggit==0.22.2

Я решил это, когда я сделал:

pip install django_taggit==1.2.0

потому что это последняя версия.

Nataliia
источник
2
Этот ответ может быть полезен, но лучше в качестве комментария к исходному сообщению, поскольку другие люди уже рекомендовали обновить другие пакеты.
DHerls
3

Исключение:

 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)

Решение:

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

Изменить:

from django.utils import six

Для того, чтобы:

import six
Kevin
источник
2

Идеальным решением для людей является обновление и чистое использование, но обходной путь для людей, находящихся в тяжелом положении, достаточно прост.

В Djangoутилитах создайте новый файл six.py и внутри файла поместите:

import six

ПРИМЕЧАНИЕ. Не решение, а обходной путь для немедленного исправления

АМИТ АРОРА
источник
1

Решение JSONField :

Я использовал jsonfieldи jsonfiled2пакеты. Но в обоих случаях я столкнулся с одной и той же ошибкой.

Моя проблема решена, когда я установил django-jsonfield пакет и удалил остальные пакеты (связанные с jsonfield).

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

pip install django-jsonfield

Использование :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()
Мостафа Гадими
источник
0

Вам лучше запустить эту команду, если вы используете Django 3

pip install six

согласно этому

https://docs.djangoproject.com/en/3.0/releases/3.0/#removed-private-python-2-compatibility-apis

radkal2
источник
Пожалуйста, добавьте недостающую ссылку
Bemis
я не помню точный lilnk на данный момент, но я уверен, что это было что-то подобное ... в любом случае спасибо;)
radkal2