##// END OF EJS Templates
Merge pull request #3568 from minrk/pylab-no-import...
Paul Ivanov -
r11487:9e253ecd merge
parent child Browse files
Show More
@@ -1,3088 +1,3133 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Main IPython class."""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 # Copyright (C) 2008-2011 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 from __future__ import absolute_import
18 18 from __future__ import print_function
19 19
20 20 import __builtin__ as builtin_mod
21 21 import __future__
22 22 import abc
23 23 import ast
24 24 import atexit
25 25 import os
26 26 import re
27 27 import runpy
28 28 import sys
29 29 import tempfile
30 30 import types
31 31 from io import open as io_open
32 32
33 33 from IPython.config.configurable import SingletonConfigurable
34 34 from IPython.core import debugger, oinspect
35 35 from IPython.core import magic
36 36 from IPython.core import page
37 37 from IPython.core import prefilter
38 38 from IPython.core import shadowns
39 39 from IPython.core import ultratb
40 40 from IPython.core.alias import AliasManager, AliasError
41 41 from IPython.core.autocall import ExitAutocall
42 42 from IPython.core.builtin_trap import BuiltinTrap
43 43 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
44 44 from IPython.core.display_trap import DisplayTrap
45 45 from IPython.core.displayhook import DisplayHook
46 46 from IPython.core.displaypub import DisplayPublisher
47 47 from IPython.core.error import UsageError
48 48 from IPython.core.extensions import ExtensionManager
49 49 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
50 50 from IPython.core.formatters import DisplayFormatter
51 51 from IPython.core.history import HistoryManager
52 52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
53 53 from IPython.core.logger import Logger
54 54 from IPython.core.macro import Macro
55 55 from IPython.core.payload import PayloadManager
56 56 from IPython.core.prefilter import PrefilterManager
57 57 from IPython.core.profiledir import ProfileDir
58 from IPython.core.pylabtools import pylab_activate
59 58 from IPython.core.prompts import PromptManager
60 59 from IPython.lib.latextools import LaTeXTool
61 60 from IPython.testing.skipdoctest import skip_doctest
62 61 from IPython.utils import PyColorize
63 62 from IPython.utils import io
64 63 from IPython.utils import py3compat
65 64 from IPython.utils import openpy
66 65 from IPython.utils.decorators import undoc
67 66 from IPython.utils.io import ask_yes_no
68 67 from IPython.utils.ipstruct import Struct
69 68 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
70 69 from IPython.utils.pickleshare import PickleShareDB
71 70 from IPython.utils.process import system, getoutput
72 71 from IPython.utils.strdispatch import StrDispatch
73 72 from IPython.utils.syspathcontext import prepended_to_syspath
74 73 from IPython.utils.text import (format_screen, LSString, SList,
75 74 DollarFormatter)
76 75 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
77 76 List, Unicode, Instance, Type)
78 77 from IPython.utils.warn import warn, error
79 78 import IPython.core.hooks
80 79
81 80 #-----------------------------------------------------------------------------
82 81 # Globals
83 82 #-----------------------------------------------------------------------------
84 83
85 84 # compiled regexps for autoindent management
86 85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
87 86
88 87 #-----------------------------------------------------------------------------
89 88 # Utilities
90 89 #-----------------------------------------------------------------------------
91 90
92 91 @undoc
93 92 def softspace(file, newvalue):
94 93 """Copied from code.py, to remove the dependency"""
95 94
96 95 oldvalue = 0
97 96 try:
98 97 oldvalue = file.softspace
99 98 except AttributeError:
100 99 pass
101 100 try:
102 101 file.softspace = newvalue
103 102 except (AttributeError, TypeError):
104 103 # "attribute-less object" or "read-only attributes"
105 104 pass
106 105 return oldvalue
107 106
108 107 @undoc
109 108 def no_op(*a, **kw): pass
110 109
111 110 @undoc
112 111 class NoOpContext(object):
113 112 def __enter__(self): pass
114 113 def __exit__(self, type, value, traceback): pass
115 114 no_op_context = NoOpContext()
116 115
117 116 class SpaceInInput(Exception): pass
118 117
119 118 @undoc
120 119 class Bunch: pass
121 120
122 121
123 122 def get_default_colors():
124 123 if sys.platform=='darwin':
125 124 return "LightBG"
126 125 elif os.name=='nt':
127 126 return 'Linux'
128 127 else:
129 128 return 'Linux'
130 129
131 130
132 131 class SeparateUnicode(Unicode):
133 132 """A Unicode subclass to validate separate_in, separate_out, etc.
134 133
135 134 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
136 135 """
137 136
138 137 def validate(self, obj, value):
139 138 if value == '0': value = ''
140 139 value = value.replace('\\n','\n')
141 140 return super(SeparateUnicode, self).validate(obj, value)
142 141
143 142
144 143 class ReadlineNoRecord(object):
145 144 """Context manager to execute some code, then reload readline history
146 145 so that interactive input to the code doesn't appear when pressing up."""
147 146 def __init__(self, shell):
148 147 self.shell = shell
149 148 self._nested_level = 0
150 149
151 150 def __enter__(self):
152 151 if self._nested_level == 0:
153 152 try:
154 153 self.orig_length = self.current_length()
155 154 self.readline_tail = self.get_readline_tail()
156 155 except (AttributeError, IndexError): # Can fail with pyreadline
157 156 self.orig_length, self.readline_tail = 999999, []
158 157 self._nested_level += 1
159 158
160 159 def __exit__(self, type, value, traceback):
161 160 self._nested_level -= 1
162 161 if self._nested_level == 0:
163 162 # Try clipping the end if it's got longer
164 163 try:
165 164 e = self.current_length() - self.orig_length
166 165 if e > 0:
167 166 for _ in range(e):
168 167 self.shell.readline.remove_history_item(self.orig_length)
169 168
170 169 # If it still doesn't match, just reload readline history.
171 170 if self.current_length() != self.orig_length \
172 171 or self.get_readline_tail() != self.readline_tail:
173 172 self.shell.refill_readline_hist()
174 173 except (AttributeError, IndexError):
175 174 pass
176 175 # Returning False will cause exceptions to propagate
177 176 return False
178 177
179 178 def current_length(self):
180 179 return self.shell.readline.get_current_history_length()
181 180
182 181 def get_readline_tail(self, n=10):
183 182 """Get the last n items in readline history."""
184 183 end = self.shell.readline.get_current_history_length() + 1
185 184 start = max(end-n, 1)
186 185 ghi = self.shell.readline.get_history_item
187 186 return [ghi(x) for x in range(start, end)]
188 187
189 188 #-----------------------------------------------------------------------------
190 189 # Main IPython class
191 190 #-----------------------------------------------------------------------------
192 191
193 192 class InteractiveShell(SingletonConfigurable):
194 193 """An enhanced, interactive shell for Python."""
195 194
196 195 _instance = None
197 196
198 197 ast_transformers = List([], config=True, help=
199 198 """
200 199 A list of ast.NodeTransformer subclass instances, which will be applied
201 200 to user input before code is run.
202 201 """
203 202 )
204 203
205 204 autocall = Enum((0,1,2), default_value=0, config=True, help=
206 205 """
207 206 Make IPython automatically call any callable object even if you didn't
208 207 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
209 208 automatically. The value can be '0' to disable the feature, '1' for
210 209 'smart' autocall, where it is not applied if there are no more
211 210 arguments on the line, and '2' for 'full' autocall, where all callable
212 211 objects are automatically called (even if no arguments are present).
213 212 """
214 213 )
215 214 # TODO: remove all autoindent logic and put into frontends.
216 215 # We can't do this yet because even runlines uses the autoindent.
217 216 autoindent = CBool(True, config=True, help=
218 217 """
219 218 Autoindent IPython code entered interactively.
220 219 """
221 220 )
222 221 automagic = CBool(True, config=True, help=
223 222 """
224 223 Enable magic commands to be called without the leading %.
225 224 """
226 225 )
227 226 cache_size = Integer(1000, config=True, help=
228 227 """
229 228 Set the size of the output cache. The default is 1000, you can
230 229 change it permanently in your config file. Setting it to 0 completely
231 230 disables the caching system, and the minimum value accepted is 20 (if
232 231 you provide a value less than 20, it is reset to 0 and a warning is
233 232 issued). This limit is defined because otherwise you'll spend more
234 233 time re-flushing a too small cache than working
235 234 """
236 235 )
237 236 color_info = CBool(True, config=True, help=
238 237 """
239 238 Use colors for displaying information about objects. Because this
240 239 information is passed through a pager (like 'less'), and some pagers
241 240 get confused with color codes, this capability can be turned off.
242 241 """
243 242 )
244 243 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
245 244 default_value=get_default_colors(), config=True,
246 245 help="Set the color scheme (NoColor, Linux, or LightBG)."
247 246 )
248 247 colors_force = CBool(False, help=
249 248 """
250 249 Force use of ANSI color codes, regardless of OS and readline
251 250 availability.
252 251 """
253 252 # FIXME: This is essentially a hack to allow ZMQShell to show colors
254 253 # without readline on Win32. When the ZMQ formatting system is
255 254 # refactored, this should be removed.
256 255 )
257 256 debug = CBool(False, config=True)
258 257 deep_reload = CBool(False, config=True, help=
259 258 """
260 259 Enable deep (recursive) reloading by default. IPython can use the
261 260 deep_reload module which reloads changes in modules recursively (it
262 261 replaces the reload() function, so you don't need to change anything to
263 262 use it). deep_reload() forces a full reload of modules whose code may
264 263 have changed, which the default reload() function does not. When
265 264 deep_reload is off, IPython will use the normal reload(), but
266 265 deep_reload will still be available as dreload().
267 266 """
268 267 )
269 268 disable_failing_post_execute = CBool(False, config=True,
270 269 help="Don't call post-execute functions that have failed in the past."
271 270 )
272 271 display_formatter = Instance(DisplayFormatter)
273 272 displayhook_class = Type(DisplayHook)
274 273 display_pub_class = Type(DisplayPublisher)
275 274 data_pub_class = None
276 275
277 276 exit_now = CBool(False)
278 277 exiter = Instance(ExitAutocall)
279 278 def _exiter_default(self):
280 279 return ExitAutocall(self)
281 280 # Monotonically increasing execution counter
282 281 execution_count = Integer(1)
283 282 filename = Unicode("<ipython console>")
284 283 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
285 284
286 285 # Input splitter, to transform input line by line and detect when a block
287 286 # is ready to be executed.
288 287 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
289 288 (), {'line_input_checker': True})
290 289
291 290 # This InputSplitter instance is used to transform completed cells before
292 291 # running them. It allows cell magics to contain blank lines.
293 292 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
294 293 (), {'line_input_checker': False})
295 294
296 295 logstart = CBool(False, config=True, help=
297 296 """
298 297 Start logging to the default log file.
299 298 """
300 299 )
301 300 logfile = Unicode('', config=True, help=
302 301 """
303 302 The name of the logfile to use.
304 303 """
305 304 )
306 305 logappend = Unicode('', config=True, help=
307 306 """
308 307 Start logging to the given file in append mode.
309 308 """
310 309 )
311 310 object_info_string_level = Enum((0,1,2), default_value=0,
312 311 config=True)
313 312 pdb = CBool(False, config=True, help=
314 313 """
315 314 Automatically call the pdb debugger after every exception.
316 315 """
317 316 )
318 317 multiline_history = CBool(sys.platform != 'win32', config=True,
319 318 help="Save multi-line entries as one entry in readline history"
320 319 )
321 320
322 321 # deprecated prompt traits:
323 322
324 323 prompt_in1 = Unicode('In [\\#]: ', config=True,
325 324 help="Deprecated, use PromptManager.in_template")
326 325 prompt_in2 = Unicode(' .\\D.: ', config=True,
327 326 help="Deprecated, use PromptManager.in2_template")
328 327 prompt_out = Unicode('Out[\\#]: ', config=True,
329 328 help="Deprecated, use PromptManager.out_template")
330 329 prompts_pad_left = CBool(True, config=True,
331 330 help="Deprecated, use PromptManager.justify")
332 331
333 332 def _prompt_trait_changed(self, name, old, new):
334 333 table = {
335 334 'prompt_in1' : 'in_template',
336 335 'prompt_in2' : 'in2_template',
337 336 'prompt_out' : 'out_template',
338 337 'prompts_pad_left' : 'justify',
339 338 }
340 339 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
341 340 name=name, newname=table[name])
342 341 )
343 342 # protect against weird cases where self.config may not exist:
344 343 if self.config is not None:
345 344 # propagate to corresponding PromptManager trait
346 345 setattr(self.config.PromptManager, table[name], new)
347 346
348 347 _prompt_in1_changed = _prompt_trait_changed
349 348 _prompt_in2_changed = _prompt_trait_changed
350 349 _prompt_out_changed = _prompt_trait_changed
351 350 _prompt_pad_left_changed = _prompt_trait_changed
352 351
353 352 show_rewritten_input = CBool(True, config=True,
354 353 help="Show rewritten input, e.g. for autocall."
355 354 )
356 355
357 356 quiet = CBool(False, config=True)
358 357
359 358 history_length = Integer(10000, config=True)
360 359
361 360 # The readline stuff will eventually be moved to the terminal subclass
362 361 # but for now, we can't do that as readline is welded in everywhere.
363 362 readline_use = CBool(True, config=True)
364 363 readline_remove_delims = Unicode('-/~', config=True)
365 364 readline_delims = Unicode() # set by init_readline()
366 365 # don't use \M- bindings by default, because they
367 366 # conflict with 8-bit encodings. See gh-58,gh-88
368 367 readline_parse_and_bind = List([
369 368 'tab: complete',
370 369 '"\C-l": clear-screen',
371 370 'set show-all-if-ambiguous on',
372 371 '"\C-o": tab-insert',
373 372 '"\C-r": reverse-search-history',
374 373 '"\C-s": forward-search-history',
375 374 '"\C-p": history-search-backward',
376 375 '"\C-n": history-search-forward',
377 376 '"\e[A": history-search-backward',
378 377 '"\e[B": history-search-forward',
379 378 '"\C-k": kill-line',
380 379 '"\C-u": unix-line-discard',
381 380 ], allow_none=False, config=True)
382 381
383 382 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
384 383 default_value='last_expr', config=True,
385 384 help="""
386 385 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
387 386 run interactively (displaying output from expressions).""")
388 387
389 388 # TODO: this part of prompt management should be moved to the frontends.
390 389 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
391 390 separate_in = SeparateUnicode('\n', config=True)
392 391 separate_out = SeparateUnicode('', config=True)
393 392 separate_out2 = SeparateUnicode('', config=True)
394 393 wildcards_case_sensitive = CBool(True, config=True)
395 394 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
396 395 default_value='Context', config=True)
397 396
398 397 # Subcomponents of InteractiveShell
399 398 alias_manager = Instance('IPython.core.alias.AliasManager')
400 399 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
401 400 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
402 401 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
403 402 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
404 403 payload_manager = Instance('IPython.core.payload.PayloadManager')
405 404 history_manager = Instance('IPython.core.history.HistoryManager')
406 405 magics_manager = Instance('IPython.core.magic.MagicsManager')
407 406
408 407 profile_dir = Instance('IPython.core.application.ProfileDir')
409 408 @property
410 409 def profile(self):
411 410 if self.profile_dir is not None:
412 411 name = os.path.basename(self.profile_dir.location)
413 412 return name.replace('profile_','')
414 413
415 414
416 415 # Private interface
417 416 _post_execute = Instance(dict)
418 417
419 418 # Tracks any GUI loop loaded for pylab
420 419 pylab_gui_select = None
421 420
422 421 def __init__(self, ipython_dir=None, profile_dir=None,
423 422 user_module=None, user_ns=None,
424 423 custom_exceptions=((), None), **kwargs):
425 424
426 425 # This is where traits with a config_key argument are updated
427 426 # from the values on config.
428 427 super(InteractiveShell, self).__init__(**kwargs)
429 428 self.configurables = [self]
430 429
431 430 # These are relatively independent and stateless
432 431 self.init_ipython_dir(ipython_dir)
433 432 self.init_profile_dir(profile_dir)
434 433 self.init_instance_attrs()
435 434 self.init_environment()
436 435
437 436 # Check if we're in a virtualenv, and set up sys.path.
438 437 self.init_virtualenv()
439 438
440 439 # Create namespaces (user_ns, user_global_ns, etc.)
441 440 self.init_create_namespaces(user_module, user_ns)
442 441 # This has to be done after init_create_namespaces because it uses
443 442 # something in self.user_ns, but before init_sys_modules, which
444 443 # is the first thing to modify sys.
445 444 # TODO: When we override sys.stdout and sys.stderr before this class
446 445 # is created, we are saving the overridden ones here. Not sure if this
447 446 # is what we want to do.
448 447 self.save_sys_module_state()
449 448 self.init_sys_modules()
450 449
451 450 # While we're trying to have each part of the code directly access what
452 451 # it needs without keeping redundant references to objects, we have too
453 452 # much legacy code that expects ip.db to exist.
454 453 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
455 454
456 455 self.init_history()
457 456 self.init_encoding()
458 457 self.init_prefilter()
459 458
460 459 self.init_syntax_highlighting()
461 460 self.init_hooks()
462 461 self.init_pushd_popd_magic()
463 462 # self.init_traceback_handlers use to be here, but we moved it below
464 463 # because it and init_io have to come after init_readline.
465 464 self.init_user_ns()
466 465 self.init_logger()
467 466 self.init_alias()
468 467 self.init_builtins()
469 468
470 469 # The following was in post_config_initialization
471 470 self.init_inspector()
472 471 # init_readline() must come before init_io(), because init_io uses
473 472 # readline related things.
474 473 self.init_readline()
475 474 # We save this here in case user code replaces raw_input, but it needs
476 475 # to be after init_readline(), because PyPy's readline works by replacing
477 476 # raw_input.
478 477 if py3compat.PY3:
479 478 self.raw_input_original = input
480 479 else:
481 480 self.raw_input_original = raw_input
482 481 # init_completer must come after init_readline, because it needs to
483 482 # know whether readline is present or not system-wide to configure the
484 483 # completers, since the completion machinery can now operate
485 484 # independently of readline (e.g. over the network)
486 485 self.init_completer()
487 486 # TODO: init_io() needs to happen before init_traceback handlers
488 487 # because the traceback handlers hardcode the stdout/stderr streams.
489 488 # This logic in in debugger.Pdb and should eventually be changed.
490 489 self.init_io()
491 490 self.init_traceback_handlers(custom_exceptions)
492 491 self.init_prompts()
493 492 self.init_display_formatter()
494 493 self.init_display_pub()
495 494 self.init_data_pub()
496 495 self.init_displayhook()
497 496 self.init_latextool()
498 497 self.init_magics()
499 498 self.init_logstart()
500 499 self.init_pdb()
501 500 self.init_extension_manager()
502 501 self.init_payload()
503 502 self.hooks.late_startup_hook()
504 503 atexit.register(self.atexit_operations)
505 504
506 505 def get_ipython(self):
507 506 """Return the currently running IPython instance."""
508 507 return self
509 508
510 509 #-------------------------------------------------------------------------
511 510 # Trait changed handlers
512 511 #-------------------------------------------------------------------------
513 512
514 513 def _ipython_dir_changed(self, name, new):
515 514 if not os.path.isdir(new):
516 515 os.makedirs(new, mode = 0o777)
517 516
518 517 def set_autoindent(self,value=None):
519 518 """Set the autoindent flag, checking for readline support.
520 519
521 520 If called with no arguments, it acts as a toggle."""
522 521
523 522 if value != 0 and not self.has_readline:
524 523 if os.name == 'posix':
525 524 warn("The auto-indent feature requires the readline library")
526 525 self.autoindent = 0
527 526 return
528 527 if value is None:
529 528 self.autoindent = not self.autoindent
530 529 else:
531 530 self.autoindent = value
532 531
533 532 #-------------------------------------------------------------------------
534 533 # init_* methods called by __init__
535 534 #-------------------------------------------------------------------------
536 535
537 536 def init_ipython_dir(self, ipython_dir):
538 537 if ipython_dir is not None:
539 538 self.ipython_dir = ipython_dir
540 539 return
541 540
542 541 self.ipython_dir = get_ipython_dir()
543 542
544 543 def init_profile_dir(self, profile_dir):
545 544 if profile_dir is not None:
546 545 self.profile_dir = profile_dir
547 546 return
548 547 self.profile_dir =\
549 548 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
550 549
551 550 def init_instance_attrs(self):
552 551 self.more = False
553 552
554 553 # command compiler
555 554 self.compile = CachingCompiler()
556 555
557 556 # Make an empty namespace, which extension writers can rely on both
558 557 # existing and NEVER being used by ipython itself. This gives them a
559 558 # convenient location for storing additional information and state
560 559 # their extensions may require, without fear of collisions with other
561 560 # ipython names that may develop later.
562 561 self.meta = Struct()
563 562
564 563 # Temporary files used for various purposes. Deleted at exit.
565 564 self.tempfiles = []
566 565
567 566 # Keep track of readline usage (later set by init_readline)
568 567 self.has_readline = False
569 568
570 569 # keep track of where we started running (mainly for crash post-mortem)
571 570 # This is not being used anywhere currently.
572 571 self.starting_dir = os.getcwdu()
573 572
574 573 # Indentation management
575 574 self.indent_current_nsp = 0
576 575
577 576 # Dict to track post-execution functions that have been registered
578 577 self._post_execute = {}
579 578
580 579 def init_environment(self):
581 580 """Any changes we need to make to the user's environment."""
582 581 pass
583 582
584 583 def init_encoding(self):
585 584 # Get system encoding at startup time. Certain terminals (like Emacs
586 585 # under Win32 have it set to None, and we need to have a known valid
587 586 # encoding to use in the raw_input() method
588 587 try:
589 588 self.stdin_encoding = sys.stdin.encoding or 'ascii'
590 589 except AttributeError:
591 590 self.stdin_encoding = 'ascii'
592 591
593 592 def init_syntax_highlighting(self):
594 593 # Python source parser/formatter for syntax highlighting
595 594 pyformat = PyColorize.Parser().format
596 595 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
597 596
598 597 def init_pushd_popd_magic(self):
599 598 # for pushd/popd management
600 599 self.home_dir = get_home_dir()
601 600
602 601 self.dir_stack = []
603 602
604 603 def init_logger(self):
605 604 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
606 605 logmode='rotate')
607 606
608 607 def init_logstart(self):
609 608 """Initialize logging in case it was requested at the command line.
610 609 """
611 610 if self.logappend:
612 611 self.magic('logstart %s append' % self.logappend)
613 612 elif self.logfile:
614 613 self.magic('logstart %s' % self.logfile)
615 614 elif self.logstart:
616 615 self.magic('logstart')
617 616
618 617 def init_builtins(self):
619 618 # A single, static flag that we set to True. Its presence indicates
620 619 # that an IPython shell has been created, and we make no attempts at
621 620 # removing on exit or representing the existence of more than one
622 621 # IPython at a time.
623 622 builtin_mod.__dict__['__IPYTHON__'] = True
624 623
625 624 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
626 625 # manage on enter/exit, but with all our shells it's virtually
627 626 # impossible to get all the cases right. We're leaving the name in for
628 627 # those who adapted their codes to check for this flag, but will
629 628 # eventually remove it after a few more releases.
630 629 builtin_mod.__dict__['__IPYTHON__active'] = \
631 630 'Deprecated, check for __IPYTHON__'
632 631
633 632 self.builtin_trap = BuiltinTrap(shell=self)
634 633
635 634 def init_inspector(self):
636 635 # Object inspector
637 636 self.inspector = oinspect.Inspector(oinspect.InspectColors,
638 637 PyColorize.ANSICodeColors,
639 638 'NoColor',
640 639 self.object_info_string_level)
641 640
642 641 def init_io(self):
643 642 # This will just use sys.stdout and sys.stderr. If you want to
644 643 # override sys.stdout and sys.stderr themselves, you need to do that
645 644 # *before* instantiating this class, because io holds onto
646 645 # references to the underlying streams.
647 646 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
648 647 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
649 648 else:
650 649 io.stdout = io.IOStream(sys.stdout)
651 650 io.stderr = io.IOStream(sys.stderr)
652 651
653 652 def init_prompts(self):
654 653 self.prompt_manager = PromptManager(shell=self, parent=self)
655 654 self.configurables.append(self.prompt_manager)
656 655 # Set system prompts, so that scripts can decide if they are running
657 656 # interactively.
658 657 sys.ps1 = 'In : '
659 658 sys.ps2 = '...: '
660 659 sys.ps3 = 'Out: '
661 660
662 661 def init_display_formatter(self):
663 662 self.display_formatter = DisplayFormatter(parent=self)
664 663 self.configurables.append(self.display_formatter)
665 664
666 665 def init_display_pub(self):
667 666 self.display_pub = self.display_pub_class(parent=self)
668 667 self.configurables.append(self.display_pub)
669 668
670 669 def init_data_pub(self):
671 670 if not self.data_pub_class:
672 671 self.data_pub = None
673 672 return
674 673 self.data_pub = self.data_pub_class(parent=self)
675 674 self.configurables.append(self.data_pub)
676 675
677 676 def init_displayhook(self):
678 677 # Initialize displayhook, set in/out prompts and printing system
679 678 self.displayhook = self.displayhook_class(
680 679 parent=self,
681 680 shell=self,
682 681 cache_size=self.cache_size,
683 682 )
684 683 self.configurables.append(self.displayhook)
685 684 # This is a context manager that installs/revmoes the displayhook at
686 685 # the appropriate time.
687 686 self.display_trap = DisplayTrap(hook=self.displayhook)
688 687
689 688 def init_latextool(self):
690 689 """Configure LaTeXTool."""
691 690 cfg = LaTeXTool.instance(parent=self)
692 691 if cfg not in self.configurables:
693 692 self.configurables.append(cfg)
694 693
695 694 def init_virtualenv(self):
696 695 """Add a virtualenv to sys.path so the user can import modules from it.
697 696 This isn't perfect: it doesn't use the Python interpreter with which the
698 697 virtualenv was built, and it ignores the --no-site-packages option. A
699 698 warning will appear suggesting the user installs IPython in the
700 699 virtualenv, but for many cases, it probably works well enough.
701 700
702 701 Adapted from code snippets online.
703 702
704 703 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
705 704 """
706 705 if 'VIRTUAL_ENV' not in os.environ:
707 706 # Not in a virtualenv
708 707 return
709 708
710 709 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
711 710 # Running properly in the virtualenv, don't need to do anything
712 711 return
713 712
714 713 warn("Attempting to work in a virtualenv. If you encounter problems, please "
715 714 "install IPython inside the virtualenv.")
716 715 if sys.platform == "win32":
717 716 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
718 717 else:
719 718 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
720 719 'python%d.%d' % sys.version_info[:2], 'site-packages')
721 720
722 721 import site
723 722 sys.path.insert(0, virtual_env)
724 723 site.addsitedir(virtual_env)
725 724
726 725 #-------------------------------------------------------------------------
727 726 # Things related to injections into the sys module
728 727 #-------------------------------------------------------------------------
729 728
730 729 def save_sys_module_state(self):
731 730 """Save the state of hooks in the sys module.
732 731
733 732 This has to be called after self.user_module is created.
734 733 """
735 734 self._orig_sys_module_state = {}
736 735 self._orig_sys_module_state['stdin'] = sys.stdin
737 736 self._orig_sys_module_state['stdout'] = sys.stdout
738 737 self._orig_sys_module_state['stderr'] = sys.stderr
739 738 self._orig_sys_module_state['excepthook'] = sys.excepthook
740 739 self._orig_sys_modules_main_name = self.user_module.__name__
741 740 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
742 741
743 742 def restore_sys_module_state(self):
744 743 """Restore the state of the sys module."""
745 744 try:
746 745 for k, v in self._orig_sys_module_state.iteritems():
747 746 setattr(sys, k, v)
748 747 except AttributeError:
749 748 pass
750 749 # Reset what what done in self.init_sys_modules
751 750 if self._orig_sys_modules_main_mod is not None:
752 751 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
753 752
754 753 #-------------------------------------------------------------------------
755 754 # Things related to hooks
756 755 #-------------------------------------------------------------------------
757 756
758 757 def init_hooks(self):
759 758 # hooks holds pointers used for user-side customizations
760 759 self.hooks = Struct()
761 760
762 761 self.strdispatchers = {}
763 762
764 763 # Set all default hooks, defined in the IPython.hooks module.
765 764 hooks = IPython.core.hooks
766 765 for hook_name in hooks.__all__:
767 766 # default hooks have priority 100, i.e. low; user hooks should have
768 767 # 0-100 priority
769 768 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
770 769
771 770 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
772 771 """set_hook(name,hook) -> sets an internal IPython hook.
773 772
774 773 IPython exposes some of its internal API as user-modifiable hooks. By
775 774 adding your function to one of these hooks, you can modify IPython's
776 775 behavior to call at runtime your own routines."""
777 776
778 777 # At some point in the future, this should validate the hook before it
779 778 # accepts it. Probably at least check that the hook takes the number
780 779 # of args it's supposed to.
781 780
782 781 f = types.MethodType(hook,self)
783 782
784 783 # check if the hook is for strdispatcher first
785 784 if str_key is not None:
786 785 sdp = self.strdispatchers.get(name, StrDispatch())
787 786 sdp.add_s(str_key, f, priority )
788 787 self.strdispatchers[name] = sdp
789 788 return
790 789 if re_key is not None:
791 790 sdp = self.strdispatchers.get(name, StrDispatch())
792 791 sdp.add_re(re.compile(re_key), f, priority )
793 792 self.strdispatchers[name] = sdp
794 793 return
795 794
796 795 dp = getattr(self.hooks, name, None)
797 796 if name not in IPython.core.hooks.__all__:
798 797 print("Warning! Hook '%s' is not one of %s" % \
799 798 (name, IPython.core.hooks.__all__ ))
800 799 if not dp:
801 800 dp = IPython.core.hooks.CommandChainDispatcher()
802 801
803 802 try:
804 803 dp.add(f,priority)
805 804 except AttributeError:
806 805 # it was not commandchain, plain old func - replace
807 806 dp = f
808 807
809 808 setattr(self.hooks,name, dp)
810 809
811 810 def register_post_execute(self, func):
812 811 """Register a function for calling after code execution.
813 812 """
814 813 if not callable(func):
815 814 raise ValueError('argument %s must be callable' % func)
816 815 self._post_execute[func] = True
817 816
818 817 #-------------------------------------------------------------------------
819 818 # Things related to the "main" module
820 819 #-------------------------------------------------------------------------
821 820
822 821 def new_main_mod(self, filename):
823 822 """Return a new 'main' module object for user code execution.
824 823
825 824 ``filename`` should be the path of the script which will be run in the
826 825 module. Requests with the same filename will get the same module, with
827 826 its namespace cleared.
828 827
829 828 When scripts are executed via %run, we must keep a reference to their
830 829 __main__ module (a FakeModule instance) around so that Python doesn't
831 830 clear it, rendering references to module globals useless.
832 831
833 832 This method keeps said reference in a private dict, keyed by the
834 833 absolute path of the script. This way, for multiple executions of the
835 834 same script we only keep one copy of the namespace (the last one),
836 835 thus preventing memory leaks from old references while allowing the
837 836 objects from the last execution to be accessible.
838 837 """
839 838 filename = os.path.abspath(filename)
840 839 try:
841 840 main_mod = self._main_mod_cache[filename]
842 841 except KeyError:
843 842 main_mod = self._main_mod_cache[filename] = FakeModule()
844 843 else:
845 844 init_fakemod_dict(main_mod)
846 845
847 846 return main_mod
848 847
849 848 def clear_main_mod_cache(self):
850 849 """Clear the cache of main modules.
851 850
852 851 Mainly for use by utilities like %reset.
853 852
854 853 Examples
855 854 --------
856 855
857 856 In [15]: import IPython
858 857
859 858 In [16]: m = _ip.new_main_mod(IPython.__file__)
860 859
861 860 In [17]: len(_ip._main_mod_cache) > 0
862 861 Out[17]: True
863 862
864 863 In [18]: _ip.clear_main_mod_cache()
865 864
866 865 In [19]: len(_ip._main_mod_cache) == 0
867 866 Out[19]: True
868 867 """
869 868 self._main_mod_cache.clear()
870 869
871 870 #-------------------------------------------------------------------------
872 871 # Things related to debugging
873 872 #-------------------------------------------------------------------------
874 873
875 874 def init_pdb(self):
876 875 # Set calling of pdb on exceptions
877 876 # self.call_pdb is a property
878 877 self.call_pdb = self.pdb
879 878
880 879 def _get_call_pdb(self):
881 880 return self._call_pdb
882 881
883 882 def _set_call_pdb(self,val):
884 883
885 884 if val not in (0,1,False,True):
886 885 raise ValueError('new call_pdb value must be boolean')
887 886
888 887 # store value in instance
889 888 self._call_pdb = val
890 889
891 890 # notify the actual exception handlers
892 891 self.InteractiveTB.call_pdb = val
893 892
894 893 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
895 894 'Control auto-activation of pdb at exceptions')
896 895
897 896 def debugger(self,force=False):
898 897 """Call the pydb/pdb debugger.
899 898
900 899 Keywords:
901 900
902 901 - force(False): by default, this routine checks the instance call_pdb
903 902 flag and does not actually invoke the debugger if the flag is false.
904 903 The 'force' option forces the debugger to activate even if the flag
905 904 is false.
906 905 """
907 906
908 907 if not (force or self.call_pdb):
909 908 return
910 909
911 910 if not hasattr(sys,'last_traceback'):
912 911 error('No traceback has been produced, nothing to debug.')
913 912 return
914 913
915 914 # use pydb if available
916 915 if debugger.has_pydb:
917 916 from pydb import pm
918 917 else:
919 918 # fallback to our internal debugger
920 919 pm = lambda : self.InteractiveTB.debugger(force=True)
921 920
922 921 with self.readline_no_record:
923 922 pm()
924 923
925 924 #-------------------------------------------------------------------------
926 925 # Things related to IPython's various namespaces
927 926 #-------------------------------------------------------------------------
928 927 default_user_namespaces = True
929 928
930 929 def init_create_namespaces(self, user_module=None, user_ns=None):
931 930 # Create the namespace where the user will operate. user_ns is
932 931 # normally the only one used, and it is passed to the exec calls as
933 932 # the locals argument. But we do carry a user_global_ns namespace
934 933 # given as the exec 'globals' argument, This is useful in embedding
935 934 # situations where the ipython shell opens in a context where the
936 935 # distinction between locals and globals is meaningful. For
937 936 # non-embedded contexts, it is just the same object as the user_ns dict.
938 937
939 938 # FIXME. For some strange reason, __builtins__ is showing up at user
940 939 # level as a dict instead of a module. This is a manual fix, but I
941 940 # should really track down where the problem is coming from. Alex
942 941 # Schmolck reported this problem first.
943 942
944 943 # A useful post by Alex Martelli on this topic:
945 944 # Re: inconsistent value from __builtins__
946 945 # Von: Alex Martelli <aleaxit@yahoo.com>
947 946 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
948 947 # Gruppen: comp.lang.python
949 948
950 949 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
951 950 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
952 951 # > <type 'dict'>
953 952 # > >>> print type(__builtins__)
954 953 # > <type 'module'>
955 954 # > Is this difference in return value intentional?
956 955
957 956 # Well, it's documented that '__builtins__' can be either a dictionary
958 957 # or a module, and it's been that way for a long time. Whether it's
959 958 # intentional (or sensible), I don't know. In any case, the idea is
960 959 # that if you need to access the built-in namespace directly, you
961 960 # should start with "import __builtin__" (note, no 's') which will
962 961 # definitely give you a module. Yeah, it's somewhat confusing:-(.
963 962
964 963 # These routines return a properly built module and dict as needed by
965 964 # the rest of the code, and can also be used by extension writers to
966 965 # generate properly initialized namespaces.
967 966 if (user_ns is not None) or (user_module is not None):
968 967 self.default_user_namespaces = False
969 968 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
970 969
971 970 # A record of hidden variables we have added to the user namespace, so
972 971 # we can list later only variables defined in actual interactive use.
973 972 self.user_ns_hidden = set()
974 973
975 974 # Now that FakeModule produces a real module, we've run into a nasty
976 975 # problem: after script execution (via %run), the module where the user
977 976 # code ran is deleted. Now that this object is a true module (needed
978 977 # so docetst and other tools work correctly), the Python module
979 978 # teardown mechanism runs over it, and sets to None every variable
980 979 # present in that module. Top-level references to objects from the
981 980 # script survive, because the user_ns is updated with them. However,
982 981 # calling functions defined in the script that use other things from
983 982 # the script will fail, because the function's closure had references
984 983 # to the original objects, which are now all None. So we must protect
985 984 # these modules from deletion by keeping a cache.
986 985 #
987 986 # To avoid keeping stale modules around (we only need the one from the
988 987 # last run), we use a dict keyed with the full path to the script, so
989 988 # only the last version of the module is held in the cache. Note,
990 989 # however, that we must cache the module *namespace contents* (their
991 990 # __dict__). Because if we try to cache the actual modules, old ones
992 991 # (uncached) could be destroyed while still holding references (such as
993 992 # those held by GUI objects that tend to be long-lived)>
994 993 #
995 994 # The %reset command will flush this cache. See the cache_main_mod()
996 995 # and clear_main_mod_cache() methods for details on use.
997 996
998 997 # This is the cache used for 'main' namespaces
999 998 self._main_mod_cache = {}
1000 999
1001 1000 # A table holding all the namespaces IPython deals with, so that
1002 1001 # introspection facilities can search easily.
1003 1002 self.ns_table = {'user_global':self.user_module.__dict__,
1004 1003 'user_local':self.user_ns,
1005 1004 'builtin':builtin_mod.__dict__
1006 1005 }
1007 1006
1008 1007 @property
1009 1008 def user_global_ns(self):
1010 1009 return self.user_module.__dict__
1011 1010
1012 1011 def prepare_user_module(self, user_module=None, user_ns=None):
1013 1012 """Prepare the module and namespace in which user code will be run.
1014 1013
1015 1014 When IPython is started normally, both parameters are None: a new module
1016 1015 is created automatically, and its __dict__ used as the namespace.
1017 1016
1018 1017 If only user_module is provided, its __dict__ is used as the namespace.
1019 1018 If only user_ns is provided, a dummy module is created, and user_ns
1020 1019 becomes the global namespace. If both are provided (as they may be
1021 1020 when embedding), user_ns is the local namespace, and user_module
1022 1021 provides the global namespace.
1023 1022
1024 1023 Parameters
1025 1024 ----------
1026 1025 user_module : module, optional
1027 1026 The current user module in which IPython is being run. If None,
1028 1027 a clean module will be created.
1029 1028 user_ns : dict, optional
1030 1029 A namespace in which to run interactive commands.
1031 1030
1032 1031 Returns
1033 1032 -------
1034 1033 A tuple of user_module and user_ns, each properly initialised.
1035 1034 """
1036 1035 if user_module is None and user_ns is not None:
1037 1036 user_ns.setdefault("__name__", "__main__")
1038 1037 class DummyMod(object):
1039 1038 "A dummy module used for IPython's interactive namespace."
1040 1039 pass
1041 1040 user_module = DummyMod()
1042 1041 user_module.__dict__ = user_ns
1043 1042
1044 1043 if user_module is None:
1045 1044 user_module = types.ModuleType("__main__",
1046 1045 doc="Automatically created module for IPython interactive environment")
1047 1046
1048 1047 # We must ensure that __builtin__ (without the final 's') is always
1049 1048 # available and pointing to the __builtin__ *module*. For more details:
1050 1049 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1051 1050 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1052 1051 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1053 1052
1054 1053 if user_ns is None:
1055 1054 user_ns = user_module.__dict__
1056 1055
1057 1056 return user_module, user_ns
1058 1057
1059 1058 def init_sys_modules(self):
1060 1059 # We need to insert into sys.modules something that looks like a
1061 1060 # module but which accesses the IPython namespace, for shelve and
1062 1061 # pickle to work interactively. Normally they rely on getting
1063 1062 # everything out of __main__, but for embedding purposes each IPython
1064 1063 # instance has its own private namespace, so we can't go shoving
1065 1064 # everything into __main__.
1066 1065
1067 1066 # note, however, that we should only do this for non-embedded
1068 1067 # ipythons, which really mimic the __main__.__dict__ with their own
1069 1068 # namespace. Embedded instances, on the other hand, should not do
1070 1069 # this because they need to manage the user local/global namespaces
1071 1070 # only, but they live within a 'normal' __main__ (meaning, they
1072 1071 # shouldn't overtake the execution environment of the script they're
1073 1072 # embedded in).
1074 1073
1075 1074 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1076 1075 main_name = self.user_module.__name__
1077 1076 sys.modules[main_name] = self.user_module
1078 1077
1079 1078 def init_user_ns(self):
1080 1079 """Initialize all user-visible namespaces to their minimum defaults.
1081 1080
1082 1081 Certain history lists are also initialized here, as they effectively
1083 1082 act as user namespaces.
1084 1083
1085 1084 Notes
1086 1085 -----
1087 1086 All data structures here are only filled in, they are NOT reset by this
1088 1087 method. If they were not empty before, data will simply be added to
1089 1088 therm.
1090 1089 """
1091 1090 # This function works in two parts: first we put a few things in
1092 1091 # user_ns, and we sync that contents into user_ns_hidden so that these
1093 1092 # initial variables aren't shown by %who. After the sync, we add the
1094 1093 # rest of what we *do* want the user to see with %who even on a new
1095 1094 # session (probably nothing, so theye really only see their own stuff)
1096 1095
1097 1096 # The user dict must *always* have a __builtin__ reference to the
1098 1097 # Python standard __builtin__ namespace, which must be imported.
1099 1098 # This is so that certain operations in prompt evaluation can be
1100 1099 # reliably executed with builtins. Note that we can NOT use
1101 1100 # __builtins__ (note the 's'), because that can either be a dict or a
1102 1101 # module, and can even mutate at runtime, depending on the context
1103 1102 # (Python makes no guarantees on it). In contrast, __builtin__ is
1104 1103 # always a module object, though it must be explicitly imported.
1105 1104
1106 1105 # For more details:
1107 1106 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1108 1107 ns = dict()
1109 1108
1110 1109 # Put 'help' in the user namespace
1111 1110 try:
1112 1111 from site import _Helper
1113 1112 ns['help'] = _Helper()
1114 1113 except ImportError:
1115 1114 warn('help() not available - check site.py')
1116 1115
1117 1116 # make global variables for user access to the histories
1118 1117 ns['_ih'] = self.history_manager.input_hist_parsed
1119 1118 ns['_oh'] = self.history_manager.output_hist
1120 1119 ns['_dh'] = self.history_manager.dir_hist
1121 1120
1122 1121 ns['_sh'] = shadowns
1123 1122
1124 1123 # user aliases to input and output histories. These shouldn't show up
1125 1124 # in %who, as they can have very large reprs.
1126 1125 ns['In'] = self.history_manager.input_hist_parsed
1127 1126 ns['Out'] = self.history_manager.output_hist
1128 1127
1129 1128 # Store myself as the public api!!!
1130 1129 ns['get_ipython'] = self.get_ipython
1131 1130
1132 1131 ns['exit'] = self.exiter
1133 1132 ns['quit'] = self.exiter
1134 1133
1135 1134 # Sync what we've added so far to user_ns_hidden so these aren't seen
1136 1135 # by %who
1137 1136 self.user_ns_hidden.update(ns)
1138 1137
1139 1138 # Anything put into ns now would show up in %who. Think twice before
1140 1139 # putting anything here, as we really want %who to show the user their
1141 1140 # stuff, not our variables.
1142 1141
1143 1142 # Finally, update the real user's namespace
1144 1143 self.user_ns.update(ns)
1145 1144
1146 1145 @property
1147 1146 def all_ns_refs(self):
1148 1147 """Get a list of references to all the namespace dictionaries in which
1149 1148 IPython might store a user-created object.
1150 1149
1151 1150 Note that this does not include the displayhook, which also caches
1152 1151 objects from the output."""
1153 1152 return [self.user_ns, self.user_global_ns] + \
1154 1153 [m.__dict__ for m in self._main_mod_cache.values()]
1155 1154
1156 1155 def reset(self, new_session=True):
1157 1156 """Clear all internal namespaces, and attempt to release references to
1158 1157 user objects.
1159 1158
1160 1159 If new_session is True, a new history session will be opened.
1161 1160 """
1162 1161 # Clear histories
1163 1162 self.history_manager.reset(new_session)
1164 1163 # Reset counter used to index all histories
1165 1164 if new_session:
1166 1165 self.execution_count = 1
1167 1166
1168 1167 # Flush cached output items
1169 1168 if self.displayhook.do_full_cache:
1170 1169 self.displayhook.flush()
1171 1170
1172 1171 # The main execution namespaces must be cleared very carefully,
1173 1172 # skipping the deletion of the builtin-related keys, because doing so
1174 1173 # would cause errors in many object's __del__ methods.
1175 1174 if self.user_ns is not self.user_global_ns:
1176 1175 self.user_ns.clear()
1177 1176 ns = self.user_global_ns
1178 1177 drop_keys = set(ns.keys())
1179 1178 drop_keys.discard('__builtin__')
1180 1179 drop_keys.discard('__builtins__')
1181 1180 drop_keys.discard('__name__')
1182 1181 for k in drop_keys:
1183 1182 del ns[k]
1184 1183
1185 1184 self.user_ns_hidden.clear()
1186 1185
1187 1186 # Restore the user namespaces to minimal usability
1188 1187 self.init_user_ns()
1189 1188
1190 1189 # Restore the default and user aliases
1191 1190 self.alias_manager.clear_aliases()
1192 1191 self.alias_manager.init_aliases()
1193 1192
1194 1193 # Flush the private list of module references kept for script
1195 1194 # execution protection
1196 1195 self.clear_main_mod_cache()
1197 1196
1198 1197 def del_var(self, varname, by_name=False):
1199 1198 """Delete a variable from the various namespaces, so that, as
1200 1199 far as possible, we're not keeping any hidden references to it.
1201 1200
1202 1201 Parameters
1203 1202 ----------
1204 1203 varname : str
1205 1204 The name of the variable to delete.
1206 1205 by_name : bool
1207 1206 If True, delete variables with the given name in each
1208 1207 namespace. If False (default), find the variable in the user
1209 1208 namespace, and delete references to it.
1210 1209 """
1211 1210 if varname in ('__builtin__', '__builtins__'):
1212 1211 raise ValueError("Refusing to delete %s" % varname)
1213 1212
1214 1213 ns_refs = self.all_ns_refs
1215 1214
1216 1215 if by_name: # Delete by name
1217 1216 for ns in ns_refs:
1218 1217 try:
1219 1218 del ns[varname]
1220 1219 except KeyError:
1221 1220 pass
1222 1221 else: # Delete by object
1223 1222 try:
1224 1223 obj = self.user_ns[varname]
1225 1224 except KeyError:
1226 1225 raise NameError("name '%s' is not defined" % varname)
1227 1226 # Also check in output history
1228 1227 ns_refs.append(self.history_manager.output_hist)
1229 1228 for ns in ns_refs:
1230 1229 to_delete = [n for n, o in ns.iteritems() if o is obj]
1231 1230 for name in to_delete:
1232 1231 del ns[name]
1233 1232
1234 1233 # displayhook keeps extra references, but not in a dictionary
1235 1234 for name in ('_', '__', '___'):
1236 1235 if getattr(self.displayhook, name) is obj:
1237 1236 setattr(self.displayhook, name, None)
1238 1237
1239 1238 def reset_selective(self, regex=None):
1240 1239 """Clear selective variables from internal namespaces based on a
1241 1240 specified regular expression.
1242 1241
1243 1242 Parameters
1244 1243 ----------
1245 1244 regex : string or compiled pattern, optional
1246 1245 A regular expression pattern that will be used in searching
1247 1246 variable names in the users namespaces.
1248 1247 """
1249 1248 if regex is not None:
1250 1249 try:
1251 1250 m = re.compile(regex)
1252 1251 except TypeError:
1253 1252 raise TypeError('regex must be a string or compiled pattern')
1254 1253 # Search for keys in each namespace that match the given regex
1255 1254 # If a match is found, delete the key/value pair.
1256 1255 for ns in self.all_ns_refs:
1257 1256 for var in ns:
1258 1257 if m.search(var):
1259 1258 del ns[var]
1260 1259
1261 1260 def push(self, variables, interactive=True):
1262 1261 """Inject a group of variables into the IPython user namespace.
1263 1262
1264 1263 Parameters
1265 1264 ----------
1266 1265 variables : dict, str or list/tuple of str
1267 1266 The variables to inject into the user's namespace. If a dict, a
1268 1267 simple update is done. If a str, the string is assumed to have
1269 1268 variable names separated by spaces. A list/tuple of str can also
1270 1269 be used to give the variable names. If just the variable names are
1271 1270 give (list/tuple/str) then the variable values looked up in the
1272 1271 callers frame.
1273 1272 interactive : bool
1274 1273 If True (default), the variables will be listed with the ``who``
1275 1274 magic.
1276 1275 """
1277 1276 vdict = None
1278 1277
1279 1278 # We need a dict of name/value pairs to do namespace updates.
1280 1279 if isinstance(variables, dict):
1281 1280 vdict = variables
1282 1281 elif isinstance(variables, (basestring, list, tuple)):
1283 1282 if isinstance(variables, basestring):
1284 1283 vlist = variables.split()
1285 1284 else:
1286 1285 vlist = variables
1287 1286 vdict = {}
1288 1287 cf = sys._getframe(1)
1289 1288 for name in vlist:
1290 1289 try:
1291 1290 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1292 1291 except:
1293 1292 print('Could not get variable %s from %s' %
1294 1293 (name,cf.f_code.co_name))
1295 1294 else:
1296 1295 raise ValueError('variables must be a dict/str/list/tuple')
1297 1296
1298 1297 # Propagate variables to user namespace
1299 1298 self.user_ns.update(vdict)
1300 1299
1301 1300 # And configure interactive visibility
1302 1301 user_ns_hidden = self.user_ns_hidden
1303 1302 if interactive:
1304 1303 user_ns_hidden.difference_update(vdict)
1305 1304 else:
1306 1305 user_ns_hidden.update(vdict)
1307 1306
1308 1307 def drop_by_id(self, variables):
1309 1308 """Remove a dict of variables from the user namespace, if they are the
1310 1309 same as the values in the dictionary.
1311 1310
1312 1311 This is intended for use by extensions: variables that they've added can
1313 1312 be taken back out if they are unloaded, without removing any that the
1314 1313 user has overwritten.
1315 1314
1316 1315 Parameters
1317 1316 ----------
1318 1317 variables : dict
1319 1318 A dictionary mapping object names (as strings) to the objects.
1320 1319 """
1321 1320 for name, obj in variables.iteritems():
1322 1321 if name in self.user_ns and self.user_ns[name] is obj:
1323 1322 del self.user_ns[name]
1324 1323 self.user_ns_hidden.discard(name)
1325 1324
1326 1325 #-------------------------------------------------------------------------
1327 1326 # Things related to object introspection
1328 1327 #-------------------------------------------------------------------------
1329 1328
1330 1329 def _ofind(self, oname, namespaces=None):
1331 1330 """Find an object in the available namespaces.
1332 1331
1333 1332 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1334 1333
1335 1334 Has special code to detect magic functions.
1336 1335 """
1337 1336 oname = oname.strip()
1338 1337 #print '1- oname: <%r>' % oname # dbg
1339 1338 if not oname.startswith(ESC_MAGIC) and \
1340 1339 not oname.startswith(ESC_MAGIC2) and \
1341 1340 not py3compat.isidentifier(oname, dotted=True):
1342 1341 return dict(found=False)
1343 1342
1344 1343 alias_ns = None
1345 1344 if namespaces is None:
1346 1345 # Namespaces to search in:
1347 1346 # Put them in a list. The order is important so that we
1348 1347 # find things in the same order that Python finds them.
1349 1348 namespaces = [ ('Interactive', self.user_ns),
1350 1349 ('Interactive (global)', self.user_global_ns),
1351 1350 ('Python builtin', builtin_mod.__dict__),
1352 1351 ('Alias', self.alias_manager.alias_table),
1353 1352 ]
1354 1353 alias_ns = self.alias_manager.alias_table
1355 1354
1356 1355 # initialize results to 'null'
1357 1356 found = False; obj = None; ospace = None; ds = None;
1358 1357 ismagic = False; isalias = False; parent = None
1359 1358
1360 1359 # We need to special-case 'print', which as of python2.6 registers as a
1361 1360 # function but should only be treated as one if print_function was
1362 1361 # loaded with a future import. In this case, just bail.
1363 1362 if (oname == 'print' and not py3compat.PY3 and not \
1364 1363 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1365 1364 return {'found':found, 'obj':obj, 'namespace':ospace,
1366 1365 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1367 1366
1368 1367 # Look for the given name by splitting it in parts. If the head is
1369 1368 # found, then we look for all the remaining parts as members, and only
1370 1369 # declare success if we can find them all.
1371 1370 oname_parts = oname.split('.')
1372 1371 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1373 1372 for nsname,ns in namespaces:
1374 1373 try:
1375 1374 obj = ns[oname_head]
1376 1375 except KeyError:
1377 1376 continue
1378 1377 else:
1379 1378 #print 'oname_rest:', oname_rest # dbg
1380 1379 for part in oname_rest:
1381 1380 try:
1382 1381 parent = obj
1383 1382 obj = getattr(obj,part)
1384 1383 except:
1385 1384 # Blanket except b/c some badly implemented objects
1386 1385 # allow __getattr__ to raise exceptions other than
1387 1386 # AttributeError, which then crashes IPython.
1388 1387 break
1389 1388 else:
1390 1389 # If we finish the for loop (no break), we got all members
1391 1390 found = True
1392 1391 ospace = nsname
1393 1392 if ns == alias_ns:
1394 1393 isalias = True
1395 1394 break # namespace loop
1396 1395
1397 1396 # Try to see if it's magic
1398 1397 if not found:
1399 1398 obj = None
1400 1399 if oname.startswith(ESC_MAGIC2):
1401 1400 oname = oname.lstrip(ESC_MAGIC2)
1402 1401 obj = self.find_cell_magic(oname)
1403 1402 elif oname.startswith(ESC_MAGIC):
1404 1403 oname = oname.lstrip(ESC_MAGIC)
1405 1404 obj = self.find_line_magic(oname)
1406 1405 else:
1407 1406 # search without prefix, so run? will find %run?
1408 1407 obj = self.find_line_magic(oname)
1409 1408 if obj is None:
1410 1409 obj = self.find_cell_magic(oname)
1411 1410 if obj is not None:
1412 1411 found = True
1413 1412 ospace = 'IPython internal'
1414 1413 ismagic = True
1415 1414
1416 1415 # Last try: special-case some literals like '', [], {}, etc:
1417 1416 if not found and oname_head in ["''",'""','[]','{}','()']:
1418 1417 obj = eval(oname_head)
1419 1418 found = True
1420 1419 ospace = 'Interactive'
1421 1420
1422 1421 return {'found':found, 'obj':obj, 'namespace':ospace,
1423 1422 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1424 1423
1425 1424 def _ofind_property(self, oname, info):
1426 1425 """Second part of object finding, to look for property details."""
1427 1426 if info.found:
1428 1427 # Get the docstring of the class property if it exists.
1429 1428 path = oname.split('.')
1430 1429 root = '.'.join(path[:-1])
1431 1430 if info.parent is not None:
1432 1431 try:
1433 1432 target = getattr(info.parent, '__class__')
1434 1433 # The object belongs to a class instance.
1435 1434 try:
1436 1435 target = getattr(target, path[-1])
1437 1436 # The class defines the object.
1438 1437 if isinstance(target, property):
1439 1438 oname = root + '.__class__.' + path[-1]
1440 1439 info = Struct(self._ofind(oname))
1441 1440 except AttributeError: pass
1442 1441 except AttributeError: pass
1443 1442
1444 1443 # We return either the new info or the unmodified input if the object
1445 1444 # hadn't been found
1446 1445 return info
1447 1446
1448 1447 def _object_find(self, oname, namespaces=None):
1449 1448 """Find an object and return a struct with info about it."""
1450 1449 inf = Struct(self._ofind(oname, namespaces))
1451 1450 return Struct(self._ofind_property(oname, inf))
1452 1451
1453 1452 def _inspect(self, meth, oname, namespaces=None, **kw):
1454 1453 """Generic interface to the inspector system.
1455 1454
1456 1455 This function is meant to be called by pdef, pdoc & friends."""
1457 1456 info = self._object_find(oname, namespaces)
1458 1457 if info.found:
1459 1458 pmethod = getattr(self.inspector, meth)
1460 1459 formatter = format_screen if info.ismagic else None
1461 1460 if meth == 'pdoc':
1462 1461 pmethod(info.obj, oname, formatter)
1463 1462 elif meth == 'pinfo':
1464 1463 pmethod(info.obj, oname, formatter, info, **kw)
1465 1464 else:
1466 1465 pmethod(info.obj, oname)
1467 1466 else:
1468 1467 print('Object `%s` not found.' % oname)
1469 1468 return 'not found' # so callers can take other action
1470 1469
1471 1470 def object_inspect(self, oname, detail_level=0):
1472 1471 with self.builtin_trap:
1473 1472 info = self._object_find(oname)
1474 1473 if info.found:
1475 1474 return self.inspector.info(info.obj, oname, info=info,
1476 1475 detail_level=detail_level
1477 1476 )
1478 1477 else:
1479 1478 return oinspect.object_info(name=oname, found=False)
1480 1479
1481 1480 #-------------------------------------------------------------------------
1482 1481 # Things related to history management
1483 1482 #-------------------------------------------------------------------------
1484 1483
1485 1484 def init_history(self):
1486 1485 """Sets up the command history, and starts regular autosaves."""
1487 1486 self.history_manager = HistoryManager(shell=self, parent=self)
1488 1487 self.configurables.append(self.history_manager)
1489 1488
1490 1489 #-------------------------------------------------------------------------
1491 1490 # Things related to exception handling and tracebacks (not debugging)
1492 1491 #-------------------------------------------------------------------------
1493 1492
1494 1493 def init_traceback_handlers(self, custom_exceptions):
1495 1494 # Syntax error handler.
1496 1495 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1497 1496
1498 1497 # The interactive one is initialized with an offset, meaning we always
1499 1498 # want to remove the topmost item in the traceback, which is our own
1500 1499 # internal code. Valid modes: ['Plain','Context','Verbose']
1501 1500 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1502 1501 color_scheme='NoColor',
1503 1502 tb_offset = 1,
1504 1503 check_cache=check_linecache_ipython)
1505 1504
1506 1505 # The instance will store a pointer to the system-wide exception hook,
1507 1506 # so that runtime code (such as magics) can access it. This is because
1508 1507 # during the read-eval loop, it may get temporarily overwritten.
1509 1508 self.sys_excepthook = sys.excepthook
1510 1509
1511 1510 # and add any custom exception handlers the user may have specified
1512 1511 self.set_custom_exc(*custom_exceptions)
1513 1512
1514 1513 # Set the exception mode
1515 1514 self.InteractiveTB.set_mode(mode=self.xmode)
1516 1515
1517 1516 def set_custom_exc(self, exc_tuple, handler):
1518 1517 """set_custom_exc(exc_tuple,handler)
1519 1518
1520 1519 Set a custom exception handler, which will be called if any of the
1521 1520 exceptions in exc_tuple occur in the mainloop (specifically, in the
1522 1521 run_code() method).
1523 1522
1524 1523 Parameters
1525 1524 ----------
1526 1525
1527 1526 exc_tuple : tuple of exception classes
1528 1527 A *tuple* of exception classes, for which to call the defined
1529 1528 handler. It is very important that you use a tuple, and NOT A
1530 1529 LIST here, because of the way Python's except statement works. If
1531 1530 you only want to trap a single exception, use a singleton tuple::
1532 1531
1533 1532 exc_tuple == (MyCustomException,)
1534 1533
1535 1534 handler : callable
1536 1535 handler must have the following signature::
1537 1536
1538 1537 def my_handler(self, etype, value, tb, tb_offset=None):
1539 1538 ...
1540 1539 return structured_traceback
1541 1540
1542 1541 Your handler must return a structured traceback (a list of strings),
1543 1542 or None.
1544 1543
1545 1544 This will be made into an instance method (via types.MethodType)
1546 1545 of IPython itself, and it will be called if any of the exceptions
1547 1546 listed in the exc_tuple are caught. If the handler is None, an
1548 1547 internal basic one is used, which just prints basic info.
1549 1548
1550 1549 To protect IPython from crashes, if your handler ever raises an
1551 1550 exception or returns an invalid result, it will be immediately
1552 1551 disabled.
1553 1552
1554 1553 WARNING: by putting in your own exception handler into IPython's main
1555 1554 execution loop, you run a very good chance of nasty crashes. This
1556 1555 facility should only be used if you really know what you are doing."""
1557 1556
1558 1557 assert type(exc_tuple)==type(()) , \
1559 1558 "The custom exceptions must be given AS A TUPLE."
1560 1559
1561 1560 def dummy_handler(self,etype,value,tb,tb_offset=None):
1562 1561 print('*** Simple custom exception handler ***')
1563 1562 print('Exception type :',etype)
1564 1563 print('Exception value:',value)
1565 1564 print('Traceback :',tb)
1566 1565 #print 'Source code :','\n'.join(self.buffer)
1567 1566
1568 1567 def validate_stb(stb):
1569 1568 """validate structured traceback return type
1570 1569
1571 1570 return type of CustomTB *should* be a list of strings, but allow
1572 1571 single strings or None, which are harmless.
1573 1572
1574 1573 This function will *always* return a list of strings,
1575 1574 and will raise a TypeError if stb is inappropriate.
1576 1575 """
1577 1576 msg = "CustomTB must return list of strings, not %r" % stb
1578 1577 if stb is None:
1579 1578 return []
1580 1579 elif isinstance(stb, basestring):
1581 1580 return [stb]
1582 1581 elif not isinstance(stb, list):
1583 1582 raise TypeError(msg)
1584 1583 # it's a list
1585 1584 for line in stb:
1586 1585 # check every element
1587 1586 if not isinstance(line, basestring):
1588 1587 raise TypeError(msg)
1589 1588 return stb
1590 1589
1591 1590 if handler is None:
1592 1591 wrapped = dummy_handler
1593 1592 else:
1594 1593 def wrapped(self,etype,value,tb,tb_offset=None):
1595 1594 """wrap CustomTB handler, to protect IPython from user code
1596 1595
1597 1596 This makes it harder (but not impossible) for custom exception
1598 1597 handlers to crash IPython.
1599 1598 """
1600 1599 try:
1601 1600 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1602 1601 return validate_stb(stb)
1603 1602 except:
1604 1603 # clear custom handler immediately
1605 1604 self.set_custom_exc((), None)
1606 1605 print("Custom TB Handler failed, unregistering", file=io.stderr)
1607 1606 # show the exception in handler first
1608 1607 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1609 1608 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1610 1609 print("The original exception:", file=io.stdout)
1611 1610 stb = self.InteractiveTB.structured_traceback(
1612 1611 (etype,value,tb), tb_offset=tb_offset
1613 1612 )
1614 1613 return stb
1615 1614
1616 1615 self.CustomTB = types.MethodType(wrapped,self)
1617 1616 self.custom_exceptions = exc_tuple
1618 1617
1619 1618 def excepthook(self, etype, value, tb):
1620 1619 """One more defense for GUI apps that call sys.excepthook.
1621 1620
1622 1621 GUI frameworks like wxPython trap exceptions and call
1623 1622 sys.excepthook themselves. I guess this is a feature that
1624 1623 enables them to keep running after exceptions that would
1625 1624 otherwise kill their mainloop. This is a bother for IPython
1626 1625 which excepts to catch all of the program exceptions with a try:
1627 1626 except: statement.
1628 1627
1629 1628 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1630 1629 any app directly invokes sys.excepthook, it will look to the user like
1631 1630 IPython crashed. In order to work around this, we can disable the
1632 1631 CrashHandler and replace it with this excepthook instead, which prints a
1633 1632 regular traceback using our InteractiveTB. In this fashion, apps which
1634 1633 call sys.excepthook will generate a regular-looking exception from
1635 1634 IPython, and the CrashHandler will only be triggered by real IPython
1636 1635 crashes.
1637 1636
1638 1637 This hook should be used sparingly, only in places which are not likely
1639 1638 to be true IPython errors.
1640 1639 """
1641 1640 self.showtraceback((etype,value,tb),tb_offset=0)
1642 1641
1643 1642 def _get_exc_info(self, exc_tuple=None):
1644 1643 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1645 1644
1646 1645 Ensures sys.last_type,value,traceback hold the exc_info we found,
1647 1646 from whichever source.
1648 1647
1649 1648 raises ValueError if none of these contain any information
1650 1649 """
1651 1650 if exc_tuple is None:
1652 1651 etype, value, tb = sys.exc_info()
1653 1652 else:
1654 1653 etype, value, tb = exc_tuple
1655 1654
1656 1655 if etype is None:
1657 1656 if hasattr(sys, 'last_type'):
1658 1657 etype, value, tb = sys.last_type, sys.last_value, \
1659 1658 sys.last_traceback
1660 1659
1661 1660 if etype is None:
1662 1661 raise ValueError("No exception to find")
1663 1662
1664 1663 # Now store the exception info in sys.last_type etc.
1665 1664 # WARNING: these variables are somewhat deprecated and not
1666 1665 # necessarily safe to use in a threaded environment, but tools
1667 1666 # like pdb depend on their existence, so let's set them. If we
1668 1667 # find problems in the field, we'll need to revisit their use.
1669 1668 sys.last_type = etype
1670 1669 sys.last_value = value
1671 1670 sys.last_traceback = tb
1672 1671
1673 1672 return etype, value, tb
1674 1673
1675 1674 def show_usage_error(self, exc):
1676 1675 """Show a short message for UsageErrors
1677 1676
1678 1677 These are special exceptions that shouldn't show a traceback.
1679 1678 """
1680 1679 self.write_err("UsageError: %s" % exc)
1681 1680
1682 1681 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1683 1682 exception_only=False):
1684 1683 """Display the exception that just occurred.
1685 1684
1686 1685 If nothing is known about the exception, this is the method which
1687 1686 should be used throughout the code for presenting user tracebacks,
1688 1687 rather than directly invoking the InteractiveTB object.
1689 1688
1690 1689 A specific showsyntaxerror() also exists, but this method can take
1691 1690 care of calling it if needed, so unless you are explicitly catching a
1692 1691 SyntaxError exception, don't try to analyze the stack manually and
1693 1692 simply call this method."""
1694 1693
1695 1694 try:
1696 1695 try:
1697 1696 etype, value, tb = self._get_exc_info(exc_tuple)
1698 1697 except ValueError:
1699 1698 self.write_err('No traceback available to show.\n')
1700 1699 return
1701 1700
1702 1701 if issubclass(etype, SyntaxError):
1703 1702 # Though this won't be called by syntax errors in the input
1704 1703 # line, there may be SyntaxError cases with imported code.
1705 1704 self.showsyntaxerror(filename)
1706 1705 elif etype is UsageError:
1707 1706 self.show_usage_error(value)
1708 1707 else:
1709 1708 if exception_only:
1710 1709 stb = ['An exception has occurred, use %tb to see '
1711 1710 'the full traceback.\n']
1712 1711 stb.extend(self.InteractiveTB.get_exception_only(etype,
1713 1712 value))
1714 1713 else:
1715 1714 try:
1716 1715 # Exception classes can customise their traceback - we
1717 1716 # use this in IPython.parallel for exceptions occurring
1718 1717 # in the engines. This should return a list of strings.
1719 1718 stb = value._render_traceback_()
1720 1719 except Exception:
1721 1720 stb = self.InteractiveTB.structured_traceback(etype,
1722 1721 value, tb, tb_offset=tb_offset)
1723 1722
1724 1723 self._showtraceback(etype, value, stb)
1725 1724 if self.call_pdb:
1726 1725 # drop into debugger
1727 1726 self.debugger(force=True)
1728 1727 return
1729 1728
1730 1729 # Actually show the traceback
1731 1730 self._showtraceback(etype, value, stb)
1732 1731
1733 1732 except KeyboardInterrupt:
1734 1733 self.write_err("\nKeyboardInterrupt\n")
1735 1734
1736 1735 def _showtraceback(self, etype, evalue, stb):
1737 1736 """Actually show a traceback.
1738 1737
1739 1738 Subclasses may override this method to put the traceback on a different
1740 1739 place, like a side channel.
1741 1740 """
1742 1741 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1743 1742
1744 1743 def showsyntaxerror(self, filename=None):
1745 1744 """Display the syntax error that just occurred.
1746 1745
1747 1746 This doesn't display a stack trace because there isn't one.
1748 1747
1749 1748 If a filename is given, it is stuffed in the exception instead
1750 1749 of what was there before (because Python's parser always uses
1751 1750 "<string>" when reading from a string).
1752 1751 """
1753 1752 etype, value, last_traceback = self._get_exc_info()
1754 1753
1755 1754 if filename and issubclass(etype, SyntaxError):
1756 1755 try:
1757 1756 value.filename = filename
1758 1757 except:
1759 1758 # Not the format we expect; leave it alone
1760 1759 pass
1761 1760
1762 1761 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1763 1762 self._showtraceback(etype, value, stb)
1764 1763
1765 1764 # This is overridden in TerminalInteractiveShell to show a message about
1766 1765 # the %paste magic.
1767 1766 def showindentationerror(self):
1768 1767 """Called by run_cell when there's an IndentationError in code entered
1769 1768 at the prompt.
1770 1769
1771 1770 This is overridden in TerminalInteractiveShell to show a message about
1772 1771 the %paste magic."""
1773 1772 self.showsyntaxerror()
1774 1773
1775 1774 #-------------------------------------------------------------------------
1776 1775 # Things related to readline
1777 1776 #-------------------------------------------------------------------------
1778 1777
1779 1778 def init_readline(self):
1780 1779 """Command history completion/saving/reloading."""
1781 1780
1782 1781 if self.readline_use:
1783 1782 import IPython.utils.rlineimpl as readline
1784 1783
1785 1784 self.rl_next_input = None
1786 1785 self.rl_do_indent = False
1787 1786
1788 1787 if not self.readline_use or not readline.have_readline:
1789 1788 self.has_readline = False
1790 1789 self.readline = None
1791 1790 # Set a number of methods that depend on readline to be no-op
1792 1791 self.readline_no_record = no_op_context
1793 1792 self.set_readline_completer = no_op
1794 1793 self.set_custom_completer = no_op
1795 1794 if self.readline_use:
1796 1795 warn('Readline services not available or not loaded.')
1797 1796 else:
1798 1797 self.has_readline = True
1799 1798 self.readline = readline
1800 1799 sys.modules['readline'] = readline
1801 1800
1802 1801 # Platform-specific configuration
1803 1802 if os.name == 'nt':
1804 1803 # FIXME - check with Frederick to see if we can harmonize
1805 1804 # naming conventions with pyreadline to avoid this
1806 1805 # platform-dependent check
1807 1806 self.readline_startup_hook = readline.set_pre_input_hook
1808 1807 else:
1809 1808 self.readline_startup_hook = readline.set_startup_hook
1810 1809
1811 1810 # Load user's initrc file (readline config)
1812 1811 # Or if libedit is used, load editrc.
1813 1812 inputrc_name = os.environ.get('INPUTRC')
1814 1813 if inputrc_name is None:
1815 1814 inputrc_name = '.inputrc'
1816 1815 if readline.uses_libedit:
1817 1816 inputrc_name = '.editrc'
1818 1817 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1819 1818 if os.path.isfile(inputrc_name):
1820 1819 try:
1821 1820 readline.read_init_file(inputrc_name)
1822 1821 except:
1823 1822 warn('Problems reading readline initialization file <%s>'
1824 1823 % inputrc_name)
1825 1824
1826 1825 # Configure readline according to user's prefs
1827 1826 # This is only done if GNU readline is being used. If libedit
1828 1827 # is being used (as on Leopard) the readline config is
1829 1828 # not run as the syntax for libedit is different.
1830 1829 if not readline.uses_libedit:
1831 1830 for rlcommand in self.readline_parse_and_bind:
1832 1831 #print "loading rl:",rlcommand # dbg
1833 1832 readline.parse_and_bind(rlcommand)
1834 1833
1835 1834 # Remove some chars from the delimiters list. If we encounter
1836 1835 # unicode chars, discard them.
1837 1836 delims = readline.get_completer_delims()
1838 1837 if not py3compat.PY3:
1839 1838 delims = delims.encode("ascii", "ignore")
1840 1839 for d in self.readline_remove_delims:
1841 1840 delims = delims.replace(d, "")
1842 1841 delims = delims.replace(ESC_MAGIC, '')
1843 1842 readline.set_completer_delims(delims)
1844 1843 # Store these so we can restore them if something like rpy2 modifies
1845 1844 # them.
1846 1845 self.readline_delims = delims
1847 1846 # otherwise we end up with a monster history after a while:
1848 1847 readline.set_history_length(self.history_length)
1849 1848
1850 1849 self.refill_readline_hist()
1851 1850 self.readline_no_record = ReadlineNoRecord(self)
1852 1851
1853 1852 # Configure auto-indent for all platforms
1854 1853 self.set_autoindent(self.autoindent)
1855 1854
1856 1855 def refill_readline_hist(self):
1857 1856 # Load the last 1000 lines from history
1858 1857 self.readline.clear_history()
1859 1858 stdin_encoding = sys.stdin.encoding or "utf-8"
1860 1859 last_cell = u""
1861 1860 for _, _, cell in self.history_manager.get_tail(1000,
1862 1861 include_latest=True):
1863 1862 # Ignore blank lines and consecutive duplicates
1864 1863 cell = cell.rstrip()
1865 1864 if cell and (cell != last_cell):
1866 1865 if self.multiline_history:
1867 1866 self.readline.add_history(py3compat.unicode_to_str(cell,
1868 1867 stdin_encoding))
1869 1868 else:
1870 1869 for line in cell.splitlines():
1871 1870 self.readline.add_history(py3compat.unicode_to_str(line,
1872 1871 stdin_encoding))
1873 1872 last_cell = cell
1874 1873
1875 1874 @skip_doctest
1876 1875 def set_next_input(self, s):
1877 1876 """ Sets the 'default' input string for the next command line.
1878 1877
1879 1878 Requires readline.
1880 1879
1881 1880 Example::
1882 1881
1883 1882 In [1]: _ip.set_next_input("Hello Word")
1884 1883 In [2]: Hello Word_ # cursor is here
1885 1884 """
1886 1885 self.rl_next_input = py3compat.cast_bytes_py2(s)
1887 1886
1888 1887 # Maybe move this to the terminal subclass?
1889 1888 def pre_readline(self):
1890 1889 """readline hook to be used at the start of each line.
1891 1890
1892 1891 Currently it handles auto-indent only."""
1893 1892
1894 1893 if self.rl_do_indent:
1895 1894 self.readline.insert_text(self._indent_current_str())
1896 1895 if self.rl_next_input is not None:
1897 1896 self.readline.insert_text(self.rl_next_input)
1898 1897 self.rl_next_input = None
1899 1898
1900 1899 def _indent_current_str(self):
1901 1900 """return the current level of indentation as a string"""
1902 1901 return self.input_splitter.indent_spaces * ' '
1903 1902
1904 1903 #-------------------------------------------------------------------------
1905 1904 # Things related to text completion
1906 1905 #-------------------------------------------------------------------------
1907 1906
1908 1907 def init_completer(self):
1909 1908 """Initialize the completion machinery.
1910 1909
1911 1910 This creates completion machinery that can be used by client code,
1912 1911 either interactively in-process (typically triggered by the readline
1913 1912 library), programatically (such as in test suites) or out-of-prcess
1914 1913 (typically over the network by remote frontends).
1915 1914 """
1916 1915 from IPython.core.completer import IPCompleter
1917 1916 from IPython.core.completerlib import (module_completer,
1918 1917 magic_run_completer, cd_completer, reset_completer)
1919 1918
1920 1919 self.Completer = IPCompleter(shell=self,
1921 1920 namespace=self.user_ns,
1922 1921 global_namespace=self.user_global_ns,
1923 1922 alias_table=self.alias_manager.alias_table,
1924 1923 use_readline=self.has_readline,
1925 1924 parent=self,
1926 1925 )
1927 1926 self.configurables.append(self.Completer)
1928 1927
1929 1928 # Add custom completers to the basic ones built into IPCompleter
1930 1929 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1931 1930 self.strdispatchers['complete_command'] = sdisp
1932 1931 self.Completer.custom_completers = sdisp
1933 1932
1934 1933 self.set_hook('complete_command', module_completer, str_key = 'import')
1935 1934 self.set_hook('complete_command', module_completer, str_key = 'from')
1936 1935 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1937 1936 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1938 1937 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1939 1938
1940 1939 # Only configure readline if we truly are using readline. IPython can
1941 1940 # do tab-completion over the network, in GUIs, etc, where readline
1942 1941 # itself may be absent
1943 1942 if self.has_readline:
1944 1943 self.set_readline_completer()
1945 1944
1946 1945 def complete(self, text, line=None, cursor_pos=None):
1947 1946 """Return the completed text and a list of completions.
1948 1947
1949 1948 Parameters
1950 1949 ----------
1951 1950
1952 1951 text : string
1953 1952 A string of text to be completed on. It can be given as empty and
1954 1953 instead a line/position pair are given. In this case, the
1955 1954 completer itself will split the line like readline does.
1956 1955
1957 1956 line : string, optional
1958 1957 The complete line that text is part of.
1959 1958
1960 1959 cursor_pos : int, optional
1961 1960 The position of the cursor on the input line.
1962 1961
1963 1962 Returns
1964 1963 -------
1965 1964 text : string
1966 1965 The actual text that was completed.
1967 1966
1968 1967 matches : list
1969 1968 A sorted list with all possible completions.
1970 1969
1971 1970 The optional arguments allow the completion to take more context into
1972 1971 account, and are part of the low-level completion API.
1973 1972
1974 1973 This is a wrapper around the completion mechanism, similar to what
1975 1974 readline does at the command line when the TAB key is hit. By
1976 1975 exposing it as a method, it can be used by other non-readline
1977 1976 environments (such as GUIs) for text completion.
1978 1977
1979 1978 Simple usage example:
1980 1979
1981 1980 In [1]: x = 'hello'
1982 1981
1983 1982 In [2]: _ip.complete('x.l')
1984 1983 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1985 1984 """
1986 1985
1987 1986 # Inject names into __builtin__ so we can complete on the added names.
1988 1987 with self.builtin_trap:
1989 1988 return self.Completer.complete(text, line, cursor_pos)
1990 1989
1991 1990 def set_custom_completer(self, completer, pos=0):
1992 1991 """Adds a new custom completer function.
1993 1992
1994 1993 The position argument (defaults to 0) is the index in the completers
1995 1994 list where you want the completer to be inserted."""
1996 1995
1997 1996 newcomp = types.MethodType(completer,self.Completer)
1998 1997 self.Completer.matchers.insert(pos,newcomp)
1999 1998
2000 1999 def set_readline_completer(self):
2001 2000 """Reset readline's completer to be our own."""
2002 2001 self.readline.set_completer(self.Completer.rlcomplete)
2003 2002
2004 2003 def set_completer_frame(self, frame=None):
2005 2004 """Set the frame of the completer."""
2006 2005 if frame:
2007 2006 self.Completer.namespace = frame.f_locals
2008 2007 self.Completer.global_namespace = frame.f_globals
2009 2008 else:
2010 2009 self.Completer.namespace = self.user_ns
2011 2010 self.Completer.global_namespace = self.user_global_ns
2012 2011
2013 2012 #-------------------------------------------------------------------------
2014 2013 # Things related to magics
2015 2014 #-------------------------------------------------------------------------
2016 2015
2017 2016 def init_magics(self):
2018 2017 from IPython.core import magics as m
2019 2018 self.magics_manager = magic.MagicsManager(shell=self,
2020 2019 parent=self,
2021 2020 user_magics=m.UserMagics(self))
2022 2021 self.configurables.append(self.magics_manager)
2023 2022
2024 2023 # Expose as public API from the magics manager
2025 2024 self.register_magics = self.magics_manager.register
2026 2025 self.register_magic_function = self.magics_manager.register_function
2027 2026 self.define_magic = self.magics_manager.define_magic
2028 2027
2029 2028 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2030 2029 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2031 2030 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2032 2031 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2033 2032 )
2034 2033
2035 2034 # Register Magic Aliases
2036 2035 mman = self.magics_manager
2037 2036 # FIXME: magic aliases should be defined by the Magics classes
2038 2037 # or in MagicsManager, not here
2039 2038 mman.register_alias('ed', 'edit')
2040 2039 mman.register_alias('hist', 'history')
2041 2040 mman.register_alias('rep', 'recall')
2042 2041 mman.register_alias('SVG', 'svg', 'cell')
2043 2042 mman.register_alias('HTML', 'html', 'cell')
2044 2043 mman.register_alias('file', 'writefile', 'cell')
2045 2044
2046 2045 # FIXME: Move the color initialization to the DisplayHook, which
2047 2046 # should be split into a prompt manager and displayhook. We probably
2048 2047 # even need a centralize colors management object.
2049 2048 self.magic('colors %s' % self.colors)
2050 2049
2051 2050 def run_line_magic(self, magic_name, line):
2052 2051 """Execute the given line magic.
2053 2052
2054 2053 Parameters
2055 2054 ----------
2056 2055 magic_name : str
2057 2056 Name of the desired magic function, without '%' prefix.
2058 2057
2059 2058 line : str
2060 2059 The rest of the input line as a single string.
2061 2060 """
2062 2061 fn = self.find_line_magic(magic_name)
2063 2062 if fn is None:
2064 2063 cm = self.find_cell_magic(magic_name)
2065 2064 etpl = "Line magic function `%%%s` not found%s."
2066 2065 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2067 2066 'did you mean that instead?)' % magic_name )
2068 2067 error(etpl % (magic_name, extra))
2069 2068 else:
2070 2069 # Note: this is the distance in the stack to the user's frame.
2071 2070 # This will need to be updated if the internal calling logic gets
2072 2071 # refactored, or else we'll be expanding the wrong variables.
2073 2072 stack_depth = 2
2074 2073 magic_arg_s = self.var_expand(line, stack_depth)
2075 2074 # Put magic args in a list so we can call with f(*a) syntax
2076 2075 args = [magic_arg_s]
2077 2076 kwargs = {}
2078 2077 # Grab local namespace if we need it:
2079 2078 if getattr(fn, "needs_local_scope", False):
2080 2079 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2081 2080 with self.builtin_trap:
2082 2081 result = fn(*args,**kwargs)
2083 2082 return result
2084 2083
2085 2084 def run_cell_magic(self, magic_name, line, cell):
2086 2085 """Execute the given cell magic.
2087 2086
2088 2087 Parameters
2089 2088 ----------
2090 2089 magic_name : str
2091 2090 Name of the desired magic function, without '%' prefix.
2092 2091
2093 2092 line : str
2094 2093 The rest of the first input line as a single string.
2095 2094
2096 2095 cell : str
2097 2096 The body of the cell as a (possibly multiline) string.
2098 2097 """
2099 2098 fn = self.find_cell_magic(magic_name)
2100 2099 if fn is None:
2101 2100 lm = self.find_line_magic(magic_name)
2102 2101 etpl = "Cell magic `%%{0}` not found{1}."
2103 2102 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2104 2103 'did you mean that instead?)'.format(magic_name))
2105 2104 error(etpl.format(magic_name, extra))
2106 2105 elif cell == '':
2107 2106 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2108 2107 if self.find_line_magic(magic_name) is not None:
2109 2108 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2110 2109 raise UsageError(message)
2111 2110 else:
2112 2111 # Note: this is the distance in the stack to the user's frame.
2113 2112 # This will need to be updated if the internal calling logic gets
2114 2113 # refactored, or else we'll be expanding the wrong variables.
2115 2114 stack_depth = 2
2116 2115 magic_arg_s = self.var_expand(line, stack_depth)
2117 2116 with self.builtin_trap:
2118 2117 result = fn(magic_arg_s, cell)
2119 2118 return result
2120 2119
2121 2120 def find_line_magic(self, magic_name):
2122 2121 """Find and return a line magic by name.
2123 2122
2124 2123 Returns None if the magic isn't found."""
2125 2124 return self.magics_manager.magics['line'].get(magic_name)
2126 2125
2127 2126 def find_cell_magic(self, magic_name):
2128 2127 """Find and return a cell magic by name.
2129 2128
2130 2129 Returns None if the magic isn't found."""
2131 2130 return self.magics_manager.magics['cell'].get(magic_name)
2132 2131
2133 2132 def find_magic(self, magic_name, magic_kind='line'):
2134 2133 """Find and return a magic of the given type by name.
2135 2134
2136 2135 Returns None if the magic isn't found."""
2137 2136 return self.magics_manager.magics[magic_kind].get(magic_name)
2138 2137
2139 2138 def magic(self, arg_s):
2140 2139 """DEPRECATED. Use run_line_magic() instead.
2141 2140
2142 2141 Call a magic function by name.
2143 2142
2144 2143 Input: a string containing the name of the magic function to call and
2145 2144 any additional arguments to be passed to the magic.
2146 2145
2147 2146 magic('name -opt foo bar') is equivalent to typing at the ipython
2148 2147 prompt:
2149 2148
2150 2149 In[1]: %name -opt foo bar
2151 2150
2152 2151 To call a magic without arguments, simply use magic('name').
2153 2152
2154 2153 This provides a proper Python function to call IPython's magics in any
2155 2154 valid Python code you can type at the interpreter, including loops and
2156 2155 compound statements.
2157 2156 """
2158 2157 # TODO: should we issue a loud deprecation warning here?
2159 2158 magic_name, _, magic_arg_s = arg_s.partition(' ')
2160 2159 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2161 2160 return self.run_line_magic(magic_name, magic_arg_s)
2162 2161
2163 2162 #-------------------------------------------------------------------------
2164 2163 # Things related to macros
2165 2164 #-------------------------------------------------------------------------
2166 2165
2167 2166 def define_macro(self, name, themacro):
2168 2167 """Define a new macro
2169 2168
2170 2169 Parameters
2171 2170 ----------
2172 2171 name : str
2173 2172 The name of the macro.
2174 2173 themacro : str or Macro
2175 2174 The action to do upon invoking the macro. If a string, a new
2176 2175 Macro object is created by passing the string to it.
2177 2176 """
2178 2177
2179 2178 from IPython.core import macro
2180 2179
2181 2180 if isinstance(themacro, basestring):
2182 2181 themacro = macro.Macro(themacro)
2183 2182 if not isinstance(themacro, macro.Macro):
2184 2183 raise ValueError('A macro must be a string or a Macro instance.')
2185 2184 self.user_ns[name] = themacro
2186 2185
2187 2186 #-------------------------------------------------------------------------
2188 2187 # Things related to the running of system commands
2189 2188 #-------------------------------------------------------------------------
2190 2189
2191 2190 def system_piped(self, cmd):
2192 2191 """Call the given cmd in a subprocess, piping stdout/err
2193 2192
2194 2193 Parameters
2195 2194 ----------
2196 2195 cmd : str
2197 2196 Command to execute (can not end in '&', as background processes are
2198 2197 not supported. Should not be a command that expects input
2199 2198 other than simple text.
2200 2199 """
2201 2200 if cmd.rstrip().endswith('&'):
2202 2201 # this is *far* from a rigorous test
2203 2202 # We do not support backgrounding processes because we either use
2204 2203 # pexpect or pipes to read from. Users can always just call
2205 2204 # os.system() or use ip.system=ip.system_raw
2206 2205 # if they really want a background process.
2207 2206 raise OSError("Background processes not supported.")
2208 2207
2209 2208 # we explicitly do NOT return the subprocess status code, because
2210 2209 # a non-None value would trigger :func:`sys.displayhook` calls.
2211 2210 # Instead, we store the exit_code in user_ns.
2212 2211 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2213 2212
2214 2213 def system_raw(self, cmd):
2215 2214 """Call the given cmd in a subprocess using os.system
2216 2215
2217 2216 Parameters
2218 2217 ----------
2219 2218 cmd : str
2220 2219 Command to execute.
2221 2220 """
2222 2221 cmd = self.var_expand(cmd, depth=1)
2223 2222 # protect os.system from UNC paths on Windows, which it can't handle:
2224 2223 if sys.platform == 'win32':
2225 2224 from IPython.utils._process_win32 import AvoidUNCPath
2226 2225 with AvoidUNCPath() as path:
2227 2226 if path is not None:
2228 2227 cmd = '"pushd %s &&"%s' % (path, cmd)
2229 2228 cmd = py3compat.unicode_to_str(cmd)
2230 2229 ec = os.system(cmd)
2231 2230 else:
2232 2231 cmd = py3compat.unicode_to_str(cmd)
2233 2232 ec = os.system(cmd)
2234 2233 # The high byte is the exit code, the low byte is a signal number
2235 2234 # that we discard for now. See the docs for os.wait()
2236 2235 if ec > 255:
2237 2236 ec >>= 8
2238 2237
2239 2238 # We explicitly do NOT return the subprocess status code, because
2240 2239 # a non-None value would trigger :func:`sys.displayhook` calls.
2241 2240 # Instead, we store the exit_code in user_ns.
2242 2241 self.user_ns['_exit_code'] = ec
2243 2242
2244 2243 # use piped system by default, because it is better behaved
2245 2244 system = system_piped
2246 2245
2247 2246 def getoutput(self, cmd, split=True, depth=0):
2248 2247 """Get output (possibly including stderr) from a subprocess.
2249 2248
2250 2249 Parameters
2251 2250 ----------
2252 2251 cmd : str
2253 2252 Command to execute (can not end in '&', as background processes are
2254 2253 not supported.
2255 2254 split : bool, optional
2256 2255 If True, split the output into an IPython SList. Otherwise, an
2257 2256 IPython LSString is returned. These are objects similar to normal
2258 2257 lists and strings, with a few convenience attributes for easier
2259 2258 manipulation of line-based output. You can use '?' on them for
2260 2259 details.
2261 2260 depth : int, optional
2262 2261 How many frames above the caller are the local variables which should
2263 2262 be expanded in the command string? The default (0) assumes that the
2264 2263 expansion variables are in the stack frame calling this function.
2265 2264 """
2266 2265 if cmd.rstrip().endswith('&'):
2267 2266 # this is *far* from a rigorous test
2268 2267 raise OSError("Background processes not supported.")
2269 2268 out = getoutput(self.var_expand(cmd, depth=depth+1))
2270 2269 if split:
2271 2270 out = SList(out.splitlines())
2272 2271 else:
2273 2272 out = LSString(out)
2274 2273 return out
2275 2274
2276 2275 #-------------------------------------------------------------------------
2277 2276 # Things related to aliases
2278 2277 #-------------------------------------------------------------------------
2279 2278
2280 2279 def init_alias(self):
2281 2280 self.alias_manager = AliasManager(shell=self, parent=self)
2282 2281 self.configurables.append(self.alias_manager)
2283 2282 self.ns_table['alias'] = self.alias_manager.alias_table,
2284 2283
2285 2284 #-------------------------------------------------------------------------
2286 2285 # Things related to extensions
2287 2286 #-------------------------------------------------------------------------
2288 2287
2289 2288 def init_extension_manager(self):
2290 2289 self.extension_manager = ExtensionManager(shell=self, parent=self)
2291 2290 self.configurables.append(self.extension_manager)
2292 2291
2293 2292 #-------------------------------------------------------------------------
2294 2293 # Things related to payloads
2295 2294 #-------------------------------------------------------------------------
2296 2295
2297 2296 def init_payload(self):
2298 2297 self.payload_manager = PayloadManager(parent=self)
2299 2298 self.configurables.append(self.payload_manager)
2300 2299
2301 2300 #-------------------------------------------------------------------------
2302 2301 # Things related to the prefilter
2303 2302 #-------------------------------------------------------------------------
2304 2303
2305 2304 def init_prefilter(self):
2306 2305 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2307 2306 self.configurables.append(self.prefilter_manager)
2308 2307 # Ultimately this will be refactored in the new interpreter code, but
2309 2308 # for now, we should expose the main prefilter method (there's legacy
2310 2309 # code out there that may rely on this).
2311 2310 self.prefilter = self.prefilter_manager.prefilter_lines
2312 2311
2313 2312 def auto_rewrite_input(self, cmd):
2314 2313 """Print to the screen the rewritten form of the user's command.
2315 2314
2316 2315 This shows visual feedback by rewriting input lines that cause
2317 2316 automatic calling to kick in, like::
2318 2317
2319 2318 /f x
2320 2319
2321 2320 into::
2322 2321
2323 2322 ------> f(x)
2324 2323
2325 2324 after the user's input prompt. This helps the user understand that the
2326 2325 input line was transformed automatically by IPython.
2327 2326 """
2328 2327 if not self.show_rewritten_input:
2329 2328 return
2330 2329
2331 2330 rw = self.prompt_manager.render('rewrite') + cmd
2332 2331
2333 2332 try:
2334 2333 # plain ascii works better w/ pyreadline, on some machines, so
2335 2334 # we use it and only print uncolored rewrite if we have unicode
2336 2335 rw = str(rw)
2337 2336 print(rw, file=io.stdout)
2338 2337 except UnicodeEncodeError:
2339 2338 print("------> " + cmd)
2340 2339
2341 2340 #-------------------------------------------------------------------------
2342 2341 # Things related to extracting values/expressions from kernel and user_ns
2343 2342 #-------------------------------------------------------------------------
2344 2343
2345 2344 def _user_obj_error(self):
2346 2345 """return simple exception dict
2347 2346
2348 2347 for use in user_variables / expressions
2349 2348 """
2350 2349
2351 2350 etype, evalue, tb = self._get_exc_info()
2352 2351 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2353 2352
2354 2353 exc_info = {
2355 2354 u'status' : 'error',
2356 2355 u'traceback' : stb,
2357 2356 u'ename' : unicode(etype.__name__),
2358 2357 u'evalue' : py3compat.safe_unicode(evalue),
2359 2358 }
2360 2359
2361 2360 return exc_info
2362 2361
2363 2362 def _format_user_obj(self, obj):
2364 2363 """format a user object to display dict
2365 2364
2366 2365 for use in user_expressions / variables
2367 2366 """
2368 2367
2369 2368 data, md = self.display_formatter.format(obj)
2370 2369 value = {
2371 2370 'status' : 'ok',
2372 2371 'data' : data,
2373 2372 'metadata' : md,
2374 2373 }
2375 2374 return value
2376 2375
2377 2376 def user_variables(self, names):
2378 2377 """Get a list of variable names from the user's namespace.
2379 2378
2380 2379 Parameters
2381 2380 ----------
2382 2381 names : list of strings
2383 2382 A list of names of variables to be read from the user namespace.
2384 2383
2385 2384 Returns
2386 2385 -------
2387 2386 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2388 2387 Each element will be a sub-dict of the same form as a display_data message.
2389 2388 """
2390 2389 out = {}
2391 2390 user_ns = self.user_ns
2392 2391
2393 2392 for varname in names:
2394 2393 try:
2395 2394 value = self._format_user_obj(user_ns[varname])
2396 2395 except:
2397 2396 value = self._user_obj_error()
2398 2397 out[varname] = value
2399 2398 return out
2400 2399
2401 2400 def user_expressions(self, expressions):
2402 2401 """Evaluate a dict of expressions in the user's namespace.
2403 2402
2404 2403 Parameters
2405 2404 ----------
2406 2405 expressions : dict
2407 2406 A dict with string keys and string values. The expression values
2408 2407 should be valid Python expressions, each of which will be evaluated
2409 2408 in the user namespace.
2410 2409
2411 2410 Returns
2412 2411 -------
2413 2412 A dict, keyed like the input expressions dict, with the rich mime-typed
2414 2413 display_data of each value.
2415 2414 """
2416 2415 out = {}
2417 2416 user_ns = self.user_ns
2418 2417 global_ns = self.user_global_ns
2419 2418
2420 2419 for key, expr in expressions.iteritems():
2421 2420 try:
2422 2421 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2423 2422 except:
2424 2423 value = self._user_obj_error()
2425 2424 out[key] = value
2426 2425 return out
2427 2426
2428 2427 #-------------------------------------------------------------------------
2429 2428 # Things related to the running of code
2430 2429 #-------------------------------------------------------------------------
2431 2430
2432 2431 def ex(self, cmd):
2433 2432 """Execute a normal python statement in user namespace."""
2434 2433 with self.builtin_trap:
2435 2434 exec cmd in self.user_global_ns, self.user_ns
2436 2435
2437 2436 def ev(self, expr):
2438 2437 """Evaluate python expression expr in user namespace.
2439 2438
2440 2439 Returns the result of evaluation
2441 2440 """
2442 2441 with self.builtin_trap:
2443 2442 return eval(expr, self.user_global_ns, self.user_ns)
2444 2443
2445 2444 def safe_execfile(self, fname, *where, **kw):
2446 2445 """A safe version of the builtin execfile().
2447 2446
2448 2447 This version will never throw an exception, but instead print
2449 2448 helpful error messages to the screen. This only works on pure
2450 2449 Python files with the .py extension.
2451 2450
2452 2451 Parameters
2453 2452 ----------
2454 2453 fname : string
2455 2454 The name of the file to be executed.
2456 2455 where : tuple
2457 2456 One or two namespaces, passed to execfile() as (globals,locals).
2458 2457 If only one is given, it is passed as both.
2459 2458 exit_ignore : bool (False)
2460 2459 If True, then silence SystemExit for non-zero status (it is always
2461 2460 silenced for zero status, as it is so common).
2462 2461 raise_exceptions : bool (False)
2463 2462 If True raise exceptions everywhere. Meant for testing.
2464 2463
2465 2464 """
2466 2465 kw.setdefault('exit_ignore', False)
2467 2466 kw.setdefault('raise_exceptions', False)
2468 2467
2469 2468 fname = os.path.abspath(os.path.expanduser(fname))
2470 2469
2471 2470 # Make sure we can open the file
2472 2471 try:
2473 2472 with open(fname) as thefile:
2474 2473 pass
2475 2474 except:
2476 2475 warn('Could not open file <%s> for safe execution.' % fname)
2477 2476 return
2478 2477
2479 2478 # Find things also in current directory. This is needed to mimic the
2480 2479 # behavior of running a script from the system command line, where
2481 2480 # Python inserts the script's directory into sys.path
2482 2481 dname = os.path.dirname(fname)
2483 2482
2484 2483 with prepended_to_syspath(dname):
2485 2484 try:
2486 2485 py3compat.execfile(fname,*where)
2487 2486 except SystemExit as status:
2488 2487 # If the call was made with 0 or None exit status (sys.exit(0)
2489 2488 # or sys.exit() ), don't bother showing a traceback, as both of
2490 2489 # these are considered normal by the OS:
2491 2490 # > python -c'import sys;sys.exit(0)'; echo $?
2492 2491 # 0
2493 2492 # > python -c'import sys;sys.exit()'; echo $?
2494 2493 # 0
2495 2494 # For other exit status, we show the exception unless
2496 2495 # explicitly silenced, but only in short form.
2497 2496 if kw['raise_exceptions']:
2498 2497 raise
2499 2498 if status.code and not kw['exit_ignore']:
2500 2499 self.showtraceback(exception_only=True)
2501 2500 except:
2502 2501 if kw['raise_exceptions']:
2503 2502 raise
2504 2503 self.showtraceback()
2505 2504
2506 2505 def safe_execfile_ipy(self, fname):
2507 2506 """Like safe_execfile, but for .ipy files with IPython syntax.
2508 2507
2509 2508 Parameters
2510 2509 ----------
2511 2510 fname : str
2512 2511 The name of the file to execute. The filename must have a
2513 2512 .ipy extension.
2514 2513 """
2515 2514 fname = os.path.abspath(os.path.expanduser(fname))
2516 2515
2517 2516 # Make sure we can open the file
2518 2517 try:
2519 2518 with open(fname) as thefile:
2520 2519 pass
2521 2520 except:
2522 2521 warn('Could not open file <%s> for safe execution.' % fname)
2523 2522 return
2524 2523
2525 2524 # Find things also in current directory. This is needed to mimic the
2526 2525 # behavior of running a script from the system command line, where
2527 2526 # Python inserts the script's directory into sys.path
2528 2527 dname = os.path.dirname(fname)
2529 2528
2530 2529 with prepended_to_syspath(dname):
2531 2530 try:
2532 2531 with open(fname) as thefile:
2533 2532 # self.run_cell currently captures all exceptions
2534 2533 # raised in user code. It would be nice if there were
2535 2534 # versions of runlines, execfile that did raise, so
2536 2535 # we could catch the errors.
2537 2536 self.run_cell(thefile.read(), store_history=False, shell_futures=False)
2538 2537 except:
2539 2538 self.showtraceback()
2540 2539 warn('Unknown failure executing file: <%s>' % fname)
2541 2540
2542 2541 def safe_run_module(self, mod_name, where):
2543 2542 """A safe version of runpy.run_module().
2544 2543
2545 2544 This version will never throw an exception, but instead print
2546 2545 helpful error messages to the screen.
2547 2546
2548 2547 `SystemExit` exceptions with status code 0 or None are ignored.
2549 2548
2550 2549 Parameters
2551 2550 ----------
2552 2551 mod_name : string
2553 2552 The name of the module to be executed.
2554 2553 where : dict
2555 2554 The globals namespace.
2556 2555 """
2557 2556 try:
2558 2557 try:
2559 2558 where.update(
2560 2559 runpy.run_module(str(mod_name), run_name="__main__",
2561 2560 alter_sys=True)
2562 2561 )
2563 2562 except SystemExit as status:
2564 2563 if status.code:
2565 2564 raise
2566 2565 except:
2567 2566 self.showtraceback()
2568 2567 warn('Unknown failure executing module: <%s>' % mod_name)
2569 2568
2570 2569 def _run_cached_cell_magic(self, magic_name, line):
2571 2570 """Special method to call a cell magic with the data stored in self.
2572 2571 """
2573 2572 cell = self._current_cell_magic_body
2574 2573 self._current_cell_magic_body = None
2575 2574 return self.run_cell_magic(magic_name, line, cell)
2576 2575
2577 2576 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2578 2577 """Run a complete IPython cell.
2579 2578
2580 2579 Parameters
2581 2580 ----------
2582 2581 raw_cell : str
2583 2582 The code (including IPython code such as %magic functions) to run.
2584 2583 store_history : bool
2585 2584 If True, the raw and translated cell will be stored in IPython's
2586 2585 history. For user code calling back into IPython's machinery, this
2587 2586 should be set to False.
2588 2587 silent : bool
2589 2588 If True, avoid side-effects, such as implicit displayhooks and
2590 2589 and logging. silent=True forces store_history=False.
2591 2590 shell_futures : bool
2592 2591 If True, the code will share future statements with the interactive
2593 2592 shell. It will both be affected by previous __future__ imports, and
2594 2593 any __future__ imports in the code will affect the shell. If False,
2595 2594 __future__ imports are not shared in either direction.
2596 2595 """
2597 2596 if (not raw_cell) or raw_cell.isspace():
2598 2597 return
2599 2598
2600 2599 if silent:
2601 2600 store_history = False
2602 2601
2603 2602 self.input_transformer_manager.push(raw_cell)
2604 2603 cell = self.input_transformer_manager.source_reset()
2605 2604
2606 2605 # Our own compiler remembers the __future__ environment. If we want to
2607 2606 # run code with a separate __future__ environment, use the default
2608 2607 # compiler
2609 2608 compiler = self.compile if shell_futures else CachingCompiler()
2610 2609
2611 2610 with self.builtin_trap:
2612 2611 prefilter_failed = False
2613 2612 if len(cell.splitlines()) == 1:
2614 2613 try:
2615 2614 # use prefilter_lines to handle trailing newlines
2616 2615 # restore trailing newline for ast.parse
2617 2616 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2618 2617 except AliasError as e:
2619 2618 error(e)
2620 2619 prefilter_failed = True
2621 2620 except Exception:
2622 2621 # don't allow prefilter errors to crash IPython
2623 2622 self.showtraceback()
2624 2623 prefilter_failed = True
2625 2624
2626 2625 # Store raw and processed history
2627 2626 if store_history:
2628 2627 self.history_manager.store_inputs(self.execution_count,
2629 2628 cell, raw_cell)
2630 2629 if not silent:
2631 2630 self.logger.log(cell, raw_cell)
2632 2631
2633 2632 if not prefilter_failed:
2634 2633 # don't run if prefilter failed
2635 2634 cell_name = self.compile.cache(cell, self.execution_count)
2636 2635
2637 2636 with self.display_trap:
2638 2637 try:
2639 2638 code_ast = compiler.ast_parse(cell, filename=cell_name)
2640 2639 except IndentationError:
2641 2640 self.showindentationerror()
2642 2641 if store_history:
2643 2642 self.execution_count += 1
2644 2643 return None
2645 2644 except (OverflowError, SyntaxError, ValueError, TypeError,
2646 2645 MemoryError):
2647 2646 self.showsyntaxerror()
2648 2647 if store_history:
2649 2648 self.execution_count += 1
2650 2649 return None
2651 2650
2652 2651 code_ast = self.transform_ast(code_ast)
2653 2652
2654 2653 interactivity = "none" if silent else self.ast_node_interactivity
2655 2654 self.run_ast_nodes(code_ast.body, cell_name,
2656 2655 interactivity=interactivity, compiler=compiler)
2657 2656
2658 2657 # Execute any registered post-execution functions.
2659 2658 # unless we are silent
2660 2659 post_exec = [] if silent else self._post_execute.iteritems()
2661 2660
2662 2661 for func, status in post_exec:
2663 2662 if self.disable_failing_post_execute and not status:
2664 2663 continue
2665 2664 try:
2666 2665 func()
2667 2666 except KeyboardInterrupt:
2668 2667 print("\nKeyboardInterrupt", file=io.stderr)
2669 2668 except Exception:
2670 2669 # register as failing:
2671 2670 self._post_execute[func] = False
2672 2671 self.showtraceback()
2673 2672 print('\n'.join([
2674 2673 "post-execution function %r produced an error." % func,
2675 2674 "If this problem persists, you can disable failing post-exec functions with:",
2676 2675 "",
2677 2676 " get_ipython().disable_failing_post_execute = True"
2678 2677 ]), file=io.stderr)
2679 2678
2680 2679 if store_history:
2681 2680 # Write output to the database. Does nothing unless
2682 2681 # history output logging is enabled.
2683 2682 self.history_manager.store_output(self.execution_count)
2684 2683 # Each cell is a *single* input, regardless of how many lines it has
2685 2684 self.execution_count += 1
2686 2685
2687 2686 def transform_ast(self, node):
2688 2687 """Apply the AST transformations from self.ast_transformers
2689 2688
2690 2689 Parameters
2691 2690 ----------
2692 2691 node : ast.Node
2693 2692 The root node to be transformed. Typically called with the ast.Module
2694 2693 produced by parsing user input.
2695 2694
2696 2695 Returns
2697 2696 -------
2698 2697 An ast.Node corresponding to the node it was called with. Note that it
2699 2698 may also modify the passed object, so don't rely on references to the
2700 2699 original AST.
2701 2700 """
2702 2701 for transformer in self.ast_transformers:
2703 2702 try:
2704 2703 node = transformer.visit(node)
2705 2704 except Exception:
2706 2705 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2707 2706 self.ast_transformers.remove(transformer)
2708 2707
2709 2708 if self.ast_transformers:
2710 2709 ast.fix_missing_locations(node)
2711 2710 return node
2712 2711
2713 2712
2714 2713 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2715 2714 compiler=compile):
2716 2715 """Run a sequence of AST nodes. The execution mode depends on the
2717 2716 interactivity parameter.
2718 2717
2719 2718 Parameters
2720 2719 ----------
2721 2720 nodelist : list
2722 2721 A sequence of AST nodes to run.
2723 2722 cell_name : str
2724 2723 Will be passed to the compiler as the filename of the cell. Typically
2725 2724 the value returned by ip.compile.cache(cell).
2726 2725 interactivity : str
2727 2726 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2728 2727 run interactively (displaying output from expressions). 'last_expr'
2729 2728 will run the last node interactively only if it is an expression (i.e.
2730 2729 expressions in loops or other blocks are not displayed. Other values
2731 2730 for this parameter will raise a ValueError.
2732 2731 compiler : callable
2733 2732 A function with the same interface as the built-in compile(), to turn
2734 2733 the AST nodes into code objects. Default is the built-in compile().
2735 2734 """
2736 2735 if not nodelist:
2737 2736 return
2738 2737
2739 2738 if interactivity == 'last_expr':
2740 2739 if isinstance(nodelist[-1], ast.Expr):
2741 2740 interactivity = "last"
2742 2741 else:
2743 2742 interactivity = "none"
2744 2743
2745 2744 if interactivity == 'none':
2746 2745 to_run_exec, to_run_interactive = nodelist, []
2747 2746 elif interactivity == 'last':
2748 2747 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2749 2748 elif interactivity == 'all':
2750 2749 to_run_exec, to_run_interactive = [], nodelist
2751 2750 else:
2752 2751 raise ValueError("Interactivity was %r" % interactivity)
2753 2752
2754 2753 exec_count = self.execution_count
2755 2754
2756 2755 try:
2757 2756 for i, node in enumerate(to_run_exec):
2758 2757 mod = ast.Module([node])
2759 2758 code = compiler(mod, cell_name, "exec")
2760 2759 if self.run_code(code):
2761 2760 return True
2762 2761
2763 2762 for i, node in enumerate(to_run_interactive):
2764 2763 mod = ast.Interactive([node])
2765 2764 code = compiler(mod, cell_name, "single")
2766 2765 if self.run_code(code):
2767 2766 return True
2768 2767
2769 2768 # Flush softspace
2770 2769 if softspace(sys.stdout, 0):
2771 2770 print()
2772 2771
2773 2772 except:
2774 2773 # It's possible to have exceptions raised here, typically by
2775 2774 # compilation of odd code (such as a naked 'return' outside a
2776 2775 # function) that did parse but isn't valid. Typically the exception
2777 2776 # is a SyntaxError, but it's safest just to catch anything and show
2778 2777 # the user a traceback.
2779 2778
2780 2779 # We do only one try/except outside the loop to minimize the impact
2781 2780 # on runtime, and also because if any node in the node list is
2782 2781 # broken, we should stop execution completely.
2783 2782 self.showtraceback()
2784 2783
2785 2784 return False
2786 2785
2787 2786 def run_code(self, code_obj):
2788 2787 """Execute a code object.
2789 2788
2790 2789 When an exception occurs, self.showtraceback() is called to display a
2791 2790 traceback.
2792 2791
2793 2792 Parameters
2794 2793 ----------
2795 2794 code_obj : code object
2796 2795 A compiled code object, to be executed
2797 2796
2798 2797 Returns
2799 2798 -------
2800 2799 False : successful execution.
2801 2800 True : an error occurred.
2802 2801 """
2803 2802
2804 2803 # Set our own excepthook in case the user code tries to call it
2805 2804 # directly, so that the IPython crash handler doesn't get triggered
2806 2805 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2807 2806
2808 2807 # we save the original sys.excepthook in the instance, in case config
2809 2808 # code (such as magics) needs access to it.
2810 2809 self.sys_excepthook = old_excepthook
2811 2810 outflag = 1 # happens in more places, so it's easier as default
2812 2811 try:
2813 2812 try:
2814 2813 self.hooks.pre_run_code_hook()
2815 2814 #rprint('Running code', repr(code_obj)) # dbg
2816 2815 exec code_obj in self.user_global_ns, self.user_ns
2817 2816 finally:
2818 2817 # Reset our crash handler in place
2819 2818 sys.excepthook = old_excepthook
2820 2819 except SystemExit:
2821 2820 self.showtraceback(exception_only=True)
2822 2821 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2823 2822 except self.custom_exceptions:
2824 2823 etype,value,tb = sys.exc_info()
2825 2824 self.CustomTB(etype,value,tb)
2826 2825 except:
2827 2826 self.showtraceback()
2828 2827 else:
2829 2828 outflag = 0
2830 2829 return outflag
2831 2830
2832 2831 # For backwards compatibility
2833 2832 runcode = run_code
2834 2833
2835 2834 #-------------------------------------------------------------------------
2836 2835 # Things related to GUI support and pylab
2837 2836 #-------------------------------------------------------------------------
2838 2837
2839 2838 def enable_gui(self, gui=None):
2840 2839 raise NotImplementedError('Implement enable_gui in a subclass')
2840
2841 def enable_matplotlib(self, gui=None):
2842 """Enable interactive matplotlib and inline figure support.
2843
2844 This takes the following steps:
2845
2846 1. select the appropriate eventloop and matplotlib backend
2847 2. set up matplotlib for interactive use with that backend
2848 3. configure formatters for inline figure display
2849 4. enable the selected gui eventloop
2850
2851 Parameters
2852 ----------
2853 gui : optional, string
2854 If given, dictates the choice of matplotlib GUI backend to use
2855 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2856 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2857 matplotlib (as dictated by the matplotlib build-time options plus the
2858 user's matplotlibrc configuration file). Note that not all backends
2859 make sense in all contexts, for example a terminal ipython can't
2860 display figures inline.
2861 """
2862 from IPython.core import pylabtools as pt
2863 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2864
2865 if gui != 'inline':
2866 # If we have our first gui selection, store it
2867 if self.pylab_gui_select is None:
2868 self.pylab_gui_select = gui
2869 # Otherwise if they are different
2870 elif gui != self.pylab_gui_select:
2871 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2872 ' Using %s instead.' % (gui, self.pylab_gui_select))
2873 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2874
2875 pt.activate_matplotlib(backend)
2876 pt.configure_inline_support(self, backend)
2877
2878 # Now we must activate the gui pylab wants to use, and fix %run to take
2879 # plot updates into account
2880 self.enable_gui(gui)
2881 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2882 pt.mpl_runner(self.safe_execfile)
2883
2884 return gui, backend
2841 2885
2842 2886 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2843 2887 """Activate pylab support at runtime.
2844 2888
2845 2889 This turns on support for matplotlib, preloads into the interactive
2846 2890 namespace all of numpy and pylab, and configures IPython to correctly
2847 2891 interact with the GUI event loop. The GUI backend to be used can be
2848 2892 optionally selected with the optional ``gui`` argument.
2893
2894 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2849 2895
2850 2896 Parameters
2851 2897 ----------
2852 2898 gui : optional, string
2853 2899 If given, dictates the choice of matplotlib GUI backend to use
2854 2900 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2855 2901 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2856 2902 matplotlib (as dictated by the matplotlib build-time options plus the
2857 2903 user's matplotlibrc configuration file). Note that not all backends
2858 2904 make sense in all contexts, for example a terminal ipython can't
2859 2905 display figures inline.
2906 import_all : optional, bool, default: True
2907 Whether to do `from numpy import *` and `from pylab import *`
2908 in addition to module imports.
2909 welcome_message : deprecated
2910 This argument is ignored, no welcome message will be displayed.
2860 2911 """
2861 from IPython.core.pylabtools import mpl_runner, backends
2912 from IPython.core.pylabtools import import_pylab
2913
2914 gui, backend = self.enable_matplotlib(gui)
2915
2862 2916 # We want to prevent the loading of pylab to pollute the user's
2863 2917 # namespace as shown by the %who* magics, so we execute the activation
2864 2918 # code in an empty namespace, and we update *both* user_ns and
2865 2919 # user_ns_hidden with this information.
2866 2920 ns = {}
2867 try:
2868 gui = pylab_activate(ns, gui, import_all, self, welcome_message=welcome_message)
2869 except KeyError:
2870 error("Backend '%s' not supported. Supported backends are: %s"
2871 % (gui, " ".join(sorted(backends.keys()))))
2872 return
2873 except ImportError:
2874 error("pylab mode doesn't work as matplotlib could not be found." + \
2875 "\nIs it installed on the system?")
2876 return
2921 import_pylab(ns, import_all)
2922 # warn about clobbered names
2923 ignored = set(["__builtins__"])
2924 both = set(ns).intersection(self.user_ns).difference(ignored)
2925 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2877 2926 self.user_ns.update(ns)
2878 2927 self.user_ns_hidden.update(ns)
2879 # Now we must activate the gui pylab wants to use, and fix %run to take
2880 # plot updates into account
2881 self.enable_gui(gui)
2882 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2883 mpl_runner(self.safe_execfile)
2928 return gui, backend, clobbered
2884 2929
2885 2930 #-------------------------------------------------------------------------
2886 2931 # Utilities
2887 2932 #-------------------------------------------------------------------------
2888 2933
2889 2934 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2890 2935 """Expand python variables in a string.
2891 2936
2892 2937 The depth argument indicates how many frames above the caller should
2893 2938 be walked to look for the local namespace where to expand variables.
2894 2939
2895 2940 The global namespace for expansion is always the user's interactive
2896 2941 namespace.
2897 2942 """
2898 2943 ns = self.user_ns.copy()
2899 2944 ns.update(sys._getframe(depth+1).f_locals)
2900 2945 try:
2901 2946 # We have to use .vformat() here, because 'self' is a valid and common
2902 2947 # name, and expanding **ns for .format() would make it collide with
2903 2948 # the 'self' argument of the method.
2904 2949 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2905 2950 except Exception:
2906 2951 # if formatter couldn't format, just let it go untransformed
2907 2952 pass
2908 2953 return cmd
2909 2954
2910 2955 def mktempfile(self, data=None, prefix='ipython_edit_'):
2911 2956 """Make a new tempfile and return its filename.
2912 2957
2913 2958 This makes a call to tempfile.mktemp, but it registers the created
2914 2959 filename internally so ipython cleans it up at exit time.
2915 2960
2916 2961 Optional inputs:
2917 2962
2918 2963 - data(None): if data is given, it gets written out to the temp file
2919 2964 immediately, and the file is closed again."""
2920 2965
2921 2966 filename = tempfile.mktemp('.py', prefix)
2922 2967 self.tempfiles.append(filename)
2923 2968
2924 2969 if data:
2925 2970 tmp_file = open(filename,'w')
2926 2971 tmp_file.write(data)
2927 2972 tmp_file.close()
2928 2973 return filename
2929 2974
2930 2975 # TODO: This should be removed when Term is refactored.
2931 2976 def write(self,data):
2932 2977 """Write a string to the default output"""
2933 2978 io.stdout.write(data)
2934 2979
2935 2980 # TODO: This should be removed when Term is refactored.
2936 2981 def write_err(self,data):
2937 2982 """Write a string to the default error output"""
2938 2983 io.stderr.write(data)
2939 2984
2940 2985 def ask_yes_no(self, prompt, default=None):
2941 2986 if self.quiet:
2942 2987 return True
2943 2988 return ask_yes_no(prompt,default)
2944 2989
2945 2990 def show_usage(self):
2946 2991 """Show a usage message"""
2947 2992 page.page(IPython.core.usage.interactive_usage)
2948 2993
2949 2994 def extract_input_lines(self, range_str, raw=False):
2950 2995 """Return as a string a set of input history slices.
2951 2996
2952 2997 Parameters
2953 2998 ----------
2954 2999 range_str : string
2955 3000 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
2956 3001 since this function is for use by magic functions which get their
2957 3002 arguments as strings. The number before the / is the session
2958 3003 number: ~n goes n back from the current session.
2959 3004
2960 3005 Optional Parameters:
2961 3006 - raw(False): by default, the processed input is used. If this is
2962 3007 true, the raw input history is used instead.
2963 3008
2964 3009 Note that slices can be called with two notations:
2965 3010
2966 3011 N:M -> standard python form, means including items N...(M-1).
2967 3012
2968 3013 N-M -> include items N..M (closed endpoint)."""
2969 3014 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
2970 3015 return "\n".join(x for _, _, x in lines)
2971 3016
2972 3017 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
2973 3018 """Get a code string from history, file, url, or a string or macro.
2974 3019
2975 3020 This is mainly used by magic functions.
2976 3021
2977 3022 Parameters
2978 3023 ----------
2979 3024
2980 3025 target : str
2981 3026
2982 3027 A string specifying code to retrieve. This will be tried respectively
2983 3028 as: ranges of input history (see %history for syntax), url,
2984 3029 correspnding .py file, filename, or an expression evaluating to a
2985 3030 string or Macro in the user namespace.
2986 3031
2987 3032 raw : bool
2988 3033 If true (default), retrieve raw history. Has no effect on the other
2989 3034 retrieval mechanisms.
2990 3035
2991 3036 py_only : bool (default False)
2992 3037 Only try to fetch python code, do not try alternative methods to decode file
2993 3038 if unicode fails.
2994 3039
2995 3040 Returns
2996 3041 -------
2997 3042 A string of code.
2998 3043
2999 3044 ValueError is raised if nothing is found, and TypeError if it evaluates
3000 3045 to an object of another type. In each case, .args[0] is a printable
3001 3046 message.
3002 3047 """
3003 3048 code = self.extract_input_lines(target, raw=raw) # Grab history
3004 3049 if code:
3005 3050 return code
3006 3051 utarget = unquote_filename(target)
3007 3052 try:
3008 3053 if utarget.startswith(('http://', 'https://')):
3009 3054 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3010 3055 except UnicodeDecodeError:
3011 3056 if not py_only :
3012 3057 from urllib import urlopen # Deferred import
3013 3058 response = urlopen(target)
3014 3059 return response.read().decode('latin1')
3015 3060 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3016 3061
3017 3062 potential_target = [target]
3018 3063 try :
3019 3064 potential_target.insert(0,get_py_filename(target))
3020 3065 except IOError:
3021 3066 pass
3022 3067
3023 3068 for tgt in potential_target :
3024 3069 if os.path.isfile(tgt): # Read file
3025 3070 try :
3026 3071 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3027 3072 except UnicodeDecodeError :
3028 3073 if not py_only :
3029 3074 with io_open(tgt,'r', encoding='latin1') as f :
3030 3075 return f.read()
3031 3076 raise ValueError(("'%s' seem to be unreadable.") % target)
3032 3077 elif os.path.isdir(os.path.expanduser(tgt)):
3033 3078 raise ValueError("'%s' is a directory, not a regular file." % target)
3034 3079
3035 3080 try: # User namespace
3036 3081 codeobj = eval(target, self.user_ns)
3037 3082 except Exception:
3038 3083 raise ValueError(("'%s' was not found in history, as a file, url, "
3039 3084 "nor in the user namespace.") % target)
3040 3085 if isinstance(codeobj, basestring):
3041 3086 return codeobj
3042 3087 elif isinstance(codeobj, Macro):
3043 3088 return codeobj.value
3044 3089
3045 3090 raise TypeError("%s is neither a string nor a macro." % target,
3046 3091 codeobj)
3047 3092
3048 3093 #-------------------------------------------------------------------------
3049 3094 # Things related to IPython exiting
3050 3095 #-------------------------------------------------------------------------
3051 3096 def atexit_operations(self):
3052 3097 """This will be executed at the time of exit.
3053 3098
3054 3099 Cleanup operations and saving of persistent data that is done
3055 3100 unconditionally by IPython should be performed here.
3056 3101
3057 3102 For things that may depend on startup flags or platform specifics (such
3058 3103 as having readline or not), register a separate atexit function in the
3059 3104 code that has the appropriate information, rather than trying to
3060 3105 clutter
3061 3106 """
3062 3107 # Close the history session (this stores the end time and line count)
3063 3108 # this must be *before* the tempfile cleanup, in case of temporary
3064 3109 # history db
3065 3110 self.history_manager.end_session()
3066 3111
3067 3112 # Cleanup all tempfiles left around
3068 3113 for tfile in self.tempfiles:
3069 3114 try:
3070 3115 os.unlink(tfile)
3071 3116 except OSError:
3072 3117 pass
3073 3118
3074 3119 # Clear all user namespaces to release all references cleanly.
3075 3120 self.reset(new_session=False)
3076 3121
3077 3122 # Run user hooks
3078 3123 self.hooks.shutdown_hook()
3079 3124
3080 3125 def cleanup(self):
3081 3126 self.restore_sys_module_state()
3082 3127
3083 3128
3084 3129 class InteractiveShellABC(object):
3085 3130 """An abstract base class for InteractiveShell."""
3086 3131 __metaclass__ = abc.ABCMeta
3087 3132
3088 3133 InteractiveShellABC.register(InteractiveShell)
@@ -1,88 +1,141 b''
1 1 """Implementation of magic functions for matplotlib/pylab support.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2012 The IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14
15 15 # Our own packages
16 16 from IPython.config.application import Application
17 from IPython.core import magic_arguments
17 18 from IPython.core.magic import Magics, magics_class, line_magic
18 19 from IPython.testing.skipdoctest import skip_doctest
20 from IPython.utils.warn import warn
21 from IPython.core.pylabtools import backends
19 22
20 23 #-----------------------------------------------------------------------------
21 24 # Magic implementation classes
22 25 #-----------------------------------------------------------------------------
23 26
27 magic_gui_arg = magic_arguments.argument(
28 'gui', nargs='?',
29 help="""Name of the matplotlib backend to use %s.
30 If given, the corresponding matplotlib backend is used,
31 otherwise it will be matplotlib's default
32 (which you can set in your matplotlib config file).
33 """ % str(tuple(sorted(backends.keys())))
34 )
35
36
24 37 @magics_class
25 38 class PylabMagics(Magics):
26 39 """Magics related to matplotlib's pylab support"""
27
40
28 41 @skip_doctest
29 42 @line_magic
30 def pylab(self, parameter_s=''):
31 """Load numpy and matplotlib to work interactively.
32
33 %pylab [GUINAME]
34
35 This function lets you activate pylab (matplotlib, numpy and
36 interactive support) at any point during an IPython session.
37
38 It will import at the top level numpy as np, pyplot as plt, matplotlib,
39 pylab and mlab, as well as all names from numpy and pylab.
40
43 @magic_arguments.magic_arguments()
44 @magic_gui_arg
45 def matplotlib(self, line=''):
46 """Set up matplotlib to work interactively.
47
48 This function lets you activate matplotlib interactive support
49 at any point during an IPython session.
50 It does not import anything into the interactive namespace.
51
41 52 If you are using the inline matplotlib backend for embedded figures,
42 53 you can adjust its behavior via the %config magic::
43 54
44 55 # enable SVG figures, necessary for SVG+XHTML export in the qtconsole
45 56 In [1]: %config InlineBackend.figure_format = 'svg'
46 57
47 58 # change the behavior of closing all figures at the end of each
48 59 # execution (cell), or allowing reuse of active figures across
49 60 # cells:
50 61 In [2]: %config InlineBackend.close_figures = False
51 62
52 Parameters
53 ----------
54 guiname : optional
55 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk',
56 'osx' or 'tk'). If given, the corresponding Matplotlib backend is
57 used, otherwise matplotlib's default (which you can override in your
58 matplotlib config file) is used.
59
60 63 Examples
61 64 --------
62 65 In this case, where the MPL default is TkAgg::
63 66
64 In [2]: %pylab
65
66 Welcome to pylab, a matplotlib-based Python environment.
67 Backend in use: TkAgg
68 For more information, type 'help(pylab)'.
67 In [2]: %matplotlib
68 Using matplotlib backend: TkAgg
69 69
70 70 But you can explicitly request a different backend::
71 71
72 In [3]: %pylab qt
72 In [3]: %matplotlib qt
73 """
74 args = magic_arguments.parse_argstring(self.matplotlib, line)
75 gui, backend = self.shell.enable_matplotlib(args.gui)
76 self._show_matplotlib_backend(args.gui, backend)
73 77
74 Welcome to pylab, a matplotlib-based Python environment.
75 Backend in use: Qt4Agg
76 For more information, type 'help(pylab)'.
78 @skip_doctest
79 @line_magic
80 @magic_arguments.magic_arguments()
81 @magic_arguments.argument(
82 '--no-import-all', action='store_true', default=None,
83 help="""Prevent IPython from performing ``import *`` into the interactive namespace.
84
85 The names that will still be added to the namespace if this flag is given::
86
87 numpy
88 matplotlib
89 np (numpy alias)
90 plt (matplotlib.pyplot alias)
91 pylab (from matplotlib)
92 pyplot (from matplotlib)
93 mlab (from matplotlib)
94 display (from IPython)
95 figsize (from IPython)
96 getfigs (from IPython)
97
98 You can govern the default behavior with the
99 InteractiveShellApp.pylab_import_all configurable.
77 100 """
101 )
102 @magic_gui_arg
103 def pylab(self, line=''):
104 """Load numpy and matplotlib to work interactively.
78 105
79 if Application.initialized():
80 app = Application.instance()
81 try:
82 import_all_status = app.pylab_import_all
83 except AttributeError:
84 import_all_status = True
85 else:
86 import_all_status = True
106 This function lets you activate pylab (matplotlib, numpy and
107 interactive support) at any point during an IPython session.
87 108
88 self.shell.enable_pylab(parameter_s, import_all=import_all_status, welcome_message=True)
109 It will import at the top level numpy as np, pyplot as plt, matplotlib,
110 pylab and mlab, as well as all names from numpy and pylab.
111
112 See the %matplotlib magic for more details.
113 """
114 args = magic_arguments.parse_argstring(self.pylab, line)
115 if args.no_import_all is None:
116 # get default from Application
117 if Application.initialized():
118 app = Application.instance()
119 try:
120 import_all = app.pylab_import_all
121 except AttributeError:
122 import_all = True
123 else:
124 # nothing specified, no app - default True
125 import_all = True
126 else:
127 # invert no-import flag
128 import_all = not args.no_import_all
129
130 gui, backend, clobbered = self.shell.enable_pylab(args.gui, import_all=import_all)
131 self._show_matplotlib_backend(args.gui, backend)
132 if clobbered:
133 warn("pylab import has clobbered these variables: %s" % clobbered +
134 "\n`%pylab --no-import-all` prevents importing * from pylab and numpy"
135 )
136
137 def _show_matplotlib_backend(self, gui, backend):
138 """show matplotlib message backend message"""
139 if not gui or gui == 'auto':
140 print ("using matplotlib backend: %s" % backend)
141
@@ -1,385 +1,333 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Pylab (matplotlib) support utilities.
3 3
4 4 Authors
5 5 -------
6 6
7 7 * Fernando Perez.
8 8 * Brian Granger
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (C) 2009 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import sys
23 23 from io import BytesIO
24 24
25 25 from IPython.core.display import _pngxy
26 26 from IPython.utils.decorators import flag_calls
27 27
28 28 # If user specifies a GUI, that dictates the backend, otherwise we read the
29 29 # user's mpl default from the mpl rc structure
30 30 backends = {'tk': 'TkAgg',
31 31 'gtk': 'GTKAgg',
32 32 'wx': 'WXAgg',
33 33 'qt': 'Qt4Agg', # qt3 not supported
34 34 'qt4': 'Qt4Agg',
35 35 'osx': 'MacOSX',
36 36 'inline' : 'module://IPython.kernel.zmq.pylab.backend_inline'}
37 37
38 38 # We also need a reverse backends2guis mapping that will properly choose which
39 39 # GUI support to activate based on the desired matplotlib backend. For the
40 40 # most part it's just a reverse of the above dict, but we also need to add a
41 41 # few others that map to the same GUI manually:
42 42 backend2gui = dict(zip(backends.values(), backends.keys()))
43 43 # In the reverse mapping, there are a few extra valid matplotlib backends that
44 44 # map to the same GUI support
45 45 backend2gui['GTK'] = backend2gui['GTKCairo'] = 'gtk'
46 46 backend2gui['WX'] = 'wx'
47 47 backend2gui['CocoaAgg'] = 'osx'
48 48
49 49 #-----------------------------------------------------------------------------
50 50 # Matplotlib utilities
51 51 #-----------------------------------------------------------------------------
52 52
53 53
54 54 def getfigs(*fig_nums):
55 55 """Get a list of matplotlib figures by figure numbers.
56 56
57 57 If no arguments are given, all available figures are returned. If the
58 58 argument list contains references to invalid figures, a warning is printed
59 59 but the function continues pasting further figures.
60 60
61 61 Parameters
62 62 ----------
63 63 figs : tuple
64 64 A tuple of ints giving the figure numbers of the figures to return.
65 65 """
66 66 from matplotlib._pylab_helpers import Gcf
67 67 if not fig_nums:
68 68 fig_managers = Gcf.get_all_fig_managers()
69 69 return [fm.canvas.figure for fm in fig_managers]
70 70 else:
71 71 figs = []
72 72 for num in fig_nums:
73 73 f = Gcf.figs.get(num)
74 74 if f is None:
75 75 print('Warning: figure %s not available.' % num)
76 76 else:
77 77 figs.append(f.canvas.figure)
78 78 return figs
79 79
80 80
81 81 def figsize(sizex, sizey):
82 82 """Set the default figure size to be [sizex, sizey].
83 83
84 84 This is just an easy to remember, convenience wrapper that sets::
85 85
86 86 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
87 87 """
88 88 import matplotlib
89 89 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
90 90
91 91
92 92 def print_figure(fig, fmt='png'):
93 93 """Convert a figure to svg or png for inline display."""
94 94 from matplotlib import rcParams
95 95 # When there's an empty figure, we shouldn't return anything, otherwise we
96 96 # get big blank areas in the qt console.
97 97 if not fig.axes and not fig.lines:
98 98 return
99 99
100 100 fc = fig.get_facecolor()
101 101 ec = fig.get_edgecolor()
102 102 bytes_io = BytesIO()
103 103 dpi = rcParams['savefig.dpi']
104 104 if fmt == 'retina':
105 105 dpi = dpi * 2
106 106 fmt = 'png'
107 107 fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight',
108 108 facecolor=fc, edgecolor=ec, dpi=dpi)
109 109 data = bytes_io.getvalue()
110 110 return data
111 111
112 112 def retina_figure(fig):
113 113 """format a figure as a pixel-doubled (retina) PNG"""
114 114 pngdata = print_figure(fig, fmt='retina')
115 115 w, h = _pngxy(pngdata)
116 116 metadata = dict(width=w//2, height=h//2)
117 117 return pngdata, metadata
118 118
119 119 # We need a little factory function here to create the closure where
120 120 # safe_execfile can live.
121 121 def mpl_runner(safe_execfile):
122 122 """Factory to return a matplotlib-enabled runner for %run.
123 123
124 124 Parameters
125 125 ----------
126 126 safe_execfile : function
127 127 This must be a function with the same interface as the
128 128 :meth:`safe_execfile` method of IPython.
129 129
130 130 Returns
131 131 -------
132 132 A function suitable for use as the ``runner`` argument of the %run magic
133 133 function.
134 134 """
135 135
136 136 def mpl_execfile(fname,*where,**kw):
137 137 """matplotlib-aware wrapper around safe_execfile.
138 138
139 139 Its interface is identical to that of the :func:`execfile` builtin.
140 140
141 141 This is ultimately a call to execfile(), but wrapped in safeties to
142 142 properly handle interactive rendering."""
143 143
144 144 import matplotlib
145 145 import matplotlib.pylab as pylab
146 146
147 147 #print '*** Matplotlib runner ***' # dbg
148 148 # turn off rendering until end of script
149 149 is_interactive = matplotlib.rcParams['interactive']
150 150 matplotlib.interactive(False)
151 151 safe_execfile(fname,*where,**kw)
152 152 matplotlib.interactive(is_interactive)
153 153 # make rendering call now, if the user tried to do it
154 154 if pylab.draw_if_interactive.called:
155 155 pylab.draw()
156 156 pylab.draw_if_interactive.called = False
157 157
158 158 return mpl_execfile
159 159
160 160
161 161 def select_figure_format(shell, fmt):
162 162 """Select figure format for inline backend, can be 'png', 'retina', or 'svg'.
163 163
164 164 Using this method ensures only one figure format is active at a time.
165 165 """
166 166 from matplotlib.figure import Figure
167 167 from IPython.kernel.zmq.pylab import backend_inline
168 168
169 169 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
170 170 png_formatter = shell.display_formatter.formatters['image/png']
171 171
172 172 if fmt == 'png':
173 173 svg_formatter.type_printers.pop(Figure, None)
174 174 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png'))
175 175 elif fmt in ('png2x', 'retina'):
176 176 svg_formatter.type_printers.pop(Figure, None)
177 177 png_formatter.for_type(Figure, retina_figure)
178 178 elif fmt == 'svg':
179 179 png_formatter.type_printers.pop(Figure, None)
180 180 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg'))
181 181 else:
182 182 raise ValueError("supported formats are: 'png', 'retina', 'svg', not %r" % fmt)
183 183
184 184 # set the format to be used in the backend()
185 185 backend_inline._figure_format = fmt
186 186
187 187 #-----------------------------------------------------------------------------
188 188 # Code for initializing matplotlib and importing pylab
189 189 #-----------------------------------------------------------------------------
190 190
191 191
192 192 def find_gui_and_backend(gui=None, gui_select=None):
193 193 """Given a gui string return the gui and mpl backend.
194 194
195 195 Parameters
196 196 ----------
197 197 gui : str
198 198 Can be one of ('tk','gtk','wx','qt','qt4','inline').
199 199 gui_select : str
200 200 Can be one of ('tk','gtk','wx','qt','qt4','inline').
201 201 This is any gui already selected by the shell.
202 202
203 203 Returns
204 204 -------
205 205 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
206 206 'WXAgg','Qt4Agg','module://IPython.kernel.zmq.pylab.backend_inline').
207 207 """
208 208
209 209 import matplotlib
210 210
211 211 if gui and gui != 'auto':
212 212 # select backend based on requested gui
213 213 backend = backends[gui]
214 214 else:
215 215 backend = matplotlib.rcParams['backend']
216 216 # In this case, we need to find what the appropriate gui selection call
217 217 # should be for IPython, so we can activate inputhook accordingly
218 218 gui = backend2gui.get(backend, None)
219 219
220 220 # If we have already had a gui active, we need it and inline are the
221 221 # ones allowed.
222 222 if gui_select and gui != gui_select:
223 223 gui = gui_select
224 224 backend = backends[gui]
225 225
226 226 return gui, backend
227 227
228 228
229 229 def activate_matplotlib(backend):
230 230 """Activate the given backend and set interactive to True."""
231 231
232 232 import matplotlib
233 233 matplotlib.interactive(True)
234
234
235 235 # Matplotlib had a bug where even switch_backend could not force
236 236 # the rcParam to update. This needs to be set *before* the module
237 237 # magic of switch_backend().
238 238 matplotlib.rcParams['backend'] = backend
239 239
240 240 import matplotlib.pyplot
241 241 matplotlib.pyplot.switch_backend(backend)
242 242
243 243 # This must be imported last in the matplotlib series, after
244 244 # backend/interactivity choices have been made
245 245 import matplotlib.pylab as pylab
246 246
247 247 pylab.show._needmain = False
248 248 # We need to detect at runtime whether show() is called by the user.
249 249 # For this, we wrap it into a decorator which adds a 'called' flag.
250 250 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
251 251
252 252
253 253 def import_pylab(user_ns, import_all=True):
254 """Import the standard pylab symbols into user_ns."""
254 """Populate the namespace with pylab-related values.
255
256 Imports matplotlib, pylab, numpy, and everything from pylab and numpy.
257
258 Also imports a few names from IPython (figsize, display, getfigs)
259
260 """
255 261
256 262 # Import numpy as np/pyplot as plt are conventions we're trying to
257 263 # somewhat standardize on. Making them available to users by default
258 264 # will greatly help this.
259 265 s = ("import numpy\n"
260 266 "import matplotlib\n"
261 267 "from matplotlib import pylab, mlab, pyplot\n"
262 268 "np = numpy\n"
263 269 "plt = pyplot\n"
264 270 )
265 271 exec s in user_ns
266
272
267 273 if import_all:
268 274 s = ("from matplotlib.pylab import *\n"
269 275 "from numpy import *\n")
270 276 exec s in user_ns
277
278 # IPython symbols to add
279 user_ns['figsize'] = figsize
280 from IPython.core.display import display
281 # Add display and getfigs to the user's namespace
282 user_ns['display'] = display
283 user_ns['getfigs'] = getfigs
271 284
272 285
273 def configure_inline_support(shell, backend, user_ns=None):
286 def configure_inline_support(shell, backend):
274 287 """Configure an IPython shell object for matplotlib use.
275 288
276 289 Parameters
277 290 ----------
278 291 shell : InteractiveShell instance
279 292
280 293 backend : matplotlib backend
281
282 user_ns : dict
283 A namespace where all configured variables will be placed. If not given,
284 the `user_ns` attribute of the shell object is used.
285 294 """
286 295 # If using our svg payload backend, register the post-execution
287 296 # function that will pick up the results for display. This can only be
288 297 # done with access to the real shell object.
289 298
290 299 # Note: if we can't load the inline backend, then there's no point
291 300 # continuing (such as in terminal-only shells in environments without
292 301 # zeromq available).
293 302 try:
294 303 from IPython.kernel.zmq.pylab.backend_inline import InlineBackend
295 304 except ImportError:
296 305 return
297 306 from matplotlib import pyplot
298 307
299 user_ns = shell.user_ns if user_ns is None else user_ns
300
301 308 cfg = InlineBackend.instance(parent=shell)
302 309 cfg.shell = shell
303 310 if cfg not in shell.configurables:
304 311 shell.configurables.append(cfg)
305 312
306 313 if backend == backends['inline']:
307 314 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
308 315 shell.register_post_execute(flush_figures)
309 316
310 317 # Save rcParams that will be overwrittern
311 318 shell._saved_rcParams = dict()
312 319 for k in cfg.rc:
313 320 shell._saved_rcParams[k] = pyplot.rcParams[k]
314 321 # load inline_rc
315 322 pyplot.rcParams.update(cfg.rc)
316 # Add 'figsize' to pyplot and to the user's namespace
317 user_ns['figsize'] = pyplot.figsize = figsize
318 323 else:
319 324 from IPython.kernel.zmq.pylab.backend_inline import flush_figures
320 325 if flush_figures in shell._post_execute:
321 326 shell._post_execute.pop(flush_figures)
322 327 if hasattr(shell, '_saved_rcParams'):
323 328 pyplot.rcParams.update(shell._saved_rcParams)
324 329 del shell._saved_rcParams
325 330
326 331 # Setup the default figure format
327 fmt = cfg.figure_format
328 select_figure_format(shell, fmt)
329
330 # The old pastefig function has been replaced by display
331 from IPython.core.display import display
332 # Add display and getfigs to the user's namespace
333 user_ns['display'] = display
334 user_ns['getfigs'] = getfigs
335
336
337 def pylab_activate(user_ns, gui=None, import_all=True, shell=None, welcome_message=False):
338 """Activate pylab mode in the user's namespace.
339
340 Loads and initializes numpy, matplotlib and friends for interactive use.
341
342 Parameters
343 ----------
344 user_ns : dict
345 Namespace where the imports will occur.
346
347 gui : optional, string
348 A valid gui name following the conventions of the %gui magic.
349
350 import_all : optional, boolean
351 If true, an 'import *' is done from numpy and pylab.
332 select_figure_format(shell, cfg.figure_format)
352 333
353 welcome_message : optional, boolean
354 If true, print a welcome message about pylab, which includes the backend
355 being used.
356
357 Returns
358 -------
359 The actual gui used (if not given as input, it was obtained from matplotlib
360 itself, and will be needed next to configure IPython's gui integration.
361 """
362 pylab_gui_select = shell.pylab_gui_select if shell is not None else None
363 # Try to find the appropriate gui and backend for the settings
364 gui, backend = find_gui_and_backend(gui, pylab_gui_select)
365 if shell is not None and gui != 'inline':
366 # If we have our first gui selection, store it
367 if pylab_gui_select is None:
368 shell.pylab_gui_select = gui
369 # Otherwise if they are different
370 elif gui != pylab_gui_select:
371 print ('Warning: Cannot change to a different GUI toolkit: %s.'
372 ' Using %s instead.' % (gui, pylab_gui_select))
373 gui, backend = find_gui_and_backend(pylab_gui_select)
374 activate_matplotlib(backend)
375 import_pylab(user_ns, import_all)
376 if shell is not None:
377 configure_inline_support(shell, backend, user_ns)
378 if welcome_message:
379 print """
380 Welcome to pylab, a matplotlib-based Python environment [backend: %s].
381 For more information, type 'help(pylab)'.""" % backend
382 # flush stdout, just to be safe
383 sys.stdout.flush()
384
385 return gui
@@ -1,366 +1,371 b''
1 1 # encoding: utf-8
2 2 """
3 3 A mixin for :class:`~IPython.core.application.Application` classes that
4 4 launch InteractiveShell instances, load extensions, etc.
5 5
6 6 Authors
7 7 -------
8 8
9 9 * Min Ragan-Kelley
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2011 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 from __future__ import absolute_import
24 24
25 25 import glob
26 26 import os
27 27 import sys
28 28
29 29 from IPython.config.application import boolean_flag
30 30 from IPython.config.configurable import Configurable
31 31 from IPython.config.loader import Config
32 32 from IPython.core import pylabtools
33 33 from IPython.utils import py3compat
34 34 from IPython.utils.contexts import preserve_keys
35 35 from IPython.utils.path import filefind
36 36 from IPython.utils.traitlets import (
37 37 Unicode, Instance, List, Bool, CaselessStrEnum
38 38 )
39 39
40 40 #-----------------------------------------------------------------------------
41 41 # Aliases and Flags
42 42 #-----------------------------------------------------------------------------
43 43
44 44 shell_flags = {}
45 45
46 46 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
47 47 addflag('autoindent', 'InteractiveShell.autoindent',
48 48 'Turn on autoindenting.', 'Turn off autoindenting.'
49 49 )
50 50 addflag('automagic', 'InteractiveShell.automagic',
51 51 """Turn on the auto calling of magic commands. Type %%magic at the
52 52 IPython prompt for more information.""",
53 53 'Turn off the auto calling of magic commands.'
54 54 )
55 55 addflag('pdb', 'InteractiveShell.pdb',
56 56 "Enable auto calling the pdb debugger after every exception.",
57 57 "Disable auto calling the pdb debugger after every exception."
58 58 )
59 59 # pydb flag doesn't do any config, as core.debugger switches on import,
60 60 # which is before parsing. This just allows the flag to be passed.
61 61 shell_flags.update(dict(
62 62 pydb = ({},
63 63 """Use the third party 'pydb' package as debugger, instead of pdb.
64 64 Requires that pydb is installed."""
65 65 )
66 66 ))
67 67 addflag('pprint', 'PlainTextFormatter.pprint',
68 68 "Enable auto pretty printing of results.",
69 69 "Disable auto auto pretty printing of results."
70 70 )
71 71 addflag('color-info', 'InteractiveShell.color_info',
72 72 """IPython can display information about objects via a set of func-
73 73 tions, and optionally can use colors for this, syntax highlighting
74 74 source code and various other elements. However, because this
75 75 information is passed through a pager (like 'less') and many pagers get
76 76 confused with color codes, this option is off by default. You can test
77 77 it and turn it on permanently in your ipython_config.py file if it
78 78 works for you. Test it and turn it on permanently if it works with
79 79 your system. The magic function %%color_info allows you to toggle this
80 80 interactively for testing.""",
81 81 "Disable using colors for info related things."
82 82 )
83 83 addflag('deep-reload', 'InteractiveShell.deep_reload',
84 84 """Enable deep (recursive) reloading by default. IPython can use the
85 85 deep_reload module which reloads changes in modules recursively (it
86 86 replaces the reload() function, so you don't need to change anything to
87 87 use it). deep_reload() forces a full reload of modules whose code may
88 88 have changed, which the default reload() function does not. When
89 89 deep_reload is off, IPython will use the normal reload(), but
90 90 deep_reload will still be available as dreload(). This feature is off
91 91 by default [which means that you have both normal reload() and
92 92 dreload()].""",
93 93 "Disable deep (recursive) reloading by default."
94 94 )
95 95 nosep_config = Config()
96 96 nosep_config.InteractiveShell.separate_in = ''
97 97 nosep_config.InteractiveShell.separate_out = ''
98 98 nosep_config.InteractiveShell.separate_out2 = ''
99 99
100 100 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
101 101 shell_flags['pylab'] = (
102 102 {'InteractiveShellApp' : {'pylab' : 'auto'}},
103 103 """Pre-load matplotlib and numpy for interactive use with
104 104 the default matplotlib backend."""
105 105 )
106 106
107 107 # it's possible we don't want short aliases for *all* of these:
108 108 shell_aliases = dict(
109 109 autocall='InteractiveShell.autocall',
110 110 colors='InteractiveShell.colors',
111 111 logfile='InteractiveShell.logfile',
112 112 logappend='InteractiveShell.logappend',
113 113 c='InteractiveShellApp.code_to_run',
114 114 m='InteractiveShellApp.module_to_run',
115 115 ext='InteractiveShellApp.extra_extension',
116 116 gui='InteractiveShellApp.gui',
117 117 pylab='InteractiveShellApp.pylab',
118 118 )
119 119 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
120 120
121 121 #-----------------------------------------------------------------------------
122 122 # Main classes and functions
123 123 #-----------------------------------------------------------------------------
124 124
125 125 class InteractiveShellApp(Configurable):
126 126 """A Mixin for applications that start InteractiveShell instances.
127 127
128 128 Provides configurables for loading extensions and executing files
129 129 as part of configuring a Shell environment.
130 130
131 131 The following methods should be called by the :meth:`initialize` method
132 132 of the subclass:
133 133
134 134 - :meth:`init_path`
135 135 - :meth:`init_shell` (to be implemented by the subclass)
136 136 - :meth:`init_gui_pylab`
137 137 - :meth:`init_extensions`
138 138 - :meth:`init_code`
139 139 """
140 140 extensions = List(Unicode, config=True,
141 141 help="A list of dotted module names of IPython extensions to load."
142 142 )
143 143 extra_extension = Unicode('', config=True,
144 144 help="dotted module name of an IPython extension to load."
145 145 )
146 146 def _extra_extension_changed(self, name, old, new):
147 147 if new:
148 148 # add to self.extensions
149 149 self.extensions.append(new)
150 150
151 151 # Extensions that are always loaded (not configurable)
152 152 default_extensions = List(Unicode, [u'storemagic'], config=False)
153 153
154 154 exec_files = List(Unicode, config=True,
155 155 help="""List of files to run at IPython startup."""
156 156 )
157 157 file_to_run = Unicode('', config=True,
158 158 help="""A file to be run""")
159 159
160 160 exec_lines = List(Unicode, config=True,
161 161 help="""lines of code to run at IPython startup."""
162 162 )
163 163 code_to_run = Unicode('', config=True,
164 164 help="Execute the given command string."
165 165 )
166 166 module_to_run = Unicode('', config=True,
167 167 help="Run the module as a script."
168 168 )
169 169 gui = CaselessStrEnum(('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx'), config=True,
170 170 help="Enable GUI event loop integration ('qt', 'wx', 'gtk', 'glut', 'pyglet', 'osx')."
171 171 )
172 172 pylab = CaselessStrEnum(['tk', 'qt', 'wx', 'gtk', 'osx', 'inline', 'auto'],
173 173 config=True,
174 174 help="""Pre-load matplotlib and numpy for interactive use,
175 175 selecting a particular matplotlib backend and loop integration.
176 176 """
177 177 )
178 178 pylab_import_all = Bool(True, config=True,
179 help="""If true, an 'import *' is done from numpy and pylab,
180 when using pylab"""
179 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
180 and an 'import *' is done from numpy and pylab, when using pylab mode.
181
182 When False, pylab mode should not import any names into the user namespace.
183 """
181 184 )
182 185 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
183 186
184 187 def init_path(self):
185 188 """Add current working directory, '', to sys.path"""
186 189 if sys.path[0] != '':
187 190 sys.path.insert(0, '')
188 191
189 192 def init_shell(self):
190 193 raise NotImplementedError("Override in subclasses")
191 194
192 195 def init_gui_pylab(self):
193 196 """Enable GUI event loop integration, taking pylab into account."""
194 197 if self.gui or self.pylab:
195 198 shell = self.shell
196 199 try:
197 200 if self.pylab:
198 201 gui, backend = pylabtools.find_gui_and_backend(self.pylab)
199 202 self.log.info("Enabling GUI event loop integration, "
200 203 "toolkit=%s, pylab=%s" % (gui, self.pylab))
201 shell.enable_pylab(gui, import_all=self.pylab_import_all, welcome_message=True)
204 if self.pylab == "auto":
205 print ("using matplotlib backend: %s" % backend)
206 shell.enable_pylab(self.pylab, import_all=self.pylab_import_all)
202 207 else:
203 208 self.log.info("Enabling GUI event loop integration, "
204 209 "toolkit=%s" % self.gui)
205 210 shell.enable_gui(self.gui)
206 211 except ImportError:
207 212 self.log.warn("pylab mode doesn't work as matplotlib could not be found." + \
208 213 "\nIs it installed on the system?")
209 214 self.shell.showtraceback()
210 215 except Exception:
211 216 self.log.warn("GUI event loop or pylab initialization failed")
212 217 self.shell.showtraceback()
213 218
214 219 def init_extensions(self):
215 220 """Load all IPython extensions in IPythonApp.extensions.
216 221
217 222 This uses the :meth:`ExtensionManager.load_extensions` to load all
218 223 the extensions listed in ``self.extensions``.
219 224 """
220 225 try:
221 226 self.log.debug("Loading IPython extensions...")
222 227 extensions = self.default_extensions + self.extensions
223 228 for ext in extensions:
224 229 try:
225 230 self.log.info("Loading IPython extension: %s" % ext)
226 231 self.shell.extension_manager.load_extension(ext)
227 232 except:
228 233 self.log.warn("Error in loading extension: %s" % ext +
229 234 "\nCheck your config files in %s" % self.profile_dir.location
230 235 )
231 236 self.shell.showtraceback()
232 237 except:
233 238 self.log.warn("Unknown error in loading extensions:")
234 239 self.shell.showtraceback()
235 240
236 241 def init_code(self):
237 242 """run the pre-flight code, specified via exec_lines"""
238 243 self._run_startup_files()
239 244 self._run_exec_lines()
240 245 self._run_exec_files()
241 246 self._run_cmd_line_code()
242 247 self._run_module()
243 248
244 249 # flush output, so itwon't be attached to the first cell
245 250 sys.stdout.flush()
246 251 sys.stderr.flush()
247 252
248 253 # Hide variables defined here from %who etc.
249 254 self.shell.user_ns_hidden.update(self.shell.user_ns)
250 255
251 256 def _run_exec_lines(self):
252 257 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
253 258 if not self.exec_lines:
254 259 return
255 260 try:
256 261 self.log.debug("Running code from IPythonApp.exec_lines...")
257 262 for line in self.exec_lines:
258 263 try:
259 264 self.log.info("Running code in user namespace: %s" %
260 265 line)
261 266 self.shell.run_cell(line, store_history=False)
262 267 except:
263 268 self.log.warn("Error in executing line in user "
264 269 "namespace: %s" % line)
265 270 self.shell.showtraceback()
266 271 except:
267 272 self.log.warn("Unknown error in handling IPythonApp.exec_lines:")
268 273 self.shell.showtraceback()
269 274
270 275 def _exec_file(self, fname):
271 276 try:
272 277 full_filename = filefind(fname, [u'.', self.ipython_dir])
273 278 except IOError as e:
274 279 self.log.warn("File not found: %r"%fname)
275 280 return
276 281 # Make sure that the running script gets a proper sys.argv as if it
277 282 # were run from a system shell.
278 283 save_argv = sys.argv
279 284 sys.argv = [full_filename] + self.extra_args[1:]
280 285 # protect sys.argv from potential unicode strings on Python 2:
281 286 if not py3compat.PY3:
282 287 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
283 288 try:
284 289 if os.path.isfile(full_filename):
285 290 self.log.info("Running file in user namespace: %s" %
286 291 full_filename)
287 292 # Ensure that __file__ is always defined to match Python
288 293 # behavior.
289 294 with preserve_keys(self.shell.user_ns, '__file__'):
290 295 self.shell.user_ns['__file__'] = fname
291 296 if full_filename.endswith('.ipy'):
292 297 self.shell.safe_execfile_ipy(full_filename)
293 298 else:
294 299 # default to python, even without extension
295 300 self.shell.safe_execfile(full_filename,
296 301 self.shell.user_ns)
297 302 finally:
298 303 sys.argv = save_argv
299 304
300 305 def _run_startup_files(self):
301 306 """Run files from profile startup directory"""
302 307 startup_dir = self.profile_dir.startup_dir
303 308 startup_files = []
304 309 if os.environ.get('PYTHONSTARTUP', False):
305 310 startup_files.append(os.environ['PYTHONSTARTUP'])
306 311 startup_files += glob.glob(os.path.join(startup_dir, '*.py'))
307 312 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
308 313 if not startup_files:
309 314 return
310 315
311 316 self.log.debug("Running startup files from %s...", startup_dir)
312 317 try:
313 318 for fname in sorted(startup_files):
314 319 self._exec_file(fname)
315 320 except:
316 321 self.log.warn("Unknown error in handling startup files:")
317 322 self.shell.showtraceback()
318 323
319 324 def _run_exec_files(self):
320 325 """Run files from IPythonApp.exec_files"""
321 326 if not self.exec_files:
322 327 return
323 328
324 329 self.log.debug("Running files in IPythonApp.exec_files...")
325 330 try:
326 331 for fname in self.exec_files:
327 332 self._exec_file(fname)
328 333 except:
329 334 self.log.warn("Unknown error in handling IPythonApp.exec_files:")
330 335 self.shell.showtraceback()
331 336
332 337 def _run_cmd_line_code(self):
333 338 """Run code or file specified at the command-line"""
334 339 if self.code_to_run:
335 340 line = self.code_to_run
336 341 try:
337 342 self.log.info("Running code given at command line (c=): %s" %
338 343 line)
339 344 self.shell.run_cell(line, store_history=False)
340 345 except:
341 346 self.log.warn("Error in executing line in user namespace: %s" %
342 347 line)
343 348 self.shell.showtraceback()
344 349
345 350 # Like Python itself, ignore the second if the first of these is present
346 351 elif self.file_to_run:
347 352 fname = self.file_to_run
348 353 try:
349 354 self._exec_file(fname)
350 355 except:
351 356 self.log.warn("Error in executing file in user namespace: %s" %
352 357 fname)
353 358 self.shell.showtraceback()
354 359
355 360 def _run_module(self):
356 361 """Run module specified at the command-line."""
357 362 if self.module_to_run:
358 363 # Make sure that the module gets a proper sys.argv as if it were
359 364 # run using `python -m`.
360 365 save_argv = sys.argv
361 366 sys.argv = [sys.executable] + self.extra_args
362 367 try:
363 368 self.shell.safe_run_module(self.module_to_run,
364 369 self.shell.user_ns)
365 370 finally:
366 371 sys.argv = save_argv
@@ -1,139 +1,140 b''
1 1 """Tests for pylab tools module.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2011, the IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14 from __future__ import print_function
15 15
16 16 # Stdlib imports
17 17
18 18 # Third-party imports
19 19 import matplotlib; matplotlib.use('Agg')
20 20 import nose.tools as nt
21 21
22 22 from matplotlib import pyplot as plt
23 23 import numpy as np
24 24
25 25 # Our own imports
26 from IPython.core.interactiveshell import InteractiveShell
26 27 from IPython.testing import decorators as dec
27 28 from .. import pylabtools as pt
28 29
29 30 #-----------------------------------------------------------------------------
30 31 # Globals and constants
31 32 #-----------------------------------------------------------------------------
32 33
33 34 #-----------------------------------------------------------------------------
34 35 # Local utilities
35 36 #-----------------------------------------------------------------------------
36 37
37 38 #-----------------------------------------------------------------------------
38 39 # Classes and functions
39 40 #-----------------------------------------------------------------------------
40 41
41 42 @dec.parametric
42 43 def test_figure_to_svg():
43 44 # simple empty-figure test
44 45 fig = plt.figure()
45 46 yield nt.assert_equal(pt.print_figure(fig, 'svg'), None)
46 47
47 48 plt.close('all')
48 49
49 50 # simple check for at least svg-looking output
50 51 fig = plt.figure()
51 52 ax = fig.add_subplot(1,1,1)
52 53 ax.plot([1,2,3])
53 54 plt.draw()
54 55 svg = pt.print_figure(fig, 'svg')[:100].lower()
55 56 yield nt.assert_true('doctype svg' in svg)
56 57
57 58
58 59 def test_import_pylab():
59 60 ip = get_ipython()
60 61 ns = {}
61 62 pt.import_pylab(ns, import_all=False)
62 63 nt.assert_true('plt' in ns)
63 64 nt.assert_equal(ns['np'], np)
64 65
65
66 66 class TestPylabSwitch(object):
67 class Shell(object):
68 pylab_gui_select = None
69
67 class Shell(InteractiveShell):
68 def enable_gui(self, gui):
69 pass
70
70 71 def setup(self):
71 72 import matplotlib
72 73 def act_mpl(backend):
73 74 matplotlib.rcParams['backend'] = backend
74 75
75 76 # Save rcParams since they get modified
76 77 self._saved_rcParams = matplotlib.rcParams
77 78 matplotlib.rcParams = dict(backend='Qt4Agg')
78 79
79 80 # Mock out functions
80 81 self._save_am = pt.activate_matplotlib
81 82 pt.activate_matplotlib = act_mpl
82 83 self._save_ip = pt.import_pylab
83 84 pt.import_pylab = lambda *a,**kw:None
84 85 self._save_cis = pt.configure_inline_support
85 86 pt.configure_inline_support = lambda *a,**kw:None
86 87
87 88 def teardown(self):
88 89 pt.activate_matplotlib = self._save_am
89 90 pt.import_pylab = self._save_ip
90 91 pt.configure_inline_support = self._save_cis
91 92 import matplotlib
92 93 matplotlib.rcParams = self._saved_rcParams
93 94
94 95 def test_qt(self):
95 96 s = self.Shell()
96 gui = pt.pylab_activate(dict(), None, False, s)
97 gui, backend = s.enable_matplotlib(None)
97 98 nt.assert_equal(gui, 'qt')
98 99 nt.assert_equal(s.pylab_gui_select, 'qt')
99 100
100 gui = pt.pylab_activate(dict(), 'inline', False, s)
101 gui, backend = s.enable_matplotlib('inline')
101 102 nt.assert_equal(gui, 'inline')
102 103 nt.assert_equal(s.pylab_gui_select, 'qt')
103 104
104 gui = pt.pylab_activate(dict(), 'qt', False, s)
105 gui, backend = s.enable_matplotlib('qt')
105 106 nt.assert_equal(gui, 'qt')
106 107 nt.assert_equal(s.pylab_gui_select, 'qt')
107 108
108 gui = pt.pylab_activate(dict(), 'inline', False, s)
109 gui, backend = s.enable_matplotlib('inline')
109 110 nt.assert_equal(gui, 'inline')
110 111 nt.assert_equal(s.pylab_gui_select, 'qt')
111 112
112 gui = pt.pylab_activate(dict(), None, False, s)
113 gui, backend = s.enable_matplotlib()
113 114 nt.assert_equal(gui, 'qt')
114 115 nt.assert_equal(s.pylab_gui_select, 'qt')
115 116
116 117 def test_inline(self):
117 118 s = self.Shell()
118 gui = pt.pylab_activate(dict(), 'inline', False, s)
119 gui, backend = s.enable_matplotlib('inline')
119 120 nt.assert_equal(gui, 'inline')
120 121 nt.assert_equal(s.pylab_gui_select, None)
121 122
122 gui = pt.pylab_activate(dict(), 'inline', False, s)
123 gui, backend = s.enable_matplotlib('inline')
123 124 nt.assert_equal(gui, 'inline')
124 125 nt.assert_equal(s.pylab_gui_select, None)
125 126
126 gui = pt.pylab_activate(dict(), 'qt', False, s)
127 gui, backend = s.enable_matplotlib('qt')
127 128 nt.assert_equal(gui, 'qt')
128 129 nt.assert_equal(s.pylab_gui_select, 'qt')
129 130
130 131 def test_qt_gtk(self):
131 132 s = self.Shell()
132 gui = pt.pylab_activate(dict(), 'qt', False, s)
133 gui, backend = s.enable_matplotlib('qt')
133 134 nt.assert_equal(gui, 'qt')
134 135 nt.assert_equal(s.pylab_gui_select, 'qt')
135 136
136 gui = pt.pylab_activate(dict(), 'gtk', False, s)
137 gui, backend = s.enable_matplotlib('gtk')
137 138 nt.assert_equal(gui, 'qt')
138 139 nt.assert_equal(s.pylab_gui_select, 'qt')
139 140
@@ -1,178 +1,182 b''
1 1 """An in-process kernel"""
2 2
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (C) 2012 The IPython Development Team
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #-----------------------------------------------------------------------------
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Imports
12 12 #-----------------------------------------------------------------------------
13 13
14 14 # Standard library imports
15 15 from contextlib import contextmanager
16 16 import logging
17 17 import sys
18 18
19 19 # Local imports
20 20 from IPython.core.interactiveshell import InteractiveShellABC
21 21 from IPython.utils.jsonutil import json_clean
22 22 from IPython.utils.traitlets import Any, Enum, Instance, List, Type
23 23 from IPython.kernel.zmq.ipkernel import Kernel
24 24 from IPython.kernel.zmq.zmqshell import ZMQInteractiveShell
25 25
26 26 from .socket import DummySocket
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Main kernel class
30 30 #-----------------------------------------------------------------------------
31 31
32 32 class InProcessKernel(Kernel):
33 33
34 34 #-------------------------------------------------------------------------
35 35 # InProcessKernel interface
36 36 #-------------------------------------------------------------------------
37 37
38 38 # The frontends connected to this kernel.
39 39 frontends = List(
40 40 Instance('IPython.kernel.inprocess.client.InProcessKernelClient')
41 41 )
42 42
43 43 # The GUI environment that the kernel is running under. This need not be
44 44 # specified for the normal operation for the kernel, but is required for
45 45 # IPython's GUI support (including pylab). The default is 'inline' because
46 46 # it is safe under all GUI toolkits.
47 47 gui = Enum(('tk', 'gtk', 'wx', 'qt', 'qt4', 'inline'),
48 48 default_value='inline')
49 49
50 50 raw_input_str = Any()
51 51 stdout = Any()
52 52 stderr = Any()
53 53
54 54 #-------------------------------------------------------------------------
55 55 # Kernel interface
56 56 #-------------------------------------------------------------------------
57 57
58 58 shell_class = Type()
59 59 shell_streams = List()
60 60 control_stream = Any()
61 61 iopub_socket = Instance(DummySocket, ())
62 62 stdin_socket = Instance(DummySocket, ())
63 63
64 64 def __init__(self, **traits):
65 65 # When an InteractiveShell is instantiated by our base class, it binds
66 66 # the current values of sys.stdout and sys.stderr.
67 67 with self._redirected_io():
68 68 super(InProcessKernel, self).__init__(**traits)
69 69
70 70 self.iopub_socket.on_trait_change(self._io_dispatch, 'message_sent')
71 71 self.shell.kernel = self
72 72
73 73 def execute_request(self, stream, ident, parent):
74 74 """ Override for temporary IO redirection. """
75 75 with self._redirected_io():
76 76 super(InProcessKernel, self).execute_request(stream, ident, parent)
77 77
78 78 def start(self):
79 79 """ Override registration of dispatchers for streams. """
80 80 self.shell.exit_now = False
81 81
82 82 def _abort_queue(self, stream):
83 83 """ The in-process kernel doesn't abort requests. """
84 84 pass
85 85
86 86 def _raw_input(self, prompt, ident, parent):
87 87 # Flush output before making the request.
88 88 self.raw_input_str = None
89 89 sys.stderr.flush()
90 90 sys.stdout.flush()
91 91
92 92 # Send the input request.
93 93 content = json_clean(dict(prompt=prompt))
94 94 msg = self.session.msg(u'input_request', content, parent)
95 95 for frontend in self.frontends:
96 96 if frontend.session.session == parent['header']['session']:
97 97 frontend.stdin_channel.call_handlers(msg)
98 98 break
99 99 else:
100 100 logging.error('No frontend found for raw_input request')
101 101 return str()
102 102
103 103 # Await a response.
104 104 while self.raw_input_str is None:
105 105 frontend.stdin_channel.process_events()
106 106 return self.raw_input_str
107 107
108 108 #-------------------------------------------------------------------------
109 109 # Protected interface
110 110 #-------------------------------------------------------------------------
111 111
112 112 @contextmanager
113 113 def _redirected_io(self):
114 114 """ Temporarily redirect IO to the kernel.
115 115 """
116 116 sys_stdout, sys_stderr = sys.stdout, sys.stderr
117 117 sys.stdout, sys.stderr = self.stdout, self.stderr
118 118 yield
119 119 sys.stdout, sys.stderr = sys_stdout, sys_stderr
120 120
121 121 #------ Trait change handlers --------------------------------------------
122 122
123 123 def _io_dispatch(self):
124 124 """ Called when a message is sent to the IO socket.
125 125 """
126 126 ident, msg = self.session.recv(self.iopub_socket, copy=False)
127 127 for frontend in self.frontends:
128 128 frontend.iopub_channel.call_handlers(msg)
129 129
130 130 #------ Trait initializers -----------------------------------------------
131 131
132 132 def _log_default(self):
133 133 return logging.getLogger(__name__)
134 134
135 135 def _session_default(self):
136 136 from IPython.kernel.zmq.session import Session
137 137 return Session(parent=self)
138 138
139 139 def _shell_class_default(self):
140 140 return InProcessInteractiveShell
141 141
142 142 def _stdout_default(self):
143 143 from IPython.kernel.zmq.iostream import OutStream
144 144 return OutStream(self.session, self.iopub_socket, u'stdout', pipe=False)
145 145
146 146 def _stderr_default(self):
147 147 from IPython.kernel.zmq.iostream import OutStream
148 148 return OutStream(self.session, self.iopub_socket, u'stderr', pipe=False)
149 149
150 150 #-----------------------------------------------------------------------------
151 151 # Interactive shell subclass
152 152 #-----------------------------------------------------------------------------
153 153
154 154 class InProcessInteractiveShell(ZMQInteractiveShell):
155 155
156 156 kernel = Instance('IPython.kernel.inprocess.ipkernel.InProcessKernel')
157 157
158 158 #-------------------------------------------------------------------------
159 159 # InteractiveShell interface
160 160 #-------------------------------------------------------------------------
161 161
162 162 def enable_gui(self, gui=None):
163 """ Enable GUI integration for the kernel.
164 """
163 """Enable GUI integration for the kernel."""
165 164 from IPython.kernel.zmq.eventloops import enable_gui
166 165 if not gui:
167 166 gui = self.kernel.gui
168 enable_gui(gui, kernel=self.kernel)
167 return enable_gui(gui, kernel=self.kernel)
168
169 def enable_matplotlib(self, gui=None):
170 """Enable matplotlib integration for the kernel."""
171 if not gui:
172 gui = self.kernel.gui
173 return super(InProcessInteractiveShell, self).enable_matplotlib(gui)
169 174
170 175 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
171 """ Activate pylab support at runtime.
172 """
176 """Activate pylab support at runtime."""
173 177 if not gui:
174 178 gui = self.kernel.gui
175 super(InProcessInteractiveShell, self).enable_pylab(gui, import_all,
179 return super(InProcessInteractiveShell, self).enable_pylab(gui, import_all,
176 180 welcome_message)
177 181
178 182 InteractiveShellABC.register(InProcessInteractiveShell)
@@ -1,91 +1,91 b''
1 1 #-------------------------------------------------------------------------------
2 2 # Copyright (C) 2012 The IPython Development Team
3 3 #
4 4 # Distributed under the terms of the BSD License. The full license is in
5 5 # the file COPYING, distributed as part of this software.
6 6 #-------------------------------------------------------------------------------
7 7
8 8 #-----------------------------------------------------------------------------
9 9 # Imports
10 10 #-----------------------------------------------------------------------------
11 11 from __future__ import print_function
12 12
13 13 # Standard library imports
14 14 from StringIO import StringIO
15 15 import sys
16 16 import unittest
17 17
18 18 # Local imports
19 19 from IPython.kernel.inprocess.blocking import BlockingInProcessKernelClient
20 20 from IPython.kernel.inprocess.manager import InProcessKernelManager
21 21 from IPython.kernel.inprocess.ipkernel import InProcessKernel
22 22 from IPython.testing.decorators import skipif_not_matplotlib
23 23 from IPython.utils.io import capture_output
24 24 from IPython.utils import py3compat
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Test case
28 28 #-----------------------------------------------------------------------------
29 29
30 30 class InProcessKernelTestCase(unittest.TestCase):
31 31
32 32 def setUp(self):
33 33 self.km = InProcessKernelManager()
34 34 self.km.start_kernel()
35 35 self.kc = BlockingInProcessKernelClient(kernel=self.km.kernel)
36 36 self.kc.start_channels()
37 37
38 38 @skipif_not_matplotlib
39 39 def test_pylab(self):
40 40 """ Does pylab work in the in-process kernel?
41 41 """
42 42 kc = self.kc
43 43 kc.execute('%pylab')
44 44 msg = get_stream_message(kc)
45 self.assert_('Welcome to pylab' in msg['content']['data'])
45 self.assert_('matplotlib' in msg['content']['data'])
46 46
47 47 def test_raw_input(self):
48 48 """ Does the in-process kernel handle raw_input correctly?
49 49 """
50 50 io = StringIO('foobar\n')
51 51 sys_stdin = sys.stdin
52 52 sys.stdin = io
53 53 try:
54 54 if py3compat.PY3:
55 55 self.kc.execute('x = input()')
56 56 else:
57 57 self.kc.execute('x = raw_input()')
58 58 finally:
59 59 sys.stdin = sys_stdin
60 60 self.assertEqual(self.km.kernel.shell.user_ns.get('x'), 'foobar')
61 61
62 62 def test_stdout(self):
63 63 """ Does the in-process kernel correctly capture IO?
64 64 """
65 65 kernel = InProcessKernel()
66 66
67 67 with capture_output() as io:
68 68 kernel.shell.run_cell('print("foo")')
69 69 self.assertEqual(io.stdout, 'foo\n')
70 70
71 71 kc = BlockingInProcessKernelClient(kernel=kernel)
72 72 kernel.frontends.append(kc)
73 73 kc.shell_channel.execute('print("bar")')
74 74 msg = get_stream_message(kc)
75 75 self.assertEqual(msg['content']['data'], 'bar\n')
76 76
77 77 #-----------------------------------------------------------------------------
78 78 # Utility functions
79 79 #-----------------------------------------------------------------------------
80 80
81 81 def get_stream_message(kernel_client, timeout=5):
82 82 """ Gets a single stream message synchronously from the sub channel.
83 83 """
84 84 while True:
85 85 msg = kernel_client.get_iopub_msg(timeout=timeout)
86 86 if msg['header']['msg_type'] == 'stream':
87 87 return msg
88 88
89 89
90 90 if __name__ == '__main__':
91 91 unittest.main()
@@ -1,119 +1,117 b''
1 1 """Test suite for pylab_import_all magic
2 2 Modified from the irunner module but using regex.
3 3 """
4 4 from __future__ import print_function
5 5
6 6 # Global to make tests extra verbose and help debugging
7 7 VERBOSE = True
8 8
9 9 # stdlib imports
10 10 import StringIO
11 11 import sys
12 12 import unittest
13 13 import re
14 14
15 15 # IPython imports
16 16 from IPython.lib import irunner
17 17 from IPython.testing import decorators
18 18
19 19 def pylab_not_importable():
20 20 """Test if importing pylab fails. (For example, when having no display)"""
21 21 try:
22 22 import pylab
23 23 return False
24 24 except:
25 25 return True
26 26
27 27 # Testing code begins
28 28 class RunnerTestCase(unittest.TestCase):
29 29
30 30 def setUp(self):
31 31 self.out = StringIO.StringIO()
32 32 #self.out = sys.stdout
33 33
34 34 def _test_runner(self,runner,source,output):
35 35 """Test that a given runner's input/output match."""
36 36
37 37 runner.run_source(source)
38 38 out = self.out.getvalue()
39 39 #out = ''
40 40 # this output contains nasty \r\n lineends, and the initial ipython
41 41 # banner. clean it up for comparison, removing lines of whitespace
42 42 output_l = [l for l in output.splitlines() if l and not l.isspace()]
43 43 out_l = [l for l in out.splitlines() if l and not l.isspace()]
44 44 mismatch = 0
45 45 if len(output_l) != len(out_l):
46 46 message = ("Mismatch in number of lines\n\n"
47 47 "Expected:\n"
48 48 "~~~~~~~~~\n"
49 49 "%s\n\n"
50 50 "Got:\n"
51 51 "~~~~~~~~~\n"
52 52 "%s"
53 53 ) % ("\n".join(output_l), "\n".join(out_l))
54 54 self.fail(message)
55 55 for n in range(len(output_l)):
56 56 # Do a line-by-line comparison
57 57 ol1 = output_l[n].strip()
58 58 ol2 = out_l[n].strip()
59 59 if not re.match(ol1,ol2):
60 60 mismatch += 1
61 61 if VERBOSE:
62 62 print('<<< line %s does not match:' % n)
63 63 print(repr(ol1))
64 64 print(repr(ol2))
65 65 print('>>>')
66 66 self.assertTrue(mismatch==0,'Number of mismatched lines: %s' %
67 67 mismatch)
68 68
69 69 @decorators.skipif_not_matplotlib
70 70 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
71 71 def test_pylab_import_all_enabled(self):
72 72 "Verify that plot is available when pylab_import_all = True"
73 73 source = """
74 74 from IPython.config.application import Application
75 75 app = Application.instance()
76 76 app.pylab_import_all = True
77 77 pylab
78 78 ip=get_ipython()
79 79 'plot' in ip.user_ns
80 80 """
81 81 output = """
82 82 In \[1\]: from IPython\.config\.application import Application
83 83 In \[2\]: app = Application\.instance\(\)
84 84 In \[3\]: app\.pylab_import_all = True
85 85 In \[4\]: pylab
86 ^Welcome to pylab, a matplotlib-based Python environment
87 For more information, type 'help\(pylab\)'\.
86 ^using matplotlib backend:
88 87 In \[5\]: ip=get_ipython\(\)
89 88 In \[6\]: \'plot\' in ip\.user_ns
90 89 Out\[6\]: True
91 90 """
92 91 runner = irunner.IPythonRunner(out=self.out)
93 92 self._test_runner(runner,source,output)
94 93
95 94 @decorators.skipif_not_matplotlib
96 95 @decorators.skipif(pylab_not_importable, "Likely a run without X.")
97 96 def test_pylab_import_all_disabled(self):
98 97 "Verify that plot is not available when pylab_import_all = False"
99 98 source = """
100 99 from IPython.config.application import Application
101 100 app = Application.instance()
102 101 app.pylab_import_all = False
103 102 pylab
104 103 ip=get_ipython()
105 104 'plot' in ip.user_ns
106 105 """
107 106 output = """
108 107 In \[1\]: from IPython\.config\.application import Application
109 108 In \[2\]: app = Application\.instance\(\)
110 109 In \[3\]: app\.pylab_import_all = False
111 110 In \[4\]: pylab
112 ^Welcome to pylab, a matplotlib-based Python environment
113 For more information, type 'help\(pylab\)'\.
111 ^using matplotlib backend:
114 112 In \[5\]: ip=get_ipython\(\)
115 113 In \[6\]: \'plot\' in ip\.user_ns
116 114 Out\[6\]: False
117 115 """
118 116 runner = irunner.IPythonRunner(out=self.out)
119 117 self._test_runner(runner,source,output)
@@ -1,54 +1,58 b''
1 1 # encoding: utf-8
2 2 """Decorators that don't go anywhere else.
3 3
4 4 This module contains misc. decorators that don't really go with another module
5 5 in :mod:`IPython.utils`. Beore putting something here please see if it should
6 6 go into another topical module in :mod:`IPython.utils`.
7 7 """
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (C) 2008-2011 The IPython Development Team
11 11 #
12 12 # Distributed under the terms of the BSD License. The full license is in
13 13 # the file COPYING, distributed as part of this software.
14 14 #-----------------------------------------------------------------------------
15 15
16 16 #-----------------------------------------------------------------------------
17 17 # Imports
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Code
22 22 #-----------------------------------------------------------------------------
23 23
24 24 def flag_calls(func):
25 25 """Wrap a function to detect and flag when it gets called.
26 26
27 27 This is a decorator which takes a function and wraps it in a function with
28 28 a 'called' attribute. wrapper.called is initialized to False.
29 29
30 30 The wrapper.called attribute is set to False right before each call to the
31 31 wrapped function, so if the call fails it remains False. After the call
32 32 completes, wrapper.called is set to True and the output is returned.
33 33
34 34 Testing for truth in wrapper.called allows you to determine if a call to
35 35 func() was attempted and succeeded."""
36
37 # don't wrap twice
38 if hasattr(func, 'called'):
39 return func
36 40
37 41 def wrapper(*args,**kw):
38 42 wrapper.called = False
39 43 out = func(*args,**kw)
40 44 wrapper.called = True
41 45 return out
42 46
43 47 wrapper.called = False
44 48 wrapper.__doc__ = func.__doc__
45 49 return wrapper
46 50
47 51 def undoc(func):
48 52 """Mark a function or class as undocumented.
49 53
50 54 This is found by inspecting the AST, so for now it must be used directly
51 55 as @undoc, not as e.g. @decorators.undoc
52 56 """
53 57 return func
54 58
General Comments 0
You need to be logged in to leave comments. Login now