【问题标题】:Django circular import errorDjango循环导入错误
【发布时间】:2011-10-23 12:56:11
【问题描述】:

我是 django 新手。我刚刚在 windows vista 上为 python 2.5 安装了 v 1.3.1(使用 setup.py 安装)

当我启动 python shell 并尝试导入 django.db 时,我收到以下循环导入错误

>>> import os
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
>>> import django.db
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python25\lib\site-packages\django\db\__init__.py", line 78, in <module>
connection = connections[DEFAULT_DB_ALIAS]
  File "C:\Python25\lib\site-packages\django\db\utils.py", line 93, in __getitem__
backend = load_backend(db['ENGINE'])
  File "C:\Python25\lib\site-packages\django\db\utils.py", line 33, in load_backend
return import_module('.base', backend_name)
  File "C:\Python25\lib\site-packages\django\utils\importlib.py", line 35, in import_module
    __import__(name)
  File "C:\Python25\Lib\site-packages\django\db\backends\sqlite3\base.py", line 14, in <module>
    from django.db import utils
ImportError: cannot import name utils
>>>

查看代码,我可以看到django\db\backends\sqlite3\base.py 导入了django\db\utils.py,但是这个文件也导入了base.py(使用import_module)。由于循环导入,这不一定会崩溃吗?

另一方面,如果我使用来自 python manage.py shell 的 shell,一切正常,所以必须有一些东西可以在我的普通 shell 上运行以使其工作

感谢您的任何提示!

编辑:

Delyan 提出了两种可能的解决方案:

C:\Users\xulo>cd c:\django_example
c:\django_example>cd mysite
c:\django_example\mysite>python
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
>>> import sys
>>> sys.path.append('c:\\django_example\\mysite')
>>> sys.path.append('c:\\django_example')
>>> from django import db
>>>

c:\django_example\mysite>python
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import settings
>>> import django.core.management
>>> django.core.management.setup_environ(settings)
'c:\\django_example\\mysite'
>>> from django import db
>>>

两者都运行良好,但我现在将问题悬而未决,看看是否有人对原因有一个简单的解释,以及为什么对 utils.py 和 base.py 之间明显的循环导入进行排序

【问题讨论】:

    标签: django


    【解决方案1】:

    这很烦人,但 Django 希望您将项目的文件夹 放在 sys.path 中。您可以在setup_environdjango.core.management.__init__ 中看到这种情况

    最近提出了一个问题,可能会在不久的将来对其进行重构,但现在只需将这两个文件夹添加到任何自定义脚本中(尽管您确实应该将它们添加为 manage.py 命令)。

    编辑:这是 Django 1.4 中的 partially refactored

    【讨论】:

    • 感谢 Delyan,它确实有效(添加两个文件夹或运行 setup_environ)。但是我仍然不确定这如何改变 utils.py 和 base.py 循环导入彼此的问题 - 我猜 import_module 与普通导入不太一样,有没有机会快速解释一下?
    • 不,完全一样。如果我不得不猜测,我会说它归结为 Python 如何识别导入的包。 import settingsimport project.settings 不同。不过,我没有时间深入研究 Django 来找出这个特定问题。涉及 Django 和导入的地方有很多巫术魔法..
    • 好的,它确实有效,非常感谢,我会让它打开几天,但如果没有其他人可以解释它,我会接受你的
    • 我遇到了一个非常相似的问题,结果也是路径问题。对我来说,将路径添加到我需要从中导入到 sys.path 的模块解决了问题(在我的情况下不是项目父级)。对我来说,我将 C:\Python27\lib\site-packages\django 添加到路径中,其中 django.db 是我尝试从中导入的模块。感谢您的帮助。