94
votes

ImportError: impossible d'importer le nom 'six' depuis 'django.utils'

Récemment, j'ai mis à niveau la version du framework Django de 2.0.6 à 3.0 et soudainement après avoir appelé la commande python manage.py shell , j'ai eu cette exception:

ImportError: impossible d'importer le nom 'six' depuis 'django.utils' (/chemin-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 cette note de publication de , mais ces ressources n'ont pas pu m'aider.


5 commentaires

Vous utilisez un package corsheaders qui utilise toujours un module qui a été supprimé.


@MohammadMasoumi En gros, supprimez les déclarations explicites comme from django.utils import six si vous en avez dans votre code, puis from django.utils import six systématiquement aux versions de tous les packages dans requirements.txt qui se plaignent de cela. Dans mon cas, j'ai dû également bump django-nested-admin et djangorestframework .


Si vous travaillez avec un paquet qui n'a pas été mis à jour pour fonctionner avec django 3.0, vous pouvez résoudre ce problème avec un simple patch .


Salut Mohammad, Votre problème est-il résolu? Quelle est la bonne solution?


Salut @MostafaGhadimi, comme @WillemVanOnsem l'a mentionné, je l'ai résolu en mettant à jour le paquet corsheaders . Je vous remercie d'avoir partagé votre expérience comme réponse ici, j'espère que cela résoudra le problème de quelqu'un.


18 Réponses :


48
votes

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 se trouvait django.utils.six .

Pour cette erreur spécifiquement, @WillemVanOnsem a noté que les corsheaders du module corsheaders référence à ce module.

Pour les autres rencontrant la même chose, regarder le chemin du fichier sur la dernière ligne de la trace de la pile peut aider à identifier le module problématique. Un autre exemple de cela 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 aidera tous les autres qui rencontrent ce problème.


4 commentaires

Veuillez installer la version inférieure de Django, dans mon cas, j'ai installé Django-2.1.4.


@ smartworld-dm La rétrogradation de la version Django résoudra le problème, mais vous ne pouvez pas toujours rester dans les anciennes versions, le changement est inévitable


@ArakkalAbu En fait, mon projet utilisait Django-2.1.4 et Django 3.0.0 a été installé accidentellement.


Bas Django résout mon problème. J'attendrai que les modules mettent à jour leurs versions.



5
votes

Il existe un certain nombre de bibliothèques et de modules complémentaires à Django qui utilisent django.utils.six, qui bien sûr sont maintenant cassés. Le principal sujet de préoccupation est mysql-connector-python (8.0.18). La solution simple est d'utiliser la bibliothèque externe à Django, mais les auteurs de ces bibliothèques devront effectuer leurs modifications (ou vous pouvez temporairement faire les modifications vous-même .... remplacer django.utils.six par six).


0 commentaires

21
votes

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

pip install --upgrade django-cors-headers

J'ai également mis à jour djangorestframework et drf_yasg pour éviter cette ImportError.


0 commentaires

5
votes

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

Mon problème utilisait:

pip install django_taggit==1.2.0

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

pip install django_taggit==0.22.2

car c'est la dernière version.


1 commentaires

Cette réponse pourrait être utile, mais elle est préférable en tant que commentaire sous le message d'origine, car d'autres personnes ont déjà recommandé de mettre à niveau d'autres packages.



50
votes

Pourquoi cette erreur / exception?

À partir des notes de publication de ,

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

signifie django.utils.six module django.utils.six été supprimé à partir de .


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

Cette erreur d'importation peut être générée pour deux raisons,

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

REMARQUE: la plupart du temps, la première raison est le méchant 😠– 😖


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

Le moyen le plus simple est de regarder vos dernières lignes de suivi des erreurs et il vous indiquera quel package est à l'origine des exceptions.

Exemples

Exemple 1

Dans cet exemple, le module corsheaders 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'

Exemple-2

Dans cet exemple, le module jsonfield 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-3

Dans cet exemple, le module parler causé 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-4

Dans cet exemple, le module django_mysql 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


Quelle est la solution?

Si l'erreur s'est django-cors-headers cause de certains packages tiers tels que django-cors-headers , django-jsonfield , etc., django-jsonfield niveau les versions de package correspondantes vers les dernières versions .

Si l'erreur s'est django.utils.six partir de votre base de code, utilisez six packages au lieu du module django.utils.six


0 commentaires

3
votes

Solution JSONField :

J'ai utilisé les jsonfield et jsonfiled2 . 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-jsonfield et désinstallé le reste des packages (liés à jsonfield).

