ImportError:无法从“ django.utils”导入名称“ six”

时间:2019-12-05 10:50:00

标签: django python-3.x upgrade django-3.0

当前,我已经将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 中导入名称“ six” > .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

类似问题:

我读了Questionrelease note,但是这些资源对我没有帮助。

19 个答案:

答案 0 :(得分:16)

首先,从pip安装六个

append()

第二,打六个

A

对我来说,我有Django 3.0.4

答案 1 :(得分:14)

安装此库:django-utils-six 2.0 for Django> 3。

pip install django-utils-six

答案 2 :(得分:12)

Django 3.0.0发行说明指定某些private Python 2 compatibility APIs were removed。其中有django.utils.six

对于此错误,@ WillemVanOnsem特别指出模块corsheaders在引用此模块。

对于遇到相同问题的其他人,查看stacktrace的最后一行上的文件路径可以帮助识别有问题的模块。我见过的另一个例子是:

...
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 :(得分:9)

例外:

 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

答案 4 :(得分:9)

您需要更新cors标头包:

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

答案 5 :(得分:7)

为什么会出现此错误/异常?

来自 release notes

  

django.utils.six -删除此供应商库的使用或切换到six

意味着, django.utils.six 模块已从 删除。


我的代码库未使用“ django.utils.six”模块,为什么会出现此错误?

此导入错误可能是由于两个原因引起的,

  1. 最重要的是,任何已安装的软件包都在使用django.utils.six模块
  2. 或使用 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-headersdjango-jsonfield等某些第三方程序包而引起错误,则将相应的程序包版本升级到最新版本

如果由于您的代码库而引发错误,请使用six软件包而不是 django.utils.six 模块

答案 6 :(得分:5)

我通过安装更高版本的corsheader软件包解决了此问题。

corsheader v3.3.0支持Django 3.0.x

django-cors-headers==3.3.0

答案 7 :(得分:4)

有许多使用django.utils.six的Django库和附加组件,它们现在当然已经损坏了。关注的主要问题之一是mysql-connector-python(8.0.18)。一种简单的解决方案是使用Django外部的库,但是这些库的作者将需要进行更改(或者您可以暂时进行更改。...用6代替django.utils.six)。

答案 8 :(得分:4)

Folks的理想解决方案是升级和简洁的用法,但是对处于困境的人们来说,解决方法很简单。

Django实用程序中创建一个新文件six.py,并在文件内部放置:

import six

注意:不是解决方案,而是一种立即修补的解决方法

答案 9 :(得分:3)

JSONField解决方案

我使用了jsonfieldjsonfiled2软件包。但是在两种情况下,我都遇到相同的错误。

我安装了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()

答案 10 :(得分:1)

  1. pip安装六个

  2. 在站点包\ django \ utils \ encoding.py上的
  3. 导入 “来自六个导入python_2_unicode_compatible”

  4. 运行python manage.py makemigrations和python manage.py migration

我还删除了urllib3和chardet

答案 11 :(得分:1)

只需更改它!

导入六个,它肯定会修复。

答案 12 :(得分:1)

如Mohammad Masoumi所述,升级软件包将解决此问题,因为corsheaders现在支持Django 3.0。

pip install --upgrade django-cors-headers

我还升级了djangorestframeworkdrf_yasg以避免此ImportError。

答案 13 :(得分:1)

我有完全相同的问题。让我告诉你我是如何解决的(幸运的是,这样做很简单)。

那是怎么回事?

您必须注意Django告诉您的回溯(<提示>专业提示:从底部开始):

  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)

它告诉您两个重要的事情:

  1. 发生了什么事:ImportError: cannot import name 'six' from 'django.utils'
  2. 发生的地方:/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>

首先要告诉您它无法从six导入django.utils模块,因为Django具有deprecated the module in Django 3.0,这是很合逻辑的。

现在您可能会问:

  • 但是,嘿,我没有使用该模块!
  • 您是对的,但依存关系是:)
  • 哪个依赖项?
  • 很高兴你问...

这个==> /lib/python3.7/site-packages/corsheaders/checks.py corsheaders 正在此处将模块导入:from django.utils import six中的checks.py(第7行)。 / p>

有什么解决方案?

通常由updating the package解决该问题,该问题首先是造成该问题的原因。他们可能会删除该导入,并在必要时将其替换为其他内容。 转到命令行并输入:

pip install corsheaders -U

是什么引起了问题?

Django停止支持Python2。由于django.utils.six provided用于编写在Python 2和3上运行的代码的实用程序”,因此不再需要支持此模块,因此在Django 3中已弃用。

答案 14 :(得分:0)

‍如果您使用的是Django3

,则最好运行此命令
pip install six

根据this

答案 15 :(得分:0)

尝试将Disqus集成到我的应用程序时出现错误,只需安装django-six软件包即可解决。

pip install django-six

答案 16 :(得分:0)

我有同样的问题。我的问题是使用pip install django_taggit==0.22.2的问题。我解决了当我执行“ pip install django_taggit == 1.2.0”时,因为它是最新版本。

答案 17 :(得分:0)

据我了解,您只需要删除tokens.py文件 如果您有更高版本的Django。 并同时删除其他文件中的所有导入from .tokens,例如views.py

答案 18 :(得分:0)

Django 6 不适用于高于 django2 的 Django 版本,因此快速修复是通过 pip 安装:

pip install django-utils-six

那你应该可以走了