Ошибка кругового импорта Django - PullRequest
6 голосов
/ 23 октября 2011

Я новичок в Джанго. Я только что установил v 1.3.1 на Windows Vista (используя установку setup.py) для Python 2.5

Когда я запускаю оболочку python и пытаюсь импортировать 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, все работает нормально, поэтому должно быть что-то, что я могу запустить на своей простой оболочке, чтобы она работала

Спасибо за любые подсказки!

EDIT:

Делян предложил два возможных решения:

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

1 Ответ

7 голосов
/ 23 октября 2011

Это довольно раздражает, но Django хочет, чтобы у вас была папка вашего проекта и ее родительский элемент в sys.path. Вы можете увидеть это в setup_environ в django.core.management.__init__

Недавно возникла проблема, которая может быть реорганизована в ближайшем будущем, но сейчас просто добавьте эти две папки в любые пользовательские сценарии (хотя вам действительно следует добавлять их как manage.py команды).

Редактировать: частично изменен в Django 1.4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...