ImportError: impossible d'importer le nom «six» de «django.utils»

49

À l' heure actuelle, je l' ai déjà mis à jour la version de Django 2.0.6à 3.0et tout à coup après avoir appelé python manage.py shellcommande obtenu cette erreur:

ImportError: impossible d'importer le nom «six» de «django.utils» (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Trace complète:

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

Questions similaires:

J'ai lu cette question et , note de version , mais ces ressources ne pouvaient pas m'aider.

Mohammad Masoumi
la source
2
Vous utilisez un package corsheadersqui utilise toujours un module qui a été supprimé.
Willem Van Onsem
1
@WillemVanOnsem Merci beaucoup, mis à jour cela.
Mohammad Masoumi
2
@MohammadMasoumi Fondamentalement, supprimez les déclarations explicites comme from django.utils import sixsi vous les aviez dans votre code, puis bumpez systématiquement les versions de tous les packages requirements.txtqui se plaignent de cela. Dans mon cas, je devais aussi bosse django-nested-adminet djangorestframework.
Raul Laasner
Si vous travaillez avec un package qui n'a pas été mis à jour pour fonctionner avec django 3.0, vous pouvez résoudre ce problème avec un simple patch .
Rétablir Monica
1
Salut Mohammad, votre problème est-il résolu? Quelle est la bonne solution?
Mostafa Ghadimi

Réponses:

29

Les notes de publication de Django 3.0.0 spécifient que certaines API de compatibilité Python 2 privées ont été supprimées . Parmi ceux-ci, il y avait django.utils.six.

Pour cette erreur en particulier, @WillemVanOnsem a noté que le module corsheadersfaisait référence à ce module.

Pour d'autres personnes rencontrant la même chose, regarder le chemin du fichier sur la dernière ligne de la stacktrace peut aider à identifier le module problématique. Un autre exemple de ce que j'ai vu est:

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

Le module à l'origine du problème dans ce cas était parler. J'espère que cela aide tous ceux qui rencontrent ce problème.

Marque0R
la source
3
Veuillez installer la version inférieure de Django, dans mon cas, j'ai installé Django-2.1.4.
smartworld-dm
4
@ smartworld-dm Le déclassement de la version Django résoudra le problème, mais vous ne pouvez pas toujours rester dans les anciennes versions, Change Is Inevitable
Arakkal Abu
@ArakkalAbu En fait, mon projet utilisait Django-2.1.4 et Django 3.0.0 a été accidentellement installé.
smartworld-dm
Django inférieur résout le problème de mi. J'attendrai que les modules mettent à jour leurs versions.
Jose Luis Quichimbo
21

Pourquoi cette erreur / exception?

À partir des notes de publication de ,

django.utils.six- Supprimez l'utilisation de cette bibliothèque vendue ou passez à six .

des moyens, le django.utils.sixmodule a été retiré de en avant .


Ma base de code n'utilise pas le django.utils.sixmodule " ", alors pourquoi cette erreur?

Cette erreur d'importation peut être déclenchée pour deux raisons,

  1. Plus important encore, tous vos packages installés utilisent le django.utils.sixmodule
  2. ou peut-être votre base de code en utilisant le django.utils.sixmodule

NOTE: La plupart du temps, la première raison est le méchant 😖😖


Comment puis-je identifier le package à l'origine de l'erreur / exception?

La méthode la plus simple consiste à examiner vos dernières lignes de trace d'erreur et il vous indiquera quel package est à l'origine des exceptions.

Exemples

Exemple 1

Dans cet exemple, le corsheadersmodule a provoqué l'erreur d'importation

  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

Exemple-2

Dans cet exemple, le jsonfieldmodule a provoqué l'erreur d'importation

  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)

Exemple-3

Dans cet exemple, le parlermodule a provoqué l'erreur d'importation

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

Exemple-4

Dans cet exemple, le django_mysqlmodule a provoqué l'erreur d'importation

  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'


Quelle est la solution?

Si l'erreur soulevée en raison de certains paquets tiers comme django-cors-headers, django-jsonfield, etc mettre à niveau les versions de paquet correspondant à des versions plus récentes .

Si l'erreur s'est produite car à partir de votre base de code, utilisez le package six au lieu du django.utils.sixmodule

JPG
la source
7

Comme mentionné par Mohammad Masoumi, la mise à niveau des packages résoudra le problème car corsheadersprend actuellement en charge Django 3.0.

pip install --upgrade django-cors-headers

J'ai également mis à jour djangorestframeworket drf_yasgpour éviter cette ImportError.

Jun Zhou
la source
7

Vous devez mettre à jour le paquet d'en-têtes cors:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
la source
la simple mise à niveau vers django == 2.2 et l'installation de six ont résolu le problème pour moi. Pourquoi devons-nous mettre à niveau les en-têtes cors?
because_im_batman
1
Si vous avez mis à niveau votre version de django vers 3.x, vous devriez envisager de mettre à niveau les en-têtes cors. C'est aussi une autre alternative.
Shedrack
6

Tout d'abord, installez six à partir de pip

pip install six

Deuxièmement, dans settings.py

INSTALLED_APPS = [
  'six']

Troisièmement, appelez six

from six import text_type

Pour moi ça marche, j'ai Django 3.0.4

Diego Bianchi
la source
5

Il existe un certain nombre de bibliothèques et d'add-ons à Django qui utilisent django.utils.six, qui bien sûr sont maintenant cassés. Le principal problème est mysql-connector-python (8.0.18). La solution simple consiste à utiliser la bibliothèque externe à Django, mais les auteurs de ces bibliothèques devront apporter leurs modifications (ou vous pourriez temporairement faire les modifications vous-même ... remplacez django.utils.six par six).

Lee Harding
la source
4

J'ai eu le même problème.

Mon problème utilisait:

pip install django_taggit==0.22.2

J'ai résolu cela quand j'ai fait:

pip install django_taggit==1.2.0

car c'est la dernière version.

Nataliia
la source
2
Cette réponse pourrait être utile, mais c'est mieux en tant que commentaire sous le message d'origine car d'autres personnes ont déjà recommandé de mettre à niveau d'autres packages.
DHerls
3

Exception:

 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)

Solution:

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

Changement:

from django.utils import six

À:

import six
Kevin
la source
2

La solution idéale pour les gens est une mise à niveau pour les gens et une utilisation propre, mais une solution de contournement pour les gens en détresse est assez simple.

Dans les Djangoutils, créez un nouveau fichier six.py et à l'intérieur du fichier put:

import six

REMARQUE: pas une solution mais une solution de contournement pour l'application immédiate de correctifs

AMIT ARORA
la source
1

JSONField Solution :

J'ai utilisé jsonfieldetjsonfiled2 emballé. Mais dans les deux cas, j'ai fait face à la même erreur.

Mon problème a été résolu lorsque j'ai installé le django-jsonfieldpackage et désinstallé le reste des packages (liés à jsonfield).

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

pip install django-jsonfield

Utilisation :

from django.db import models
from jsonfield import JSONField

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