ImportError и Django сводят меня с ума - PullRequest
3 голосов
/ 05 апреля 2010

ОК, у меня следующая структура каталогов (это проект django):

-> project
--> app

и внутри папки приложения есть файл scraper.py, который должен ссылаться на класс, определенный в models.py

Я пытаюсь сделать следующее:


import urllib2
import os
import sys
import time
import datetime
import re
import BeautifulSoup

sys.path.append('/home/userspace/Development/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

from project.app.models import ClassName

и этот код просто не работает. Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "scraper.py", line 14, in 
    from project.app.models import ClassName
ImportError: No module named project.app.models

Этот код, приведенный выше, работал, но где-то не получалось, и я очень запутался, почему у меня проблемы. На SnowLeopard используется python2.5.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2010
import sys
sys.path.append ('/path/to/the/project')
from django.core.management import setup_environ
import settings
setup_environ(settings)

from app.models import MyModel
1 голос
/ 05 апреля 2010

Вау Вау Вау. Вы никогда не должны когда-либо указывать название своего проекта в коде вашего приложения. Вы должны иметь возможность повторно использовать код приложения в нескольких проектах без изменений. Pinax делает это очень хорошо, и я настоятельно рекомендую проверить это для многих лучших практик django.

Худшее, что вы можете здесь сделать, - это жестко запрограммировать ваш абсолютный путь в ваше приложение или настройки. Вы не должны этого делать, потому что он сломается во время развертывания, если вы не сделаете import local_settings взлом.

Если вам нужно получить доступ к корневому каталогу проекта, попробуйте установить pinax в settings.py ...

import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

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

Чтобы импортировать models.py внутри scraper.py в том же каталоге, просто используйте import models или import models as app_models, если в scraper.py уже есть что-то с именем models (например, django.db.models). Вы знакомы с соглашениями по модулю Python?

Однако лучше всего придерживаться идиомы django из оператора ... import ...:

from app import models

Если это не работает автоматически, значит, что-то не так в вашем файле settings.py.

0 голосов
/ 05 апреля 2010

Вы не указываете, находится ли project в /home/userspace/Development/. Я предполагаю, что это так.

Убедитесь, что есть (пустой по умолчанию) файл с именем __init__.py в project и еще один в app.

РЕДАКТИРОВАТЬ: Следующая попытка: Запустите командную строку Python в каталоге сценария и попробуйте следующее:

import project
import project.app as app
import project.app.models as models
models.__dict__.keys()

Они все работают? Если да, что выводится в последней строке? Если нет, то кто умирает первым?

...