2009-08-21 48 views
34

Tengo un script que usa las funciones de ORM de Django, entre otras bibliotecas externas, que quiero ejecutar fuera de Django (es decir, ejecutado desde la línea de comandos).Ejecutar un script de Python fuera de Django

Editar: Por el momento, puedo lanzarlo al navegar a una URL ...

¿Cómo puedo configurar el entorno para esto?

+0

duplicado posible de [En ejecución Python secuencia de comandos del shell Django] (http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell) –

+0

Una de las soluciones más limpias es la proporcionada aquí: ht tps: //stackoverflow.com/a/39724171/4454597 –

Respuesta

20
from <Project path>   import settings   #your project settings file 
from django.core.management import setup_environ  #environment setup function 

setup_environ(settings) 

#Rest of your django imports and code go here 
+0

Lamentablemente, este método no funciona si utiliza una secuencia de comandos en \ app1 \ y necesita usar archivos de \ app2 \ a menos que lo coloque en la raíz del proyecto. –

+1

Creo que debería ser "import setup_environ" en lugar de "import setup_environment" – del

+1

Esto estaba obsoleto en Django 1.4 ... hace mucho tiempo. – mlissner

13

Todo lo que necesita es una configuración importable y establecer correctamente la ruta de Python. En la forma más cruda esto se puede hacer mediante la creación de variables de entorno apropiadas, como:

$ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py 

Hay otras maneras, como por ejemplo llamar settings.configure() y ya se ha mencionado setup_environ() descrito por James Bennett en some blog post.

+1

+1: Hacer esto todo el tiempo. Tenemos muchos trabajos por lotes que usan el ORM. –

+0

¿Funcionará un modelo simple de importación en "myscript.py"? – jgomo3

38

La manera más fácil de hacerlo es configurar su secuencia de comandos como un subcomando manage.py. Es bastante fácil de hacer:

from django.core.management.base import NoArgsCommand, make_option 

class Command(NoArgsCommand): 

    help = "Whatever you want to print here" 

    option_list = NoArgsCommand.option_list + (
     make_option('--verbose', action='store_true'), 
    ) 

    def handle_noargs(self, **options): 
     ... call your script here ... 

poner esto en un archivo, en cualquiera de sus aplicaciones bajo administración/comandos/yourcommand.py (con vacíos __init__.py archivos en cada uno) y ahora se puede llamar a la secuencia de comandos con ./manage.py yourcommand.

+0

Esta es la opción que uso, suponiendo que el comando esté relacionado con su proyecto. – DaveJ

+1

Aparece el error "NameError: name 'make_option' no está definido" cuando se ejecuta esto - ¿falta algo? –

+3

Probablemente necesites 'from optparse import make_option' en la parte superior. –

10

Nota que las sugerencias sobre la importación de configuraciones y el uso de setup_environ han quedado en desuso con Django 1.4.

Hay un hilo en el Django Github que describe why this was done.

Todavía hay algunas otras opciones, pero muchas de ellas me parecen hambrientas. Mi método preferido es a menudo para incluir la función de guión como un extended command of manage.py

10

Uso runscript de django-extensions: python manage.py runscript <my_script>

Con el fin de hacer esto, es necesario:

  1. pip install django-extensions
  2. Crear un directorio llamado scripts. Esto puede ubicarse en su directorio raíz o en una aplicación específica.
  3. inicializar el directorio con un archivo de inicio en blanco:

    touch scripts/__init__.py

  4. Coloque el guión en este directorio, e incluyen una función run(). Ejemplo:

    #hello.py 
    
    def hello(): 
        return "Hello, World" 
    
    def run(): 
        print hello() 
    
  5. ejecutar el script con python manage.py runscript hello

Consulte docs y helpful blog post para más detalles.

+0

no funciona con Python 3.6. –

1

me gusta añadir el siguiente comando para mis proyectos:

myproject/management/commands/run-script.py:

from django.core.management.base import BaseCommand, CommandError 

import imp 
import sys 


class Command(BaseCommand): 

    help = """Run a non-django script with django settings.""" 
    args = "<path_to_script.py> [<script_args>...]" 

    def handle(self, *args, **options): 
     if len(args) == 0: 
      raise CommandError("Path to script to run is required") 
     sys.argv = list(args) 
     imp.load_source("__main__", args[0]) 

Entonces, puedo ejecutar scripts personalizados, por ejemplo:

./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2 
Cuestiones relacionadas