web-dev-qa-db-fra.com

Comment exécuter un script Python à partir du shell Django?

Je dois exécuter un script Python à partir du shell Django. J'ai essayé:

./manage.py Shell << my_script.py

Mais ça n'a pas marché. J'attendais juste que j'écrive quelque chose.

185
user2429940

La partie << est incorrecte, utilisez plutôt <:

$ ./manage.py Shell < myscript.py

Vous pouvez aussi faire:

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

Pour python3, vous devez utiliser

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

Il n'est pas recommandé de faire cela à partir de la Shell - et ceci est destiné à ne pas exécuter de scripts aléatoires à partir de l'environnement Django (mais il y a sont façons de contourner cela, voir les autres réponses). 

S'il s'agit d'un script que vous exécuterez plusieurs fois, c'est une bonne idée de le configurer en tant que commande custom ie

 $ ./manage.py my_command

pour ce faire, créez un fichier dans un sous-répertoire de management et commands de votre app, c'est-à-dire

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

et dans ce fichier, définissez votre commande personnalisée (assurez-vous que le nom du fichier est celui de la commande à partir de ./manage.py)

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

Pour ceux qui utilisent Django 1.7+, il semble que simplement importer le module de configuration ne suffit pas. 

Après quelques recherches, j'ai trouvé cette réponse Stack Overflow: https://stackoverflow.com/a/23241093

Vous devez maintenant:

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

Sans faire ce qui précède, je recevais une erreur Django.core.exceptions.AppRegistryNoReady.

Mon fichier de script est dans le même répertoire que mon projet Django (c'est-à-dire dans le même dossier que manage.py)

83
cgons

Je suis en retard pour la fête mais j'espère que ma réponse aidera quelqu'un:

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

le reste de vos affaires va ici ....

65
e-nouri

runscript à partir de Django-extensions

python manage.py runscript scripty.py

Un exemple script.py pour le tester:

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

Mentionné à: http://Django-extensions.readthedocs.io/en/latest/command_extensions.html et documenté à

python manage.py runscript --help

Il y a aussi un tutoriel .

Testé sur Django 1.9.6, Django-extensions 1.6.7.

Si IPython est disponible (pip install ipython) alors ./manage.py Shell utilisera automatiquement son shell et vous pourrez alors utiliser la commande magique %run :

%run my_script.py
9
gitaarik

Vous pouvez simplement exécuter le script avec la variable d'environnement Django_SETTINGS_MODULE définie. C'est tout ce qu'il faut pour configurer l'environnement Django-Shell.

Cela fonctionne dans Django> = 1.4

7
ziima

@AtulVarma a fourni un commentaire très utile sous le non-fonctionnement réponse acceptée :

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

Comme d'autres réponses l'indiquent mais ne l'indiquent pas explicitement, ce dont vous pourriez avoir besoin n'est pas nécessairement d'exécuter votre script à partir du shell Django, mais d'accéder à vos applications sans utiliser le shell Django.

Cela diffère beaucoup de la version de Django à la version de Django. Si vous ne trouvez pas la solution à ce sujet, répondez ici -- Le script Django permettant d’accéder aux objets du modèle sans utiliser manage.py Shell -- ou des recherches similaires peut vous aider.

Je devais commencer ma_command.py avec

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

puis a couru 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

Notez que cette méthode est obsolète pour les versions plus récentes de Django! (> 1.3)

Une réponse alternative, vous pourriez l'ajouter en haut de my_script.py

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

et exécutez my_script.py juste avec python dans le répertoire où vous avez settings.py mais c’est un peu hacky.

$ python my_script.py
2
danodonovan

Essayez ceci si vous utilisez un environnement virtuel: -

shell python manage.py

pour utiliser ces commandes, vous devez être dans un environnement virtuel. pour cet usage: -

workon vir_env_name

par exemple :-

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

Note : - Ici, mon nom est mon nom de site Web et jango est mon nom d'environnement virtuel 

1
Rahul Satal

si vous n'avez pas beaucoup de commandes dans votre script, utilisez-le:

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

Django docs

1
MrNinjamannn

Sinon, exécutez celui-ci:

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

Cela fonctionne sur Python2.7 et Django1.9

Quelque chose que je viens de trouver intéressant est Django Scripts, qui vous permet d'écrire des scripts à exécuter avec python manage.py runscript foobar. Des informations plus détaillées sur la mise en œuvre et la structure peuvent être trouvées ici, http://Django-extensions.readthedocs.org/en/latest/index.html

0
tseboho

est venu ici avec la même question que l'OP, et j'ai trouvé ma réponse préférée précisément dans l'erreur dans la question, qui fonctionne également dans Python 3:

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

Si vous voulez faire encore mieux en BG:

Nohup echo 'exec(open("my_script.py").read())' | python manage.py Shell &

La sortie sera en Nohup.out

0
Kevin He