mirror of
https://github.com/django/django.git
synced 2025-11-04 13:39:16 +00:00
Specify python interpreter interface ipython or bpython with the -i, --interface options argument. ex// python manage.py shell -i bpython ex// python manage.py shell --interface bpython Like all other options, defaults to default python interpreter when your selected choice isn't available. updated documentation where appropriate
93 lines
3.5 KiB
Python
93 lines
3.5 KiB
Python
import os
|
|
from django.core.management.base import NoArgsCommand
|
|
from optparse import make_option
|
|
|
|
|
|
class Command(NoArgsCommand):
|
|
shells = ['ipython', 'bpython']
|
|
|
|
option_list = NoArgsCommand.option_list + (
|
|
make_option('--plain', action='store_true', dest='plain',
|
|
help='Tells Django to use plain Python, not IPython or bpython.'),
|
|
make_option('-i', '--interface', action='store', type='choice', choices=shells,
|
|
dest='interface',
|
|
help='Specify an interactive interpreter interface. Available options: "ipython" and "bpython"'),
|
|
|
|
)
|
|
help = "Runs a Python interactive interpreter. Tries to use IPython or bpython, if one of them is available."
|
|
requires_model_validation = False
|
|
|
|
def ipython(self):
|
|
try:
|
|
from IPython import embed
|
|
embed()
|
|
except ImportError:
|
|
# IPython < 0.11
|
|
# Explicitly pass an empty list as arguments, because otherwise
|
|
# IPython would use sys.argv from this script.
|
|
try:
|
|
from IPython.Shell import IPShell
|
|
shell = IPShell(argv=[])
|
|
shell.mainloop()
|
|
except ImportError:
|
|
# IPython not found at all, raise ImportError
|
|
raise
|
|
|
|
def bpython(self):
|
|
import bpython
|
|
bpython.embed()
|
|
|
|
def run_shell(self, shell=None):
|
|
available_shells = [shell] if shell else self.shells
|
|
|
|
for shell in available_shells:
|
|
try:
|
|
return getattr(self, shell)()
|
|
except ImportError:
|
|
pass
|
|
raise ImportError
|
|
|
|
def handle_noargs(self, **options):
|
|
# XXX: (Temporary) workaround for ticket #1796: force early loading of all
|
|
# models from installed apps.
|
|
from django.db.models.loading import get_models
|
|
get_models()
|
|
|
|
use_plain = options.get('plain', False)
|
|
interface = options.get('interface', None)
|
|
|
|
try:
|
|
if use_plain:
|
|
# Don't bother loading IPython, because the user wants plain Python.
|
|
raise ImportError
|
|
|
|
self.run_shell(shell=interface)
|
|
except ImportError:
|
|
import code
|
|
# Set up a dictionary to serve as the environment for the shell, so
|
|
# that tab completion works on objects that are imported at runtime.
|
|
# See ticket 5082.
|
|
imported_objects = {}
|
|
try: # Try activating rlcompleter, because it's handy.
|
|
import readline
|
|
except ImportError:
|
|
pass
|
|
else:
|
|
# We don't have to wrap the following import in a 'try', because
|
|
# we already know 'readline' was imported successfully.
|
|
import rlcompleter
|
|
readline.set_completer(rlcompleter.Completer(imported_objects).complete)
|
|
readline.parse_and_bind("tab:complete")
|
|
|
|
# We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
|
|
# conventions and get $PYTHONSTARTUP first then import user.
|
|
if not use_plain:
|
|
pythonrc = os.environ.get("PYTHONSTARTUP")
|
|
if pythonrc and os.path.isfile(pythonrc):
|
|
try:
|
|
execfile(pythonrc)
|
|
except NameError:
|
|
pass
|
|
# This will import .pythonrc.py as a side-effect
|
|
import user
|
|
code.interact(local=imported_objects)
|