2010-02-17 7 views
0

J'essaie d'avoir un script Django exécuté toutes les 5 minutes via cron sur mon ordinateur portable (Mac OS X). Voici le code dans le script:Django + Unix Cron, impossible d'importer 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 * * * * python /absolute/path/to/tweet_cache.py

erreur du système 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 

quelqu'un peut-il me dire ce que je fais mal?

Répondre

1

sys.argv[0] n'est pas toujours le moyen le plus fiable d'obtenir le chemin du fichier actuel. Je recommande cette modification:

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

Notez l'utilisation de sys.path.insert au lieu de sys.path.append, et l'utilisation du fichier . En outre, l'utilisation de abspath dans le fichier -avant-dirname réduit la possibilité de réduire le nom de fichier entier à la chaîne vide ou simplement '.' ce qui peut même ne pas être précis.

De plus, le paquet django est-il installé dans l'un de ces deux chemins que vous ajoutez? Sinon, vous devez seuil d'ajouter ce chemin

Enfin, une boutade mineure, probablement sans rapport avec votre problème d'importation django, mais vous devriez vraiment faire:

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

Il peut fonctionner sans, mais il vaut mieux si vous mettez toute votre application django dans un paquet. Cela réduit les chances de masquer d'autres noms de package.

+0

Ainsi le chemin de mon installation de django serait-il: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django? –

+0

qui a fait l'affaire, je pense qu'il me manquait d'avoir django sur le chemin car il semble cron crée son propre environnement où vous devez spécifier le chemin indépendamment du système. –