ImportError: não é possível importar o nome 'six' de 'django.utils'

49

Atualmente, eu já atualizei a versão do Django de e 2.0.6para 3.0repente, depois de chamar o python manage.py shellcomando, recebi este erro:

ImportError: não é possível importar o nome 'six' de 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)

Rastreio completo:

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

Perguntas semelhantes:

Li esta pergunta e o , nota de lançamento , mas esses recursos não puderam me ajudar.

Mohammad Masoumi
fonte
2
Você usa um pacote corsheadersque ainda usa um módulo que foi removido.
Willem Van Onsem 05/12/19
11
@WillemVanOnsem Muito obrigado, atualizei isso.
Mohammad Masoumi
2
@MohammadMasoumi Basicamente, remova instruções explícitas como from django.utils import sixse você as tivesse em seu código e, em seguida, bata sistematicamente nas versões de todos os pacotes requirements.txtque se queixam disso. No meu caso, eu também tive que esbarrar django-nested-admine djangorestframework.
Raul Laasner 9/12/19
Se você estiver trabalhando com um pacote que não foi atualizado para funcionar com o django 3.0, poderá corrigir isso com um patch simples .
Restabelecer Monica
11
Olá Mohammad, o seu problema está sendo resolvido? Qual é a solução adequada?
Mostafa Ghadimi 29/01

Respostas:

29

As notas de versão do Django 3.0.0 especificam que determinadas APIs de compatibilidade privadas do Python 2 foram removidas . Entre esses estava django.utils.six.

Para este erro especificamente, o @WillemVanOnsem observou que o módulo corsheadersestava fazendo referência a este módulo.

Para outras pessoas que encontram a mesma coisa, olhar o caminho do arquivo na última linha do stacktrace pode ajudar a identificar o módulo problemático. Outro exemplo disso que eu vi é:

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

O módulo que causou o problema neste caso foi parler. Espero que isso ajude outras pessoas que encontrarem esse problema.

Brand0R
fonte
3
Por favor, instale a versão mais baixa do Django, no meu caso eu instalei o Django-2.1.4.
smartworld-dm 8/01
4
@ smartworld-dm A desatualização da versão do Django resolverá o problema, mas você não pode permanecer sempre nas versões mais antigas, Change Is Inevitable
Arakkal Abu 23/01
@ArakkalAbu Na verdade, meu projeto estava usando o Django-2.1.4 e o Django 3.0.0 foi instalado acidentalmente.
smartworld-dm 23/01
O Django inferior resolve o meu problema. Vou esperar até os módulos atualizarem suas versões.
Jose Luis Quichimbo 21/02
21

Por que esse erro / exceção?

Nas notas de versão do ,

django.utils.six- Remova o uso desta biblioteca vendida ou mude para seis .

significa que o django.utils.sixmódulo foi removido do diante .


Minha base de código não está usando o django.utils.sixmódulo " ", então por que esse erro?

Esse erro de importação pode ser gerado por dois motivos:

  1. Mais importante, qualquer um dos pacotes instalados está usando o django.utils.sixmódulo
  2. ou talvez sua base de código usando o django.utils.sixmódulo

NOTA: Na maioria das vezes, o primeiro motivo é o vilão 😖😖


Como posso identificar qual pacote está causando o erro / exceção?

A maneira mais fácil é, observe suas últimas linhas de rastreamento de erros e ele informará qual pacote está causando as exceções.

Exemplos

Exemplo 1

Neste exemplo, o corsheadersmódulo causou o erro de importação

  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

Exemplo-2

Neste exemplo, o jsonfieldmódulo causou o erro de importação

  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)

Exemplo-3

Neste parlermódulo de exemplo, ocorreu o erro de importação

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

Exemplo-4

Neste django_mysqlmódulo de exemplo, ocorreu o erro de importação

  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'


Qual é a solução?

Se o erro levantada por causa de alguns pacotes de terceiros, como django-cors-headers, django-jsonfield, etc atualizar as versões de pacotes correspondentes para versões mais recentes .

Se o erro foi causado por causa da sua base de código, use seis pacotes em vez do django.utils.sixmódulo

JPG
fonte
7

Conforme mencionado por Mohammad Masoumi, a atualização dos pacotes resolverá o problema, pois agora corsheadersé compatível com o Django 3.0.

pip install --upgrade django-cors-headers

Também atualizei djangorestframeworke drf_yasgpara evitar esse ImportError.

Jun Zhou
fonte
7

Você precisa atualizar o pacote de cabeçalhos cors:

pip3 install six
pip3 install --upgrade django-cors-headers 
Shedrack
fonte
apenas fazer o downgrade para o django == 2.2 e instalar apenas seis resolveram o problema para mim. Por que precisamos atualizar cabeçalhos de cors?
porque_im_batman 19/03
11
Se você atualizou sua versão do django para 3.x, considere atualizar os cabeçalhos de cors. Essa é outra alternativa também.
Shedrack
6

Primeiro, instale seis do pip

pip install six

Segundo, em settings.py

INSTALLED_APPS = [
  'six']

Terceiro, ligue para seis

from six import text_type

Para mim funciona, eu tenho o Django 3.0.4

Diego Bianchi
fonte
5

Existem várias bibliotecas e complementos no Django que usam django.utils.six, que obviamente estão quebrados. O principal motivo de preocupação é o mysql-connector-python (8.0.18). A solução simples é usar a biblioteca externa ao Django, mas os autores dessas bibliotecas precisarão fazer suas alterações (ou você pode fazer as alterações temporariamente por conta própria ... substitua django.utils.six por seis).

Lee Harding
fonte
4

Eu tive o mesmo problema.

Meu problema foi usando:

pip install django_taggit==0.22.2

Eu resolvi isso quando fiz:

pip install django_taggit==1.2.0

porque essa é a versão mais recente.

Nataliia
fonte
2
Essa resposta pode ser útil, mas é melhor como um comentário na postagem original, pois outras pessoas já recomendaram a atualização de outros pacotes.
DHerls
3

Exceção:

 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)

Solução:

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

Mudança:

from django.utils import six

Para:

import six
Kevin
fonte
2

A solução ideal para as pessoas é uma atualização e uso limpo, mas uma solução alternativa para pessoas em apuros é bastante simples.

Nos Djangoutilitários, crie um novo arquivo six.py e, dentro do arquivo, coloque:

import six

NOTA: Não é uma solução, mas uma solução alternativa para aplicação imediata de patches

AMIT ARORA
fonte
1

Solução JSONField :

Eu usei jsonfielde jsonfiled2pacotes. Mas nos dois casos, eu enfrentei o mesmo erro.

Meu problema foi resolvido ao instalar o django-jsonfieldpacote e desinstalar o restante dos pacotes (relacionados ao jsonfield).

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

pip install django-jsonfield

Uso :

from django.db import models
from jsonfield import JSONField

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