Necesito ejecutar un script Python desde el shell Django. Lo intenté:
./manage.py shell << my_script.py
Pero no funcionó. Solo estaba esperando que yo escribiera algo.
Necesito ejecutar un script Python desde el shell Django. Lo intenté:
./manage.py shell << my_script.py
Pero no funcionó. Solo estaba esperando que yo escribiera algo.
Respuestas:
La <<
parte está mal, use <
en su lugar:
$ ./manage.py shell < myscript.py
También puedes hacer:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Para python3 necesitarías usar
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. He descubierto que esto puede ser útil para scripts rápidos y sucios que solo necesita ejecutar una vez, sin tener que pasar por el engorroso proceso de crear un manage.py
comando.
Get-Content myscript.py | .\manage.py shell
Usted no está recomendada de hacer que desde el shell
- y ello se pretende, ya que no realmente debería estar ejecutando scripts de azar desde el entorno Django (pero no son formas de evitar esto, ver 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 sea el nombre del comando desde el que desea ejecutar ./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
está en desuso. Esta página ofrece un ejemplo de trabajo: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
a def handle(self, **options):
.
def handle(self, **options):
como el comentario de James.
Para cualquiera que use Django 1.7+, parece que simplemente importar el módulo de configuración no es suficiente.
Después de investigar un poco, encontré esta respuesta de desbordamiento de pila: https://stackoverflow.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, recibí un django.core.exceptions.AppRegistryNoReady
error.
Mi archivo de script está en el mismo directorio que mi proyecto django (es decir, en la misma carpeta que manage.py)
DJANGO_SETTINGS_MODULE
variable de entorno. Con eso fue suficiente para solo: import django ; django.setup()
menos de 1.7.
django.setup()
no permitirá que el script acceda a los modelos de Django, ¡ni siquiera los importará!
import django; django.setup()
.
Llego tarde a la fiesta, pero espero que mi respuesta ayude a alguien: puede hacer esto en su 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 va aquí ...
sys.path.append
cosas siempre que lo haga DJANGO_SETTINGS_MODULES
correctamente (por ejemplo, si tiene un script sentado justo encima de la raíz de su sitio, puede hacerlo os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
, funciona cuando estoy dentro del directorio de mi proyecto, mi DJANGO_SETTINGS_MODULE es correcto e intento ejecutar un script que importe modelos, vistas, etc.
runscript
de django-extensiones
python manage.py runscript scripty.py
Una muestra 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.
django-extensions
(debería). Nota: Parece que runscript
usa el django estándar shell
. Sería fantástico si se usara shell_plus
(también en extensiones) para que no tuviera que importar todo para scripts simples.
Si IPython está disponible ( pip install ipython
), ./manage.py shell
usará automáticamente su shell y luego podrá usar el comando mágico %run
:
%run my_script.py
runscript
que funciona con scripts fuera del proyecto / paquete y no se queja asíTypeError: the 'package' argument is required to perform a relative import for
Simplemente puede ejecutar el script con el DJANGO_SETTINGS_MODULE
conjunto de variables de entorno. Eso es todo lo que se necesita para configurar el entorno Django-shell.
Esto funciona en Django> = 1.4
@AtulVarma proporcionó un comentario muy útil bajo la respuesta aceptada que no funciona :
echo 'import myscript' | python manage.py shell
si no tiene muchos comandos en su script, úselo:
manage.py shell --command="import django; print(django.__version__)"
Como otras respuestas indican pero no indican explícitamente, lo que realmente puede necesitar no es necesariamente ejecutar su script desde el shell Django, sino acceder a sus aplicaciones sin usar el shell 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, responda aquí ( script de Django para acceder a los objetos del modelo sin utilizar 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 corrió 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__)))
y `sys.path.append (BASE_DIR)`. ¡Además, no olvide activar su entorno virtual antes de ejecutar el comando!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
¡Tenga en cuenta que este método ha quedado en desuso para versiones más recientes de django! (> 1.3)
Una respuesta alternativa, podría agregar esto al principio 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
Algo que acabo de encontrar interesante es Django Scripts, que le permite escribir scripts para ejecutarlos con python manage.py runscript foobar. Puede encontrar información más detallada sobre implementación y escrutinio aquí, http://django-extensions.readthedocs.org/en/latest/index.html
Pruebe esto si está utilizando un entorno virtual: -
Python manage.py shell
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
Otra forma es ejecutar este:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Esto está funcionando en Python2.7 y Django1.9
El shell django es la buena manera de ejecutar un módulo de Python con el entorno django, pero no siempre es fácil y cansado importar módulos y ejecutar funciones manualmente, especialmente sin autocompletar. Para resolver esto, creé un pequeño script de shell "runscript.sh" que le permite aprovechar al máximo la finalización automática y el historial de registro de la consola de Linux.
NB: Copie runscript.sh al proyecto raíz y configure la ejecución correcta (chmod + x)
Por ejemplo: quiero ejecutar la función de Python llamada show (a, b, c) en el módulo do_somethings.py en myapp / do_folder /
La forma estándar de django (manage.py shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
Con script (runcript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
El guión no está limitado en número de argumentos. Sin embargo, solo se admiten argumentos de tipos primitivos (int, float, string)
runscript
desde el django-extensions
paquete haga lo mismo, compruébelo django-extensions.readthedocs.io/en/latest/runscript.html
Tarde a la fiesta. Pero esto podría ser útil para alguien.
Todo lo que necesitas es tu script e django-extensions
instalado.
Simplemente ejecute el shell_plus
disponible django_extensions
e importe el script que ha escrito.
Si su script está scpt.py
y está dentro de una carpeta fol
, puede ejecutar el script de la siguiente manera.
python manage.py shell_plus
e importa tu script dentro del shell de la siguiente manera.
>>> from fol import scpt
django.setup () no parece funcionar.
tampoco parece ser necesario.
esto solo funcionó.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
funciona, ¿qué es lo que realmente quieres hacer?