2010-03-15 9 views
6

Ich versuche, das Django ORM in einigen eigenständigen Screen Scraping-Skripten zu verwenden. Ich weiß, dass diese Frage schon einmal gestellt wurde, aber ich bin nicht in der Lage, eine gute Lösung für mein spezielles Problem zu finden.Verwenden Sie das Django ORM in einem eigenständigen Skript (wieder)

Ich habe ein Django-Projekt mit definierten Modellen. Ich möchte diese Modelle und das ORM in meinem Scraping-Skript verwenden. Meine Verzeichnisstruktur ist so etwas wie dieses:

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

ich nach dem in project/scrape/test.py versuchte dabei:

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

Allerdings habe ich eine ImportError, wenn ich versuche zu laufen 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 

Eine Lösung, die ich um dieses Problem gefunden habe, ist eine symbolische Verbindung zu ../web/govcheck in dem Scrape-Ordner zu erstellen:

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

Mit diesem kann ich test.py dann gut laufen lassen. Dies scheint jedoch ein Hack zu sein und, was noch wichtiger ist, ist nicht sehr portabel (ich muss diesen symbolischen Link überall dort erstellen, wo ich diesen Code ausführe).

Also fragte ich mich, ob jemand bessere Lösungen für mein Problem hat?

Antwort

2

Sind Sie sicher, dass es nicht sein sollte:

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

Stellen Sie außerdem sicher, dass es eine __init__.py Datei (leer ist in Ordnung) in project/web/django_project.

P.S. Ich würde empfehlen, die Ausgabe os.path.join an os.path.abspath anstatt andersherum zu füttern.

+0

Danke - das funktioniert. –

7

Gefunden eine einfache Möglichkeit, bestehende django App-Einstellungen für die Konsolen Skript wiederverwenden:

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 
+1

Beachten Sie, dass die Funktion setup_environ seit Django 1.4 nicht mehr unterstützt wird. Weitere Informationen finden Sie in den Versionshinweisen unter https://docs.djangoproject.com/de/dev/releases/1.4/#django-core-management-setup-environ –

+0

Außerdem sollten Sie keine Einstellungen importieren. Do 'from django.conf Einstellungen importieren. Dadurch wird die Einstellungsdatei ordnungsgemäß gefunden, auch wenn sie sich nicht im Python-Pfad befindet. –

0

Ich weiß, diese Frage 6 Jahre alt ist, aber diese Alternative könnte jemand anspricht dieses Thema zu suchen. Unter der Annahme, Djangos manage.py in project/ ist, und unter der Annahme main() der Einstiegspunkt des Scripts ist, dann lassen Sie Django die Belastung nehmen:

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