3

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

-> 项目
--> 应用

在 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

而这段代码就是行不通。我收到以下错误:

回溯(最近一次通话最后):
  文件“scraper.py”,第 14 行,在
    从 project.app.models 导入类名
ImportError:没有名为 project.app.models 的模块

上面的这段代码曾经可以工作,但是在某个地方中断了,我对为什么会遇到问题感到非常困惑。在雪豹上使用 python2.5。

4

3 回答 3

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
于 2010-04-04T21:16:42.093 回答
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 models或者import models as app_models如果您在 scraper.py 中已经有名为模型的东西(例如 django.db.models)。你熟悉 Python 模块约定吗?

但是,最好的方法可能是坚持使用 django 成语, from ... import ... 语句:

from app import models

如果这不能自动工作,那么您的 settings.py 中有问题。

于 2010-04-05T05:58:56.700 回答
0

您没有指明是否project位于/home/userspace/Development/. 我会假设它是。

确保有一个(默认为空)文件名为__init__.pyinproject和另一个app.

编辑:接下来要尝试的事情:在脚本目录中启动 Python 命令行并尝试以下操作:

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

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

于 2010-04-04T21:02:10.187 回答