ImportError : 'django.utils'에서 'six'이름을 가져올 수 없습니다


48

현재 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

유제:

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


2
corsheaders여전히 제거 된 모듈을 사용하는 패키지 를 사용합니다.
Willem Van Onsem

1
@WillemVanOnsem 대단히 감사합니다.
Mohammad Masoumi

2
@MohammadMasoumi 기본적으로 from django.utils import six코드에 명시적인 문장이있는 경우이를 제거 requirements.txt하고 이에 대해 불만이 있는 모든 패키지의 버전을 체계적으로 충돌시킵니다 . 내 경우에는 내가 또한 범프했다 django-nested-admindjangorestframework.
Raul Laasner

django 3.0과 함께 작동하도록 업데이트되지 않은 패키지로 작업하는 경우 간단한 패치 로이 문제를 해결할 수 있습니다 .
Monica Monica

1
안녕 Mohammad, 문제가 해결되고 있습니까? 적절한 해결책은 무엇입니까?
Mostafa Ghadimi

답변:


29

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입니다. 이것이이 문제가 발생하는 다른 사람들에게 도움이되기를 바랍니다.


3
Django-2.1.4를 설치 한 경우 더 낮은 Django 버전을 설치하십시오.
smartworld-dm

4
@ smartworld-DM 다운 그레이드 장고 버전으로 문제를 해결할 수 있지만, 당신은 항상 이전 버전에있을 수 없어, 변경은 불가피
Arakkal 아부

@ArakkalAbu 실제로 내 프로젝트는 Django-2.1.4를 사용하고 Django 3.0.0은 실수로 설치되었습니다.
smartworld-dm

장고를 낮추면 문제가 해결됩니다. 모듈이 버전을 업데이트 할 때까지 기다립니다.
Jose Luis Quichimbo

21

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

에서 릴리스 노트 ,

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


7

Mohammad Masoumi가 언급했듯이 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로 다운 그레이드하고 6을 설치하면 문제가 해결되었습니다. cors-headers를 업그레이드해야하는 이유는 무엇입니까?
because_im_batman

1
django 버전을 3.x로 업그레이드 한 경우 cors-headers 업그레이드를 고려해야합니다. 그것은 또 다른 대안입니다.
Shedrack

6

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

pip install six

둘째, settings.py

INSTALLED_APPS = [
  'six']

셋째, 여섯을 호출

from six import text_type

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


5

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


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

Folks의 이상적인 솔루션은 업그레이드입니다 및 깨끗한 사용법이지만, 해협에있는 사람들을위한 해결 방법은 충분히 간단합니다.

에서 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()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.