7 votes

Utiliser l'ORM de Django dans un script autonome (encore)

J'essaie d'utiliser l'ORM de Django dans des scripts autonomes de scraping d'écran scripts. Je sais que cette question a déjà été posée, mais je ne parviens pas à trouver une bonne solution pour mon problème particulier.

J'ai un projet Django avec des modèles définis. Ce que je voudrais faire, c'est utiliser ces modèles et l'ORM dans mon script de scraping. Ma structure de répertoire est quelque chose comme ceci :

project
    scrape
        #scraping scripts
        ...
        test.py
    web
        django_project
            settings.py
            ...
            #Django files

J'ai essayé de faire ce qui suit dans project/scrape/test.py :

print os.path.join(os.path.abspath('..'), 'web', 'django_project')
sys.path.append(os.path.join(os.path.abspath('..'), 'web', 'django_project'))
print sys.path
print "-------"
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'
#print os.environ
from django_project.myapp.models import MyModel
print MyModel.objects.count()

Cependant, je reçois un ImportError lorsque j'essaie d'exécuter test.py :

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    from django_project.myapp.models import MyModel
ImportError: No module named django_project.myapp.models

Une solution que j'ai trouvée pour contourner ce problème est de créer un lien symbolique vers ../web/govcheck dans le dossier de scrape :

:scrape rmanocha$ ln -s ../web/govcheck ./govcheck

Avec cela, je peux exécuter test.py sans problème. Cependant, cela ressemble à un hack, et plus important encore, ce n'est pas très portable (je vais devoir créer ce lien symbolique partout où j'exécute ce code).

Donc, je me demandais si quelqu'un avait une meilleure solution à mon problème ?

8voto

C W Points 41

J'ai trouvé un moyen facile de réutiliser les paramètres d'une application Django existante pour la console script :

from django.core.management import setup_environ

import settings
setup_environ(settings)

from myapp.models import Object

for o in Object.objects.all():
    print o

2voto

Mike DeSimone Points 20059

Vous êtes sûr que ça ne devrait pas l'être :

sys.path.append(os.path.join(os.path.abspath('..'), 'web'))

Assurez-vous également qu'il y a un __init__.py (un fichier vide est suffisant) dans project/web/django_project .

P.S. Je recommande de nourrir os.path.join à la sortie de os.path.abspath au lieu de l'inverse.

0voto

nigel222 Points 1900

Je sais que cette question est vieille de six ans, mais cette alternative pourrait intéresser quelqu'un qui fait des recherches sur ce sujet. En supposant que l'outil manage.py está en project/ et en supposant que main() est le point d'entrée du script, alors laissez Django prendre le relais :

./manage.py shell -c 'from scrape.test import main; main()'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X