Ticket #11542: shell.2.py

File shell.2.py, 3.1 KB (added by Seamus, 15 years ago)

Added commenting, help text, and a fallback to plain if it's an older version of bpython without embed()

Line 
1import os
2from django.core.management.base import NoArgsCommand
3from optparse import make_option
4
5class Command(NoArgsCommand):
6 option_list = NoArgsCommand.option_list + (
7 make_option('--plain', action='store_true', dest='plain',
8 help='Tells Django to use plain Python, not IPython.'),
9 make_option('--bpython', action='store_true', dest='bpython',
10 help='Tells Django to use bpython, not IPython.'),
11 )
12 help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available. If IPython is not available, tries to use bpython. "
13
14 requires_model_validation = False
15
16 def handle_noargs(self, **options):
17 # XXX: (Temporary) workaround for ticket #1796: force early loading of all
18 # models from installed apps.
19 from django.db.models.loading import get_models
20 loaded_models = get_models()
21
22 use_plain = options.get('plain', False)
23 use_bpython = options.get('bpython',False)
24 try:
25 if use_plain or use_bpython:
26 if use_bpython:
27 use_plain = None
28 raise ImportError
29 import IPython
30 shell = IPython.Shell.IPShell(argv=[])
31 shell.mainloop()
32 except ImportError:
33 try:
34 if use_plain:
35 raise ImportError
36 import bpython
37 try:
38 bpython.embed()
39 except AttributeError:
40 if use_bpython:
41 raise AttributeError("Your version of bpython does not support embedding. Please upgrade to the latest version.")
42 else:
43 raise ImportError
44 except ImportError:
45 import code
46 # Set up a dictionary to serve as the environment for the shell, so
47 # that tab completion works on objects that are imported at runtime.
48 # See ticket 5082.
49 imported_objects = {}
50 try: # Try activating rlcompleter, because it's handy.
51 import readline
52 except ImportError:
53 pass
54 else:
55 # We don't have to wrap the following import in a 'try', because
56 # we already know 'readline' was imported successfully.
57 import rlcompleter
58 readline.set_completer(rlcompleter.Completer(imported_objects).complete)
59 readline.parse_and_bind("tab:complete")
60
61 # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
62 # conventions and get $PYTHONSTARTUP first then import user.
63 if not use_plain:
64 pythonrc = os.environ.get("PYTHONSTARTUP")
65 if pythonrc and os.path.isfile(pythonrc):
66 try:
67 execfile(pythonrc)
68 except NameError:
69 pass
70 # This will import .pythonrc.py as a side-effect
71 import user
72 code.interact(local=imported_objects)
73
Back to Top