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.
python
django
django-shell
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
quelle
django
funktioniert das nicht , was wollen Sie eigentlich tun?my_script.py
enthält einige Operationen an einem meiner Django-Modelle. Ich habe das schon vorher gemacht, aber ich kann mich nicht erinnern, wie genau.Antworten:
Der
<<
Teil ist falsch, verwenden Sie<
stattdessen:Sie könnten auch tun:
Für Python3 müssten Sie verwenden
quelle
./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 einesmanage.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.
Erstellen Sie dazu eine Datei in einem Unterverzeichnis von
management
undcommands
von Ihremapp
, dhund 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
)quelle
NoArgsCommand
veraltet. Diese Seite gibt ein funktionierendes Beispiel: docs.djangoproject.com/de/1.9/howto/custom-management-commands/…def handle_noargs(self, **options):
zudef 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:
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).
quelle
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:
Der Rest deiner Sachen geht hier ...
quelle
sys.path.append
löschen können, solange Sie esDJANGO_SETTINGS_MODULES
richtig machen (z. B. wenn Sie ein Skript direkt über Ihrem Site-Stammverzeichnis haben, können Sie dies tunos.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. importiertrunscript
von Django-ErweiterungenEin Beispiel
script.py
zum Testen:Erwähnt unter: http://django-extensions.readthedocs.io/en/latest/command_extensions.html und dokumentiert unter:
Es gibt auch ein Tutorial .
Getestet auf Django 1.9.6, Django-Erweiterungen 1.6.7.
quelle
django-extensions
(sollten Sie). Hinweis: Es sieht so aus,runscript
als würde der Standard-Django verwendetshell
. Es wäre fantastisch, wenn es verwendet würdeshell_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
:quelle
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
quelle
@AtulVarma lieferte einen sehr nützlichen Kommentar unter der nicht funktionierenden akzeptierten Antwort :
quelle
Wenn Ihr Skript nicht viele Befehle enthält, verwenden Sie es:
Django docs
quelle
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
und rannte dann
python3 my_command.py
(Django 2.0.2)
quelle
sys.path.append('/path/to/myproject')
mitBASE_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!quelle
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
und
my_script.py
nur mit Python in dem Verzeichnis ausführen, in dem Sie haben,settings.py
aber das ist ein bisschen hacky.quelle
Wenn Sie in BG noch besser laufen wollen:
Die Ausgabe erfolgt in
nohup.out
quelle
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
quelle
Versuchen Sie dies, wenn Sie eine virtuelle Umgebung verwenden: -
Um diesen Befehl verwenden zu können, müssen Sie sich in der virtuellen Umgebung befinden. für diesen Gebrauch: -
zum Beispiel :-
Hinweis : - Hier ist mysite mein Website-Name und jango mein virtueller Umweltname
quelle
kam mit der gleichen Frage wie das OP hierher, und ich fand meine Lieblingsantwort genau in dem Fehler in der Frage, der auch in Python 3 funktioniert:
quelle
Auf andere Weise wird dies ausgeführt:
Dies funktioniert unter Python2.7 und Django1.9
quelle
Wenn Sie ein Startskript ausführen möchten (z. B. einige Django-Modelle importieren, um interaktiv mit ihnen zu arbeiten) und in der Django-Shell bleiben möchten:
quelle
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):
Mit Skript (runscript.sh):
Das Skript ist nicht auf die Anzahl der Argumente beschränkt. Es werden jedoch nur Argumente primitiver Typen unterstützt (int, float, string).
quelle
runscript
aus demdjango-extensions
Paket machen Sie das gleiche, überprüfen Sie es django-extensions.readthedocs.io/en/latest/runscript.htmlSpä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ügbaredjango_extensions
Skript aus und importieren Sie das von Ihnen geschriebene Skript.Wenn sich Ihr Skript
scpt.py
in einem Ordner befindetfol
, können Sie das Skript wie folgt ausführen.und importieren Sie einfach Ihr Skript wie folgt in die Shell.
quelle
django.setup () scheint nicht zu funktionieren.
scheint auch nicht erforderlich zu sein.
das allein hat funktioniert.
quelle