Import Error: 无法从‘ django.utils’导入名称‘ six’

最近,我将 Django 框架的版本从 2.0.6升级到了 3.0,在调用了 python manage.py shell命令之后,我突然发现了一个异常:

Import Error: 无法从‘ django.utils’(/path-to-project/project/venv/lib/python3.7/site-package/django/utils/Init.py)导入名称‘ six’

全面追踪:

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

类似问题:

我读了这个 提问和这个 释放通知书,但这些资源不能帮助我。

143115 次浏览

Django 3.0.0发行说明指定了某些 删除了私有的 Python2兼容 API。其中包括 django.utils.six

对于这个错误,@WillemVanOnsem 注意到模块 corsheaders正在引用这个模块。

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

...
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。我希望这对遇到这个问题的其他人有所帮助。

有许多使用 Django.utils.six 的库和 Django 的附加组件,当然,它们现在已经坏了。主要关注的是 mysql-connect-python (8.0.18)。简单的解决方案是使用 Django 外部的库,但是这些库的作者需要进行更改(或者您可以自己临时进行更改... ... 将 Django.utils.six 替换为 six)。

正如 Mohammad Masoumi 提到的,升级软件包将解决这个问题,因为 corsheaders现在支持 Django 3.0。

pip install --upgrade django-cors-headers

我还升级了 djangorestframeworkdrf_yasg以避免这个重要错误。

我也有同样的问题。

我的问题是:

pip install django_taggit==0.22.2

当我这么做的时候,我解决了这个问题:

pip install django_taggit==1.2.0

因为那是最新的版本。

为什么是这个错误/异常?

来自 释放通知书,

删除此库的使用或切换到 六个

意味着,从 课程名称 = “ post-tag”title = “ show questions tag & # 39; django-3.0 & # 39;”rel = “ tag”> django-3.0 及以下内容中移除了 django.utils.six模块。

我的代码库没有使用“ django.utils.six”模块,那么为什么会出现这个错误?

此导入错误可能由于两个原因引发,

  1. 最重要的是 任何已安装的软件包都使用 django.utils.six模块
  2. 或者使用 django.utils.six模块的代码库

注意: 大多数情况下,第一个原因是恶棍

如何识别导致错误/异常的包?

简单的方法是 查看最后几行错误回溯,它会告诉您是哪个包导致了异常。

例子

冲锋衣

在本例中,强 > 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-headers django-jsonfield 等)引起的。如果您已经在使用最新版本,请向开发人员报告问题。

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

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

例外:

 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

您需要更新 cors 头文件包:

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

人们的理想解决方案是 升级和干净的使用,但是对于那些处于困境中的人们来说,一个解决方案是非常简单的。

Django utils 中创建一个新文件 six. py,并在该文件中放入:

import six

注意: 这不是一个解决方案,而是一个可以立即进行修补的解决方案

首先,从 pip 安装6个

pip install six

第二,打六号电话

from six import text_type

对于我的工作,我有姜戈3.0

我通过安装更高版本的 corsheader包解决了这个问题。

corsheader v3.3.0支持 Django 3.0. x

django-cors-headers==3.3.0

据我所知,您只需删除 tokens.py文件即可 如果你有更好的姜戈。 并删除其他文件(如 views.py)中的所有导入 from .tokens

安装这个库: django-utils-six2.0 for Django > = 3。

pip install django-utils-six

我也遇到过同样的问题,让我来告诉你我是如何解决的(幸运的是这个问题很简单)。

到底怎么回事?

你必须注意 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>

它首先告诉您它不能从 django.utils导入 six模块,这是非常合乎逻辑的,因为 Django 有 取消了 Django 3.0中的模块

现在你可能会问:

  • 但是,嘿,我没有用那个模块! !
  • 你是对的,但是依赖是:)
  • 什么依赖?
  • 我很高兴你问了。

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

解决办法是什么?

这个问题通常是由 更新包裹解决的,而 更新包裹首先创造了这个问题。如果有必要的话,他们可能会移除那个导入并用其他东西替换它。 转到命令行并键入:

pip install corsheaders -U

是什么导致了这个问题?

Django 停止了对 Python 2的支持。由于 django.utils.six 提供用于编写运行在 Python2和3上的代码的实用程序”,它不再需要支持这个模块,所以在 Django 3中不推荐使用它。

Django six 不适用于比 Django 2更高的 Django 版本,所以一个快速修复方法是通过 pip 安装它:

pip install django-utils-six

那你应该可以走了

如果由于某些第三方软件包而引发错误,并且您已经在使用最新版本,请向开发人员报告问题。如果你这样做了,但你真的需要一个紧急解决方案,这种策略可以让第三方软件包高兴:


try:
# six removed since Django 3.0
from django.utils import six
except ImportError:
import six
import sys
sys.modules["django.utils.six"] = six
# similarly for any other six sub-module required:
sys.modules["django.utils.six.moves"] = six.moves




# finally, import the outdated third-party package below:


import outdated_library