ImportError: tidak dapat mengimpor nama 'enam' dari 'django.utils'

49

Saat ini, saya telah memutakhirkan versi Django dari 2.0.6ke 3.0dan tiba-tiba setelah memanggil python manage.py shellperintah mendapat kesalahan ini:

ImportError: tidak dapat mengimpor nama 'enam' dari 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Jejak lengkap:

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

Pertanyaan serupa:

Saya membaca Pertanyaan ini dan , catatan rilis , tetapi sumber daya itu tidak bisa membantu saya.

Mohammad Masoumi
sumber
2
Anda menggunakan paket corsheadersyang masih menggunakan modul yang telah dihapus.
Willem Van Onsem
1
@ WillemVanOnsem Terima kasih banyak, meningkatkannya.
Mohammad Masoumi
2
@MohammadMasoumi Pada dasarnya, hapus pernyataan eksplisit seperti from django.utils import sixjika Anda memilikinya di kode Anda, dan kemudian secara sistematis menabrak versi semua paket requirements.txtyang mengeluh tentang hal ini. Dalam kasus saya, saya juga harus menabrak django-nested-admindan djangorestframework.
Raul Laasner
Jika Anda bekerja dengan paket yang belum diperbarui untuk bekerja dengan Django 3.0, Anda dapat memperbaikinya dengan tambalan sederhana .
Pasang kembali Monica
1
Hai Mohammad, Apakah masalah Anda terpecahkan? Apa solusi yang tepat?
Mostafa Ghadimi

Jawaban:

29

Catatan rilis Django 3.0.0 menetapkan bahwa API kompatibilitas Python 2 pribadi tertentu telah dihapus . Di antara mereka adalah django.utils.six.

Untuk kesalahan ini secara khusus @WillemVanOnsem mencatat bahwa modul corsheadersitu merujuk modul ini.

Bagi yang lain mengalami hal yang sama, melihat jalur file pada baris terakhir stacktrace dapat membantu mengidentifikasi modul yang bermasalah. Contoh lain dari ini yang pernah saya lihat adalah:

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

Modul yang menyebabkan masalah dalam kasus ini adalah parler. Semoga ini bisa membantu orang lain yang mengalami masalah ini.

Brand0R
sumber
3
Silakan instal versi Django yang lebih rendah, dalam kasus saya saya menginstal Django-2.1.4.
smartworld-dm
4
@ smartworld-dm Menurunkan versi Django akan menyelesaikan masalah ini, tetapi Anda tidak dapat selalu menggunakan versi yang lebih lama, Change Is Inevitable
Arakkal Abu
@ArakkalAbu Sebenarnya proyek saya menggunakan Django-2.1.4 dan Django 3.0.0 tidak diinstal.
smartworld-dm
Django Bawah memecahkan masalah mi. Saya akan menunggu sampai modul memperbarui versinya.
Jose Luis Quichimbo
21

Mengapa ini kesalahan / pengecualian?

Dari catatan rilis ,

django.utils.six- Hapus penggunaan perpustakaan yang dibatalkan ini atau beralih ke enam .

berarti, django.utils.sixmodul telah dihapus dari dan seterusnya .


Basis kode saya tidak menggunakan django.utils.sixmodul " ", lalu mengapa kesalahan ini?

Kesalahan impor ini dapat dinaikkan karena dua alasan,

  1. Yang paling penting, semua paket yang Anda instal menggunakan django.utils.sixmodul
  2. atau mungkin basis kode Anda menggunakan django.utils.sixmodul

CATATAN: Sebagian besar alasan pertama adalah penjahat 😖😖


Bagaimana saya bisa mengidentifikasi paket mana yang menyebabkan kesalahan / pengecualian?

Cara mudah adalah, lihat beberapa baris terakhir traceback kesalahan Anda , dan itu akan memberi tahu Anda paket mana yang menyebabkan pengecualian.

Contohnya

Contoh 1

Dalam contoh ini, corsheadersmodul menyebabkan kesalahan impor

  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

Contoh-2

Dalam contoh ini, jsonfieldmodul menyebabkan kesalahan impor

  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)

Contoh-3

Dalam contoh parlermodul ini menyebabkan kesalahan impor

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

Contoh-4

Dalam contoh django_mysqlmodul ini menyebabkan kesalahan impor

  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'


Apa solusinya?

Jika kesalahan dibangkitkan karena beberapa paket pihak ketiga seperti django-cors-headers, django-jsonfield, dll meng-upgrade paket versi sesuai dengan versi terbaru .

Jika kesalahan muncul karena dari basis kode Anda, gunakan enam paket bukan django.utils.sixmodul

JPG
sumber
7

Seperti yang disebutkan oleh Mohammad Masoumi, meningkatkan paket akan menyelesaikan masalah karena corsheadersmendukung Django 3.0 sekarang.

pip install --upgrade django-cors-headers

Saya juga memutakhirkan djangorestframeworkdan drf_yasguntuk menghindari ImportError ini.

Jun Zhou
sumber
7

Anda perlu memperbarui paket header kor:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
sumber
hanya menurunkan ke Django == 2.2 dan hanya menginstal enam memecahkan masalah untuk saya. Mengapa kita perlu memutakhirkan kor-header?
karena_im_batman
1
Jika Anda meningkatkan versi Django ke 3.x, Anda harus mempertimbangkan untuk meng-upgrade header-cors. Itu juga alternatif lain.
Shedrack
6

Pertama, instal enam dari pip

pip install six

Kedua, di settings.py

INSTALLED_APPS = [
  'six']

Ketiga, telepon enam

from six import text_type

Bagi saya bekerja, saya punya Django 3.0.4

Diego Bianchi
sumber
5

Ada sejumlah perpustakaan dan tambahan untuk Django yang menggunakan django.utils.six, yang tentu saja sekarang rusak. Yang utama yang menjadi perhatian adalah mysql-connector-python (8.0.18). Solusi sederhananya adalah dengan menggunakan pustaka eksternal untuk Django, tetapi penulis pustaka-pustaka ini perlu membuat perubahan mereka (atau Anda dapat membuat sendiri sementara perubahan .... gantikan django.utils.six dengan enam).

Lee Harding
sumber
4

Saya memiliki masalah yang sama.

Masalah saya menggunakan:

pip install django_taggit==0.22.2

Saya menyelesaikan ini ketika saya melakukannya:

pip install django_taggit==1.2.0

karena itu adalah versi terbaru.

Nataliia
sumber
2
Jawaban ini bisa berguna, tetapi lebih baik sebagai komentar di bawah posting asli karena orang lain telah merekomendasikan untuk meningkatkan paket lain.
DHerls
3

Pengecualian:

 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)

Larutan:

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

Perubahan:

from django.utils import six

Untuk:

import six
Kevin
sumber
2

Solusi ideal orang-orang adalah peningkatan dan penggunaan yang bersih, tetapi solusi untuk orang-orang dalam kesulitan cukup sederhana.

Dalam Djangoutils, buat file baru six.py dan di dalam file tersebut:

import six

CATATAN: Bukan solusi tetapi solusi untuk penambalan segera

AMIT ARORA
sumber
1

Solusi JSONField :

Saya menggunakan jsonfielddanjsonfiled2 paket. Namun dalam kedua kasus, saya menghadapi kesalahan yang sama.

Masalah saya terpecahkan ketika saya telah menginstal django-jsonfieldpaket dan menghapus semua paket lainnya (terkait dengan jsonfield).

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

pip install django-jsonfield

Penggunaan :

from django.db import models
from jsonfield import JSONField

class ModelName(models.Model):
    json_field = JSONField()
Mostafa Ghadimi
sumber