2011-01-31 20 views
28

puedo mover a un directorio del proyecto pitón (por ejemplo c: \ www \ miproyecto) y luego emitiruso Django: de "manage.py shell Python" de secuencia de comandos Python

python manage.py shell 

y luego puedo utilizar todos módulos de proyecto de Django, dicen lo siguiente pedazo de comandos del comando shell:

import settings 
from django.template import Template, Context 

t=Template("My name is {myname}.") 
c=Context({"myname":"John"}) 
f = open('write_test.txt', 'w') 
f.write(t.render(c)) 
f.close 

ahora, cuando traté de recoger todas mis comandos en un script en Python, diga "mytest.py", no puedo ejecutar el script . Debo perder algo importante.

I emitió pitón mytest.py

luego me Import error: could not import settings ¿Está en el camino sys?"

estoy en el directorio del proyecto en el que reside settings.py .....

podría alguien ayudarme?

gracias.

+0

¿Se puede publicar el error? Es muy probable que tengas un problema PYTHONPATH. Como su pregunta mencionó el disco C: supongo que está en Windows. http://docs.python.org/using/windows.html – dicato

+0

gracias. error agregado – john

+0

Posible duplicación de [secuencia de comandos de Django para acceder a los objetos del modelo sin usar el shell manage.py] (http://stackoverflow.com/questions/8047204/django-script-to-access-model-objects-without-using-manage-py -shell) –

Respuesta

21

Trate de usar un Django management command lugar.

# myproject/myapp/management/commands/my_command.py 

from django.core.management.base import NoArgsCommand 
from django.template import Template, Context 
from django.conf import settings 

class Command(NoArgsCommand): 
    def handle_noargs(self, **options): 
     t=Template("My name is {myname}.") 
     c=Context({"myname":"John"}) 
     f = open('write_test.txt', 'w') 
     f.write(t.render(c)) 
     f.close 

Y luego (si se siguen los docs) usted será capaz de ejecutar el comando de la siguiente manera:

python manage.py my_command 
+0

gracias. Lo intentaré. ¿Hay una solución más fácil? – john

+0

Ver mi otra respuesta, que podría hacer el truco. Sin embargo, si desea un lugar ordenado para sus scripts, los comandos de administración pueden ser el camino a seguir. –

2

Para importar utilizan la configuración de Django: poner

from django.conf import settings 
+0

pongo "desde la configuración de importación de django.conf" como la primera línea de mi script, pero todavía python no puede importar la configuración ... ¿la estoy usando de la manera correcta? ¡Gracias! – john

+0

La razón por la que uso comandos de administración es porque Django pone un montón de cosas en la ruta de Python cuando se inicia (como 'django') y el uso de un comando de gestión aprovecha esto. 'python manage.py shell' inicia una versión normal del interruptor' python' pero con el entorno agregado. Por ejemplo, intente ejecutar sus declaraciones en el conmutador python normal en lugar de en el shell django. –

11

Try estas dos líneas al comienzo de su secuencia de comandos:

from django.conf import settings 
settings.configure() # check django source for more detail 

# now you can import other django modules 
from django.template import Template, Context 
23

Este método es deprecated en Django 1.4. Use django.conf.settings.configure() en su lugar (consulte la respuesta de @adiew para obtener un código de ejemplo).

Sigue el método anterior.

poner esto en el comienzo de su script

from django.core.management import setup_environ 
import settings 
setup_environ(settings) 

Esto es realmente lo que hace el manage.py detrás de la escena. Para verlo, vea la fuente de Django en django/core/management/__init__.py. Después de ejecutar estas líneas, todo debería ser como en ./manage.py shell.

+3

Esto se ha depreciado en Django 1.4. use @adieu en su lugar 'desde django.conf import settings; settings.configure()' –

+0

Para mí, esta es la respuesta __right__, aún (a partir de Django 1.5 para mí). 'settings.configure()' a veces no es suficiente – lajarre

2

En lugar de agregar cosas manualmente a su secuencia de comandos python, o tener que encajar en el formato de comando de administración, en caso de que no sea necesario, puede obtener todos los beneficios del entorno de Django ejecutando su guión con ./manage.py runscript <myscript.py>

... pero si la secuencia de comandos se encuentra en la carpeta del proyecto, entonces usted puede simplemente añadir esta línea a la parte superior de la secuencia de comandos Python: import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

+1

Usar runscript es un poco más complicado, pero muy bien resumido [aquí] (http://blog.brendel.com/2012/01/how-to-use-djangextensions-runscript .html) – chrisst

1

vio en https://stackoverflow.com/a/24456404/4200284 una buena solución para Django> = 1,7 y en caso de que alguien utiliza Django configuraciones Esto funcionó para mí:

import sys, os, django 

sys.path.append('/path/to/project') 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.local") # path to config 

## if using django-configurations 
os.environ.setdefault("DJANGO_CONFIGURATION", "Local") 
from configurations import importer 
importer.install() 

django.setup() ## apparently important for django 1.7 

from foo.models import Bar 

print Bar.objects.all() 
Cuestiones relacionadas