Come eseguire uno script Python dalla shell Django?


247

Devo eseguire uno script Python dalla shell Django. Provai:

./manage.py shell << my_script.py

Ma non ha funzionato. Stava solo aspettando che scrivessi qualcosa.


Non è così che djangofunziona, cosa vuoi davvero fare?
danodonovan,

2
my_script.pycontiene alcune operazioni su uno dei miei modelli Django. L'ho già fatto prima, ma non ricordo esattamente come.

Risposte:


388

La <<parte è sbagliata, utilizzare <invece:

$ ./manage.py shell < myscript.py

Puoi anche fare:

$ ./manage.py shell
...
>>> execfile('myscript.py')

Per python3 dovresti usare

>>> exec(open('myscript.py').read())

17
Per me, questo esegue solo la prima riga dello script. L'unica cosa che funziona è combinare entrambi i metodi:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett,

Non funziona più con Python 3+. Qualche idea per sostituirlo?
David D.

4
@DavidD. La sostituzione è data in questa risposta qui
peter2108

11
Un'altra soluzione che sembra funzionare sia per Python 2.xe 3.x è echo 'import myscript' | python manage.py shell. Ho scoperto che questo può essere utile per gli script veloci e sporchi che devi eseguire una sola volta, senza dover passare attraverso il processo ingombrante di creazione di un manage.pycomando.
Atul Varma,

1
se lo stai facendo su Power Shell di Windows: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha il

219

Non è consigliabile farlo dal shell- e questo è inteso perché non dovresti davvero eseguire script casuali dall'ambiente django (ma ci sono modi per aggirare questo, vedi le altre risposte).

Se questo è uno script che eseguirai più volte, è una buona idea configurarlo come comando personalizzato, ad es

 $ ./manage.py my_command

per fare ciò creare un file in una sottodirectory di managemente commandsdel tuo app, ad es

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

e in questo file definire il comando personalizzato (assicurandosi che il nome del file sia il nome del comando da cui si desidera eseguire ./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

9
Ancora una volta questa è la risposta migliore. Poiché django 1.8 NoArgsCommandè deprecato. Questa pagina fornisce un esempio funzionante: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
Ger

2
Come da commento precedente, per farlo funzionare per me avevo bisogno di cambiare def handle_noargs(self, **options):a def handle(self, **options):.
James,

Link interessante qui a supporto di questa risposta e della documentazione.
Mattia Paterna,

1
Per farlo funzionare, cambia def handle(self, **options):come commento di James.
Omar Gonzales,

Risposta elegante. Grazie mille
Tessaracter,

103

Per chiunque usi Django 1.7+, sembra che importare semplicemente il modulo delle impostazioni non sia sufficiente.

Dopo alcuni scavi, ho trovato questa risposta Stack Overflow: https://stackoverflow.com/a/23241093

Ora devi:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

Senza fare quanto sopra, stavo ricevendo un django.core.exceptions.AppRegistryNoReadyerrore.

Il mio file di script si trova nella stessa directory del mio progetto django (cioè nella stessa cartella di manage.py)


2
La mia installazione ha il file delle impostazioni già indicato nella DJANGO_SETTINGS_MODULEvariabile d'ambiente. Con ciò è bastato solo: import django ; django.setup()meno di 1.7.
Taylor Edmiston,

1
Con django 1.7+ questa dovrebbe essere la risposta accettata :)
acidjunk

Questa è definitivamente la risposta corretta per Django 1.9.x. La django.setup()mancata esecuzione non consentirà allo script di accedere ai modelli Django, nemmeno di importarli!
Glarrain,

In virtualenv puoi semplicemente import django; django.setup().
Utente 37756868

1
Mi hai reso felice! Grazie per questo post stavo diventando cremoso sul sedano perché non ero in grado di eseguire le attività su management.call_command: D: D: D

68

Sono in ritardo per la festa ma spero che la mia risposta possa aiutare qualcuno: puoi farlo nel tuo script Python:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings

il resto delle tue cose va qui ....


