it-swarm.com.de

Wie man ein Python-Skript von der Django-Shell aus ausführt?

Ich muss ein Python-Skript von der Django-Shell ausführen. Ich habe es versucht:

./manage.py Shell << my_script.py

Aber es hat nicht funktioniert. Es hat nur darauf gewartet, dass ich etwas schreibe.

185
user2429940

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())
297
codeape

Es wird nicht empfohlen, dies von der Shell aus zu tun - und dies ist beabsichtigt, da Sie eigentlich keine zufälligen Skripts aus der Django-Umgebung ausführen sollten (aber es gibt gibt [ Möglichkeiten], siehe die anderen Antworten). 

Wenn Sie dieses Skript mehrmals ausführen, sollten Sie es als custom command ie einrichten

 $ ./manage.py my_command

dazu erstellen Sie eine Datei in einem Unterverzeichnis von management und commands Ihrer 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 dem Namen des Befehls entspricht, den Sie von ./manage.py ausführen möchten).

from Django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle_noargs(self, **options):
        # now do the things that you want with your models here
181
danodonovan

Für jeden, der Django 1.7+ verwendet, scheint es nicht genug zu sein, das Einstellungsmodul zu importieren. 

Nach einigem Graben fand ich diese Stack Overflow-Antwort: 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 dies zu tun, erhielt 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).

83
cgons

Ich komme zu spät zur Party, aber ich hoffe, dass meine Antwort jemandem helfen wird: 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 ....

65
e-nouri

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 bei: http://Django-extensions.readthedocs.io/de/latest/command_extensions.html und dokumentiert bei:

python manage.py runscript --help

Es gibt auch ein Tutorial .

Getestet auf Django 1.9.6, Django-Erweiterungen 1.6.7.

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

%run my_script.py
9
gitaarik

Sie können das Skript einfach mit der Umgebungsvariablen Django_SETTINGS_MODULE ausführen. Das ist alles, was Sie brauchen, um die Django-Shell-Umgebung einzurichten.

Das funktioniert in Django> = 1.4

7
ziima

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

echo 'import myscript' | python manage.py Shell
3
raratiru

Wie aus anderen Antworten hervorgeht, aber nicht ausdrücklich angegeben wird, müssen Sie Ihr Skript nicht unbedingt von der Django-Shell aus ausführen, sondern auf Ihre Anwendungen zugreifen, ohne die Django-Shell zu verwenden.

Dies unterscheidet sich viel von der Django-Version zur Django-Version. Wenn Sie Ihre Lösung in diesem Thread nicht finden, können Sie hier auf das Django-Skript -- zugreifen, um auf Modellobjekte zuzugreifen, ohne die manage.py Shell -- oder ähnliche Suchen zu verwenden.

Ich musste my_command.py mit

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 lief dann python3 my_command.py

(Django 2.0.2)

3
Simone
import os, sys, Django
os.environ["Django_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

Django.setup()
2
user5121699

Beachten Sie, dass diese Methode für neuere Versionen von Django nicht mehr empfohlen wird! (> 1,3)

Eine alternative Antwort können Sie oben in my_script.py einfügen.

from Django.core.management import setup_environ
import settings
setup_environ(settings)

und führen Sie my_script.py einfach mit python in dem Verzeichnis aus, in dem Sie settings.py haben.

$ python my_script.py
2
danodonovan

Versuchen Sie dies, wenn Sie eine virtuelle Umgebung verwenden: -

python manage.py Shell

um diese Befehle verwenden zu können, müssen Sie sich in einer virtuellen Umgebung befinden. für diese Verwendung: -

workon vir_env_name

zum Beispiel :-

[email protected]:~/mysite$ workon jango
(jango)[email protected]:~/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 mein Name der Name meiner Website und Jango ist mein virtueller Umgebungsname 

1
Rahul Satal

wenn Sie nicht viele Befehle in Ihrem Skript haben, verwenden Sie es:

manage.py Shell --command="import Django; print(Django.__version__)"

Django-Dokumente

1
MrNinjamannn

Auf andere Weise ist es dieses auszuführen:

echo 'execfile("/path_to/myscript.py")' | python manage.py Shell --settings=config.base

Dies funktioniert auf Python2.7 und Django1.9

Was ich gerade interessant fand, ist Django Scripts, mit dem Sie Skripte schreiben können, die mit python manage.py ausgeführt werden. Ausführliche Informationen zu Implementierung und Struktur finden Sie hier, http://Django-extensions.readthedocs.org/de/latest/index.html

0
tseboho

kam hierher mit der gleichen Frage wie das OP, und ich fand meine Lieblingsantwort genau in dem Fehler in der Frage, die auch in Python 3 funktioniert:

./manage.py Shell <<EOF
import my_script
my_script.main()
EOF
0
mariotomo

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

0
Kevin He