【问题标题】:ImportError: cannot import name 'six' from 'django.utils'ImportError:无法从“django.utils”导入名称“六”
【发布时间】:2020-03-30 06:55:29
【问题描述】:

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

ImportError: cannot import name 'six' from 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/init.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

类似问题:

我读过这个Question 和这个release note,但是这些资源对我没有帮助。

【问题讨论】:

  • 您使用的包corsheaders 仍然使用已删除的模块。
  • @MohammadMasoumi 基本上,如果您的代码中有类似from django.utils import six 的显式语句,则删除它们,然后系统地修改requirements.txt 中抱怨此问题的所有包的版本。在我的情况下,我还必须碰到 django-nested-admindjangorestframework
  • 如果您正在使用尚未更新为可与 django 3.0 一起使用的软件包,您可以使用 simple patch 解决此问题。
  • 嗨 Mohammad,您的问题解决了吗?什么是正确的解决方案?
  • 嗨@MostafaGhadimi,正如@WillemVanOnsem 提到的,我通过升级corsheaders 包解决了这个问题。感谢您在这里分享您的经验作为答案,我希望它能解决某人的问题。

标签: django-3.0 django


【解决方案1】:

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

来自release notes

django.utils.six - 移除对这个供应商库的使用或切换到six

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

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

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

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

注意:大多数时候第一个原因是小人??

如何确定是哪个包导致了错误/异常?

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

示例

Corsheaders

在这个例子中,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 模块

【讨论】:

    【解决方案2】:

    Django 3.0.0 发行说明指定某些 private Python 2 compatibility APIs were removed.其中包括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,我安装的是 Django-2.1.4。
    • @smartworld-dm 降级 Django 版本会解决问题,但你不能一直停留在旧版本,改变是不可避免的
    • @ArakkalAbu 实际上我的项目使用的是 Django-2.1.4 并且意外安装了 Django 3.0.0。
    • Lower Django 解决 mi 问题。我会等到模块更新它们的版本。
    • 您还解决了升级 django-cors-headers 包 pip install --upgrade django-cors-headers 的问题,正如 @aryan-jadon 在 Github 上所建议的那样。
    【解决方案3】:

    安装这个库:django-utils-six 2.0 for Django >= 3。

    pip install django-utils-six
    

    【讨论】:

      【解决方案4】:

      首先,从 pip 安装六个

      pip install six
      

      第二,叫六

      from six import text_type
      

      对我来说工作,我有 Django 3.0.4

      【讨论】:

      • 这对我有用,因为我在我的代码中使用了六个。
      【解决方案5】:

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

      pip install --upgrade django-cors-headers
      

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

      【讨论】:

        【解决方案6】:

        你需要更新 cors 头包:

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

        【讨论】:

        • 只是降级到 django==2.2 并安装六个解决了我的问题。为什么我们需要升级 cors-headers ?
        • 如果您将 django 版本升级到 3.x,您应该考虑升级 cors-headers。这也是另一种选择。
        【解决方案7】:

        例外:

         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
        

        【讨论】:

        • 像这样修改已安装的软件包不是一个好主意。如果您在新服务器上安装相同的软件包,那么您将再次收到错误消息。在这种情况下,更好的解决方法是升级django-timezone-field - 4.0 版增加了对 Django 3.0 的支持。
        【解决方案8】:

        我遇到了同样的问题。

        我的问题是使用:

        pip install django_taggit==0.22.2
        

        我解决了这个问题:

        pip install django_taggit==1.2.0
        

        因为那是最新版本。

        【讨论】:

        • 这个答案可能很有用,但最好作为原始帖子下的评论,因为其他人已经建议升级其他软件包。
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

          Django utils 中创建一个新文件 Six.py 并在文件中放置:

          import six
          

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

          【讨论】:

            【解决方案11】:

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

            corsheader v3.3.0 支持 Django 3.0.x

            django-cors-headers==3.3.0
            

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                【解决方案13】:
                1. pip 安装六

                2. 在 site-packages\django\utils\encoding.py 之上,导入 '从六导入python_2_unicode_compatible'

                3. 运行 python manage.py makemigrations 和 python manage.py migrate

                我还删除了我的 urllib3 和 chardet

                【讨论】:

                  【解决方案14】:

                  我遇到了完全相同的问题。让我告诉你我是如何解决它的(幸运的是它很简单)。

                  那么,发生了什么事?

                  你要注意Django告诉你的traceback(专业提示:从底部开始):

                    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 &lt;module&gt;

                  它首先告诉你它不能从django.utils 导入six 模块,这是非常合乎逻辑的,因为Django 有deprecated the module in Django 3.0

                  现在你可能会问:

                  • 但是,我没有使用那个模块!!
                  • 你是对的,但依赖是:)
                  • 哪个依赖?
                  • 很高兴你问...

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

                  解决办法是什么?

                  这个问题通常由最初造成问题的updating the package 解决。如有必要,他们可能会删除该导入并用其他东西替换它。 转到命令行并输入:

                  pip install corsheaders -U
                  

                  是什么导致了问题?

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

                  【讨论】:

                    【解决方案15】:

                    Django 6 不适用于高于 django2 的 Django 版本,因此快速解决方法是通过 pip 安装它:

                    pip install django-utils-six

                    那你应该很高兴

                    【讨论】:

                      【解决方案16】:

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

                      【讨论】:

                        【解决方案17】:

                        如果由于某些第三方软件包而引发错误并且您已经在使用最新版本,请向开发人员报告问题。如果您这样做了,但您确实需要紧急修复,则此策略可以使第三方软件包满意:

                            
                        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
                        
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2021-02-27
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多