J'ai besoin d'exécuter un script Python à partir du shell Django. J'ai essayé:
./manage.py shell << my_script.py
Mais ça n'a pas marché. Il n'attendait que moi pour écrire quelque chose.
python
django
django-shell
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
la source
django
fonctionne, que voulez-vous réellement faire?my_script.py
contient quelques opérations sur l'un de mes modèles Django. Je l'ai déjà fait auparavant, mais je ne me souviens pas exactement comment.Réponses:
La
<<
pièce est fausse, utilisez<
plutôt:Vous pourriez également faire:
Pour python3, vous devez utiliser
la source
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. J'ai trouvé que cela peut être utile pour les scripts rapides et sales que vous n'avez besoin d'exécuter qu'une seule fois, sans avoir à passer par le processus fastidieux de création d'unemanage.py
commande.Get-Content myscript.py | .\manage.py shell
Il n'est pas recommandé de le faire à partir du
shell
- et cela est prévu car vous ne devriez pas vraiment exécuter des scripts aléatoires à partir de l'environnement django (mais il existe des moyens 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 comme une commande personnalisée, c'est-à-dire
pour ce faire, créez un fichier dans un sous-répertoire de
management
etcommands
de votreapp
, c'est-à-direet dans ce fichier, définissez votre commande personnalisée (en vous assurant que le nom du fichier est le nom de la commande à partir de laquelle vous souhaitez exécuter
./manage.py
)la source
NoArgsCommand
est obsolète. Cette page donne un exemple de travail: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…def handle_noargs(self, **options):
pourdef handle(self, **options):
.def handle(self, **options):
comme le commentaire de James.Pour tous ceux qui utilisent Django 1.7+, il semble que simplement importer le module des paramètres ne suffit pas.
Après quelques recherches, j'ai trouvé cette réponse Stack Overflow: https://stackoverflow.com/a/23241093
Vous devez maintenant:
Sans faire ce qui précède, j'obtenais une
django.core.exceptions.AppRegistryNoReady
erreur.Mon fichier de script se trouve dans le même répertoire que mon projet django (c'est-à-dire dans le même dossier que manage.py)
la source
DJANGO_SETTINGS_MODULE
variable d'environnement. Avec cela, il suffisait de:import django ; django.setup()
moins de 1,7.django.setup()
ne permettra pas au script d'accéder aux modèles Django, pas même de les importer!import django; django.setup()
.Je suis en retard pour la fête mais j'espère que ma réponse aidera quelqu'un: vous pouvez le faire dans votre script Python:
le reste de vos affaires va ici ....
la source
sys.path.append
contenu aussi longtemps que vous le souhaitezDJANGO_SETTINGS_MODULES
(par exemple, si vous avez un script juste au-dessus de la racine de votre site, vous pouvez le faireos.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).sys.path.append(os.getcwd())
, cela fonctionne lorsque je suis dans mon répertoire de projet, mon DJANGO_SETTINGS_MODULE est correct et j'essaie d'exécuter un script qui importe des modèles, des vues, etc.runscript
de django-extensionsUn échantillon
script.py
pour le tester:Mentionné sur: http://django-extensions.readthedocs.io/en/latest/command_extensions.html et documenté sur:
Il y a aussi un tutoriel .
Testé sur Django 1.9.6, django-extensions 1.6.7.
la source
django-extensions
(vous devriez). Remarque: Il semble querunscript
le django standard soit utiliséshell
. Ce serait fantastique s'il était utiliséshell_plus
(également dans les extensions) afin que vous n'ayez pas à tout importer pour des scripts simples.Si IPython est disponible (
pip install ipython
), il./manage.py shell
utilisera automatiquement son shell et vous pourrez alors utiliser la commande magique%run
:la source
runscript
fait qu'il fonctionne avec des scripts en dehors du projet / package et ne se plaint pas comme çaTypeError: the 'package' argument is required to perform a relative import for
Vous pouvez simplement exécuter le script avec l'
DJANGO_SETTINGS_MODULE
ensemble de variables d'environnement. C'est tout ce qu'il faut pour configurer l'environnement Django-shell.Cela fonctionne dans Django> = 1.4
la source
@AtulVarma a fourni un commentaire très utile sous la réponse acceptée non fonctionnelle :
la source
si vous n'avez pas beaucoup de commandes dans votre script, utilisez-le:
Documents Django
la source
Comme d'autres réponses l'indiquent mais ne le disent 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 Django de la version Django. Si vous ne trouvez pas votre solution sur ce fil, les réponses ici - Script Django pour accéder aux objets du modèle sans utiliser le shell manage.py - ou des recherches similaires peuvent vous aider.
Je devais commencer my_command.py par
puis a couru
python3 my_command.py
(Django 2.0.2)
la source
sys.path.append('/path/to/myproject')
parBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
et `sys.path.append (BASE_DIR)`. N'oubliez pas non plus d'activer votre env virtuel avant d'exécuter la commande!la source
Notez que cette méthode est déconseillée pour les versions plus récentes de django! (> 1.3)
Une autre réponse, vous pouvez l'ajouter en haut de
my_script.py
et exécutez
my_script.py
juste avec python dans le répertoire où vous avez,settings.py
mais c'est un peu hacky.la source
Si vous voulez encore mieux utiliser BG:
La sortie sera en
nohup.out
la source
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 sont disponibles ici, http://django-extensions.readthedocs.org/en/latest/index.html
la source
Essayez ceci si vous utilisez un environnement virtuel: -
pour utiliser ces commandes, vous devez être dans un environnement virtuel. pour cette utilisation: -
par exemple :-
Remarque : - Ici, mysite est le nom de mon site Web et jango est le nom de mon environnement virtuel
la source
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 en Python 3:
la source
Sinon, exécutez celui-ci:
Cela fonctionne sur Python2.7 et Django1.9
la source
Si vous souhaitez exécuter un script de démarrage (par exemple, importer certains modèles django pour travailler avec eux de manière interactive) et rester dans le shell django:
la source
Le shell django est le bon moyen d'exécuter un module python avec l'environnement django, mais il n'est pas toujours facile et fastidieux d'importer des modules et d'exécuter des fonctions manuellement, surtout sans auto-complétion. Pour résoudre ce problème, j'ai créé un petit script shell "runscript.sh" qui vous permet de profiter pleinement de l'auto-complétion et de l'historique des journaux de la console Linux.
NB: Copiez runscript.sh dans le projet racine et définissez le droit d'exécution (chmod + x)
Par exemple: je veux exécuter la fonction python nommée show (a, b, c) dans le module do_somethings.py dans myapp / do_folder /
La manière standard de Django (shell manage.py):
Avec script (runscript.sh):
Le script n'est pas limité en nombre d'arguments. Cependant, seuls les arguments de types primitifs sont pris en charge (int, float, string)
la source
runscript
dudjango-extensions
package faire la même chose, vérifiez-le django-extensions.readthedocs.io/en/latest/runscript.htmlTard à la fête. Mais cela pourrait être utile pour quelqu'un.
Tout ce dont vous avez besoin est votre script et
django-extensions
installé.Exécutez simplement le
shell_plus
disponible dansdjango_extensions
et importez le script que vous avez écrit.Si votre script se trouve
scpt.py
et se trouve dans un dossier,fol
vous pouvez exécuter le script comme suit.et importez simplement votre script à l'intérieur du shell comme suit.
la source
django.setup () ne semble pas fonctionner.
ne semble pas non plus nécessaire.
cela seul a fonctionné.
la source