ImportError: không thể nhập tên 'six' từ 'django.utils'


49

Hiện tại, tôi đã nâng cấp phiên bản Django từ 2.0.6đến 3.0và đột nhiên sau khi gọi python manage.py shelllệnh gặp lỗi này:

ImportError: không thể nhập tên 'six' từ 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Dấu vết đầy đủ:

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

Câu hỏi tương tự:

Tôi đã đọc Câu hỏi này và , ghi chú phát hành , nhưng những tài nguyên đó không thể giúp tôi.


2
Bạn sử dụng một gói corsheadersvẫn sử dụng một mô-đun đã được gỡ bỏ.
Willem Van Onsem

1
@WillemVanOnsem Cảm ơn rất nhiều, đã nâng cấp nó.
Mohammad Masoumi

2
@MohammadMasoumi Về cơ bản, hãy xóa các câu lệnh rõ ràng như from django.utils import sixnếu bạn có chúng trong mã của mình, và sau đó hệ thống các phiên bản của tất cả các gói trong requirements.txtđó phàn nàn về điều này. Trong trường hợp của tôi, tôi đã phải va đập django-nested-admindjangorestframework.
Raul Laasner

Nếu bạn đang làm việc với một gói chưa được cập nhật để hoạt động với django 3.0, bạn có thể sửa lỗi này bằng một bản vá đơn giản .
Phục hồi

1
Xin chào Mohammad, vấn đề của bạn đã được giải quyết chưa? Giải pháp thích hợp là gì?
Mostafa Ghadimi

Câu trả lời:


29

Ghi chú phát hành Django 3.0.0 xác định rằng các API tương thích Python 2 riêng tư đã bị xóa . Trong số đó là django.utils.six.

Đối với lỗi này cụ thể là @WillemVanOnsem lưu ý rằng mô-đun corsheadersđã tham chiếu mô-đun này.

Đối với những người khác gặp phải điều tương tự, nhìn vào đường dẫn tệp trên dòng cuối cùng của stacktrace có thể giúp xác định mô-đun có vấn đề. Một ví dụ khác về điều này tôi đã thấy là:

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

Các mô-đun gây ra vấn đề trong trường hợp này là parler. Hy vọng điều này sẽ giúp bất kỳ ai khác gặp phải vấn đề này.


3
Vui lòng cài đặt phiên bản Django thấp hơn, trong trường hợp của tôi, tôi đã cài đặt Django-2.1.4.
smartworld-dm

4
@ smartworld-dm Hạ cấp phiên bản Django sẽ giải quyết vấn đề, nhưng bạn không thể luôn ở các phiên bản cũ hơn, Thay đổi là không thể tránh khỏi
Arakkal Abu

@ArakkalAbu Thật ra dự án của tôi đang sử dụng Django-2.1.4 và Django 3.0.0 đã được cài đặt.
smartworld-dm

Hạ Django giải quyết vấn đề mi. Tôi sẽ đợi cho đến khi các mô-đun cập nhật phiên bản của họ.
Jose Luis Quichimbo

21

Tại sao lỗi này / ngoại lệ?

Từ ghi chú phát hành ,

django.utils.six- Hủy bỏ việc sử dụng thư viện trả thù này hoặc chuyển sang sáu .

có nghĩa là, django.utils.sixmô-đun đã được gỡ bỏ từ trở đi .


Cơ sở mã của tôi không sử dụng django.utils.sixmô-đun "", vậy tại sao lỗi này?

Lỗi nhập này có thể được nêu ra vì hai lý do,

  1. Quan trọng nhất, bất kỳ gói cài đặt nào của bạn đều đang sử dụng django.utils.sixmô-đun
  2. hoặc có thể là cơ sở mã của bạn bằng cách sử dụng django.utils.sixmô-đun

LƯU Ý: Hầu hết thời gian lý do đầu tiên là nhân vật phản diện


Làm cách nào để xác định gói nào gây ra lỗi / ngoại lệ?

