ImportError: не можна імпортувати назву 'шість' з 'django.utils'


48

Наразі я вже оновив версію Джанго 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. Сподіваюся, це допоможе будь-яким іншим, хто стикається з цією проблемою.


3
Будь ласка, встановіть нижню версію Django, у моєму випадку я встановив Django-2.1.4.
smartworld-dm

4
@ smartworld-dm Пониження версії Django вирішить проблему, але ви не можете завжди залишатися в старих версіях. Зміна неминуча
Arakkal Абу,

@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модуля


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 

просто перехід на django == 2.2 та встановлення шести вирішило проблему для мене. Чому нам потрібно модернізувати заголовки cors?
потому_im_batman

1
Якщо ви оновили версію django до 3.x, вам слід розглянути можливість оновлення заголовок cors. Це ще одна альтернатива.
Шедрек

6

Спочатку встановіть шість із pip

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

тому що це остання версія.


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

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


Будь ласка, додайте відсутнє посилання
Bemis

Я не пам’ятаю точний lilnk на даний момент, але я впевнений, що це було щось подібне ... все одно дякую;)
radkal2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.