Wie führe ich ein Python-Skript aus der Django-Shell aus?

247

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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
So djangofunktioniert das nicht , was wollen Sie eigentlich tun?
Danodonovan
2
my_script.pyenthält einige Operationen an einem meiner Django-Modelle. Ich habe das schon vorher gemacht, aber ich kann mich nicht erinnern, wie genau.

Antworten:

388

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())
Codeape
quelle
17
Für mich führt dies nur die erste Zeile des Skripts aus. Das einzige, was funktioniert, ist die Kombination beider Methoden:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett
Es funktioniert nicht mehr mit Python 3+. Irgendeine Idee, dies zu ersetzen?
David D.
4
@ DavidD. Der Ersatz wird in dieser Antwort hier gegeben
peter2108
11
Eine andere Lösung, die sowohl für Python 2.x als auch für 3.x zu funktionieren scheint, ist 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.pyBefehls durchlaufen zu müssen .
Atul Varma
1
Wenn Sie dies unter Windows Power Shell tun: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha
219

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 managementund commandsvon 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
danodonovan
quelle
9
Auch dies ist die beste Antwort. Da ist Django 1.8 NoArgsCommandveraltet. Diese Seite gibt ein funktionierendes Beispiel: docs.djangoproject.com/de/1.9/howto/custom-management-commands/…
Ger
2
Gemäß früheren Kommentar, denn es ist für mich zur Arbeit musste ich ändern def handle_noargs(self, **options):zu def handle(self, **options):.
James
Interessanter Link hier zur Unterstützung dieser Antwort und der Dokumentation.
Mattia Paterna
1
Damit es funktioniert, ändern Sie es def handle(self, **options):als James 'Kommentar.
Omar Gonzales
Elegante Antwort. Vielen Dank
Tessaracter
103

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

Meine Skriptdatei befindet sich im selben Verzeichnis wie mein Django-Projekt (dh im selben Ordner wie manage.py).

cgons
quelle
2
In meinem Setup ist die Einstellungsdatei bereits in der DJANGO_SETTINGS_MODULEUmgebungsvariablen referenziert . Damit war es genug, um nur: import django ; django.setup()unter 1,7.
Taylor Edmiston
1
Mit Django 1.7+ sollte dies die akzeptierte Antwort sein :)
acidjunk
Dies ist definitiv die richtige Antwort für Django 1.9.x. django.setup()Wenn das Skript nicht ausgeführt wird, kann das Skript nicht auf Django-Modelle zugreifen und diese nicht einmal importieren!
Glarrain
In einer virtuellen Umgebung können Sie einfach import django; django.setup().
User3759685
1
Du hast meinen Tag gerettet! Danke für diesen Beitrag. Ich wurde auf Sellerie knarrend, weil ich nicht in der Lage war, Aufgaben auf management.call_command auszuführen: D: D: D
68

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

e-nouri
quelle
3
Beachten Sie auch, dass Sie das Material sys.path.appendlöschen können, solange Sie es DJANGO_SETTINGS_MODULESrichtig 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').
mgalgs
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
Danilo Cabello
Ja, aber Sie können es nicht von überall ausführen!
E-Nouri
Dies funktioniert bei mir mit Django 1.6 nicht - ich habe eine App. Ich habe meinen Pfad so festgelegt, dass er das Django-Projektverzeichnis enthält, und die Projekteinstellungen eingerichtet. Wenn ich jedoch versuche, meine App mit "from shoppinglist.models import ShoppingList" zu importieren, wird die Fehlermeldung angezeigt, dass keine Modelle gefunden werden können. Dieselbe Importzeile funktioniert in der shell.py-Shell. Irgendwelche Ideen?
Frankster
33

runscriptvon Django-Erweiterungen

python manage.py runscript scripty.py

Ein Beispiel script.pyzum 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

Es gibt auch ein Tutorial .

Getestet auf Django 1.9.6, Django-Erweiterungen 1.6.7.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
Dies ist die beste Antwort, wenn Sie bereits verwenden django-extensions(sollten Sie). Hinweis: Es sieht so aus, runscriptals 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 .
Grokpot
12

Wenn IPython verfügbar ist ( pip install ipython), ./manage.py shellwird automatisch die Shell verwendet, und Sie können den magischen Befehl verwenden %run:

%run my_script.py
Gitaarik
quelle
Lief wie am Schnürchen!
Roel
Dies hat den Vorteil, runscriptdass 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
smido
8

Sie können das Skript einfach mit der DJANGO_SETTINGS_MODULEUmgebungsvariablen ausführen . Das ist alles, was zum Einrichten der Django-Shell-Umgebung erforderlich ist.

Dies funktioniert in Django> = 1.4

Vlastimil Zíma
quelle
7

@AtulVarma lieferte einen sehr nützlichen Kommentar unter der nicht funktionierenden akzeptierten Antwort :

echo 'import myscript' | python manage.py shell
raratiru
quelle
gute Antwort! Ich habe es in den Kommentaren verpasst. Danke, dass du es hierher gebracht
hast
6

Wenn Ihr Skript nicht viele Befehle enthält, verwenden Sie es:

manage.py shell --command="import django; print(django.__version__)"

Django docs

MrNinjamannn
quelle
4

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)

Simone
quelle
Dies funktioniert immer noch für Django 3.0. Ich ersetzte 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!
Mrj
3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()
user5121699
quelle
1
Könnten Sie bitte eine Erklärung darüber bearbeiten, warum dieser Code die Frage auf eine Weise beantwortet, die sich von einigen der sehr ähnlichen früheren Antworten unterscheidet? Nur-Code-Antworten werden nicht empfohlen , da sie die Lösung nicht vermitteln.
Nathan Tuggy
2

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.pynur mit Python in dem Verzeichnis ausführen, in dem Sie haben, settings.pyaber das ist ein bisschen hacky.

$ python my_script.py
danodonovan
quelle
1

Wenn Sie in BG noch besser laufen wollen:

nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &

Die Ausgabe erfolgt in nohup.out

Kevin He
quelle
0

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

tseboho
quelle
0

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

Rahul Satal
quelle
0

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:

./manage.py shell <<EOF
import my_script
my_script.main()
EOF
Mariotomo
quelle
0

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

Руслан Руденко
quelle
0

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:

PYTHONSTARTUP=my_script.py python manage.py shell
Apogentus
quelle
0

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

Martin13
quelle
Hallo, wahrscheinlich runscriptaus dem django-extensionsPaket machen Sie das gleiche, überprüfen Sie es django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4
Vielen Dank, dass Sie frost-nzcr4. Ja, diese Erweiterung funktioniert zwar, aber ich finde sie auf den Ordner srcipts und nur auf die Funktion run () beschränkt. Mit meinem srcipt können Sie eine Funktion überall in einem beliebigen Ordner ausführen.
Martin13
0

Spät zur Party. Aber das könnte für jemanden hilfreich sein.

Alles was Sie brauchen ist Ihr Skript und django-extensionsinstalliert.

Führen Sie einfach das shell_plusverfügbare django_extensionsSkript aus und importieren Sie das von Ihnen geschriebene Skript.

Wenn sich Ihr Skript scpt.pyin 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
Jarvis
quelle
-1

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")
davidj411
quelle
1
django.setup () wird mit Sicherheit benötigt, um die Django-Umgebung zu booten.
colm.anseo