from django.db import models
from jsonfield import JSONField

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

Utilisation :

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

pip install django-jsonfield


0 commentaires

9
votes

Exception:

import six

Solution:

from django.utils import six

Changement:

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

À:

 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)


1 commentaires

Modifier les packages installés comme celui-ci n'est pas une bonne idée. Si vous installez les mêmes packages sur un nouveau serveur, vous obtiendrez à nouveau une erreur. Dans ce cas, une meilleure solution consiste à mettre à niveau django-timezone-field - la version 4.0 a ajouté la prise en charge de Django 3.0.



9
votes

Vous devez mettre à jour le package des en-têtes cors:

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


2 commentaires

le simple fait de passer à django == 2.2 et d'installer six a résolu le problème pour moi. Pourquoi avons-nous besoin de mettre à jour les cors-headers?


Si vous avez mis à jour votre version de django vers 3.x, vous devriez envisager de mettre à jour cors-headers. C'est une autre alternative également.



4
votes

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

Dans Django utils, créez un nouveau fichier six.py et à l'intérieur du fichier mettez:

import six

REMARQUE: pas une solution mais une solution de contournement pour un correctif immédiat


0 commentaires

16
votes

Tout d'abord, installez six à partir de pip

from six import text_type

Deuxièmement, appelez six

pip install six

Pour moi fonctionne, j'ai Django 3.0.4


0 commentaires

0
votes

- vous feriez mieux d'exécuter cette commande si vous utilisez Django3

pip install six

Selon cela


2 commentaires

Veuillez ajouter le lien manquant


Je ne me souviens plus du lilnk exact maintenant mais je suis sûr que c'était quelque chose comme ça ... en tout cas merci;)



1
votes
  1. pip installer six

  2. au-dessus des packages de site \ django \ utils \ encoding.py, importez 'from six import python_2_unicode_compatible'

  3. exécuter python manage.py makemigrations et python manage.py migrate

J'ai également supprimé mon urllib3 et mon chardet


0 commentaires

0
votes

J'ai eu l'erreur en essayant d'intégrer Disqus dans mon application, qui est résolue en installant simplement le django-six .

pip install django-six


0 commentaires

5
votes

J'ai résolu ce problème en installant une version supérieure du package corsheader .

corsheader v3.3.0 prend en charge Django 3.0.x

django-cors-headers==3.3.0


0 commentaires

1
votes

Changez-le!

importez six et cela résoudra certainement le problème.


0 commentaires

0
votes

Si je comprends bien, il vous suffit de supprimer le fichier tokens.py si vous avez une version supérieure de Django. Supprimez également toutes les importations from .tokens dans d'autres fichiers tels que views.py .


0 commentaires

13
votes

Installez cette bibliothèque: django-utils-six 2.0 pour Django> 3.

pip install django-utils-six


0 commentaires

1
votes

J'ai eu exactement le même problème. Laissez-moi vous dire comment je l'ai résolu (heureusement, c'était simple à faire).

Alors que se passe-t-il?

Vous devez faire attention au traçage que Django vous dit ( conseil de pro : commencez par le bas):

pip install corsheaders -U

Il vous dit deux choses importantes:

  1. Qu'est-ce qui se passe: ImportError: cannot import name 'six' from 'django.utils'
  2. Où cela se passe: /lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>

Il vous dit d'abord qu'il ne peut pas importer les six modules de django.utils , ce qui est assez logique puisque Django a désapprouvé le module dans Django 3.0 .

Maintenant, vous pouvez demander:

  • mais bon, je n'utilisais pas ce module !!
  • Vous avez raison, mais une dépendance était :)
  • Quelle dépendance?
  • Je suis content que vous ayez demandé ...

Celui-ci ==> /lib/python3.7/site-packages/corsheaders/checks.py , corsheaders importait le module ici: à from django.utils import six dans checks.py (en ligne 7).

Quelle est la solution?

Ce problème est généralement résolu en mettant à jour le package qui a créé le problème en premier lieu. Ils ont probablement supprimé cette importation et l'ont remplacée par autre chose, si nécessaire. Accédez à la ligne de commande et tapez:

  File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
    from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/init.py)

Qu'est-ce qui a généré le problème?

Django a cessé de prendre en charge Python 2. Puisque django.utils.six fournissait des " Utilitaires pour écrire du code qui s'exécute sur Python 2 et 3 ", il n'était plus nécessaire de supporter ce module, il était donc obsolète dans Django 3.


0 commentaires