##// END OF EJS Templates
Update %guiref with a note about Ctrl-R style history searching.
Update %guiref with a note about Ctrl-R style history searching.

File last commit:

r4462:da4180d9
r4482:b63d2de7
Show More
ipapp.py
383 lines | 13.6 KiB | text/x-python | PythonLexer
Brian Granger
Massive, crazy refactoring of everything....
r2202 #!/usr/bin/env python
# encoding: utf-8
"""
MinRK
rename core.newapplication -> core.application
r4023 The :class:`~IPython.core.application.Application` object for the command
Brian Granger
ipcontroller/ipengine use the new clusterdir.py module.
r2301 line :command:`ipython` program.
Brian Granger
Massive, crazy refactoring of everything....
r2202
Fernando Perez
Unify command-line usage information in one place....
r2427 Authors
-------
Brian Granger
Massive, crazy refactoring of everything....
r2202
* Brian Granger
* Fernando Perez
MinRK
Terminal IPython working with newapp
r3963 * Min Ragan-Kelley
Brian Granger
Massive, crazy refactoring of everything....
r2202 """
#-----------------------------------------------------------------------------
Fernando Perez
Unify command-line usage information in one place....
r2427 # Copyright (C) 2008-2010 The IPython Development Team
Brian Granger
Massive, crazy refactoring of everything....
r2202 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Brian Granger
More work on the crash handler....
r2506
Fernando Perez
Unify command-line usage information in one place....
r2427 from __future__ import absolute_import
Brian Granger
Massive, crazy refactoring of everything....
r2202
Brian Granger
Work on startup related things....
r2252 import logging
Brian Granger
More work on getting rid of ipmaker.
r2203 import os
import sys
MinRK
Terminal IPython working with newapp
r3963 from IPython.config.loader import (
Config, PyFileConfigLoader
)
from IPython.config.application import boolean_flag
Brian Granger
More work on the crash handler....
r2506 from IPython.core import release
MinRK
Terminal IPython working with newapp
r3963 from IPython.core import usage
Brian Granger
More work on the crash handler....
r2506 from IPython.core.crashhandler import CrashHandler
MinRK
Terminal IPython working with newapp
r3963 from IPython.core.formatters import PlainTextFormatter
MinRK
rename core.newapplication -> core.application
r4023 from IPython.core.application import (
MinRK
Terminal IPython working with newapp
r3963 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
Brian Granger
Massive refactoring of of the core....
r2245 )
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 from IPython.core.shellapp import (
InteractiveShellApp, shell_flags, shell_aliases
)
MinRK
Terminal IPython working with newapp
r3963 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
Brian Granger
Reenabled -wthread/-q4thread/-gthread and added warning for -pylab....
r2264 from IPython.lib import inputhook
MinRK
support `-pylab` flag with deprecation warning...
r4104 from IPython.utils import warn
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 from IPython.utils.path import get_ipython_dir, check_for_old_config
MinRK
Terminal IPython working with newapp
r3963 from IPython.utils.traitlets import (
MinRK
move InteractiveShellApp before TerminalIPythonApp in TerminalApp class list...
r4462 Bool, List, Dict, CaselessStrEnum
MinRK
Terminal IPython working with newapp
r3963 )
Brian Granger
More work on getting rid of ipmaker.
r2203
#-----------------------------------------------------------------------------
Fernando Perez
Unify command-line usage information in one place....
r2427 # Globals, utilities and helpers
Brian Granger
More work on getting rid of ipmaker.
r2203 #-----------------------------------------------------------------------------
Brian Granger
Refactored the command line config system and other aspects of config....
r2501 #: The default config file name for this application.
Fernando Perez
Unify command-line usage information in one place....
r2427 default_config_file_name = u'ipython_config.py'
Brian Granger
More work on getting rid of ipmaker.
r2203
Brian Granger
More work on adding examples to help strings.
r4216 _examples = """
ipython --pylab # start in pylab mode
ipython --pylab=qt # start in pylab mode with the qt4 backend
Brian E. Granger
Fixing command line options and help strings to use new syntax....
r4219 ipython --log-level=DEBUG # set logging to DEBUG
Brian Granger
More work on adding examples to help strings.
r4216 ipython --profile=foo # start with profile foo
Brian E. Granger
Finishing up help string work.
r4218
Brian Granger
More work on adding examples to help strings.
r4216 ipython qtconsole # start the qtconsole GUI application
ipython qtconsole -h # show the help string for the qtconsole subcmd
Brian E. Granger
Finishing up help string work.
r4218
ipython profile create foo # create profile foo w/ default config files
ipython profile -h # show the help string for the profile subcmd
Brian Granger
More work on adding examples to help strings.
r4216 """
Brian Granger
Refactored the command line config system and other aspects of config....
r2501
Fernando Perez
Unify command-line usage information in one place....
r2427 #-----------------------------------------------------------------------------
Brian Granger
More work on the crash handler....
r2506 # Crash handler for this application
#-----------------------------------------------------------------------------
class IPAppCrashHandler(CrashHandler):
"""sys.excepthook for IPython itself, leaves a detailed report on disk."""
def __init__(self, app):
contact_name = release.authors['Fernando'][0]
contact_email = release.authors['Fernando'][1]
Fernando Perez
Fix bug tracker address to point to github
r3201 bug_tracker = 'http://github.com/ipython/ipython/issues'
Brian Granger
More work on the crash handler....
r2506 super(IPAppCrashHandler,self).__init__(
app, contact_name, contact_email, bug_tracker
)
def make_report(self,traceback):
"""Return a string containing a crash report."""
sec_sep = self.section_sep
# Start with parent report
report = [super(IPAppCrashHandler, self).make_report(traceback)]
# Add interactive-specific info we may have
rpt_add = report.append
try:
rpt_add(sec_sep+"History of session input:")
for line in self.app.shell.user_ns['_ih']:
rpt_add(line)
rpt_add('\n*** Last line of input (may not be in above history):\n')
rpt_add(self.app.shell._last_input_line+'\n')
except:
pass
return ''.join(report)
MinRK
Terminal IPython working with newapp
r3963 #-----------------------------------------------------------------------------
# Aliases and Flags
#-----------------------------------------------------------------------------
flags = dict(base_flags)
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 flags.update(shell_flags)
MinRK
Terminal IPython working with newapp
r3963 addflag = lambda *args: flags.update(boolean_flag(*args))
addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
'Turn on auto editing of files with syntax errors.',
'Turn off auto editing of files with syntax errors.'
)
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 addflag('banner', 'TerminalIPythonApp.display_banner',
MinRK
Terminal IPython working with newapp
r3963 "Display a banner upon starting IPython.",
"Don't display a banner upon starting IPython."
)
addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
"""Set to confirm when you try to exit IPython with an EOF (Control-D
MinRK
minor helpstring cleanup per review.
r3967 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
you can force a direct exit without any confirmation.""",
MinRK
Terminal IPython working with newapp
r3963 "Don't prompt the user when exiting."
)
addflag('term-title', 'TerminalInteractiveShell.term_title',
"Enable auto setting the terminal title.",
"Disable auto setting the terminal title."
)
classic_config = Config()
classic_config.InteractiveShell.cache_size = 0
classic_config.PlainTextFormatter.pprint = False
classic_config.InteractiveShell.prompt_in1 = '>>> '
classic_config.InteractiveShell.prompt_in2 = '... '
classic_config.InteractiveShell.prompt_out = ''
classic_config.InteractiveShell.separate_in = ''
classic_config.InteractiveShell.separate_out = ''
classic_config.InteractiveShell.separate_out2 = ''
classic_config.InteractiveShell.colors = 'NoColor'
classic_config.InteractiveShell.xmode = 'Plain'
flags['classic']=(
classic_config,
"Gives IPython a similar feel to the classic Python prompt."
)
# # log doesn't make so much sense this way anymore
# paa('--log','-l',
# action='store_true', dest='InteractiveShell.logstart',
# help="Start logging to the default log file (./ipython_log.py).")
#
# # quick is harder to implement
flags['quick']=(
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 {'TerminalIPythonApp' : {'quick' : True}},
MinRK
Terminal IPython working with newapp
r3963 "Enable quick startup with no config files."
)
flags['i'] = (
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 {'TerminalIPythonApp' : {'force_interact' : True}},
Fernando Perez
Cleanup -pylab handling with faster logic.
r4245 """If running code from the command line, become interactive afterwards.
Note: can also be given simply as '-i.'"""
MinRK
Terminal IPython working with newapp
r3963 )
flags['pylab'] = (
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 {'TerminalIPythonApp' : {'pylab' : 'auto'}},
MinRK
Terminal IPython working with newapp
r3963 """Pre-load matplotlib and numpy for interactive use with
the default matplotlib backend."""
)
aliases = dict(base_aliases)
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 aliases.update(shell_aliases)
MinRK
Terminal IPython working with newapp
r3963
# it's possible we don't want short aliases for *all* of these:
aliases.update(dict(
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 gui='TerminalIPythonApp.gui',
pylab='TerminalIPythonApp.pylab',
MinRK
Terminal IPython working with newapp
r3963 ))
Brian Granger
More work on the crash handler....
r2506
#-----------------------------------------------------------------------------
Fernando Perez
Unify command-line usage information in one place....
r2427 # Main classes and functions
#-----------------------------------------------------------------------------
Brian Granger
Massive refactoring of of the core....
r2245
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
Brian Granger
Beginning to transition all paths, files, dirs over to unicode....
r2328 name = u'ipython'
MinRK
Terminal IPython working with newapp
r3963 description = usage.cl_usage
Brian Granger
Various fixes to ipapp/ipcluster/ipengine/ipcontroller....
r2511 default_config_file_name = default_config_file_name
Brian Granger
More work on the crash handler....
r2506 crash_handler_class = IPAppCrashHandler
Brian Granger
More work on adding examples to help strings.
r4216 examples = _examples
Brian Granger
Command line examples added for non-parallel apps.
r4215
MinRK
Terminal IPython working with newapp
r3963 flags = Dict(flags)
aliases = Dict(aliases)
MinRK
move InteractiveShellApp before TerminalIPythonApp in TerminalApp class list...
r4462 classes = List()
def _classes_default(self):
"""This has to be in a method, for TerminalIPythonApp to be available."""
return [
InteractiveShellApp, # ShellApp comes before TerminalApp, because
self.__class__, # it will also affect subclasses (e.g. QtConsole)
TerminalInteractiveShell,
ProfileDir,
PlainTextFormatter,
]
MinRK
add qtconsole as subapp of terminal ipapp...
r3982 subcommands = Dict(dict(
MinRK
rename ipythonqt to qtconsoleapp...
r4022 qtconsole=('IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp',
"""Launch the IPython Qt Console."""
MinRK
move ipcluster create|list to `ipython profile create|list`...
r4024 ),
profile = ("IPython.core.profileapp.ProfileApp",
"Create and manage IPython profiles.")
MinRK
add qtconsole as subapp of terminal ipapp...
r3982 ))
MinRK
default config files are automatically generated...
r4025 # *do* autocreate requested profile, but don't create the config file.
MinRK
Terminal IPython working with newapp
r3963 auto_create=Bool(True)
# configurables
ignore_old_config=Bool(False, config=True,
help="Suppress warning messages about legacy config files"
)
quick = Bool(False, config=True,
help="""Start IPython quickly by skipping the loading of config files."""
)
def _quick_changed(self, name, old, new):
if new:
self.load_config_file = lambda *a, **kw: None
self.ignore_old_config=True
gui = CaselessStrEnum(('qt','wx','gtk'), config=True,
help="Enable GUI event loop integration ('qt', 'wx', 'gtk')."
)
pylab = CaselessStrEnum(['tk', 'qt', 'wx', 'gtk', 'osx', 'auto'],
config=True,
help="""Pre-load matplotlib and numpy for interactive use,
selecting a particular matplotlib backend and loop integration.
"""
)
display_banner = Bool(True, config=True,
help="Whether to display a banner upon starting IPython."
)
# if there is code of files to run from the cmd line, don't interact
# unless the --i flag (App.force_interact) is true.
force_interact = Bool(False, config=True,
help="""If a command or file is given via the command-line,
e.g. 'ipython foo.py"""
)
def _force_interact_changed(self, name, old, new):
if new:
self.interact = True
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968
MinRK
Terminal IPython working with newapp
r3963 def _file_to_run_changed(self, name, old, new):
if new and not self.force_interact:
self.interact = False
_code_to_run_changed = _file_to_run_changed
# internal, not-configurable
interact=Bool(True)
MinRK
support `-pylab` flag with deprecation warning...
r4104 def parse_command_line(self, argv=None):
"""override to allow old '-pylab' flag with deprecation warning"""
Fernando Perez
Cleanup -pylab handling with faster logic.
r4245
MinRK
support `-pylab` flag with deprecation warning...
r4104 argv = sys.argv[1:] if argv is None else argv
Fernando Perez
Cleanup -pylab handling with faster logic.
r4245
if '-pylab' in argv:
MinRK
support `-pylab` flag with deprecation warning...
r4104 # deprecated `-pylab` given,
# warn and transform into current syntax
Fernando Perez
Cleanup -pylab handling with faster logic.
r4245 argv = argv[:] # copy, don't clobber
idx = argv.index('-pylab')
MinRK
support `-pylab` flag with deprecation warning...
r4104 warn.warn("`-pylab` flag has been deprecated.\n"
MinRK
update '-pylab' deprecation message to new pattern.
r4190 " Use `--pylab` instead, or `--pylab=foo` to specify a backend.")
MinRK
support `-pylab` flag with deprecation warning...
r4104 sub = '--pylab'
if len(argv) > idx+1:
# check for gui arg, as in '-pylab qt'
gui = argv[idx+1]
if gui in ('wx', 'qt', 'qt4', 'gtk', 'auto'):
MinRK
update '-pylab' deprecation message to new pattern.
r4190 sub = '--pylab='+gui
MinRK
support `-pylab` flag with deprecation warning...
r4104 argv.pop(idx+1)
argv[idx] = sub
return super(TerminalIPythonApp, self).parse_command_line(argv)
MinRK
Terminal IPython working with newapp
r3963 def initialize(self, argv=None):
"""Do actions after construct, but before starting the app."""
MinRK
Split generic part of terminal frontend/terminal/ipapp into core/shellapp...
r3968 super(TerminalIPythonApp, self).initialize(argv)
MinRK
add qtconsole as subapp of terminal ipapp...
r3982 if self.subapp is not None:
# don't bother initializing further, starting subapp
return
MinRK
Terminal IPython working with newapp
r3963 if not self.ignore_old_config:
check_for_old_config(self.ipython_dir)
# print self.extra_args
if self.extra_args:
self.file_to_run = self.extra_args[0]
# create the shell
self.init_shell()
# and draw the banner
self.init_banner()
# Now a variety of things that happen after the banner is printed.
self.init_gui_pylab()
self.init_extensions()
self.init_code()
def init_shell(self):
"""initialize the InteractiveShell instance"""
Brian Granger
More work on getting rid of ipmaker.
r2203 # I am a little hesitant to put these into InteractiveShell itself.
# But that might be the place for them
sys.path.insert(0, '')
Brian Granger
Work on startup related things....
r2252
Brian Granger
First draft of refactored Component->Configurable.
r2731 # Create an InteractiveShell instance.
Brian Granger
Work on startup related things....
r2252 # shell.display_banner should always be False for the terminal
# based app, because we call shell.show_banner() by hand below
# so the banner shows *before* all extension loading stuff.
MinRK
Terminal IPython working with newapp
r3963 self.shell = TerminalInteractiveShell.instance(config=self.config,
display_banner=False, profile_dir=self.profile_dir,
ipython_dir=self.ipython_dir)
Brian Granger
Work on startup related things....
r2252
MinRK
Terminal IPython working with newapp
r3963 def init_banner(self):
"""optionally display the banner"""
if self.display_banner and self.interact:
self.shell.show_banner()
Brian Granger
Work on startup related things....
r2252 # Make sure there is a space below the banner.
if self.log_level <= logging.INFO: print
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
MinRK
Terminal IPython working with newapp
r3963 def init_gui_pylab(self):
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 """Enable GUI event loop integration, taking pylab into account."""
MinRK
Terminal IPython working with newapp
r3963 gui = self.gui
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
MinRK
Terminal IPython working with newapp
r3963 # Using `pylab` will also require gui activation, though which toolkit
Fernando Perez
Added --gui to match %gui use, better docs and behavior for %pylab code....
r2388 # to use may be chosen automatically based on mpl configuration.
MinRK
Terminal IPython working with newapp
r3963 if self.pylab:
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 activate = self.shell.enable_pylab
MinRK
Terminal IPython working with newapp
r3963 if self.pylab == 'auto':
Fernando Perez
Added --gui to match %gui use, better docs and behavior for %pylab code....
r2388 gui = None
else:
MinRK
Terminal IPython working with newapp
r3963 gui = self.pylab
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 else:
# Enable only GUI integration, no pylab
activate = inputhook.enable_gui
MinRK
Terminal IPython working with newapp
r3963 if gui or self.pylab:
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 try:
Fernando Perez
Added --gui to match %gui use, better docs and behavior for %pylab code....
r2388 self.log.info("Enabling GUI event loop integration, "
MinRK
Terminal IPython working with newapp
r3963 "toolkit=%s, pylab=%s" % (gui, self.pylab) )
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 activate(gui)
except:
self.log.warn("Error in enabling GUI event loop integration:")
self.shell.showtraceback()
Brian Granger
Work on startup related things....
r2252
MinRK
Terminal IPython working with newapp
r3963 def start(self):
MinRK
add qtconsole as subapp of terminal ipapp...
r3982 if self.subapp is not None:
return self.subapp.start()
MinRK
Terminal IPython working with newapp
r3963 # perform any prexec steps:
if self.interact:
Brian Granger
All code startup related things are working....
r2253 self.log.debug("Starting IPython's mainloop...")
self.shell.mainloop()
Fernando Perez
Manage and propagate argv correctly....
r2391 else:
MinRK
Terminal IPython working with newapp
r3963 self.log.debug("IPython not interactive...")
Brian Granger
Massive, crazy refactoring of everything....
r2202
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Brian Granger
Lots of work on command line options and env vars....
r2322 def load_default_config(ipython_dir=None):
"""Load the default config file from the default ipython_dir.
Brian Granger
Massive refactoring of of the core....
r2245
This is useful for embedded shells.
"""
Brian Granger
Lots of work on command line options and env vars....
r2322 if ipython_dir is None:
ipython_dir = get_ipython_dir()
MinRK
Terminal IPython working with newapp
r3963 profile_dir = os.path.join(ipython_dir, 'profile_default')
cl = PyFileConfigLoader(default_config_file_name, profile_dir)
MinRK
don't let missing config prevent embed from launching...
r4168 try:
config = cl.load_config()
except IOError:
# no config found
config = Config()
Brian Granger
Massive refactoring of of the core....
r2245 return config
Brian Granger
Removed ipapi compatability layer and updated top-level functions....
r2269 def launch_new_instance():
Brian Granger
Work on ipcontroller....
r2296 """Create and run a full blown IPython instance"""
MinRK
use App.instance() in launch_new_instance...
r3969 app = TerminalIPythonApp.instance()
MinRK
Terminal IPython working with newapp
r3963 app.initialize()
Brian Granger
Removed ipapi compatability layer and updated top-level functions....
r2269 app.start()
Brian Granger
Refactored the command line config system and other aspects of config....
r2501
Brian Granger
Removed the top-level iptest.py and INSTALLED logic....
r2507
if __name__ == '__main__':
launch_new_instance()