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