2010-02-17 51 views
0

我想通过我的开发笔记本电脑(Mac OS X)上的cron每5分钟运行一次Django脚本。下面是在脚本代码:Django + Unix Cron,无法导入django.db

import sys 
import os 

def setup_environment(): 
    pathname = os.path.dirname(sys.argv[0]) 
    sys.path.append(os.path.abspath(pathname)) 
    sys.path.append(os.path.normpath(os.path.join(os.path.abspath(pathname), '../'))) 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

setup_environment() 


from common.models import TweetCache 
import datetime 

def main(): 
    print "(%s) Caching tweets..." % str(datetime.datetime.now()) 
    previous_tweets = TweetCache.objects.filter(username='atmospherian') 
    for prev in previous_tweets: 
     prev.delete() 

    import twitter 

    api = twitter.Api() 
    tweets = api.GetUserTimeline('atmospherian') 
    for t in tweets: 
     tc = TweetCache(username='atmospherian', date=t.created_at, text=t.text) 
     tc.save() 

if __name__ == '__main__': 
    main() 

的crontab:

*/5 * * * *蟒/absolute/path/to/tweet_cache.py

从系统错误mail:

X-Cron-Env: <SHELL=/bin/sh> 
X-Cron-Env: <PATH=/usr/bin:/bin> 
X-Cron-Env: <LOGNAME=jason> 
X-Cron-Env: <USER=jason> 
X-Cron-Env: <HOME=/Users/jason> 
Date: Tue, 16 Feb 2010 17:45:00 -0500 (EST) 

Traceback (most recent call last): 
    File "/Users/jason/Development/bandistry/tweet_cache.py", line 22, in <module> 
    from common.models import TweetCache 
    File "/Users/jason/Development/bandistry/common/models.py", line 1, in <module> 
    from django.db import models 
ImportError: No module named django.db 

任何人都可以告诉我什么即时通讯做错了?

回答

1

sys.argv[0]并不总是获取当前文件路径的最可靠方法。我建议这个修改:

pathname = os.path.dirname(os.path.abspath(__file__)) 
sys.path.insert(0, pathname) 
sys.path.insert(0, os.path.abspath(os.path.join(pathname, '..'))) 

的使用注意事项sys.path.insert代替sys.path.append的,以及使用文件的。此外,在文件-forefore-dirname上使用abspath可减少将整个文件名缩减为空字符串或简单地将'。'缩小的机会。这可能不准确。

另外,django软件包是否安装在您添加的这两个路径之一中?如果没有,你窗台需要这条道路

最后,未成年人妙语,很可能无关添加到您的Django进口的问题,但你真的应该这样做:

os.environ['DJANGO_SETTINGS_MODULE'] = 'bandistry.settings' 

它可能工作没有,但最好如果你把你的整个Django应用程序放在一个包中。这样可以减少模糊其他软件包名称的机会。

+0

所以将我的django安装路径是:/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django? – 2010-02-17 13:11:19

+0

这样做,我想我错过了django的路径,因为它看起来像cron创建了自己的环境,您必须指定独立于系统的PATH。 – 2010-02-17 13:34:35