Ich muss ein Python-Skript aus der Django-Shell ausführen. Ich habe es versucht:
./manage.py shell << my_script.py
Aber es hat nicht funktioniert. Es wartete nur darauf, dass ich etwas schrieb.
Ich muss ein Python-Skript aus der Django-Shell ausführen. Ich habe es versucht:
./manage.py shell << my_script.py
Aber es hat nicht funktioniert. Es wartete nur darauf, dass ich etwas schrieb.
Antworten:
Der <<
Teil ist falsch, verwenden Sie <
stattdessen:
$ ./manage.py shell < myscript.py
Sie könnten auch tun:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Für Python3 müssten Sie verwenden
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. Ich habe festgestellt, dass dies für schnelle und schmutzige Skripte nützlich sein kann, die Sie nur einmal ausführen müssen, ohne den umständlichen Prozess des Erstellens eines manage.py
Befehls durchlaufen zu müssen .
Get-Content myscript.py | .\manage.py shell
Es wird nicht empfohlen, dies von der Seite aus zu tun shell
- und dies ist beabsichtigt, da Sie eigentlich keine zufälligen Skripte aus der Django-Umgebung ausführen sollten (aber es gibt Möglichkeiten, dies zu umgehen , siehe die anderen Antworten).
Wenn dies ein Skript ist, das Sie mehrmals ausführen werden, ist es eine gute Idee, es als benutzerdefinierten Befehl einzurichten, d. H.
$ ./manage.py my_command
Erstellen Sie dazu eine Datei in einem Unterverzeichnis von management
und commands
von Ihrem app
, dh
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
und definieren Sie in dieser Datei Ihren benutzerdefinierten Befehl (stellen Sie sicher, dass der Name der Datei der Name des Befehls ist, von dem aus Sie ausführen möchten ./manage.py
)
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, **options):
# now do the things that you want with your models here
NoArgsCommand
veraltet. Diese Seite gibt ein funktionierendes Beispiel: docs.djangoproject.com/de/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
zu def handle(self, **options):
.
def handle(self, **options):
als James 'Kommentar.
Für alle, die Django 1.7+ verwenden, scheint es nicht ausreichend zu sein, das Einstellungsmodul einfach zu importieren.
Nach einigem Graben fand ich diese Antwort zum Stapelüberlauf: https://stackoverflow.com/a/23241093
Sie müssen jetzt:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Ohne das oben Gesagte zu tun, bekam ich einen django.core.exceptions.AppRegistryNoReady
Fehler.
Meine Skriptdatei befindet sich im selben Verzeichnis wie mein Django-Projekt (dh im selben Ordner wie manage.py).
DJANGO_SETTINGS_MODULE
Umgebungsvariablen referenziert . Damit war es genug, um nur: import django ; django.setup()
unter 1,7.
django.setup()
Wenn das Skript nicht ausgeführt wird, kann das Skript nicht auf Django-Modelle zugreifen und diese nicht einmal importieren!
import django; django.setup()
.
Ich bin zu spät zur Party, aber ich hoffe, dass meine Antwort jemandem hilft: Sie können dies in Ihrem Python-Skript tun:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
Der Rest deiner Sachen geht hier ...
sys.path.append
löschen können, solange Sie es DJANGO_SETTINGS_MODULES
richtig machen (z. B. wenn Sie ein Skript direkt über Ihrem Site-Stammverzeichnis haben, können Sie dies tun os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
Am Ende hat es funktioniert, wenn ich mich in meinem Projektverzeichnis befinde, mein DJANGO_SETTINGS_MODULE korrekt ist und ich versuche, ein Skript auszuführen, das Modelle, Ansichten usw. importiert
runscript
von Django-Erweiterungen
python manage.py runscript scripty.py
Ein Beispiel script.py
zum Testen:
from django.contrib.auth.models import User
print(User.objects.values())
Erwähnt unter: http://django-extensions.readthedocs.io/en/latest/command_extensions.html und dokumentiert unter:
python manage.py runscript --help
Getestet auf Django 1.9.6, Django-Erweiterungen 1.6.7.
django-extensions
(sollten Sie). Hinweis: Es sieht so aus, runscript
als würde der Standard-Django verwendet shell
. Es wäre fantastisch, wenn es verwendet würde shell_plus
(auch in Erweiterungen), so dass Sie nicht alles für einfache Skripte importieren müssten .
Wenn IPython verfügbar ist ( pip install ipython
), ./manage.py shell
wird automatisch die Shell verwendet, und Sie können den magischen Befehl verwenden %run
:
%run my_script.py
runscript
dass es mit Skripten außerhalb des Projekts / Pakets funktioniert und sich nicht so beschwertTypeError: the 'package' argument is required to perform a relative import for
Sie können das Skript einfach mit der DJANGO_SETTINGS_MODULE
Umgebungsvariablen ausführen . Das ist alles, was zum Einrichten der Django-Shell-Umgebung erforderlich ist.
Dies funktioniert in Django> = 1.4
@AtulVarma lieferte einen sehr nützlichen Kommentar unter der nicht funktionierenden akzeptierten Antwort :
echo 'import myscript' | python manage.py shell
Wenn Ihr Skript nicht viele Befehle enthält, verwenden Sie es:
manage.py shell --command="import django; print(django.__version__)"
Wie andere Antworten zeigen, aber nicht explizit angeben, müssen Sie möglicherweise nicht unbedingt Ihr Skript über die Django-Shell ausführen, sondern auf Ihre Apps zugreifen, ohne die Django-Shell zu verwenden .
Dies unterscheidet sich stark von der Django-Version zur Django-Version. Wenn Sie in diesem Thread keine Lösung finden, finden Sie hier Antworten - Django-Skript für den Zugriff auf Modellobjekte ohne Verwendung der shell.py-Shell - oder ähnliche Suchanfragen.
Ich musste my_command.py mit beginnen
import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()
import project.app.models
#do things with my models, yay
und rannte dann python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject')
mit BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
und `sys.path.append (BASE_DIR)`. Vergessen Sie auch nicht, Ihre virtuelle Umgebung zu aktivieren, bevor Sie den Befehl ausführen!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Beachten Sie, dass diese Methode für neuere Versionen von django! (> 1,3)
Eine alternative Antwort können Sie oben hinzufügen my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
und my_script.py
nur mit Python in dem Verzeichnis ausführen, in dem Sie haben, settings.py
aber das ist ein bisschen hacky.
$ python my_script.py
Etwas, das ich gerade als interessant empfunden habe, sind Django-Skripte, mit denen Sie Skripte schreiben können, die mit python manage.py runscript foobar ausgeführt werden. Weitere Informationen zur Implementierung und Struktur finden Sie hier, http://django-extensions.readthedocs.org/en/latest/index.html
Versuchen Sie dies, wenn Sie eine virtuelle Umgebung verwenden: -
python manage.py Shell
Um diesen Befehl verwenden zu können, müssen Sie sich in der virtuellen Umgebung befinden. für diesen Gebrauch: -
workon vir_env_name
zum Beispiel :-
dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Hinweis : - Hier ist mysite mein Website-Name und jango mein virtueller Umweltname
Auf andere Weise wird dies ausgeführt:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Dies funktioniert unter Python2.7 und Django1.9
Die Django-Shell ist der gute Weg, um ein Python-Modul mit der Django-Umgebung auszuführen, aber es ist nicht immer einfach und mühsam, Module zu importieren und Funktionen manuell auszuführen, insbesondere ohne automatische Vervollständigung. Um dies zu beheben, habe ich ein kleines Shell-Skript "runscript.sh" erstellt , mit dem Sie die automatische Vervollständigung und den Protokollverlauf der Linux-Konsole voll ausnutzen können.
NB: Kopieren Sie runningcript.sh in das Root-Projekt und setzen Sie das Ausführungsrecht (chmod + x).
Beispiel: Ich möchte die Python-Funktion show (a, b, c) im Modul do_somethings.py in myapp / do_folder / ausführen.
Der Standard-Django-Weg (manage.py-Shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
Mit Skript (runscript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
Das Skript ist nicht auf die Anzahl der Argumente beschränkt. Es werden jedoch nur Argumente primitiver Typen unterstützt (int, float, string).
runscript
aus dem django-extensions
Paket machen Sie das gleiche, überprüfen Sie es django-extensions.readthedocs.io/en/latest/runscript.html
Spät zur Party. Aber das könnte für jemanden hilfreich sein.
Alles was Sie brauchen ist Ihr Skript und django-extensions
installiert.
Führen Sie einfach das shell_plus
verfügbare django_extensions
Skript aus und importieren Sie das von Ihnen geschriebene Skript.
Wenn sich Ihr Skript scpt.py
in einem Ordner befindet fol
, können Sie das Skript wie folgt ausführen.
python manage.py shell_plus
und importieren Sie einfach Ihr Skript wie folgt in die Shell.
>>> from fol import scpt
django.setup () scheint nicht zu funktionieren.
scheint auch nicht erforderlich zu sein.
das allein hat funktioniert.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
funktioniert das nicht , was wollen Sie eigentlich tun?