##// END OF EJS Templates
Cleaned up embedded shell and added cleanup method to InteractiveShell....
Cleaned up embedded shell and added cleanup method to InteractiveShell. * Added explicit code in InteractiveShell to make sure it cleans itself up. This is now done by the single method .cleanup, that can be called to have InteractiveShell cleanup. We can't use __del__ because of the many cycles in our object graph. * The embedded shell is refactored to no embedding logic is in the base class. Thus, InteractiveShell no longer takes an ``embedded`` argument. Just use InteractiveShellEmbed. * Created a super simple top-level :func:`embed` function that creates an InteractiveShellEmbed and calls it.

File last commit:

r2206:5496710c
r2226:7053ea2c
Show More
ipapp.py
316 lines | 11.2 KiB | text/x-python | PythonLexer
#!/usr/bin/env python
# encoding: utf-8
"""
The main IPython application object
Authors:
* Brian Granger
* Fernando Perez
Notes
-----
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2009 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import os
import sys
import warnings
from IPython.core.application import Application
from IPython.core import release
from IPython.core.iplib import InteractiveShell
from IPython.config.loader import IPythonArgParseConfigLoader, NoDefault
from IPython.utils.ipstruct import Struct
#-----------------------------------------------------------------------------
# Utilities and helpers
#-----------------------------------------------------------------------------
ipython_desc = """
A Python shell with automatic history (input and output), dynamic object
introspection, easier configuration, command completion, access to the system
shell and more.
"""
def threaded_shell_warning():
msg = """
The IPython threaded shells and their associated command line
arguments (pylab/wthread/gthread/qthread/q4thread) have been
deprecated. See the %gui magic for information on the new interface.
"""
warnings.warn(msg, category=DeprecationWarning, stacklevel=1)
#-----------------------------------------------------------------------------
# Main classes and functions
#-----------------------------------------------------------------------------
cl_args = (
(('-autocall',), dict(
type=int, dest='AUTOCALL', default=NoDefault,
help='Set the autocall value (0,1,2).')
),
(('-autoindent',), dict(
action='store_true', dest='AUTOINDENT', default=NoDefault,
help='Turn on autoindenting.')
),
(('-noautoindent',), dict(
action='store_false', dest='AUTOINDENT', default=NoDefault,
help='Turn off autoindenting.')
),
(('-automagic',), dict(
action='store_true', dest='AUTOMAGIC', default=NoDefault,
help='Turn on the auto calling of magic commands.')
),
(('-noautomagic',), dict(
action='store_false', dest='AUTOMAGIC', default=NoDefault,
help='Turn off the auto calling of magic commands.')
),
(('-autoedit_syntax',), dict(
action='store_true', dest='AUTOEDIT_SYNTAX', default=NoDefault,
help='Turn on auto editing of files with syntax errors.')
),
(('-noautoedit_syntax',), dict(
action='store_false', dest='AUTOEDIT_SYNTAX', default=NoDefault,
help='Turn off auto editing of files with syntax errors.')
),
(('-banner',), dict(
action='store_true', dest='DISPLAY_BANNER', default=NoDefault,
help='Display a banner upon starting IPython.')
),
(('-nobanner',), dict(
action='store_false', dest='DISPLAY_BANNER', default=NoDefault,
help="Don't display a banner upon starting IPython.")
),
(('-c',), dict(
type=str, dest='C', default=NoDefault,
help="Execute the given command string.")
),
(('-cache_size',), dict(
type=int, dest='CACHE_SIZE', default=NoDefault,
help="Set the size of the output cache.")
),
(('-classic',), dict(
action='store_true', dest='CLASSIC', default=NoDefault,
help="Gives IPython a similar feel to the classic Python prompt.")
),
(('-colors',), dict(
type=str, dest='COLORS', default=NoDefault,
help="Set the color scheme (NoColor, Linux, and LightBG).")
),
(('-color_info',), dict(
action='store_true', dest='COLOR_INFO', default=NoDefault,
help="Enable using colors for info related things.")
),
(('-nocolor_info',), dict(
action='store_false', dest='COLOR_INFO', default=NoDefault,
help="Disable using colors for info related things.")
),
(('-confirm_exit',), dict(
action='store_true', dest='CONFIRM_EXIT', default=NoDefault,
help="Prompt the user when existing.")
),
(('-noconfirm_exit',), dict(
action='store_false', dest='CONFIRM_EXIT', default=NoDefault,
help="Don't prompt the user when existing.")
),
(('-deep_reload',), dict(
action='store_true', dest='DEEP_RELOAD', default=NoDefault,
help="Enable deep (recursive) reloading by default.")
),
(('-nodeep_reload',), dict(
action='store_false', dest='DEEP_RELOAD', default=NoDefault,
help="Disable deep (recursive) reloading by default.")
),
(('-editor',), dict(
type=str, dest='EDITOR', default=NoDefault,
help="Set the editor used by IPython (default to $EDITOR/vi/notepad).")
),
(('-log','-l'), dict(
action='store_true', dest='LOGSTART', default=NoDefault,
help="Start logging to the default file (./ipython_log.py).")
),
(('-logfile','-lf'), dict(
type=str, dest='LOGFILE', default=NoDefault,
help="Specify the name of your logfile.")
),
(('-logplay','-lp'), dict(
type=str, dest='LOGPLAY', default=NoDefault,
help="Re-play a log file and then append to it.")
),
(('-pdb',), dict(
action='store_true', dest='PDB', default=NoDefault,
help="Enable auto calling the pdb debugger after every exception.")
),
(('-nopdb',), dict(
action='store_false', dest='PDB', default=NoDefault,
help="Disable auto calling the pdb debugger after every exception.")
),
(('-pprint',), dict(
action='store_true', dest='PPRINT', default=NoDefault,
help="Enable auto pretty printing of results.")
),
(('-nopprint',), dict(
action='store_false', dest='PPRINT', default=NoDefault,
help="Disable auto auto pretty printing of results.")
),
(('-prompt_in1','-pi1'), dict(
type=str, dest='PROMPT_IN1', default=NoDefault,
help="Set the main input prompt ('In [\#]: ')")
),
(('-prompt_in2','-pi2'), dict(
type=str, dest='PROMPT_IN2', default=NoDefault,
help="Set the secondary input prompt (' .\D.: ')")
),
(('-prompt_out','-po'), dict(
type=str, dest='PROMPT_OUT', default=NoDefault,
help="Set the output prompt ('Out[\#]:')")
),
(('-quick',), dict(
action='store_true', dest='QUICK', default=NoDefault,
help="Enable quick startup with no config files.")
),
(('-readline',), dict(
action='store_true', dest='READLINE_USE', default=NoDefault,
help="Enable readline for command line usage.")
),
(('-noreadline',), dict(
action='store_false', dest='READLINE_USE', default=NoDefault,
help="Disable readline for command line usage.")
),
(('-screen_length','-sl'), dict(
type=int, dest='SCREEN_LENGTH', default=NoDefault,
help='Number of lines on screen, used to control printing of long strings.')
),
(('-separate_in','-si'), dict(
type=str, dest='SEPARATE_IN', default=NoDefault,
help="Separator before input prompts. Default '\n'.")
),
(('-separate_out','-so'), dict(
type=str, dest='SEPARATE_OUT', default=NoDefault,
help="Separator before output prompts. Default 0 (nothing).")
),
(('-separate_out2','-so2'), dict(
type=str, dest='SEPARATE_OUT2', default=NoDefault,
help="Separator after output prompts. Default 0 (nonight).")
),
(('-nosep',), dict(
action='store_true', dest='NOSEP', default=NoDefault,
help="Eliminate all spacing between prompts.")
),
(('-term_title',), dict(
action='store_true', dest='TERM_TITLE', default=NoDefault,
help="Enable auto setting the terminal title.")
),
(('-noterm_title',), dict(
action='store_false', dest='TERM_TITLE', default=NoDefault,
help="Disable auto setting the terminal title.")
),
(('-xmode',), dict(
type=str, dest='XMODE', default=NoDefault,
help="Exception mode ('Plain','Context','Verbose')")
),
# These are only here to get the proper deprecation warnings
(('-pylab','-wthread','-qthread','-q4thread','-gthread'), dict(
action='store_true', dest='THREADED_SHELL', default=NoDefault,
help="These command line flags are deprecated, see the 'gui' magic.")
),
)
class IPythonAppCLConfigLoader(IPythonArgParseConfigLoader):
arguments = cl_args
class IPythonApp(Application):
name = 'ipython'
config_file_name = 'ipython_config.py'
def create_command_line_config(self):
"""Create and return a command line config loader."""
return IPythonAppCLConfigLoader(
description=ipython_desc,
version=release.version)
def post_load_command_line_config(self):
"""Do actions after loading cl config."""
clc = self.command_line_config
# This needs to be set here, the rest are set in pre_construct.
if hasattr(clc, 'CLASSIC'):
if clc.CLASSIC: clc.QUICK = 1
# Display the deprecation warnings about threaded shells
if hasattr(clc, 'THREADED_SHELL'):
threaded_shell_warning()
del clc['THREADED_SHELL']
def load_file_config(self):
if hasattr(self.command_line_config, 'QUICK'):
if self.command_line_config.QUICK:
self.file_config = Struct()
return
super(IPythonApp, self).load_file_config()
def post_load_file_config(self):
"""Logic goes here."""
def pre_construct(self):
config = self.master_config
if hasattr(config, 'CLASSIC'):
if config.CLASSIC:
config.QUICK = 1
config.CACHE_SIZE = 0
config.PPRINT = 0
config.PROMPT_IN1 = '>>> '
config.PROMPT_IN2 = '... '
config.PROMPT_OUT = ''
config.SEPARATE_IN = config.SEPARATE_OUT = config.SEPARATE_OUT2 = ''
config.COLORS = 'NoColor'
config.XMODE = 'Plain'
# All this should be moved to traitlet handlers in InteractiveShell
# But, currently InteractiveShell doesn't have support for changing
# these values at runtime. Once we support that, this should
# be moved there!!!
if hasattr(config, 'NOSEP'):
if config.NOSEP:
config.SEPARATE_IN = config.SEPARATE_OUT = config.SEPARATE_OUT2 = '0'
def construct(self):
# I am a little hesitant to put these into InteractiveShell itself.
# But that might be the place for them
sys.path.insert(0, '')
# add personal ipythondir to sys.path so that users can put things in
# there for customization
sys.path.append(os.path.abspath(self.ipythondir))
# Create an InteractiveShell instance
self.shell = InteractiveShell(
parent=None,
config=self.master_config
)
def start_app(self):
self.shell.mainloop()
if __name__ == '__main__':
app = IPythonApp()
app.start()