I need to execute a Python script from the Django shell. I tried:
./manage.py shell << my_script.py
But it didn't work. It was just waiting for me to write something.
The << part is wrong, use < instead:
$ ./manage.py shell < myscript.py
You could also do:
$ ./manage.py shell
...
>>> execfile('myscript.py')
For python3 you would need to use
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOFecho 'import myscript' | python manage.py shell. I've found this can be useful for quick-and-dirty scripts that you only need to run once, without having to go through the cumbersome process of creating a manage.py command.Get-Content myscript.py | .\manage.py shellYou're not recommended to do that from the shell - and this is intended as you shouldn't really be executing random scripts from the django environment (but there are ways around this, see the other answers).
If this is a script that you will be running multiple times, it's a good idea to set it up as a custom command ie
$ ./manage.py my_command
to do this create a file in a subdir of management and commands of your app, ie
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
and in this file define your custom command (ensuring that the name of the file is the name of the command you want to execute from ./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 is deprecated. This page gives a working example : docs.djangoproject.com/en/1.9/howto/custom-management-commands/…def handle_noargs(self, **options): to def handle(self, **options):.def handle(self, **options): as James's comment.string.lower() and to replace some spaces with dashes. In a plain Python shell it worked perfectly, but not when adding to the database with the exec(...) function. Whereas this Django command worked perfectly.For anyone using Django 1.7+, it seems that simply import the settings module is not enough.
After some digging, I found this Stack Overflow answer: https://stackoverflow.com/a/23241093
You now need to:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Without doing the above, I was getting a django.core.exceptions.AppRegistryNoReady error.
My script file is in the same directory as my django project (ie. in the same folder as manage.py)
DJANGO_SETTINGS_MODULE environment variable. With that it was enough to just: import django ; django.setup() under 1.7.django.setup() will not let the script access Django models, not even import them!import sys and sys.path.insert(0, ".") and sys.path.insert(0, "../lib") or similar to be able to access libraries at different locations outside the start directory. The settings module name is just the directory names on the path to settings.py separated by . instead of /.I'm late for the party but I hope that my response will help someone: You can do this in your Python script:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
the rest of your stuff goes here ....
sys.path.append stuff as long as you get DJANGO_SETTINGS_MODULES right (e.g. if you have a script sitting just above your site root you can do os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').sys.path.append(os.getcwd()), it works when I am inside my project directory, my DJANGO_SETTINGS_MODULE is correct and I try to run a script that import models, views, etc.runscript from django-extensions
python manage.py runscript scripty.py
A sample script.py to test it out:
from django.contrib.auth.models import User
print(User.objects.values())
Mentioned at: http://django-extensions.readthedocs.io/en/latest/command_extensions.html and documented at:
python manage.py runscript --help
Tested on Django 1.9.6, django-extensions 1.6.7.
django-extensions (you should). Note: It looks like runscript uses the standard django shell. It would be fantastic if it used shell_plus (also in extensions) so you didn't have to import everything for simple scripts.If IPython is available (pip install ipython) then ./manage.py shell will automatically use it's shell and then you can use the magic command %run:
%run my_script.py
runscript that it works with scripts outside the project/package and does not complain like this TypeError: the 'package' argument is required to perform a relative import forIf you don't have many commands in your script, use -c/--command:
manage.py shell --command "import django; print(django.__version__)"
python manage.py shell --command="`cat script_name.py`"@AtulVarma provided a very useful comment under the not-working accepted answer:
echo 'import myscript' | python manage.py shell
cat ./my_script.py | python manage.py shellI'm late for the party but I hope that my response will help someone: You can do this in your Python script:
step1: Import
import mysite.asgi
step2: Need to execute a Python script simply typing:
python test.py
Where test.py file like look this:
import mysite.asgi
from polls.models import GMD_TABLE
print ( [obj.gt_GMD_name for obj in GMD_TABLE.objects.all()] )
FINALY: The result will be:
['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']
Where ['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE'] is the values of GMD_TABLE
As other answers indicate but don't explicitly state, what you may actually need is not necessarily to execute your script from the Django shell, but to access your apps without using the Django shell.
This differs a lot Django version to Django version. If you do not find your solution on this thread, answers here -- Django script to access model objects without using manage.py shell -- or similar searches may help you.
I had to begin my_command.py with
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
and then ran python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject') with BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) and ` sys.path.append(BASE_DIR)`. Also don't forget to activate your virtual env before executing the command!import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Note, this method has been deprecated for more recent versions of django! (> 1.3)
An alternative answer, you could add this to the top of my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
and execute my_script.py just with python in the directory where you have settings.py but this is a bit hacky.
$ python my_script.py
Add these lines to your python script.py
import os
import sys
import django
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.append(str(BASE_DIR))
os.environ.setdefault("DJANGO_SETTINGS_MODULE","django_server_app.settings")
django.setup()
# add your code here
then go to the project directory and run python script.py
Something I just found to be interesting is Django Scripts, which allows you to write scripts to be run with python manage.py runscript foobar. More detailed information on implementation and scructure can be found here, http://django-extensions.readthedocs.org/en/latest/index.html
django.setup() does not seem to work.
does not seem to be required either.
this alone worked.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
Try this if you are using virtual enviroment :-
python manage.py shell
for using those command you must be inside virtual enviroment. for this use :-
workon vir_env_name
for example :-
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 :- Here mysite is my website name and jango is my virtual enviroment name
The django shell is the good way to execute a python module with the django environment, but it is not always easy and tiresome to import modules and execute functions manually especially without auto-completion. To resolve this, I created a small shell script "runscript.sh" that allows you to take full advantage of the auto-completion and the log history of the Linux console.
NB: Copy runscript.sh to the root project and set the execute right (chmod +x)
For example: I want to run python function named show(a, b, c) in module do_somethings.py in myapp/do_folder/
The standard django way (manage.py shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
With script (runscript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
The script is not limited in number of arguments. However only arguments of primitive types are supported (int, float, string)
runscript from django-extensions package do the same, check it django-extensions.readthedocs.io/en/latest/runscript.htmlLate to the party. But this might be helpful for someone.
All you need is your script and django-extensions installed.
Just run the shell_plus available in django_extensions and import the script that you've written.
If your script is scpt.py and it's inside a folder fol you can run the script as follows.
python manage.py shell_plus
and just import your script inside the shell as follows.
>>> from fol import scpt
djangoworks, what are you actually wanting to do?my_script.pycontains a few operations on one of my Django models. I already did this before but I can't remember how exactly.