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.
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.
Risposte:
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())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
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.py
comando.
Get-Content myscript.py | .\manage.py shell
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 management
e commands
del 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
NoArgsCommand
è deprecato. Questa pagina fornisce un esempio funzionante: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
a def handle(self, **options):
.
def handle(self, **options):
come commento di James.
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.AppRegistryNoReady
errore.
Il mio file di script si trova nella stessa directory del mio progetto django (cioè nella stessa cartella di manage.py)
DJANGO_SETTINGS_MODULE
variabile d'ambiente. Con ciò è bastato solo: import django ; django.setup()
meno di 1.7.
django.setup()
mancata esecuzione non consentirà allo script di accedere ai modelli Django, nemmeno di importarli!
import django; django.setup()
.
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 ....
sys.path.append
materiale finché si ottiene DJANGO_SETTINGS_MODULES
correttamente (ad esempio se si dispone di uno script appena sopra la radice del sito, è possibile farlo os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
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.
runscript
da django-extensions
python manage.py runscript scripty.py
Un campione script.py
per 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
Testato su Django 1.9.6, estensioni django 1.6.7.
django-extensions
(dovresti). Nota: sembra che runscript
usi il django standard shell
. Sarebbe fantastico se usato shell_plus
(anche nelle estensioni), quindi non è necessario importare tutto per semplici script.
Se IPython è disponibile ( pip install ipython
), ./manage.py shell
utilizzerà automaticamente la sua shell e quindi è possibile utilizzare il comando magic %run
:
%run my_script.py
runscript
che 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
Puoi semplicemente eseguire lo script con la DJANGO_SETTINGS_MODULE
variabile d'ambiente impostata. Questo è tutto ciò che serve per configurare l'ambiente Django-shell.
Funziona in Django> = 1.4
@AtulVarma ha fornito un commento molto utile sotto la risposta accettata non funzionante :
echo 'import myscript' | python manage.py shell
se non hai molti comandi nel tuo script usalo:
manage.py shell --command="import django; print(django.__version__)"
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)
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!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
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.py
solo con Python nella directory in cui hai settings.py
ma questo è un po 'confuso.
$ python my_script.py
Qualcosa che ho appena trovato interessante è Django Scripts, che ti permette di scrivere script da eseguire con python manage.py runscript foobar. Informazioni più dettagliate sull'implementazione e sulla struttura sono disponibili qui, http://django-extensions.readthedocs.org/en/latest/index.html
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
Altrimenti esegui questo:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Questo funziona su Python2.7 e Django1.9
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)
runscript
dal django-extensions
pacchetto fai lo stesso, controlla django-extensions.readthedocs.io/en/latest/runscript.html
In ritardo alla festa. Ma questo potrebbe essere utile per qualcuno.
Tutto ciò che serve è il tuo script e django-extensions
installato.
Basta eseguire il shell_plus
disponibile in django_extensions
e importare lo script che hai scritto.
Se lo script è scpt.py
ed è 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
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")
django
funziona, cosa vuoi davvero fare?