[django] ImportError : ‘django.utils’에서 ‘six’이름을 가져올 수 없습니다

현재 Django 버전을에서 2.0.6로 업그레이드했으며 명령 3.0을 호출 한 후 갑자기이 python manage.py shell오류가 발생했습니다.

ImportError : ‘django.utils’에서 이름 ‘six’를 가져올 수 없습니다 (/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

유제:

질문 , 릴리스 노트를 읽었 지만 그 자료는 도움이되지 못했습니다.



답변

Django 3.0.0 릴리스 노트는 특정 프라이빗 Python 2 호환성 API가 제거 되었음을 지정합니다 . 그들 중에는 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입니다. 이것이이 문제가 발생하는 다른 사람들에게 도움이되기를 바랍니다.


답변

왜이 오류 / 예외가 발생합니까?

에서 릴리스 노트 ,

django.utils.six-이 공급 업체 라이브러리의 사용을 제거하거나 6으로 전환하십시오 .

즉, 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최신 버전에 해당하는 패키지 버전을 업그레이드 .

코드베이스에서 오류가 발생하면 모듈 대신 6 개의 패키지를 사용하십시오.django.utils.six


답변

Mohammad Masoumi가 언급했듯이 corsheaders지금 Django 3.0을 지원 하기 때문에 패키지를 업그레이드하면 문제가 해결됩니다 .

pip install --upgrade django-cors-headers

나는 또한 업그레이드 djangorestframework하고 drf_yasg이 ImportError를 피하기 위해.


답변

cors 헤더 패키지를 업데이트해야합니다.

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


답변

먼저 핍에서 6 개를 설치하십시오.

pip install six

둘째, settings.py

INSTALLED_APPS = [
  'six']

셋째, 여섯을 호출

from six import text_type

저에게는 장고 3.0.4가 있습니다.


답변

django.utils.six를 사용하는 Django에는 많은 라이브러리와 애드온이 있으며, 현재는 고장났습니다. 주요 관심사는 mysql-connector-python (8.0.18)입니다. 간단한 해결책은 Django 외부의 라이브러리를 사용하는 것이지만 이러한 라이브러리의 작성자는 변경을해야합니다 (또는 일시적으로 직접 변경할 수 있습니다. django.utils.six를 6으로 바꿉니다).


답변

나는 같은 문제가 있었다.

내 문제는 다음을 사용하고있었습니다.

pip install django_taggit==0.22.2

내가했을 때 이것을 해결했다.

pip install django_taggit==1.2.0

최신 버전이기 때문입니다.