Cách dễ dàng là, nhìn vào vài dòng cuối cùng của lỗi truy tìm lỗi và nó sẽ cho bạn biết gói nào đang gây ra ngoại lệ.

Ví dụ

Ví dụ 1

Trong ví dụ này, corsheadersmô-đun gây ra lỗi nhập

  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

Ví dụ-2

Trong ví dụ này, jsonfieldmô-đun gây ra lỗi nhập

  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)

Ví dụ-3

Trong ví dụ này parlermô-đun gây ra lỗi nhập

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

Ví dụ-4

Trong ví dụ này django_mysqlmô-đun gây ra lỗi nhập

  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'


Giải pháp là gì?

Nếu lỗi lớn lên vì một số gói của bên thứ ba như django-cors-headers, django-jsonfield, vv nâng cấp các phiên bản gói tương ứng với phiên bản mới nhất .

Nếu lỗi phát sinh do từ cơ sở mã của bạn, hãy sử dụng sáu gói thay vì django.utils.sixmô-đun


7

Như Mohammad Masoumi đã đề cập, việc nâng cấp các gói sẽ giải quyết vấn đề vì corsheadershiện đang hỗ trợ Django 3.0.

pip install --upgrade django-cors-headers

Tôi cũng đã nâng cấp djangorestframeworkdrf_yasgđể tránh ImportError này.


7

Bạn cần cập nhật gói tiêu đề cors:

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

chỉ cần hạ cấp xuống django == 2.2 và chỉ cần cài đặt sáu đã giải quyết vấn đề cho tôi. Tại sao chúng ta cần nâng cấp cors-headers?
bởi vì_im_batman

1
Nếu bạn đã nâng cấp phiên bản django của mình lên 3.x, bạn nên xem xét nâng cấp tiêu đề. Đó là một thay thế khác cũng có.
Shedrack

6

Đầu tiên, cài đặt sáu từ pip

pip install six

Thứ hai, trong settings.txt

INSTALLED_APPS = [
  'six']

Thứ ba, gọi sáu

from six import text_type

Đối với tôi hoạt động, tôi có Django 3.0.4


5

Có một số thư viện và tiện ích bổ sung cho Django sử dụng django.utils.six, tất nhiên hiện đã bị hỏng. Một trong những mối quan tâm chính là mysql-Connector-python (8.0.18). Giải pháp đơn giản là sử dụng thư viện bên ngoài Django, nhưng các tác giả của các thư viện này sẽ cần thực hiện các thay đổi của họ (hoặc bạn có thể tạm thời thực hiện các thay đổi .... thay thế django.utils.six bằng sáu).


4

Tôi đã từng gặp vấn đề tương tự.

Vấn đề của tôi là sử dụng:

pip install django_taggit==0.22.2

Tôi đã giải quyết điều này khi tôi đã làm:

pip install django_taggit==1.2.0

bởi vì đó là phiên bản mới nhất


2
Câu trả lời này có thể hữu ích, nhưng tốt hơn là bình luận dưới bài viết gốc vì những người khác đã khuyến nghị nâng cấp các gói khác.
DHerls

3

Ngoại lệ:

 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)

Giải pháp:

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

Thay đổi:

from django.utils import six

Đến:

import six

2

Giải pháp lý tưởng của mọi người là nâng cấp và sử dụng sạch, nhưng cách giải quyết cho những người ở hoàn cảnh khốc liệt là đủ đơn giản.

Trong các tiện ích Djangotạo một tập tin mới sáu tập tin và bên trong tập tin đặt:

import six

LƯU Ý: Không phải là giải pháp mà là cách giải quyết để vá ngay lập tức


1

Giải pháp JSONField :

Tôi đã sử dụng jsonfieldjsonfiled2gói. Nhưng trong cả hai trường hợp, tôi đều gặp phải lỗi tương tự.

Vấn đề của tôi đã được giải quyết khi tôi đã cài đặt django-jsonfieldgói và gỡ cài đặt các gói còn lại (liên quan đến jsonfield).

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

pip install django-jsonfield

Cách sử dụng :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.