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.
python
django
django-shell
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
fuente
django
funciona, ¿qué es lo que realmente quieres hacer?my_script.py
contiene algunas operaciones en uno de mis modelos de Django. Ya hice esto antes pero no recuerdo exactamente cómo.Respuestas:
La
<<
parte está mal, use<
en su lugar:También puedes hacer:
Para python3 necesitarías usar
fuente
./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 unmanage.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
para hacer esto crea un archivo en un subdirectorio de
management
ycommands
de tuapp
, es deciry 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
)fuente
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):
adef 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:
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)
fuente
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:
el resto de tus cosas va aquí ...
fuente
sys.path.append
cosas siempre que lo hagaDJANGO_SETTINGS_MODULES
correctamente (por ejemplo, si tiene un script sentado justo encima de la raíz de su sitio, puede hacerloos.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-extensionesUna muestra
script.py
para probarlo:Mencionado en: http://django-extensions.readthedocs.io/en/latest/command_extensions.html y documentado en:
También hay un tutorial .
Probado en Django 1.9.6, django-extensions 1.6.7.
fuente
django-extensions
(debería). Nota: Parece querunscript
usa el django estándarshell
. Sería fantástico si se usarashell_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
:fuente
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
fuente
@AtulVarma proporcionó un comentario muy útil bajo la respuesta aceptada que no funciona :
fuente
si no tiene muchos comandos en su script, úselo:
Django docs
fuente
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
y luego corrió
python3 my_command.py
(Django 2.0.2)
fuente
sys.path.append('/path/to/myproject')
conBASE_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!fuente
¡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
y ejecuta
my_script.py
solo con python en el directorio donde tienessettings.py
pero esto es un poco hacky.fuente
Si quieres correr en BG aún mejor:
La salida estará en
nohup.out
fuente
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
fuente
Pruebe esto si está utilizando un entorno virtual: -
para usar esos comandos debes estar dentro del entorno virtual. para este uso: -
por ejemplo :-
Nota : - aquí mysite es el nombre de mi sitio web y jango es mi nombre de entorno virtual
fuente
Vine aquí con la misma pregunta que el OP, y encontré mi respuesta favorita precisamente en el error dentro de la pregunta, que también funciona en Python 3:
fuente
Otra forma es ejecutar este:
Esto está funcionando en Python2.7 y Django1.9
fuente
Si desea ejecutar un script de inicio (por ejemplo, importe algunos modelos de django para trabajar con ellos de forma interactiva) y permanezca en el shell de django:
fuente
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):
Con script (runcript.sh):
El guión no está limitado en número de argumentos. Sin embargo, solo se admiten argumentos de tipos primitivos (int, float, string)
fuente
runscript
desde eldjango-extensions
paquete haga lo mismo, compruébelo django-extensions.readthedocs.io/en/latest/runscript.htmlTarde 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
disponibledjango_extensions
e importe el script que ha escrito.Si su script está
scpt.py
y está dentro de una carpetafol
, puede ejecutar el script de la siguiente manera.e importa tu script dentro del shell de la siguiente manera.
fuente
django.setup () no parece funcionar.
tampoco parece ser necesario.
esto solo funcionó.
fuente