##// END OF EJS Templates
Merge pull request #4014 from sixpi/fix_matploltib_typo...
Thomas Kluyver -
r12155:25911fa8 merge
parent child Browse files
Show More
@@ -1,386 +1,386 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 The :class:`~IPython.core.application.Application` object for the command
5 5 line :command:`ipython` program.
6 6
7 7 Authors
8 8 -------
9 9
10 10 * Brian Granger
11 11 * Fernando Perez
12 12 * Min Ragan-Kelley
13 13 """
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Copyright (C) 2008-2011 The IPython Development Team
17 17 #
18 18 # Distributed under the terms of the BSD License. The full license is in
19 19 # the file COPYING, distributed as part of this software.
20 20 #-----------------------------------------------------------------------------
21 21
22 22 #-----------------------------------------------------------------------------
23 23 # Imports
24 24 #-----------------------------------------------------------------------------
25 25
26 26 from __future__ import absolute_import
27 27
28 28 import logging
29 29 import os
30 30 import sys
31 31
32 32 from IPython.config.loader import (
33 33 Config, PyFileConfigLoader, ConfigFileNotFound
34 34 )
35 35 from IPython.config.application import boolean_flag, catch_config_error
36 36 from IPython.core import release
37 37 from IPython.core import usage
38 38 from IPython.core.completer import IPCompleter
39 39 from IPython.core.crashhandler import CrashHandler
40 40 from IPython.core.formatters import PlainTextFormatter
41 41 from IPython.core.history import HistoryManager
42 42 from IPython.core.prompts import PromptManager
43 43 from IPython.core.application import (
44 44 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
45 45 )
46 46 from IPython.core.magics import ScriptMagics
47 47 from IPython.core.shellapp import (
48 48 InteractiveShellApp, shell_flags, shell_aliases
49 49 )
50 50 from IPython.terminal.interactiveshell import TerminalInteractiveShell
51 51 from IPython.utils import warn
52 52 from IPython.utils.path import get_ipython_dir, check_for_old_config
53 53 from IPython.utils.traitlets import (
54 54 Bool, List, Dict,
55 55 )
56 56
57 57 #-----------------------------------------------------------------------------
58 58 # Globals, utilities and helpers
59 59 #-----------------------------------------------------------------------------
60 60
61 61 _examples = """
62 62 ipython --matplotlib # enable matplotlib integration
63 ipython --matploltib=qt # enable matplotlib integration with qt4 backend
63 ipython --matplotlib=qt # enable matplotlib integration with qt4 backend
64 64
65 65 ipython --log-level=DEBUG # set logging to DEBUG
66 66 ipython --profile=foo # start with profile foo
67 67
68 68 ipython qtconsole # start the qtconsole GUI application
69 69 ipython help qtconsole # show the help for the qtconsole subcmd
70 70
71 71 ipython console # start the terminal-based console application
72 72 ipython help console # show the help for the console subcmd
73 73
74 74 ipython notebook # start the IPython notebook
75 75 ipython help notebook # show the help for the notebook subcmd
76 76
77 77 ipython profile create foo # create profile foo w/ default config files
78 78 ipython help profile # show the help for the profile subcmd
79 79
80 80 ipython locate # print the path to the IPython directory
81 81 ipython locate profile foo # print the path to the directory for profile `foo`
82 82
83 83 ipython nbconvert # convert notebooks to/from other formats
84 84 """
85 85
86 86 #-----------------------------------------------------------------------------
87 87 # Crash handler for this application
88 88 #-----------------------------------------------------------------------------
89 89
90 90 class IPAppCrashHandler(CrashHandler):
91 91 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
92 92
93 93 def __init__(self, app):
94 94 contact_name = release.author
95 95 contact_email = release.author_email
96 96 bug_tracker = 'https://github.com/ipython/ipython/issues'
97 97 super(IPAppCrashHandler,self).__init__(
98 98 app, contact_name, contact_email, bug_tracker
99 99 )
100 100
101 101 def make_report(self,traceback):
102 102 """Return a string containing a crash report."""
103 103
104 104 sec_sep = self.section_sep
105 105 # Start with parent report
106 106 report = [super(IPAppCrashHandler, self).make_report(traceback)]
107 107 # Add interactive-specific info we may have
108 108 rpt_add = report.append
109 109 try:
110 110 rpt_add(sec_sep+"History of session input:")
111 111 for line in self.app.shell.user_ns['_ih']:
112 112 rpt_add(line)
113 113 rpt_add('\n*** Last line of input (may not be in above history):\n')
114 114 rpt_add(self.app.shell._last_input_line+'\n')
115 115 except:
116 116 pass
117 117
118 118 return ''.join(report)
119 119
120 120 #-----------------------------------------------------------------------------
121 121 # Aliases and Flags
122 122 #-----------------------------------------------------------------------------
123 123 flags = dict(base_flags)
124 124 flags.update(shell_flags)
125 125 frontend_flags = {}
126 126 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
127 127 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
128 128 'Turn on auto editing of files with syntax errors.',
129 129 'Turn off auto editing of files with syntax errors.'
130 130 )
131 131 addflag('banner', 'TerminalIPythonApp.display_banner',
132 132 "Display a banner upon starting IPython.",
133 133 "Don't display a banner upon starting IPython."
134 134 )
135 135 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
136 136 """Set to confirm when you try to exit IPython with an EOF (Control-D
137 137 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
138 138 you can force a direct exit without any confirmation.""",
139 139 "Don't prompt the user when exiting."
140 140 )
141 141 addflag('term-title', 'TerminalInteractiveShell.term_title',
142 142 "Enable auto setting the terminal title.",
143 143 "Disable auto setting the terminal title."
144 144 )
145 145 classic_config = Config()
146 146 classic_config.InteractiveShell.cache_size = 0
147 147 classic_config.PlainTextFormatter.pprint = False
148 148 classic_config.PromptManager.in_template = '>>> '
149 149 classic_config.PromptManager.in2_template = '... '
150 150 classic_config.PromptManager.out_template = ''
151 151 classic_config.InteractiveShell.separate_in = ''
152 152 classic_config.InteractiveShell.separate_out = ''
153 153 classic_config.InteractiveShell.separate_out2 = ''
154 154 classic_config.InteractiveShell.colors = 'NoColor'
155 155 classic_config.InteractiveShell.xmode = 'Plain'
156 156
157 157 frontend_flags['classic']=(
158 158 classic_config,
159 159 "Gives IPython a similar feel to the classic Python prompt."
160 160 )
161 161 # # log doesn't make so much sense this way anymore
162 162 # paa('--log','-l',
163 163 # action='store_true', dest='InteractiveShell.logstart',
164 164 # help="Start logging to the default log file (./ipython_log.py).")
165 165 #
166 166 # # quick is harder to implement
167 167 frontend_flags['quick']=(
168 168 {'TerminalIPythonApp' : {'quick' : True}},
169 169 "Enable quick startup with no config files."
170 170 )
171 171
172 172 frontend_flags['i'] = (
173 173 {'TerminalIPythonApp' : {'force_interact' : True}},
174 174 """If running code from the command line, become interactive afterwards.
175 175 Note: can also be given simply as '-i.'"""
176 176 )
177 177 flags.update(frontend_flags)
178 178
179 179 aliases = dict(base_aliases)
180 180 aliases.update(shell_aliases)
181 181
182 182 #-----------------------------------------------------------------------------
183 183 # Main classes and functions
184 184 #-----------------------------------------------------------------------------
185 185
186 186
187 187 class LocateIPythonApp(BaseIPythonApplication):
188 188 description = """print the path to the IPython dir"""
189 189 subcommands = Dict(dict(
190 190 profile=('IPython.core.profileapp.ProfileLocate',
191 191 "print the path to an IPython profile directory",
192 192 ),
193 193 ))
194 194 def start(self):
195 195 if self.subapp is not None:
196 196 return self.subapp.start()
197 197 else:
198 198 print self.ipython_dir
199 199
200 200
201 201 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
202 202 name = u'ipython'
203 203 description = usage.cl_usage
204 204 crash_handler_class = IPAppCrashHandler
205 205 examples = _examples
206 206
207 207 flags = Dict(flags)
208 208 aliases = Dict(aliases)
209 209 classes = List()
210 210 def _classes_default(self):
211 211 """This has to be in a method, for TerminalIPythonApp to be available."""
212 212 return [
213 213 InteractiveShellApp, # ShellApp comes before TerminalApp, because
214 214 self.__class__, # it will also affect subclasses (e.g. QtConsole)
215 215 TerminalInteractiveShell,
216 216 PromptManager,
217 217 HistoryManager,
218 218 ProfileDir,
219 219 PlainTextFormatter,
220 220 IPCompleter,
221 221 ScriptMagics,
222 222 ]
223 223
224 224 subcommands = Dict(dict(
225 225 qtconsole=('IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp',
226 226 """Launch the IPython Qt Console."""
227 227 ),
228 228 notebook=('IPython.html.notebookapp.NotebookApp',
229 229 """Launch the IPython HTML Notebook Server."""
230 230 ),
231 231 profile = ("IPython.core.profileapp.ProfileApp",
232 232 "Create and manage IPython profiles."
233 233 ),
234 234 kernel = ("IPython.kernel.zmq.kernelapp.IPKernelApp",
235 235 "Start a kernel without an attached frontend."
236 236 ),
237 237 console=('IPython.terminal.console.app.ZMQTerminalIPythonApp',
238 238 """Launch the IPython terminal-based Console."""
239 239 ),
240 240 locate=('IPython.terminal.ipapp.LocateIPythonApp',
241 241 LocateIPythonApp.description
242 242 ),
243 243 history=('IPython.core.historyapp.HistoryApp',
244 244 "Manage the IPython history database."
245 245 ),
246 246 nbconvert=('IPython.nbconvert.nbconvertapp.NbConvertApp',
247 247 "Convert notebooks to/from other formats."
248 248 ),
249 249 ))
250 250
251 251 # *do* autocreate requested profile, but don't create the config file.
252 252 auto_create=Bool(True)
253 253 # configurables
254 254 ignore_old_config=Bool(False, config=True,
255 255 help="Suppress warning messages about legacy config files"
256 256 )
257 257 quick = Bool(False, config=True,
258 258 help="""Start IPython quickly by skipping the loading of config files."""
259 259 )
260 260 def _quick_changed(self, name, old, new):
261 261 if new:
262 262 self.load_config_file = lambda *a, **kw: None
263 263 self.ignore_old_config=True
264 264
265 265 display_banner = Bool(True, config=True,
266 266 help="Whether to display a banner upon starting IPython."
267 267 )
268 268
269 269 # if there is code of files to run from the cmd line, don't interact
270 270 # unless the --i flag (App.force_interact) is true.
271 271 force_interact = Bool(False, config=True,
272 272 help="""If a command or file is given via the command-line,
273 273 e.g. 'ipython foo.py"""
274 274 )
275 275 def _force_interact_changed(self, name, old, new):
276 276 if new:
277 277 self.interact = True
278 278
279 279 def _file_to_run_changed(self, name, old, new):
280 280 if new:
281 281 self.something_to_run = True
282 282 if new and not self.force_interact:
283 283 self.interact = False
284 284 _code_to_run_changed = _file_to_run_changed
285 285 _module_to_run_changed = _file_to_run_changed
286 286
287 287 # internal, not-configurable
288 288 interact=Bool(True)
289 289 something_to_run=Bool(False)
290 290
291 291 def parse_command_line(self, argv=None):
292 292 """override to allow old '-pylab' flag with deprecation warning"""
293 293
294 294 argv = sys.argv[1:] if argv is None else argv
295 295
296 296 if '-pylab' in argv:
297 297 # deprecated `-pylab` given,
298 298 # warn and transform into current syntax
299 299 argv = argv[:] # copy, don't clobber
300 300 idx = argv.index('-pylab')
301 301 warn.warn("`-pylab` flag has been deprecated.\n"
302 302 " Use `--matplotlib <backend>` and import pylab manually.")
303 303 argv[idx] = '--pylab'
304 304
305 305 return super(TerminalIPythonApp, self).parse_command_line(argv)
306 306
307 307 @catch_config_error
308 308 def initialize(self, argv=None):
309 309 """Do actions after construct, but before starting the app."""
310 310 super(TerminalIPythonApp, self).initialize(argv)
311 311 if self.subapp is not None:
312 312 # don't bother initializing further, starting subapp
313 313 return
314 314 if not self.ignore_old_config:
315 315 check_for_old_config(self.ipython_dir)
316 316 # print self.extra_args
317 317 if self.extra_args and not self.something_to_run:
318 318 self.file_to_run = self.extra_args[0]
319 319 self.init_path()
320 320 # create the shell
321 321 self.init_shell()
322 322 # and draw the banner
323 323 self.init_banner()
324 324 # Now a variety of things that happen after the banner is printed.
325 325 self.init_gui_pylab()
326 326 self.init_extensions()
327 327 self.init_code()
328 328
329 329 def init_shell(self):
330 330 """initialize the InteractiveShell instance"""
331 331 # Create an InteractiveShell instance.
332 332 # shell.display_banner should always be False for the terminal
333 333 # based app, because we call shell.show_banner() by hand below
334 334 # so the banner shows *before* all extension loading stuff.
335 335 self.shell = TerminalInteractiveShell.instance(parent=self,
336 336 display_banner=False, profile_dir=self.profile_dir,
337 337 ipython_dir=self.ipython_dir)
338 338 self.shell.configurables.append(self)
339 339
340 340 def init_banner(self):
341 341 """optionally display the banner"""
342 342 if self.display_banner and self.interact:
343 343 self.shell.show_banner()
344 344 # Make sure there is a space below the banner.
345 345 if self.log_level <= logging.INFO: print
346 346
347 347 def _pylab_changed(self, name, old, new):
348 348 """Replace --pylab='inline' with --pylab='auto'"""
349 349 if new == 'inline':
350 350 warn.warn("'inline' not available as pylab backend, "
351 351 "using 'auto' instead.")
352 352 self.pylab = 'auto'
353 353
354 354 def start(self):
355 355 if self.subapp is not None:
356 356 return self.subapp.start()
357 357 # perform any prexec steps:
358 358 if self.interact:
359 359 self.log.debug("Starting IPython's mainloop...")
360 360 self.shell.mainloop()
361 361 else:
362 362 self.log.debug("IPython not interactive...")
363 363
364 364
365 365 def load_default_config(ipython_dir=None):
366 366 """Load the default config file from the default ipython_dir.
367 367
368 368 This is useful for embedded shells.
369 369 """
370 370 if ipython_dir is None:
371 371 ipython_dir = get_ipython_dir()
372 372 profile_dir = os.path.join(ipython_dir, 'profile_default')
373 373 cl = PyFileConfigLoader("ipython_config.py", profile_dir)
374 374 try:
375 375 config = cl.load_config()
376 376 except ConfigFileNotFound:
377 377 # no config found
378 378 config = Config()
379 379 return config
380 380
381 381
382 382 launch_new_instance = TerminalIPythonApp.launch_instance
383 383
384 384
385 385 if __name__ == '__main__':
386 386 launch_new_instance()
General Comments 0
You need to be logged in to leave comments. Login now