导入错误和Django让我烦躁
好的,我有一个这样的文件夹结构(这是一个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 个回答
你没有说明 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()
这些都能正常运行吗?如果都能,最后一行的输出是什么?如果不能,哪个先出错?
哇哇哇,千万不要在你的应用代码里写上项目名称。你应该能在多个项目中重复使用应用代码,而不需要做任何修改。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里有问题。
这段代码的意思是……
首先,它定义了一个变量,这个变量用来存储一些信息。接下来,它会执行一些操作,比如计算、比较或者是处理数据。最后,代码会输出结果,可能是显示在屏幕上,或者是存储到文件里。
在这个过程中,代码可能会用到一些条件判断,比如“如果……那么……”的逻辑,这样可以根据不同的情况做出不同的处理。
总的来说,这段代码的目的是为了完成特定的任务,通过一系列的步骤来实现。
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