2009-08-21 16 views
34

Ich habe ein Skript, das die Django-ORM-Funktionen neben anderen externen Bibliotheken verwendet, die außerhalb von Django ausgeführt werden sollen (dh über die Befehlszeile ausgeführt werden).Ausführen eines Python-Skripts außerhalb von Django

Edit: Im Moment kann ich es starten, indem Sie auf eine URL Navigation ...

Wie kann ich für diese die Umwelt Setup?

+0

Mögliche Duplikat [Python Executing Skript von Django shell] (http://stackoverflow.com/questions/16853649/executing-python-script-from-django-shell) –

+0

Eine der saubersten Lösungen ist die hier zur Verfügung gestellte: ht tps: //stackoverflow.com/a/39724171/4454597 –

Antwort

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

Leider funktioniert diese Methode nicht, wenn Sie ein Skript in \ app1 \ verwenden und Dateien aus \ app2 \ verwenden müssen, es sei denn, Sie platzieren es im Projektstammverzeichnis. –

+1

Ich denke, es sollte "import setup_environ" anstelle von "import setup_environment" sein – del

+1

Dies wurde in Django 1.4 ... vor langer Zeit veraltet. – mlissner

13

Alles, was Sie brauchen, ist importierbare Einstellungen und richtig festgelegt Python-Pfad. In dem am meisten Rohform kann dies durch die Einrichtung von entsprechenden Umgebungsvariablen durchgeführt werden, wie zB:

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

Es gibt andere Möglichkeiten, wie settings.configure() Aufruf und schon setup_environ() Erwähnt von James Bennett in some blog post beschrieben.

+1

+1: Tun Sie dies die ganze Zeit. Wir haben viele Batch-Jobs, die das ORM verwenden. –

+0

Funktioniert ein einfacher Modellimport in "myscript.py"? – jgomo3

38

Der einfachste Weg, dies zu tun, ist, Ihr Skript als manage.py Unterbefehl einzurichten. Es ist ganz einfach:

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 ... 

Setzen Sie diese in einer Datei, in jedem Ihrer Anwendungen unter Verwaltung/Befehle/yourcommand.py (mit leeren __init__.py Dateien in jedem) und jetzt können Sie Ihr Skript mit ./manage.py yourcommand nennen.

+0

Dies ist die Option, die ich verwende, vorausgesetzt, der Befehl bezieht sich auf Ihr Projekt. – DaveJ

+1

Ich bekomme den Fehler "NameError: Name 'make_option' ist nicht definiert" beim Ausführen dieser - fehlt etwas? –

+3

Sie müssen wahrscheinlich 'optparse importieren make_option' an der Spitze. –

10

Hinweis, dass die Vorschläge zum Importieren von Einstellungen und zum Verwenden von setup_environ mit Django 1.4 veraltet sind.

Es gibt einen Thread auf dem Django Github, der why this was done beschreibt.

Es gibt noch einige andere Möglichkeiten, aber viele von ihnen scheinen mir hackish. Meine bevorzugte Methode ist oft die scripted Funktion als extended command of manage.py

10

Verwenden runscript von django-extensions enthalten: python manage.py runscript <my_script>

Um dies zu tun, müssen Sie:

  1. pip install django-extensions
  2. Erstellen Sie ein Verzeichnis genannt scripts. Dies kann sich in Ihrem Stammverzeichnis oder in einer bestimmten App befinden.
  3. das Verzeichnis mit einer leeren init Datei initialisieren:

    touch scripts/__init__.py

  4. Legen Sie das Skript in diesem Verzeichnis, und verfügt über eine run() Funktion. Beispiel:

    #hello.py 
    
    def hello(): 
        return "Hello, World" 
    
    def run(): 
        print hello() 
    
  5. Führen Sie das Skript mit python manage.py runscript hello

Siehe docs und helpful blog post für weitere Details.

+0

funktioniert nicht mit Python 3.6. –

1

Ich mag den folgenden Befehl, um meine Projekte hinzuzufügen:

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

Dann kann ich benutzerdefinierte Skripts ausführen, zB:

./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2 
Verwandte Themen