Django + Unix Cron, не может импортировать django.db - PullRequest
0 голосов
/ 17 февраля 2010

Я пытаюсь запускать скрипт Django каждые 5 минут через cron на моем ноутбуке разработчика (Mac OS X). Вот код в скрипте:

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()

кронтаб:

* / 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

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

1 голос
/ 17 февраля 2010

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 и использование file . Кроме того, использование abspath в файле -before- dirname снижает вероятность того, что вы уменьшите все имя файла до пустой строки или просто '.' что может даже не быть точным.

Кроме того, пакет django установлен по одному из этих двух путей, которые вы добавляете? Если нет, то вам необходимо добавить этот путь

Наконец, незначительное замечание, возможно, не связанное с вашей проблемой импорта в django, но вы действительно должны это сделать:

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

Может работать без, но лучше, если вы положите все приложение django в пакет. Это уменьшает вероятность того, что вы затенете другие имена пакетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...