我试图在我的开发笔记本电脑(Mac OS X)上通过cron每5分钟运行一次Django脚本。以下是脚本中的代码:
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 * * * * python /absolute/path/to/tweet_cache.py
错误:
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
谁能告诉我我做错了什么?
答案 0 :(得分: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,并使用文件。此外,在文件-be abspath
上使用dirname
会减少将整个文件名减少到空字符串或简单地“减少”的可能性。这甚至可能都不准确。
另外,django软件包是否安装在您添加的这两个路径之一中?如果没有,你需要添加该路径
最后,一个小问题,可能与你的django导入问题无关,但你真的应该这样做:
os.environ['DJANGO_SETTINGS_MODULE'] = 'bandistry.settings'
它可能没有,但如果你将整个django应用程序放在一个包中,它会更好。这样可以减少您隐藏其他包名称的可能性。