ImportError: ไม่สามารถนำเข้าชื่อ 'หก' จาก 'django.utils'


48

ขณะนี้ฉันได้อัพเกรดรุ่น 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ที่ยังคงใช้โมดูลที่ถูกเอาออกไป
Willem Van Onsem

1
@WillemVanOnsem ขอบคุณมากอัปเกรดแล้ว
Mohammad Masoumi

2
@MohammadMasoumi โดยทั่วไปให้ลบข้อความที่ชัดเจนเช่นfrom django.utils import sixถ้าคุณมีพวกเขาในรหัสของคุณแล้วชนรุ่นของแพคเกจทั้งหมดในระบบrequirements.txtที่บ่นเกี่ยวกับเรื่องนี้ ในกรณีของฉันฉันต้องชนdjango-nested-adminและdjangorestframeworkด้วย
Raul Laasner

หากคุณกำลังทำงานกับแพคเกจที่ยังไม่ได้รับการปรับปรุงให้ทำงานร่วมกับ Django 3.0 คุณสามารถแก้ไขปัญหานี้กับแพทช์ที่เรียบง่าย
Reinstate Monica

1
สวัสดีโมฮัมหมัดปัญหาของคุณได้รับการแก้ไขหรือไม่? ทางออกที่เหมาะสมคืออะไร?
Mostafa Ghadimi

คำตอบ:


29

Django 3.0.0 บันทึกประจำรุ่นระบุว่าบางส่วนตัวงูหลาม 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 ที่ต่ำกว่าในกรณีของฉันฉันติดตั้ง Django-2.1.4
smartworld-dm

4
@ smartworld-dm การปรับลดรุ่น Django จะแก้ปัญหาได้ แต่คุณไม่สามารถอยู่ในเวอร์ชั่นที่เก่ากว่าได้เสมอChange Is Inevitable
Arakkal Abu

@ArakkalAbu ที่จริงแล้วโครงการของฉันใช้ Django-2.1.4 และติดตั้ง Django 3.0.0 โดยไม่ตั้งใจ
smartworld-dm

Django ตอนล่างแก้ปัญหา mi ฉันจะรอจนกว่าโมดูลจะอัปเดตเวอร์ชันของพวกเขา
Jose Luis Quichimbo

21

ทำไมข้อผิดพลาด / ข้อยกเว้นนี้?

จากบันทึกประจำรุ่น ,

django.utils.six- การใช้งานลบของห้องสมุดนี้ vendored หรือสลับไปหก

หมายถึงdjango.utils.sixโมดูลถูกลบออกจากเป็นต้นไป


codebase ของฉันไม่ได้ใช้django.utils.sixโมดูล "" ทำไมจึงเกิดข้อผิดพลาดนี้?

ข้อผิดพลาดในการนำเข้านี้สามารถยกขึ้นได้เนื่องจากสองสาเหตุ

  1. สิ่งสำคัญที่สุดคือแพ็คเกจใด ๆ ที่ติดตั้งของคุณกำลังใช้งานdjango.utils.sixโมดูลอยู่
  2. หรือบางที codebase ของคุณโดยใช้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ฯลฯอัพเกรดที่สอดคล้องรุ่นแพคเกจรุ่นล่าสุด

หากเกิดข้อผิดพลาดเนื่องจากจาก codebase ของคุณให้ใช้หกแพ็คเกจแทน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 และเพิ่งติดตั้งหกแก้ไขปัญหาสำหรับฉัน ทำไมเราต้องอัพเกรดส่วนหัว
เพราะ _im_batman

1
หากคุณปรับรุ่น django เป็น 3.x คุณควรพิจารณาอัปเกรดส่วนหัว นั่นคือทางเลือกอื่นด้วย
Shedrack

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

ทางออกในอุดมคติของ Folks คือการอัพเกรดและการใช้งานที่สะอาดตา

ในDjangoutils สร้างไฟล์ใหม่ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.