|
|
#!/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
|
|
|
)
|
|
|
print self.shell
|
|
|
|
|
|
def start_app(self):
|
|
|
self.shell.mainloop()
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
app = IPythonApp()
|
|
|
app.start()
|