3
Si noti inoltre che è possibile rilasciare il sys.path.appendmateriale finché si ottiene DJANGO_SETTINGS_MODULEScorrettamente (ad esempio se si dispone di uno script appena sopra la radice del sito, è possibile farlo os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
mgalgs

Ho finito per farlo sys.path.append(os.getcwd()), funziona quando mi trovo nella directory del mio progetto, il mio DJANGO_SETTINGS_MODULE è corretto e provo a eseguire uno script che importa modelli, viste, ecc.
Danilo Cabello,

si ma non puoi eseguirlo da nessuna parte!
e-nouri,

Questo non funziona per me con Django 1.6: ho un'app. Ho impostato il mio percorso per includere la directory del progetto django e configurare le impostazioni del progetto. Ma quando provo a importare la mia app con "from shoppinglist.models import ShoppingList" mi viene visualizzato un errore che non riesce a trovare i modelli. La stessa riga di importazione funziona all'interno della shell manage.py. Qualche idea?
Frank

33

runscriptda django-extensions

python manage.py runscript scripty.py

Un campione script.pyper provarlo:

from django.contrib.auth.models import User
print(User.objects.values())

Citato su: http://django-extensions.readthedocs.io/en/latest/command_extensions.html e documentato su:

python manage.py runscript --help

C'è anche un tutorial .

Testato su Django 1.9.6, estensioni django 1.6.7.


1
Questa è la risposta migliore se stai già utilizzando django-extensions(dovresti). Nota: sembra che runscriptusi il django standard shell. Sarebbe fantastico se usato shell_plus(anche nelle estensioni), quindi non è necessario importare tutto per semplici script.
Grokpot,

12

Se IPython è disponibile ( pip install ipython), ./manage.py shellutilizzerà automaticamente la sua shell e quindi è possibile utilizzare il comando magic %run:

%run my_script.py

Ha funzionato come un fascino!
Roel,

Questo ha il vantaggio runscriptche funziona con script esterni al progetto / pacchetto e non si lamenta in questo modoTypeError: the 'package' argument is required to perform a relative import for
smido,

8

Puoi semplicemente eseguire lo script con la DJANGO_SETTINGS_MODULEvariabile d'ambiente impostata. Questo è tutto ciò che serve per configurare l'ambiente Django-shell.

Funziona in Django> = 1.4


7

@AtulVarma ha fornito un commento molto utile sotto la risposta accettata non funzionante :

echo 'import myscript' | python manage.py shell

Bella risposta! L'ho perso nei commenti. Grazie per averlo messo qui
Anupam,


4

Come indicano altre risposte, ma non dichiarano esplicitamente, ciò di cui potresti aver effettivamente bisogno non è necessariamente eseguire lo script dalla shell Django, ma accedere alle tue app senza utilizzare la shell Django .

Ciò differisce molto dalla versione Django alla versione Django. Se non trovi la soluzione su questo thread, le risposte qui - script Django per accedere agli oggetti del modello senza usare la shell manage.py - o ricerche simili possono aiutarti.

Ho dovuto iniziare my_command.py con

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

e poi corse python3 my_command.py

(Django 2.0.2)


Questo funziona ancora per Django 3.0. Ho sostituito sys.path.append('/path/to/myproject')con BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))e `sys.path.append (BASE_DIR)`. Inoltre, non dimenticare di attivare il tuo ambiente virtuale prima di eseguire il comando!
sig.

3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()

1
Potresti modificare in una spiegazione del perché questo codice risponde alla domanda in un modo diverso da alcune delle risposte precedenti molto simili? Le risposte solo al codice sono scoraggiate , perché non insegnano la soluzione.
Nathan Tuggy,

2

Nota, questo metodo è stato deprecato per le versioni più recenti di django! (> 1.3)

Una risposta alternativa, potresti aggiungerla all'inizio my_script.py

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

ed esegui my_script.pysolo con Python nella directory in cui hai settings.pyma questo è un po 'confuso.

$ python my_script.py

1

Se vuoi imbatterti in BG ancora meglio:

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

L'output sarà in nohup.out



0

Prova questo se stai usando un ambiente virtuale: -

shell python manage.py

per usare questi comandi devi essere all'interno dell'ambiente virtuale. per questo uso: -

workon vir_env_name

per esempio :-

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

Nota : - Qui mysite è il nome del mio sito Web e jango è il mio nome di ambiente virtuale


0

è venuto qui con la stessa domanda dell'OP, e ho trovato la mia risposta preferita proprio nell'errore all'interno della domanda, che funziona anche in Python 3:

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

0

Altrimenti esegui questo:

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

Questo funziona su Python2.7 e Django1.9


0

Se si desidera eseguire lo script di avvio (ad esempio importare alcuni modelli di django per interagire con essi in modo interattivo) e rimanere nella shell di django:

PYTHONSTARTUP=my_script.py python manage.py shell

0

La shell django è il buon modo per eseguire un modulo Python con l'ambiente django, ma non è sempre facile e noioso importare moduli ed eseguire le funzioni manualmente, specialmente senza il completamento automatico. Per risolvere questo problema, ho creato un piccolo script di shell "runscript.sh" che consente di sfruttare appieno il completamento automatico e la cronologia dei log della console Linux.

NB: copia runscript.sh nel progetto di root e imposta il diritto di esecuzione (chmod + x)

Ad esempio: Voglio eseguire la funzione Python denominata show (a, b, c) nel modulo do_somethings.py in myapp / do_folder /

Il modo standard di Django (conchiglia shell.py):

python3 manage.py shell
 > from myapp.do_folder import do_somethings
 > do_somethings.show("p1", "p2"  , 3.14159)

Con script (runscript.sh):

./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159

Lo script non è limitato nel numero di argomenti. Tuttavia, sono supportati solo argomenti di tipi primitivi (int, float, string)


Ciao, probabilmente runscriptdal django-extensionspacchetto fai lo stesso, controlla django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4

Grazie frost-nzcr4. Sì, in effetti, questa estensione funziona, ma la trovo limitata alla cartella srcipts e solo alla funzione run (). Con my srcipt, puoi eseguire una funzione ovunque in qualsiasi cartella.
Martin13

0

In ritardo alla festa. Ma questo potrebbe essere utile per qualcuno.

Tutto ciò che serve è il tuo script e django-extensionsinstallato.

Basta eseguire il shell_plusdisponibile in django_extensionse importare lo script che hai scritto.

Se lo script è scpt.pyed è all'interno di una cartella, folè possibile eseguire lo script come segue.

python manage.py shell_plus

e importa semplicemente il tuo script all'interno della shell come segue.

>>> from fol import scpt

-1

django.setup () non sembra funzionare.

non sembra nemmeno essere richiesto.

solo questo ha funzionato.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")

1
django.setup () è sicuramente necessario per avviare l'ambiente Django.
colm.anseo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.