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


48

目前,我已经将Django的版本从升级2.0.6到,3.0并且在调用python manage.py shellcommand时突然出现以下错误:

ImportError:无法从“ django.utils”(/ path-to-project / project / venv / lib / python3.7 / site-packages / 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

类似问题:

我读了这个问题发行说明,但这些资源不能帮我。


2
您使用的程序包corsheaders仍然使用已删除的模块。
Willem Van Onsem '19

1
@WillemVanOnsem非常感谢,升级了。
Mohammad Masoumi

2
@MohammadMasoumi基本上,删除显式语句(例如,from django.utils import six如果您在代码中包含它们),然后系统地删除requirements.txt抱怨此内容的所有软件包的版本。在我而言,我不得不也碰到django-nested-admindjangorestframework
劳尔·拉斯纳

如果您使用的软件包尚未更新为可与django 3.0配合使用,则可以使用一个简单的patch来解决此问题。
恢复莫妮卡

1
嗨,穆罕默德,您的问题得到解决了吗?什么是正确的解决方案?
Mostafa Ghadimi

Answers:


29

Django 3.0.0发行说明指定删除了某些私有的Python 2兼容性API。其中有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
请安装较低的Django版本,以我为例,我安装了Django-2.1.4。
smartworld-dm

4
@ smartworld-dm降级Django版本可以解决此问题,但您不能始终停留在旧版本中,更改不可避免
Arakkal Abu

@ArakkalAbu实际上,我的项目使用的是Django-2.1.4,而偶然安装了Django 3.0.0。
smartworld-dm

下层Django解决了mi问题。我将等到模块更新其版本。
Jose Luis Quichimbo

21

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

发行说明中

django.utils.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升级相应的软件包版本的最新版本

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


7

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

pip install --upgrade django-cors-headers

我也进行了升级djangorestframeworkdrf_yasg以避免此ImportError。


7

您需要更新cors标头包:

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

只是降级到django == 2.2并仅安装六个就为我解决了这个问题。为什么我们需要升级cors-header?
because_im_batman

1
如果将django版本升级到3.x,则应考虑升级cors-header。那也是另一种选择。
谢德拉克

6

首先,从pip安装六个

pip install six

其次,在settings.py中

INSTALLED_APPS = [
  'six']

三,打六

from six import text_type

对于我的作品,我有Django 3.0.4


5

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


4

我有同样的问题。

我的问题是使用:

pip install django_taggit==0.22.2

我这样做时解决了这个问题:

pip install django_taggit==1.2.0

因为那是最新版本。


2
这个答案可能有用,但是最好在原始帖子下作为注释,因为其他人已经建议升级其他软件包。
DHerls

3

例外:

 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

2

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

Djangoutils中创建一个新文件six.py,并在文件内部放:

import six

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


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.