Skip to content

Commit

Permalink
Fixed #6682 -- Made shell's REPL actually execute $PYTHONSTARTUP and …
Browse files Browse the repository at this point in the history
…`~/.pythonrc.py`.

Also:

* Added a ``--no-startup`` option to disable this behavior. Previous
  logic to try to execute the code in charge of this funcionality was
  flawed (it only tried to do so if the user asked for ipython/bpython
  and they weren't found)
* Expand ``~`` in PYTHONSTARTUP value.

Thanks hekevintran at gmail dot com  for the report and initial patch.

Refs #3381.
  • Loading branch information
ramiro committed Jan 25, 2013
1 parent eaa716a commit 1f6b2e7
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 9 deletions.
24 changes: 15 additions & 9 deletions django/core/management/commands/shell.py
Expand Up @@ -9,6 +9,8 @@ class Command(NoArgsCommand):
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('--no-startup', action='store_true', dest='no_startup',
help='When using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.'),
make_option('-i', '--interface', action='store', type='choice', choices=shells,
dest='interface',
help='Specify an interactive interpreter interface. Available options: "ipython" and "bpython"'),
Expand Down Expand Up @@ -56,6 +58,7 @@ def handle_noargs(self, **options):
get_models()

use_plain = options.get('plain', False)
no_startup = options.get('no_startup', False)
interface = options.get('interface', None)

try:
Expand Down Expand Up @@ -83,13 +86,16 @@ def handle_noargs(self, **options):

# We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
# conventions and get $PYTHONSTARTUP first then .pythonrc.py.
if not use_plain:
for pythonrc in (os.environ.get("PYTHONSTARTUP"),
os.path.expanduser('~/.pythonrc.py')):
if pythonrc and os.path.isfile(pythonrc):
try:
with open(pythonrc) as handle:
exec(compile(handle.read(), pythonrc, 'exec'))
except NameError:
pass
if not no_startup:
for pythonrc in (os.environ.get("PYTHONSTARTUP"), '~/.pythonrc.py'):
if not pythonrc:
continue
pythonrc = os.path.expanduser(pythonrc)
if not os.path.isfile(pythonrc):
continue
try:
with open(pythonrc) as handle:
exec(compile(handle.read(), pythonrc, 'exec'), imported_objects)
except NameError:
pass
code.interact(local=imported_objects)
12 changes: 12 additions & 0 deletions docs/ref/django-admin.txt
Expand Up @@ -779,6 +779,18 @@ bpython::
.. _IPython: http://ipython.scipy.org/
.. _bpython: http://bpython-interpreter.org/

When the "plain" Python interactive interpreter starts (be it because
``--plain`` was specified or because no other interactive interface is
available) it reads the script pointed to by the :envvar:`PYTHONSTARTUP`
environment variable and the ``~/.pythonrc.py`` script. If you don't wish this
behavior you can use the ``--no-startup`` option. e.g.::

django-admin.py shell --plain --no-startup

.. versionadded:: 1.6

The ``--no-startup`` option was added in Django 1.6.

sql <appname appname ...>
-------------------------

Expand Down

0 comments on commit 1f6b2e7

Please sign in to comment.