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