ImportError和Django让我发疯

时间:2010-04-04 20:58:34

标签: python django django-models importerror

好的,我有以下目录结构(这是一个django项目):

-> project
--> app

在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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

哇哇哇哇哇您永远不应该 必须将您的项目名称放在任何应用代码中。您应该能够在多个项目中重用应用程序代码而无需进行任何更改。 Pinax做得非常好,我强烈建议您查看django的最佳实践。

您可以在这里做的最糟糕的事情是将您的绝对路径硬编码到您的应用或设置中。你不应该这样做,因为它会在部署期间中断,除非你做了一些import local_settings黑客攻击。

如果您必须访问项目根目录,请尝试使用pinax在settings.py中的内容...

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

问题是,您似乎正在尝试访问同一个应用程序中的模型模块,这很容易。

要在同一目录中的scraper.py中导入models.py,只需使用import modelsimport models as app_models,如果你已经在scraper.py(例如django.db.models)中有一些名为models的模型。您熟悉Python模块约定吗?

然而,最好的方法可能是坚持使用django成语,来自...... import ...声明:

from app import models

如果这不能自动生效,那么settings.py中就会出现问题。

答案 2 :(得分:0)

您未指明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()

他们都工作吗?如果是这样,最后一行的输出是什么?如果没有,哪个先死?