2010-03-15 10 views
6

Estoy tratando de usar el ORM de Django en algunas secuencias de comandos de raspado de pantalla independientes. Sé que esta pregunta ya se hizo antes, pero no puedo encontrar una buena solución para mi problema en particular.Use el ORM de Django en una secuencia de comandos independiente (otra vez)

Tengo un proyecto de Django con modelos definidos. Lo que me gustaría hacer es usar estos modelos y el ORM en mi script de raspado. Mi estructura de directorios es algo como esto:

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

He intentado hacer lo siguiente en 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() 

Sin embargo, consigo un ImportError cuando trato de ejecutar 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 

Una solución que encontré alrededor de este problema es crear un enlace simbólico al ../web/govcheck en la carpeta scrape:

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

Con esto, puedo ejecutar test.py muy bien. Sin embargo, esto parece un truco y, lo que es más importante, no es muy portátil (tendré que crear este enlace simbólico en todos los lugares donde ejecute este código).

Entonces, me preguntaba si alguien tiene mejores soluciones para mi problema?

Respuesta

2

¿Estás seguro de que no debe ser:

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

Además, asegúrese de que hay un archivo __init__.py (vacío está muy bien) en project/web/django_project.

P.S. Recomiendo alimentar la salida de os.path.join a os.path.abspath en lugar de hacerlo a la inversa.

+0

Gracias - que funciona. –

7

encontrado una forma fácil de reutilizar los ajustes de aplicación de Django existente para la escritura de la consola:

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

Tenga en cuenta que la función setup_environ ha quedado obsoleta a partir de Django 1.4. Consulte las notas de la versión en https://docs.djangoproject.com/en/dev/releases/1.4/#django-core-management-setup-environ –

+0

Además, no 'importe configuraciones'. Haz 'desde la configuración de importación django.conf'. Esto ubicará correctamente el archivo de configuración incluso si no está en la ruta de Python. –

0

Sé que esta pregunta es de seis años de edad, pero esta alternativa podría atraer a alguien en busca de este tema. Suponiendo manage.py de Django está en project/, y asumiendo main() es punto de entrada de la secuencia de comandos, a continuación, dejar de tomar la tensión de Django:

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