导入错误和Django让我烦躁

3 投票
3 回答
6089 浏览
提问于 2025-04-15 21:14

好的,我有一个这样的文件夹结构(这是一个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 个回答

0

你没有说明 project 是否在 /home/userspace/Development/ 这个路径下。我假设它是在这个位置。

确保在 project 文件夹里有一个名为 __init__.py 的文件,默认是空的,另外在 app 文件夹里也要有一个。

编辑: 接下来可以尝试的事情是:在脚本所在的目录打开 Python 命令行,然后试试下面的内容:

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

这些都能正常运行吗?如果都能,最后一行的输出是什么?如果不能,哪个先出错?

1

哇哇哇,千万不要在你的应用代码里写上项目名称。你应该能在多个项目中重复使用应用代码,而不需要做任何修改。Pinax在这方面做得非常好,我强烈建议你去看看,里面有很多Django的最佳实践。

最糟糕的做法就是把绝对路径硬编码到你的应用或设置里。这样做会在部署时出问题,除非你做一些import local_settings的操作。

如果你需要访问项目的根目录,可以试试Pinax在settings.py里的做法……

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

其实,你看起来是在尝试访问同一个应用里的models模块,这样做简单多了。

如果你想在同一个目录下的scraper.py里导入models.py,只需要用import models,或者如果你在scraper.py里已经有一个叫models的东西(比如django.db.models),可以用import models as app_models。你对Python模块的命名规则熟悉吗?

不过,最好的方式可能还是遵循Django的习惯,使用from ... import ...的语句:

from app import models

如果这样做不自动生效,那说明你的settings.py里有问题。

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

撰写回答