run - ¿Cómo ejecutar un script de Python desde el shell de Django?
ejecutar.py desde consola python (14)
Necesito ejecutar un script de Python desde el shell de Django. Lo intenté:
./manage.py shell << my_script.py
Pero no funcionó. Solo estaba esperando que escribiera algo.
@AtulVarma proporcionó un comentario muy útil en la respuesta aceptada que no funciona:
echo ''import myscript'' | python manage.py shell
Algo que me pareció interesante es Django Scripts, que te permite escribir scripts para ejecutar con python manage.py runscript foobar. Se puede encontrar información más detallada sobre implementación y estructura aquí, http://django-extensions.readthedocs.org/en/latest/index.html
Como otras respuestas indican, pero no indican explícitamente, lo que realmente puede necesitar no es necesariamente ejecutar su script desde el shell de Django, sino acceder a sus aplicaciones sin usar el shell de Django .
Esto difiere mucho de la versión de Django a la versión de Django. Si no encuentra su solución en este hilo, responde aquí - Script Django para acceder a objetos modelo sin usar el shell manage.py - o búsquedas similares pueden ayudarlo.
Tenía que comenzar 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
y luego ejecuté python3 my_command.py
(Django 2.0.2)
La parte <<
es incorrecta, use <
lugar:
$ ./manage.py shell < myscript.py
También podrías hacer:
$ ./manage.py shell
...
>>> execfile(''myscript.py'')
Para python3 necesitarías usar
>>> exec(open(''myscript.py'').read())
Llego tarde a la fiesta, pero espero que mi respuesta ayude a alguien: puedes hacer esto en tu script de Python:
import sys, os
sys.path.append(''/path/to/your/django/app'')
os.environ[''DJANGO_SETTINGS_MODULE''] = ''settings''
from django.conf import settings
el resto de tus cosas van aquí ...
No se recomienda hacer eso desde el shell
, y esto es así porque no debería estar ejecutando scripts al azar desde el entorno de django (pero hay formas de evitar esto, vea las otras respuestas).
Si se trata de un script que ejecutará varias veces, es una buena idea configurarlo como un comando personalizado, es decir,
$ ./manage.py my_command
para hacer esto, crea un archivo en un subdirectorio de management
y commands
de tu app
, es decir,
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
y en este archivo defina su comando personalizado (asegurándose de que el nombre del archivo es el nombre del comando que desea ejecutar desde ./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
Para cualquiera que use Django 1.7+, parece que simplemente importar el módulo de configuración no es suficiente.
Después de excavar, encontré esta respuesta de : https://.com/a/23241093
Ahora necesita:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Sin hacer lo anterior, django.core.exceptions.AppRegistryNoReady
un error django.core.exceptions.AppRegistryNoReady
.
Mi archivo de script está en el mismo directorio que mi proyecto django (es decir, en la misma carpeta que manage.py)
Pruebe esto si está usando un entorno virtual: -
shell python manage.py
para usar esos comandos debes estar dentro del entorno virtual. para este uso: -
workon vir_env_name
por ejemplo :-
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 : - Aquí mysite es el nombre de mi sitio web y jango es mi nombre de entorno virtual
Puede ejecutar el script con la variable de entorno DJANGO_SETTINGS_MODULE
establecida. Eso es todo lo que se necesita para configurar el entorno Django-shell.
Esto funciona en Django> = 1.4
django.setup () no parece funcionar.
tampoco parece ser requerido.
esto solo funcionó.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
Tenga en cuenta que este método ha quedado obsoleto para las versiones más recientes de django! (> 1.3)
Una respuesta alternativa, puede agregar esto a la parte superior de my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
y ejecuta my_script.py
solo con python en el directorio donde tienes settings.py
pero esto es un poco hacky.
$ python my_script.py
runscript
de django-extensions
python manage.py runscript scripty.py
Un script.py
de script.py
para probarlo:
from django.contrib.auth.models import User
print(User.objects.values())
Mencionado en: http://django-extensions.readthedocs.io/en/latest/command_extensions.html y documentado en:
python manage.py runscript --help
Probado en Django 1.9.6, django-extensions 1.6.7.
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()