##// END OF EJS Templates
Merge pull request #2184 from jasongrout/store-history...
Thomas Kluyver -
r8236:f56e91cd merge
parent child Browse files
Show More
@@ -1,3029 +1,3029 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 with_statement
18 18 from __future__ import absolute_import
19 19 from __future__ import print_function
20 20
21 21 import __builtin__ as builtin_mod
22 22 import __future__
23 23 import abc
24 24 import ast
25 25 import atexit
26 26 import os
27 27 import re
28 28 import runpy
29 29 import sys
30 30 import tempfile
31 31 import types
32 32
33 33 # We need to use nested to support python 2.6, once we move to >=2.7, we can
34 34 # use the with keyword's new builtin support for nested managers
35 35 try:
36 36 from contextlib import nested
37 37 except:
38 38 from IPython.utils.nested_context import nested
39 39
40 40 from IPython.config.configurable import SingletonConfigurable
41 41 from IPython.core import debugger, oinspect
42 42 from IPython.core import history as ipcorehist
43 43 from IPython.core import magic
44 44 from IPython.core import page
45 45 from IPython.core import prefilter
46 46 from IPython.core import shadowns
47 47 from IPython.core import ultratb
48 48 from IPython.core.alias import AliasManager, AliasError
49 49 from IPython.core.autocall import ExitAutocall
50 50 from IPython.core.builtin_trap import BuiltinTrap
51 51 from IPython.core.compilerop import CachingCompiler
52 52 from IPython.core.display_trap import DisplayTrap
53 53 from IPython.core.displayhook import DisplayHook
54 54 from IPython.core.displaypub import DisplayPublisher
55 55 from IPython.core.error import UsageError
56 56 from IPython.core.extensions import ExtensionManager
57 57 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
58 58 from IPython.core.formatters import DisplayFormatter
59 59 from IPython.core.history import HistoryManager
60 60 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
61 61 from IPython.core.logger import Logger
62 62 from IPython.core.macro import Macro
63 63 from IPython.core.payload import PayloadManager
64 64 from IPython.core.plugin import PluginManager
65 65 from IPython.core.prefilter import PrefilterManager
66 66 from IPython.core.profiledir import ProfileDir
67 67 from IPython.core.pylabtools import pylab_activate
68 68 from IPython.core.prompts import PromptManager
69 69 from IPython.lib.latextools import LaTeXTool
70 70 from IPython.utils import PyColorize
71 71 from IPython.utils import io
72 72 from IPython.utils import py3compat
73 73 from IPython.utils import openpy
74 74 from IPython.utils.doctestreload import doctest_reload
75 75 from IPython.utils.io import ask_yes_no
76 76 from IPython.utils.ipstruct import Struct
77 77 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
78 78 from IPython.utils.pickleshare import PickleShareDB
79 79 from IPython.utils.process import system, getoutput
80 80 from IPython.utils.strdispatch import StrDispatch
81 81 from IPython.utils.syspathcontext import prepended_to_syspath
82 82 from IPython.utils.text import (format_screen, LSString, SList,
83 83 DollarFormatter)
84 84 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
85 85 List, Unicode, Instance, Type)
86 86 from IPython.utils.warn import warn, error
87 87 import IPython.core.hooks
88 88
89 89 #-----------------------------------------------------------------------------
90 90 # Globals
91 91 #-----------------------------------------------------------------------------
92 92
93 93 # compiled regexps for autoindent management
94 94 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
95 95
96 96 #-----------------------------------------------------------------------------
97 97 # Utilities
98 98 #-----------------------------------------------------------------------------
99 99
100 100 def softspace(file, newvalue):
101 101 """Copied from code.py, to remove the dependency"""
102 102
103 103 oldvalue = 0
104 104 try:
105 105 oldvalue = file.softspace
106 106 except AttributeError:
107 107 pass
108 108 try:
109 109 file.softspace = newvalue
110 110 except (AttributeError, TypeError):
111 111 # "attribute-less object" or "read-only attributes"
112 112 pass
113 113 return oldvalue
114 114
115 115
116 116 def no_op(*a, **kw): pass
117 117
118 118 class NoOpContext(object):
119 119 def __enter__(self): pass
120 120 def __exit__(self, type, value, traceback): pass
121 121 no_op_context = NoOpContext()
122 122
123 123 class SpaceInInput(Exception): pass
124 124
125 125 class Bunch: pass
126 126
127 127
128 128 def get_default_colors():
129 129 if sys.platform=='darwin':
130 130 return "LightBG"
131 131 elif os.name=='nt':
132 132 return 'Linux'
133 133 else:
134 134 return 'Linux'
135 135
136 136
137 137 class SeparateUnicode(Unicode):
138 138 """A Unicode subclass to validate separate_in, separate_out, etc.
139 139
140 140 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
141 141 """
142 142
143 143 def validate(self, obj, value):
144 144 if value == '0': value = ''
145 145 value = value.replace('\\n','\n')
146 146 return super(SeparateUnicode, self).validate(obj, value)
147 147
148 148
149 149 class ReadlineNoRecord(object):
150 150 """Context manager to execute some code, then reload readline history
151 151 so that interactive input to the code doesn't appear when pressing up."""
152 152 def __init__(self, shell):
153 153 self.shell = shell
154 154 self._nested_level = 0
155 155
156 156 def __enter__(self):
157 157 if self._nested_level == 0:
158 158 try:
159 159 self.orig_length = self.current_length()
160 160 self.readline_tail = self.get_readline_tail()
161 161 except (AttributeError, IndexError): # Can fail with pyreadline
162 162 self.orig_length, self.readline_tail = 999999, []
163 163 self._nested_level += 1
164 164
165 165 def __exit__(self, type, value, traceback):
166 166 self._nested_level -= 1
167 167 if self._nested_level == 0:
168 168 # Try clipping the end if it's got longer
169 169 try:
170 170 e = self.current_length() - self.orig_length
171 171 if e > 0:
172 172 for _ in range(e):
173 173 self.shell.readline.remove_history_item(self.orig_length)
174 174
175 175 # If it still doesn't match, just reload readline history.
176 176 if self.current_length() != self.orig_length \
177 177 or self.get_readline_tail() != self.readline_tail:
178 178 self.shell.refill_readline_hist()
179 179 except (AttributeError, IndexError):
180 180 pass
181 181 # Returning False will cause exceptions to propagate
182 182 return False
183 183
184 184 def current_length(self):
185 185 return self.shell.readline.get_current_history_length()
186 186
187 187 def get_readline_tail(self, n=10):
188 188 """Get the last n items in readline history."""
189 189 end = self.shell.readline.get_current_history_length() + 1
190 190 start = max(end-n, 1)
191 191 ghi = self.shell.readline.get_history_item
192 192 return [ghi(x) for x in range(start, end)]
193 193
194 194 #-----------------------------------------------------------------------------
195 195 # Main IPython class
196 196 #-----------------------------------------------------------------------------
197 197
198 198 class InteractiveShell(SingletonConfigurable):
199 199 """An enhanced, interactive shell for Python."""
200 200
201 201 _instance = None
202 202
203 203 autocall = Enum((0,1,2), default_value=0, config=True, help=
204 204 """
205 205 Make IPython automatically call any callable object even if you didn't
206 206 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
207 207 automatically. The value can be '0' to disable the feature, '1' for
208 208 'smart' autocall, where it is not applied if there are no more
209 209 arguments on the line, and '2' for 'full' autocall, where all callable
210 210 objects are automatically called (even if no arguments are present).
211 211 """
212 212 )
213 213 # TODO: remove all autoindent logic and put into frontends.
214 214 # We can't do this yet because even runlines uses the autoindent.
215 215 autoindent = CBool(True, config=True, help=
216 216 """
217 217 Autoindent IPython code entered interactively.
218 218 """
219 219 )
220 220 automagic = CBool(True, config=True, help=
221 221 """
222 222 Enable magic commands to be called without the leading %.
223 223 """
224 224 )
225 225 cache_size = Integer(1000, config=True, help=
226 226 """
227 227 Set the size of the output cache. The default is 1000, you can
228 228 change it permanently in your config file. Setting it to 0 completely
229 229 disables the caching system, and the minimum value accepted is 20 (if
230 230 you provide a value less than 20, it is reset to 0 and a warning is
231 231 issued). This limit is defined because otherwise you'll spend more
232 232 time re-flushing a too small cache than working
233 233 """
234 234 )
235 235 color_info = CBool(True, config=True, help=
236 236 """
237 237 Use colors for displaying information about objects. Because this
238 238 information is passed through a pager (like 'less'), and some pagers
239 239 get confused with color codes, this capability can be turned off.
240 240 """
241 241 )
242 242 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
243 243 default_value=get_default_colors(), config=True,
244 244 help="Set the color scheme (NoColor, Linux, or LightBG)."
245 245 )
246 246 colors_force = CBool(False, help=
247 247 """
248 248 Force use of ANSI color codes, regardless of OS and readline
249 249 availability.
250 250 """
251 251 # FIXME: This is essentially a hack to allow ZMQShell to show colors
252 252 # without readline on Win32. When the ZMQ formatting system is
253 253 # refactored, this should be removed.
254 254 )
255 255 debug = CBool(False, config=True)
256 256 deep_reload = CBool(False, config=True, help=
257 257 """
258 258 Enable deep (recursive) reloading by default. IPython can use the
259 259 deep_reload module which reloads changes in modules recursively (it
260 260 replaces the reload() function, so you don't need to change anything to
261 261 use it). deep_reload() forces a full reload of modules whose code may
262 262 have changed, which the default reload() function does not. When
263 263 deep_reload is off, IPython will use the normal reload(), but
264 264 deep_reload will still be available as dreload().
265 265 """
266 266 )
267 267 disable_failing_post_execute = CBool(False, config=True,
268 268 help="Don't call post-execute functions that have failed in the past."
269 269 )
270 270 display_formatter = Instance(DisplayFormatter)
271 271 displayhook_class = Type(DisplayHook)
272 272 display_pub_class = Type(DisplayPublisher)
273 273 data_pub_class = None
274 274
275 275 exit_now = CBool(False)
276 276 exiter = Instance(ExitAutocall)
277 277 def _exiter_default(self):
278 278 return ExitAutocall(self)
279 279 # Monotonically increasing execution counter
280 280 execution_count = Integer(1)
281 281 filename = Unicode("<ipython console>")
282 282 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
283 283
284 284 # Input splitter, to split entire cells of input into either individual
285 285 # interactive statements or whole blocks.
286 286 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
287 287 (), {})
288 288 logstart = CBool(False, config=True, help=
289 289 """
290 290 Start logging to the default log file.
291 291 """
292 292 )
293 293 logfile = Unicode('', config=True, help=
294 294 """
295 295 The name of the logfile to use.
296 296 """
297 297 )
298 298 logappend = Unicode('', config=True, help=
299 299 """
300 300 Start logging to the given file in append mode.
301 301 """
302 302 )
303 303 object_info_string_level = Enum((0,1,2), default_value=0,
304 304 config=True)
305 305 pdb = CBool(False, config=True, help=
306 306 """
307 307 Automatically call the pdb debugger after every exception.
308 308 """
309 309 )
310 310 multiline_history = CBool(sys.platform != 'win32', config=True,
311 311 help="Save multi-line entries as one entry in readline history"
312 312 )
313 313
314 314 # deprecated prompt traits:
315 315
316 316 prompt_in1 = Unicode('In [\\#]: ', config=True,
317 317 help="Deprecated, use PromptManager.in_template")
318 318 prompt_in2 = Unicode(' .\\D.: ', config=True,
319 319 help="Deprecated, use PromptManager.in2_template")
320 320 prompt_out = Unicode('Out[\\#]: ', config=True,
321 321 help="Deprecated, use PromptManager.out_template")
322 322 prompts_pad_left = CBool(True, config=True,
323 323 help="Deprecated, use PromptManager.justify")
324 324
325 325 def _prompt_trait_changed(self, name, old, new):
326 326 table = {
327 327 'prompt_in1' : 'in_template',
328 328 'prompt_in2' : 'in2_template',
329 329 'prompt_out' : 'out_template',
330 330 'prompts_pad_left' : 'justify',
331 331 }
332 332 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}\n".format(
333 333 name=name, newname=table[name])
334 334 )
335 335 # protect against weird cases where self.config may not exist:
336 336 if self.config is not None:
337 337 # propagate to corresponding PromptManager trait
338 338 setattr(self.config.PromptManager, table[name], new)
339 339
340 340 _prompt_in1_changed = _prompt_trait_changed
341 341 _prompt_in2_changed = _prompt_trait_changed
342 342 _prompt_out_changed = _prompt_trait_changed
343 343 _prompt_pad_left_changed = _prompt_trait_changed
344 344
345 345 show_rewritten_input = CBool(True, config=True,
346 346 help="Show rewritten input, e.g. for autocall."
347 347 )
348 348
349 349 quiet = CBool(False, config=True)
350 350
351 351 history_length = Integer(10000, config=True)
352 352
353 353 # The readline stuff will eventually be moved to the terminal subclass
354 354 # but for now, we can't do that as readline is welded in everywhere.
355 355 readline_use = CBool(True, config=True)
356 356 readline_remove_delims = Unicode('-/~', config=True)
357 357 # don't use \M- bindings by default, because they
358 358 # conflict with 8-bit encodings. See gh-58,gh-88
359 359 readline_parse_and_bind = List([
360 360 'tab: complete',
361 361 '"\C-l": clear-screen',
362 362 'set show-all-if-ambiguous on',
363 363 '"\C-o": tab-insert',
364 364 '"\C-r": reverse-search-history',
365 365 '"\C-s": forward-search-history',
366 366 '"\C-p": history-search-backward',
367 367 '"\C-n": history-search-forward',
368 368 '"\e[A": history-search-backward',
369 369 '"\e[B": history-search-forward',
370 370 '"\C-k": kill-line',
371 371 '"\C-u": unix-line-discard',
372 372 ], allow_none=False, config=True)
373 373
374 374 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
375 375 default_value='last_expr', config=True,
376 376 help="""
377 377 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
378 378 run interactively (displaying output from expressions).""")
379 379
380 380 # TODO: this part of prompt management should be moved to the frontends.
381 381 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
382 382 separate_in = SeparateUnicode('\n', config=True)
383 383 separate_out = SeparateUnicode('', config=True)
384 384 separate_out2 = SeparateUnicode('', config=True)
385 385 wildcards_case_sensitive = CBool(True, config=True)
386 386 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
387 387 default_value='Context', config=True)
388 388
389 389 # Subcomponents of InteractiveShell
390 390 alias_manager = Instance('IPython.core.alias.AliasManager')
391 391 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
392 392 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
393 393 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
394 394 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
395 395 plugin_manager = Instance('IPython.core.plugin.PluginManager')
396 396 payload_manager = Instance('IPython.core.payload.PayloadManager')
397 397 history_manager = Instance('IPython.core.history.HistoryManager')
398 398 magics_manager = Instance('IPython.core.magic.MagicsManager')
399 399
400 400 profile_dir = Instance('IPython.core.application.ProfileDir')
401 401 @property
402 402 def profile(self):
403 403 if self.profile_dir is not None:
404 404 name = os.path.basename(self.profile_dir.location)
405 405 return name.replace('profile_','')
406 406
407 407
408 408 # Private interface
409 409 _post_execute = Instance(dict)
410 410
411 411 # Tracks any GUI loop loaded for pylab
412 412 pylab_gui_select = None
413 413
414 414 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
415 415 user_module=None, user_ns=None,
416 416 custom_exceptions=((), None)):
417 417
418 418 # This is where traits with a config_key argument are updated
419 419 # from the values on config.
420 420 super(InteractiveShell, self).__init__(config=config)
421 421 self.configurables = [self]
422 422
423 423 # These are relatively independent and stateless
424 424 self.init_ipython_dir(ipython_dir)
425 425 self.init_profile_dir(profile_dir)
426 426 self.init_instance_attrs()
427 427 self.init_environment()
428 428
429 429 # Check if we're in a virtualenv, and set up sys.path.
430 430 self.init_virtualenv()
431 431
432 432 # Create namespaces (user_ns, user_global_ns, etc.)
433 433 self.init_create_namespaces(user_module, user_ns)
434 434 # This has to be done after init_create_namespaces because it uses
435 435 # something in self.user_ns, but before init_sys_modules, which
436 436 # is the first thing to modify sys.
437 437 # TODO: When we override sys.stdout and sys.stderr before this class
438 438 # is created, we are saving the overridden ones here. Not sure if this
439 439 # is what we want to do.
440 440 self.save_sys_module_state()
441 441 self.init_sys_modules()
442 442
443 443 # While we're trying to have each part of the code directly access what
444 444 # it needs without keeping redundant references to objects, we have too
445 445 # much legacy code that expects ip.db to exist.
446 446 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
447 447
448 448 self.init_history()
449 449 self.init_encoding()
450 450 self.init_prefilter()
451 451
452 452 self.init_syntax_highlighting()
453 453 self.init_hooks()
454 454 self.init_pushd_popd_magic()
455 455 # self.init_traceback_handlers use to be here, but we moved it below
456 456 # because it and init_io have to come after init_readline.
457 457 self.init_user_ns()
458 458 self.init_logger()
459 459 self.init_alias()
460 460 self.init_builtins()
461 461
462 462 # The following was in post_config_initialization
463 463 self.init_inspector()
464 464 # init_readline() must come before init_io(), because init_io uses
465 465 # readline related things.
466 466 self.init_readline()
467 467 # We save this here in case user code replaces raw_input, but it needs
468 468 # to be after init_readline(), because PyPy's readline works by replacing
469 469 # raw_input.
470 470 if py3compat.PY3:
471 471 self.raw_input_original = input
472 472 else:
473 473 self.raw_input_original = raw_input
474 474 # init_completer must come after init_readline, because it needs to
475 475 # know whether readline is present or not system-wide to configure the
476 476 # completers, since the completion machinery can now operate
477 477 # independently of readline (e.g. over the network)
478 478 self.init_completer()
479 479 # TODO: init_io() needs to happen before init_traceback handlers
480 480 # because the traceback handlers hardcode the stdout/stderr streams.
481 481 # This logic in in debugger.Pdb and should eventually be changed.
482 482 self.init_io()
483 483 self.init_traceback_handlers(custom_exceptions)
484 484 self.init_prompts()
485 485 self.init_display_formatter()
486 486 self.init_display_pub()
487 487 self.init_data_pub()
488 488 self.init_displayhook()
489 489 self.init_reload_doctest()
490 490 self.init_latextool()
491 491 self.init_magics()
492 492 self.init_logstart()
493 493 self.init_pdb()
494 494 self.init_extension_manager()
495 495 self.init_plugin_manager()
496 496 self.init_payload()
497 497 self.hooks.late_startup_hook()
498 498 atexit.register(self.atexit_operations)
499 499
500 500 def get_ipython(self):
501 501 """Return the currently running IPython instance."""
502 502 return self
503 503
504 504 #-------------------------------------------------------------------------
505 505 # Trait changed handlers
506 506 #-------------------------------------------------------------------------
507 507
508 508 def _ipython_dir_changed(self, name, new):
509 509 if not os.path.isdir(new):
510 510 os.makedirs(new, mode = 0777)
511 511
512 512 def set_autoindent(self,value=None):
513 513 """Set the autoindent flag, checking for readline support.
514 514
515 515 If called with no arguments, it acts as a toggle."""
516 516
517 517 if value != 0 and not self.has_readline:
518 518 if os.name == 'posix':
519 519 warn("The auto-indent feature requires the readline library")
520 520 self.autoindent = 0
521 521 return
522 522 if value is None:
523 523 self.autoindent = not self.autoindent
524 524 else:
525 525 self.autoindent = value
526 526
527 527 #-------------------------------------------------------------------------
528 528 # init_* methods called by __init__
529 529 #-------------------------------------------------------------------------
530 530
531 531 def init_ipython_dir(self, ipython_dir):
532 532 if ipython_dir is not None:
533 533 self.ipython_dir = ipython_dir
534 534 return
535 535
536 536 self.ipython_dir = get_ipython_dir()
537 537
538 538 def init_profile_dir(self, profile_dir):
539 539 if profile_dir is not None:
540 540 self.profile_dir = profile_dir
541 541 return
542 542 self.profile_dir =\
543 543 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
544 544
545 545 def init_instance_attrs(self):
546 546 self.more = False
547 547
548 548 # command compiler
549 549 self.compile = CachingCompiler()
550 550
551 551 # Make an empty namespace, which extension writers can rely on both
552 552 # existing and NEVER being used by ipython itself. This gives them a
553 553 # convenient location for storing additional information and state
554 554 # their extensions may require, without fear of collisions with other
555 555 # ipython names that may develop later.
556 556 self.meta = Struct()
557 557
558 558 # Temporary files used for various purposes. Deleted at exit.
559 559 self.tempfiles = []
560 560
561 561 # Keep track of readline usage (later set by init_readline)
562 562 self.has_readline = False
563 563
564 564 # keep track of where we started running (mainly for crash post-mortem)
565 565 # This is not being used anywhere currently.
566 566 self.starting_dir = os.getcwdu()
567 567
568 568 # Indentation management
569 569 self.indent_current_nsp = 0
570 570
571 571 # Dict to track post-execution functions that have been registered
572 572 self._post_execute = {}
573 573
574 574 def init_environment(self):
575 575 """Any changes we need to make to the user's environment."""
576 576 pass
577 577
578 578 def init_encoding(self):
579 579 # Get system encoding at startup time. Certain terminals (like Emacs
580 580 # under Win32 have it set to None, and we need to have a known valid
581 581 # encoding to use in the raw_input() method
582 582 try:
583 583 self.stdin_encoding = sys.stdin.encoding or 'ascii'
584 584 except AttributeError:
585 585 self.stdin_encoding = 'ascii'
586 586
587 587 def init_syntax_highlighting(self):
588 588 # Python source parser/formatter for syntax highlighting
589 589 pyformat = PyColorize.Parser().format
590 590 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
591 591
592 592 def init_pushd_popd_magic(self):
593 593 # for pushd/popd management
594 594 self.home_dir = get_home_dir()
595 595
596 596 self.dir_stack = []
597 597
598 598 def init_logger(self):
599 599 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
600 600 logmode='rotate')
601 601
602 602 def init_logstart(self):
603 603 """Initialize logging in case it was requested at the command line.
604 604 """
605 605 if self.logappend:
606 606 self.magic('logstart %s append' % self.logappend)
607 607 elif self.logfile:
608 608 self.magic('logstart %s' % self.logfile)
609 609 elif self.logstart:
610 610 self.magic('logstart')
611 611
612 612 def init_builtins(self):
613 613 # A single, static flag that we set to True. Its presence indicates
614 614 # that an IPython shell has been created, and we make no attempts at
615 615 # removing on exit or representing the existence of more than one
616 616 # IPython at a time.
617 617 builtin_mod.__dict__['__IPYTHON__'] = True
618 618
619 619 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
620 620 # manage on enter/exit, but with all our shells it's virtually
621 621 # impossible to get all the cases right. We're leaving the name in for
622 622 # those who adapted their codes to check for this flag, but will
623 623 # eventually remove it after a few more releases.
624 624 builtin_mod.__dict__['__IPYTHON__active'] = \
625 625 'Deprecated, check for __IPYTHON__'
626 626
627 627 self.builtin_trap = BuiltinTrap(shell=self)
628 628
629 629 def init_inspector(self):
630 630 # Object inspector
631 631 self.inspector = oinspect.Inspector(oinspect.InspectColors,
632 632 PyColorize.ANSICodeColors,
633 633 'NoColor',
634 634 self.object_info_string_level)
635 635
636 636 def init_io(self):
637 637 # This will just use sys.stdout and sys.stderr. If you want to
638 638 # override sys.stdout and sys.stderr themselves, you need to do that
639 639 # *before* instantiating this class, because io holds onto
640 640 # references to the underlying streams.
641 641 if sys.platform == 'win32' and self.has_readline:
642 642 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
643 643 else:
644 644 io.stdout = io.IOStream(sys.stdout)
645 645 io.stderr = io.IOStream(sys.stderr)
646 646
647 647 def init_prompts(self):
648 648 self.prompt_manager = PromptManager(shell=self, config=self.config)
649 649 self.configurables.append(self.prompt_manager)
650 650 # Set system prompts, so that scripts can decide if they are running
651 651 # interactively.
652 652 sys.ps1 = 'In : '
653 653 sys.ps2 = '...: '
654 654 sys.ps3 = 'Out: '
655 655
656 656 def init_display_formatter(self):
657 657 self.display_formatter = DisplayFormatter(config=self.config)
658 658 self.configurables.append(self.display_formatter)
659 659
660 660 def init_display_pub(self):
661 661 self.display_pub = self.display_pub_class(config=self.config)
662 662 self.configurables.append(self.display_pub)
663 663
664 664 def init_data_pub(self):
665 665 if not self.data_pub_class:
666 666 self.data_pub = None
667 667 return
668 668 self.data_pub = self.data_pub_class(config=self.config)
669 669 self.configurables.append(self.data_pub)
670 670
671 671 def init_displayhook(self):
672 672 # Initialize displayhook, set in/out prompts and printing system
673 673 self.displayhook = self.displayhook_class(
674 674 config=self.config,
675 675 shell=self,
676 676 cache_size=self.cache_size,
677 677 )
678 678 self.configurables.append(self.displayhook)
679 679 # This is a context manager that installs/revmoes the displayhook at
680 680 # the appropriate time.
681 681 self.display_trap = DisplayTrap(hook=self.displayhook)
682 682
683 683 def init_reload_doctest(self):
684 684 # Do a proper resetting of doctest, including the necessary displayhook
685 685 # monkeypatching
686 686 try:
687 687 doctest_reload()
688 688 except ImportError:
689 689 warn("doctest module does not exist.")
690 690
691 691 def init_latextool(self):
692 692 """Configure LaTeXTool."""
693 693 cfg = LaTeXTool.instance(config=self.config)
694 694 if cfg not in self.configurables:
695 695 self.configurables.append(cfg)
696 696
697 697 def init_virtualenv(self):
698 698 """Add a virtualenv to sys.path so the user can import modules from it.
699 699 This isn't perfect: it doesn't use the Python interpreter with which the
700 700 virtualenv was built, and it ignores the --no-site-packages option. A
701 701 warning will appear suggesting the user installs IPython in the
702 702 virtualenv, but for many cases, it probably works well enough.
703 703
704 704 Adapted from code snippets online.
705 705
706 706 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
707 707 """
708 708 if 'VIRTUAL_ENV' not in os.environ:
709 709 # Not in a virtualenv
710 710 return
711 711
712 712 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
713 713 # Running properly in the virtualenv, don't need to do anything
714 714 return
715 715
716 716 warn("Attempting to work in a virtualenv. If you encounter problems, please "
717 717 "install IPython inside the virtualenv.\n")
718 718 if sys.platform == "win32":
719 719 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
720 720 else:
721 721 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
722 722 'python%d.%d' % sys.version_info[:2], 'site-packages')
723 723
724 724 import site
725 725 sys.path.insert(0, virtual_env)
726 726 site.addsitedir(virtual_env)
727 727
728 728 #-------------------------------------------------------------------------
729 729 # Things related to injections into the sys module
730 730 #-------------------------------------------------------------------------
731 731
732 732 def save_sys_module_state(self):
733 733 """Save the state of hooks in the sys module.
734 734
735 735 This has to be called after self.user_module is created.
736 736 """
737 737 self._orig_sys_module_state = {}
738 738 self._orig_sys_module_state['stdin'] = sys.stdin
739 739 self._orig_sys_module_state['stdout'] = sys.stdout
740 740 self._orig_sys_module_state['stderr'] = sys.stderr
741 741 self._orig_sys_module_state['excepthook'] = sys.excepthook
742 742 self._orig_sys_modules_main_name = self.user_module.__name__
743 743 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
744 744
745 745 def restore_sys_module_state(self):
746 746 """Restore the state of the sys module."""
747 747 try:
748 748 for k, v in self._orig_sys_module_state.iteritems():
749 749 setattr(sys, k, v)
750 750 except AttributeError:
751 751 pass
752 752 # Reset what what done in self.init_sys_modules
753 753 if self._orig_sys_modules_main_mod is not None:
754 754 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
755 755
756 756 #-------------------------------------------------------------------------
757 757 # Things related to hooks
758 758 #-------------------------------------------------------------------------
759 759
760 760 def init_hooks(self):
761 761 # hooks holds pointers used for user-side customizations
762 762 self.hooks = Struct()
763 763
764 764 self.strdispatchers = {}
765 765
766 766 # Set all default hooks, defined in the IPython.hooks module.
767 767 hooks = IPython.core.hooks
768 768 for hook_name in hooks.__all__:
769 769 # default hooks have priority 100, i.e. low; user hooks should have
770 770 # 0-100 priority
771 771 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
772 772
773 773 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
774 774 """set_hook(name,hook) -> sets an internal IPython hook.
775 775
776 776 IPython exposes some of its internal API as user-modifiable hooks. By
777 777 adding your function to one of these hooks, you can modify IPython's
778 778 behavior to call at runtime your own routines."""
779 779
780 780 # At some point in the future, this should validate the hook before it
781 781 # accepts it. Probably at least check that the hook takes the number
782 782 # of args it's supposed to.
783 783
784 784 f = types.MethodType(hook,self)
785 785
786 786 # check if the hook is for strdispatcher first
787 787 if str_key is not None:
788 788 sdp = self.strdispatchers.get(name, StrDispatch())
789 789 sdp.add_s(str_key, f, priority )
790 790 self.strdispatchers[name] = sdp
791 791 return
792 792 if re_key is not None:
793 793 sdp = self.strdispatchers.get(name, StrDispatch())
794 794 sdp.add_re(re.compile(re_key), f, priority )
795 795 self.strdispatchers[name] = sdp
796 796 return
797 797
798 798 dp = getattr(self.hooks, name, None)
799 799 if name not in IPython.core.hooks.__all__:
800 800 print("Warning! Hook '%s' is not one of %s" % \
801 801 (name, IPython.core.hooks.__all__ ))
802 802 if not dp:
803 803 dp = IPython.core.hooks.CommandChainDispatcher()
804 804
805 805 try:
806 806 dp.add(f,priority)
807 807 except AttributeError:
808 808 # it was not commandchain, plain old func - replace
809 809 dp = f
810 810
811 811 setattr(self.hooks,name, dp)
812 812
813 813 def register_post_execute(self, func):
814 814 """Register a function for calling after code execution.
815 815 """
816 816 if not callable(func):
817 817 raise ValueError('argument %s must be callable' % func)
818 818 self._post_execute[func] = True
819 819
820 820 #-------------------------------------------------------------------------
821 821 # Things related to the "main" module
822 822 #-------------------------------------------------------------------------
823 823
824 824 def new_main_mod(self,ns=None):
825 825 """Return a new 'main' module object for user code execution.
826 826 """
827 827 main_mod = self._user_main_module
828 828 init_fakemod_dict(main_mod,ns)
829 829 return main_mod
830 830
831 831 def cache_main_mod(self,ns,fname):
832 832 """Cache a main module's namespace.
833 833
834 834 When scripts are executed via %run, we must keep a reference to the
835 835 namespace of their __main__ module (a FakeModule instance) around so
836 836 that Python doesn't clear it, rendering objects defined therein
837 837 useless.
838 838
839 839 This method keeps said reference in a private dict, keyed by the
840 840 absolute path of the module object (which corresponds to the script
841 841 path). This way, for multiple executions of the same script we only
842 842 keep one copy of the namespace (the last one), thus preventing memory
843 843 leaks from old references while allowing the objects from the last
844 844 execution to be accessible.
845 845
846 846 Note: we can not allow the actual FakeModule instances to be deleted,
847 847 because of how Python tears down modules (it hard-sets all their
848 848 references to None without regard for reference counts). This method
849 849 must therefore make a *copy* of the given namespace, to allow the
850 850 original module's __dict__ to be cleared and reused.
851 851
852 852
853 853 Parameters
854 854 ----------
855 855 ns : a namespace (a dict, typically)
856 856
857 857 fname : str
858 858 Filename associated with the namespace.
859 859
860 860 Examples
861 861 --------
862 862
863 863 In [10]: import IPython
864 864
865 865 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
866 866
867 867 In [12]: IPython.__file__ in _ip._main_ns_cache
868 868 Out[12]: True
869 869 """
870 870 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
871 871
872 872 def clear_main_mod_cache(self):
873 873 """Clear the cache of main modules.
874 874
875 875 Mainly for use by utilities like %reset.
876 876
877 877 Examples
878 878 --------
879 879
880 880 In [15]: import IPython
881 881
882 882 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
883 883
884 884 In [17]: len(_ip._main_ns_cache) > 0
885 885 Out[17]: True
886 886
887 887 In [18]: _ip.clear_main_mod_cache()
888 888
889 889 In [19]: len(_ip._main_ns_cache) == 0
890 890 Out[19]: True
891 891 """
892 892 self._main_ns_cache.clear()
893 893
894 894 #-------------------------------------------------------------------------
895 895 # Things related to debugging
896 896 #-------------------------------------------------------------------------
897 897
898 898 def init_pdb(self):
899 899 # Set calling of pdb on exceptions
900 900 # self.call_pdb is a property
901 901 self.call_pdb = self.pdb
902 902
903 903 def _get_call_pdb(self):
904 904 return self._call_pdb
905 905
906 906 def _set_call_pdb(self,val):
907 907
908 908 if val not in (0,1,False,True):
909 909 raise ValueError('new call_pdb value must be boolean')
910 910
911 911 # store value in instance
912 912 self._call_pdb = val
913 913
914 914 # notify the actual exception handlers
915 915 self.InteractiveTB.call_pdb = val
916 916
917 917 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
918 918 'Control auto-activation of pdb at exceptions')
919 919
920 920 def debugger(self,force=False):
921 921 """Call the pydb/pdb debugger.
922 922
923 923 Keywords:
924 924
925 925 - force(False): by default, this routine checks the instance call_pdb
926 926 flag and does not actually invoke the debugger if the flag is false.
927 927 The 'force' option forces the debugger to activate even if the flag
928 928 is false.
929 929 """
930 930
931 931 if not (force or self.call_pdb):
932 932 return
933 933
934 934 if not hasattr(sys,'last_traceback'):
935 935 error('No traceback has been produced, nothing to debug.')
936 936 return
937 937
938 938 # use pydb if available
939 939 if debugger.has_pydb:
940 940 from pydb import pm
941 941 else:
942 942 # fallback to our internal debugger
943 943 pm = lambda : self.InteractiveTB.debugger(force=True)
944 944
945 945 with self.readline_no_record:
946 946 pm()
947 947
948 948 #-------------------------------------------------------------------------
949 949 # Things related to IPython's various namespaces
950 950 #-------------------------------------------------------------------------
951 951 default_user_namespaces = True
952 952
953 953 def init_create_namespaces(self, user_module=None, user_ns=None):
954 954 # Create the namespace where the user will operate. user_ns is
955 955 # normally the only one used, and it is passed to the exec calls as
956 956 # the locals argument. But we do carry a user_global_ns namespace
957 957 # given as the exec 'globals' argument, This is useful in embedding
958 958 # situations where the ipython shell opens in a context where the
959 959 # distinction between locals and globals is meaningful. For
960 960 # non-embedded contexts, it is just the same object as the user_ns dict.
961 961
962 962 # FIXME. For some strange reason, __builtins__ is showing up at user
963 963 # level as a dict instead of a module. This is a manual fix, but I
964 964 # should really track down where the problem is coming from. Alex
965 965 # Schmolck reported this problem first.
966 966
967 967 # A useful post by Alex Martelli on this topic:
968 968 # Re: inconsistent value from __builtins__
969 969 # Von: Alex Martelli <aleaxit@yahoo.com>
970 970 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
971 971 # Gruppen: comp.lang.python
972 972
973 973 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
974 974 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
975 975 # > <type 'dict'>
976 976 # > >>> print type(__builtins__)
977 977 # > <type 'module'>
978 978 # > Is this difference in return value intentional?
979 979
980 980 # Well, it's documented that '__builtins__' can be either a dictionary
981 981 # or a module, and it's been that way for a long time. Whether it's
982 982 # intentional (or sensible), I don't know. In any case, the idea is
983 983 # that if you need to access the built-in namespace directly, you
984 984 # should start with "import __builtin__" (note, no 's') which will
985 985 # definitely give you a module. Yeah, it's somewhat confusing:-(.
986 986
987 987 # These routines return a properly built module and dict as needed by
988 988 # the rest of the code, and can also be used by extension writers to
989 989 # generate properly initialized namespaces.
990 990 if (user_ns is not None) or (user_module is not None):
991 991 self.default_user_namespaces = False
992 992 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
993 993
994 994 # A record of hidden variables we have added to the user namespace, so
995 995 # we can list later only variables defined in actual interactive use.
996 996 self.user_ns_hidden = set()
997 997
998 998 # Now that FakeModule produces a real module, we've run into a nasty
999 999 # problem: after script execution (via %run), the module where the user
1000 1000 # code ran is deleted. Now that this object is a true module (needed
1001 1001 # so docetst and other tools work correctly), the Python module
1002 1002 # teardown mechanism runs over it, and sets to None every variable
1003 1003 # present in that module. Top-level references to objects from the
1004 1004 # script survive, because the user_ns is updated with them. However,
1005 1005 # calling functions defined in the script that use other things from
1006 1006 # the script will fail, because the function's closure had references
1007 1007 # to the original objects, which are now all None. So we must protect
1008 1008 # these modules from deletion by keeping a cache.
1009 1009 #
1010 1010 # To avoid keeping stale modules around (we only need the one from the
1011 1011 # last run), we use a dict keyed with the full path to the script, so
1012 1012 # only the last version of the module is held in the cache. Note,
1013 1013 # however, that we must cache the module *namespace contents* (their
1014 1014 # __dict__). Because if we try to cache the actual modules, old ones
1015 1015 # (uncached) could be destroyed while still holding references (such as
1016 1016 # those held by GUI objects that tend to be long-lived)>
1017 1017 #
1018 1018 # The %reset command will flush this cache. See the cache_main_mod()
1019 1019 # and clear_main_mod_cache() methods for details on use.
1020 1020
1021 1021 # This is the cache used for 'main' namespaces
1022 1022 self._main_ns_cache = {}
1023 1023 # And this is the single instance of FakeModule whose __dict__ we keep
1024 1024 # copying and clearing for reuse on each %run
1025 1025 self._user_main_module = FakeModule()
1026 1026
1027 1027 # A table holding all the namespaces IPython deals with, so that
1028 1028 # introspection facilities can search easily.
1029 1029 self.ns_table = {'user_global':self.user_module.__dict__,
1030 1030 'user_local':self.user_ns,
1031 1031 'builtin':builtin_mod.__dict__
1032 1032 }
1033 1033
1034 1034 @property
1035 1035 def user_global_ns(self):
1036 1036 return self.user_module.__dict__
1037 1037
1038 1038 def prepare_user_module(self, user_module=None, user_ns=None):
1039 1039 """Prepare the module and namespace in which user code will be run.
1040 1040
1041 1041 When IPython is started normally, both parameters are None: a new module
1042 1042 is created automatically, and its __dict__ used as the namespace.
1043 1043
1044 1044 If only user_module is provided, its __dict__ is used as the namespace.
1045 1045 If only user_ns is provided, a dummy module is created, and user_ns
1046 1046 becomes the global namespace. If both are provided (as they may be
1047 1047 when embedding), user_ns is the local namespace, and user_module
1048 1048 provides the global namespace.
1049 1049
1050 1050 Parameters
1051 1051 ----------
1052 1052 user_module : module, optional
1053 1053 The current user module in which IPython is being run. If None,
1054 1054 a clean module will be created.
1055 1055 user_ns : dict, optional
1056 1056 A namespace in which to run interactive commands.
1057 1057
1058 1058 Returns
1059 1059 -------
1060 1060 A tuple of user_module and user_ns, each properly initialised.
1061 1061 """
1062 1062 if user_module is None and user_ns is not None:
1063 1063 user_ns.setdefault("__name__", "__main__")
1064 1064 class DummyMod(object):
1065 1065 "A dummy module used for IPython's interactive namespace."
1066 1066 pass
1067 1067 user_module = DummyMod()
1068 1068 user_module.__dict__ = user_ns
1069 1069
1070 1070 if user_module is None:
1071 1071 user_module = types.ModuleType("__main__",
1072 1072 doc="Automatically created module for IPython interactive environment")
1073 1073
1074 1074 # We must ensure that __builtin__ (without the final 's') is always
1075 1075 # available and pointing to the __builtin__ *module*. For more details:
1076 1076 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1077 1077 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1078 1078 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1079 1079
1080 1080 if user_ns is None:
1081 1081 user_ns = user_module.__dict__
1082 1082
1083 1083 return user_module, user_ns
1084 1084
1085 1085 def init_sys_modules(self):
1086 1086 # We need to insert into sys.modules something that looks like a
1087 1087 # module but which accesses the IPython namespace, for shelve and
1088 1088 # pickle to work interactively. Normally they rely on getting
1089 1089 # everything out of __main__, but for embedding purposes each IPython
1090 1090 # instance has its own private namespace, so we can't go shoving
1091 1091 # everything into __main__.
1092 1092
1093 1093 # note, however, that we should only do this for non-embedded
1094 1094 # ipythons, which really mimic the __main__.__dict__ with their own
1095 1095 # namespace. Embedded instances, on the other hand, should not do
1096 1096 # this because they need to manage the user local/global namespaces
1097 1097 # only, but they live within a 'normal' __main__ (meaning, they
1098 1098 # shouldn't overtake the execution environment of the script they're
1099 1099 # embedded in).
1100 1100
1101 1101 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1102 1102 main_name = self.user_module.__name__
1103 1103 sys.modules[main_name] = self.user_module
1104 1104
1105 1105 def init_user_ns(self):
1106 1106 """Initialize all user-visible namespaces to their minimum defaults.
1107 1107
1108 1108 Certain history lists are also initialized here, as they effectively
1109 1109 act as user namespaces.
1110 1110
1111 1111 Notes
1112 1112 -----
1113 1113 All data structures here are only filled in, they are NOT reset by this
1114 1114 method. If they were not empty before, data will simply be added to
1115 1115 therm.
1116 1116 """
1117 1117 # This function works in two parts: first we put a few things in
1118 1118 # user_ns, and we sync that contents into user_ns_hidden so that these
1119 1119 # initial variables aren't shown by %who. After the sync, we add the
1120 1120 # rest of what we *do* want the user to see with %who even on a new
1121 1121 # session (probably nothing, so theye really only see their own stuff)
1122 1122
1123 1123 # The user dict must *always* have a __builtin__ reference to the
1124 1124 # Python standard __builtin__ namespace, which must be imported.
1125 1125 # This is so that certain operations in prompt evaluation can be
1126 1126 # reliably executed with builtins. Note that we can NOT use
1127 1127 # __builtins__ (note the 's'), because that can either be a dict or a
1128 1128 # module, and can even mutate at runtime, depending on the context
1129 1129 # (Python makes no guarantees on it). In contrast, __builtin__ is
1130 1130 # always a module object, though it must be explicitly imported.
1131 1131
1132 1132 # For more details:
1133 1133 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1134 1134 ns = dict()
1135 1135
1136 1136 # Put 'help' in the user namespace
1137 1137 try:
1138 1138 from site import _Helper
1139 1139 ns['help'] = _Helper()
1140 1140 except ImportError:
1141 1141 warn('help() not available - check site.py')
1142 1142
1143 1143 # make global variables for user access to the histories
1144 1144 ns['_ih'] = self.history_manager.input_hist_parsed
1145 1145 ns['_oh'] = self.history_manager.output_hist
1146 1146 ns['_dh'] = self.history_manager.dir_hist
1147 1147
1148 1148 ns['_sh'] = shadowns
1149 1149
1150 1150 # user aliases to input and output histories. These shouldn't show up
1151 1151 # in %who, as they can have very large reprs.
1152 1152 ns['In'] = self.history_manager.input_hist_parsed
1153 1153 ns['Out'] = self.history_manager.output_hist
1154 1154
1155 1155 # Store myself as the public api!!!
1156 1156 ns['get_ipython'] = self.get_ipython
1157 1157
1158 1158 ns['exit'] = self.exiter
1159 1159 ns['quit'] = self.exiter
1160 1160
1161 1161 # Sync what we've added so far to user_ns_hidden so these aren't seen
1162 1162 # by %who
1163 1163 self.user_ns_hidden.update(ns)
1164 1164
1165 1165 # Anything put into ns now would show up in %who. Think twice before
1166 1166 # putting anything here, as we really want %who to show the user their
1167 1167 # stuff, not our variables.
1168 1168
1169 1169 # Finally, update the real user's namespace
1170 1170 self.user_ns.update(ns)
1171 1171
1172 1172 @property
1173 1173 def all_ns_refs(self):
1174 1174 """Get a list of references to all the namespace dictionaries in which
1175 1175 IPython might store a user-created object.
1176 1176
1177 1177 Note that this does not include the displayhook, which also caches
1178 1178 objects from the output."""
1179 1179 return [self.user_ns, self.user_global_ns,
1180 1180 self._user_main_module.__dict__] + self._main_ns_cache.values()
1181 1181
1182 1182 def reset(self, new_session=True):
1183 1183 """Clear all internal namespaces, and attempt to release references to
1184 1184 user objects.
1185 1185
1186 1186 If new_session is True, a new history session will be opened.
1187 1187 """
1188 1188 # Clear histories
1189 1189 self.history_manager.reset(new_session)
1190 1190 # Reset counter used to index all histories
1191 1191 if new_session:
1192 1192 self.execution_count = 1
1193 1193
1194 1194 # Flush cached output items
1195 1195 if self.displayhook.do_full_cache:
1196 1196 self.displayhook.flush()
1197 1197
1198 1198 # The main execution namespaces must be cleared very carefully,
1199 1199 # skipping the deletion of the builtin-related keys, because doing so
1200 1200 # would cause errors in many object's __del__ methods.
1201 1201 if self.user_ns is not self.user_global_ns:
1202 1202 self.user_ns.clear()
1203 1203 ns = self.user_global_ns
1204 1204 drop_keys = set(ns.keys())
1205 1205 drop_keys.discard('__builtin__')
1206 1206 drop_keys.discard('__builtins__')
1207 1207 drop_keys.discard('__name__')
1208 1208 for k in drop_keys:
1209 1209 del ns[k]
1210 1210
1211 1211 self.user_ns_hidden.clear()
1212 1212
1213 1213 # Restore the user namespaces to minimal usability
1214 1214 self.init_user_ns()
1215 1215
1216 1216 # Restore the default and user aliases
1217 1217 self.alias_manager.clear_aliases()
1218 1218 self.alias_manager.init_aliases()
1219 1219
1220 1220 # Flush the private list of module references kept for script
1221 1221 # execution protection
1222 1222 self.clear_main_mod_cache()
1223 1223
1224 1224 # Clear out the namespace from the last %run
1225 1225 self.new_main_mod()
1226 1226
1227 1227 def del_var(self, varname, by_name=False):
1228 1228 """Delete a variable from the various namespaces, so that, as
1229 1229 far as possible, we're not keeping any hidden references to it.
1230 1230
1231 1231 Parameters
1232 1232 ----------
1233 1233 varname : str
1234 1234 The name of the variable to delete.
1235 1235 by_name : bool
1236 1236 If True, delete variables with the given name in each
1237 1237 namespace. If False (default), find the variable in the user
1238 1238 namespace, and delete references to it.
1239 1239 """
1240 1240 if varname in ('__builtin__', '__builtins__'):
1241 1241 raise ValueError("Refusing to delete %s" % varname)
1242 1242
1243 1243 ns_refs = self.all_ns_refs
1244 1244
1245 1245 if by_name: # Delete by name
1246 1246 for ns in ns_refs:
1247 1247 try:
1248 1248 del ns[varname]
1249 1249 except KeyError:
1250 1250 pass
1251 1251 else: # Delete by object
1252 1252 try:
1253 1253 obj = self.user_ns[varname]
1254 1254 except KeyError:
1255 1255 raise NameError("name '%s' is not defined" % varname)
1256 1256 # Also check in output history
1257 1257 ns_refs.append(self.history_manager.output_hist)
1258 1258 for ns in ns_refs:
1259 1259 to_delete = [n for n, o in ns.iteritems() if o is obj]
1260 1260 for name in to_delete:
1261 1261 del ns[name]
1262 1262
1263 1263 # displayhook keeps extra references, but not in a dictionary
1264 1264 for name in ('_', '__', '___'):
1265 1265 if getattr(self.displayhook, name) is obj:
1266 1266 setattr(self.displayhook, name, None)
1267 1267
1268 1268 def reset_selective(self, regex=None):
1269 1269 """Clear selective variables from internal namespaces based on a
1270 1270 specified regular expression.
1271 1271
1272 1272 Parameters
1273 1273 ----------
1274 1274 regex : string or compiled pattern, optional
1275 1275 A regular expression pattern that will be used in searching
1276 1276 variable names in the users namespaces.
1277 1277 """
1278 1278 if regex is not None:
1279 1279 try:
1280 1280 m = re.compile(regex)
1281 1281 except TypeError:
1282 1282 raise TypeError('regex must be a string or compiled pattern')
1283 1283 # Search for keys in each namespace that match the given regex
1284 1284 # If a match is found, delete the key/value pair.
1285 1285 for ns in self.all_ns_refs:
1286 1286 for var in ns:
1287 1287 if m.search(var):
1288 1288 del ns[var]
1289 1289
1290 1290 def push(self, variables, interactive=True):
1291 1291 """Inject a group of variables into the IPython user namespace.
1292 1292
1293 1293 Parameters
1294 1294 ----------
1295 1295 variables : dict, str or list/tuple of str
1296 1296 The variables to inject into the user's namespace. If a dict, a
1297 1297 simple update is done. If a str, the string is assumed to have
1298 1298 variable names separated by spaces. A list/tuple of str can also
1299 1299 be used to give the variable names. If just the variable names are
1300 1300 give (list/tuple/str) then the variable values looked up in the
1301 1301 callers frame.
1302 1302 interactive : bool
1303 1303 If True (default), the variables will be listed with the ``who``
1304 1304 magic.
1305 1305 """
1306 1306 vdict = None
1307 1307
1308 1308 # We need a dict of name/value pairs to do namespace updates.
1309 1309 if isinstance(variables, dict):
1310 1310 vdict = variables
1311 1311 elif isinstance(variables, (basestring, list, tuple)):
1312 1312 if isinstance(variables, basestring):
1313 1313 vlist = variables.split()
1314 1314 else:
1315 1315 vlist = variables
1316 1316 vdict = {}
1317 1317 cf = sys._getframe(1)
1318 1318 for name in vlist:
1319 1319 try:
1320 1320 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1321 1321 except:
1322 1322 print('Could not get variable %s from %s' %
1323 1323 (name,cf.f_code.co_name))
1324 1324 else:
1325 1325 raise ValueError('variables must be a dict/str/list/tuple')
1326 1326
1327 1327 # Propagate variables to user namespace
1328 1328 self.user_ns.update(vdict)
1329 1329
1330 1330 # And configure interactive visibility
1331 1331 user_ns_hidden = self.user_ns_hidden
1332 1332 if interactive:
1333 1333 user_ns_hidden.difference_update(vdict)
1334 1334 else:
1335 1335 user_ns_hidden.update(vdict)
1336 1336
1337 1337 def drop_by_id(self, variables):
1338 1338 """Remove a dict of variables from the user namespace, if they are the
1339 1339 same as the values in the dictionary.
1340 1340
1341 1341 This is intended for use by extensions: variables that they've added can
1342 1342 be taken back out if they are unloaded, without removing any that the
1343 1343 user has overwritten.
1344 1344
1345 1345 Parameters
1346 1346 ----------
1347 1347 variables : dict
1348 1348 A dictionary mapping object names (as strings) to the objects.
1349 1349 """
1350 1350 for name, obj in variables.iteritems():
1351 1351 if name in self.user_ns and self.user_ns[name] is obj:
1352 1352 del self.user_ns[name]
1353 1353 self.user_ns_hidden.discard(name)
1354 1354
1355 1355 #-------------------------------------------------------------------------
1356 1356 # Things related to object introspection
1357 1357 #-------------------------------------------------------------------------
1358 1358
1359 1359 def _ofind(self, oname, namespaces=None):
1360 1360 """Find an object in the available namespaces.
1361 1361
1362 1362 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1363 1363
1364 1364 Has special code to detect magic functions.
1365 1365 """
1366 1366 oname = oname.strip()
1367 1367 #print '1- oname: <%r>' % oname # dbg
1368 1368 if not oname.startswith(ESC_MAGIC) and \
1369 1369 not oname.startswith(ESC_MAGIC2) and \
1370 1370 not py3compat.isidentifier(oname, dotted=True):
1371 1371 return dict(found=False)
1372 1372
1373 1373 alias_ns = None
1374 1374 if namespaces is None:
1375 1375 # Namespaces to search in:
1376 1376 # Put them in a list. The order is important so that we
1377 1377 # find things in the same order that Python finds them.
1378 1378 namespaces = [ ('Interactive', self.user_ns),
1379 1379 ('Interactive (global)', self.user_global_ns),
1380 1380 ('Python builtin', builtin_mod.__dict__),
1381 1381 ('Alias', self.alias_manager.alias_table),
1382 1382 ]
1383 1383 alias_ns = self.alias_manager.alias_table
1384 1384
1385 1385 # initialize results to 'null'
1386 1386 found = False; obj = None; ospace = None; ds = None;
1387 1387 ismagic = False; isalias = False; parent = None
1388 1388
1389 1389 # We need to special-case 'print', which as of python2.6 registers as a
1390 1390 # function but should only be treated as one if print_function was
1391 1391 # loaded with a future import. In this case, just bail.
1392 1392 if (oname == 'print' and not py3compat.PY3 and not \
1393 1393 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1394 1394 return {'found':found, 'obj':obj, 'namespace':ospace,
1395 1395 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1396 1396
1397 1397 # Look for the given name by splitting it in parts. If the head is
1398 1398 # found, then we look for all the remaining parts as members, and only
1399 1399 # declare success if we can find them all.
1400 1400 oname_parts = oname.split('.')
1401 1401 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1402 1402 for nsname,ns in namespaces:
1403 1403 try:
1404 1404 obj = ns[oname_head]
1405 1405 except KeyError:
1406 1406 continue
1407 1407 else:
1408 1408 #print 'oname_rest:', oname_rest # dbg
1409 1409 for part in oname_rest:
1410 1410 try:
1411 1411 parent = obj
1412 1412 obj = getattr(obj,part)
1413 1413 except:
1414 1414 # Blanket except b/c some badly implemented objects
1415 1415 # allow __getattr__ to raise exceptions other than
1416 1416 # AttributeError, which then crashes IPython.
1417 1417 break
1418 1418 else:
1419 1419 # If we finish the for loop (no break), we got all members
1420 1420 found = True
1421 1421 ospace = nsname
1422 1422 if ns == alias_ns:
1423 1423 isalias = True
1424 1424 break # namespace loop
1425 1425
1426 1426 # Try to see if it's magic
1427 1427 if not found:
1428 1428 obj = None
1429 1429 if oname.startswith(ESC_MAGIC2):
1430 1430 oname = oname.lstrip(ESC_MAGIC2)
1431 1431 obj = self.find_cell_magic(oname)
1432 1432 elif oname.startswith(ESC_MAGIC):
1433 1433 oname = oname.lstrip(ESC_MAGIC)
1434 1434 obj = self.find_line_magic(oname)
1435 1435 else:
1436 1436 # search without prefix, so run? will find %run?
1437 1437 obj = self.find_line_magic(oname)
1438 1438 if obj is None:
1439 1439 obj = self.find_cell_magic(oname)
1440 1440 if obj is not None:
1441 1441 found = True
1442 1442 ospace = 'IPython internal'
1443 1443 ismagic = True
1444 1444
1445 1445 # Last try: special-case some literals like '', [], {}, etc:
1446 1446 if not found and oname_head in ["''",'""','[]','{}','()']:
1447 1447 obj = eval(oname_head)
1448 1448 found = True
1449 1449 ospace = 'Interactive'
1450 1450
1451 1451 return {'found':found, 'obj':obj, 'namespace':ospace,
1452 1452 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1453 1453
1454 1454 def _ofind_property(self, oname, info):
1455 1455 """Second part of object finding, to look for property details."""
1456 1456 if info.found:
1457 1457 # Get the docstring of the class property if it exists.
1458 1458 path = oname.split('.')
1459 1459 root = '.'.join(path[:-1])
1460 1460 if info.parent is not None:
1461 1461 try:
1462 1462 target = getattr(info.parent, '__class__')
1463 1463 # The object belongs to a class instance.
1464 1464 try:
1465 1465 target = getattr(target, path[-1])
1466 1466 # The class defines the object.
1467 1467 if isinstance(target, property):
1468 1468 oname = root + '.__class__.' + path[-1]
1469 1469 info = Struct(self._ofind(oname))
1470 1470 except AttributeError: pass
1471 1471 except AttributeError: pass
1472 1472
1473 1473 # We return either the new info or the unmodified input if the object
1474 1474 # hadn't been found
1475 1475 return info
1476 1476
1477 1477 def _object_find(self, oname, namespaces=None):
1478 1478 """Find an object and return a struct with info about it."""
1479 1479 inf = Struct(self._ofind(oname, namespaces))
1480 1480 return Struct(self._ofind_property(oname, inf))
1481 1481
1482 1482 def _inspect(self, meth, oname, namespaces=None, **kw):
1483 1483 """Generic interface to the inspector system.
1484 1484
1485 1485 This function is meant to be called by pdef, pdoc & friends."""
1486 1486 info = self._object_find(oname, namespaces)
1487 1487 if info.found:
1488 1488 pmethod = getattr(self.inspector, meth)
1489 1489 formatter = format_screen if info.ismagic else None
1490 1490 if meth == 'pdoc':
1491 1491 pmethod(info.obj, oname, formatter)
1492 1492 elif meth == 'pinfo':
1493 1493 pmethod(info.obj, oname, formatter, info, **kw)
1494 1494 else:
1495 1495 pmethod(info.obj, oname)
1496 1496 else:
1497 1497 print('Object `%s` not found.' % oname)
1498 1498 return 'not found' # so callers can take other action
1499 1499
1500 1500 def object_inspect(self, oname, detail_level=0):
1501 1501 with self.builtin_trap:
1502 1502 info = self._object_find(oname)
1503 1503 if info.found:
1504 1504 return self.inspector.info(info.obj, oname, info=info,
1505 1505 detail_level=detail_level
1506 1506 )
1507 1507 else:
1508 1508 return oinspect.object_info(name=oname, found=False)
1509 1509
1510 1510 #-------------------------------------------------------------------------
1511 1511 # Things related to history management
1512 1512 #-------------------------------------------------------------------------
1513 1513
1514 1514 def init_history(self):
1515 1515 """Sets up the command history, and starts regular autosaves."""
1516 1516 self.history_manager = HistoryManager(shell=self, config=self.config)
1517 1517 self.configurables.append(self.history_manager)
1518 1518
1519 1519 #-------------------------------------------------------------------------
1520 1520 # Things related to exception handling and tracebacks (not debugging)
1521 1521 #-------------------------------------------------------------------------
1522 1522
1523 1523 def init_traceback_handlers(self, custom_exceptions):
1524 1524 # Syntax error handler.
1525 1525 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1526 1526
1527 1527 # The interactive one is initialized with an offset, meaning we always
1528 1528 # want to remove the topmost item in the traceback, which is our own
1529 1529 # internal code. Valid modes: ['Plain','Context','Verbose']
1530 1530 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1531 1531 color_scheme='NoColor',
1532 1532 tb_offset = 1,
1533 1533 check_cache=self.compile.check_cache)
1534 1534
1535 1535 # The instance will store a pointer to the system-wide exception hook,
1536 1536 # so that runtime code (such as magics) can access it. This is because
1537 1537 # during the read-eval loop, it may get temporarily overwritten.
1538 1538 self.sys_excepthook = sys.excepthook
1539 1539
1540 1540 # and add any custom exception handlers the user may have specified
1541 1541 self.set_custom_exc(*custom_exceptions)
1542 1542
1543 1543 # Set the exception mode
1544 1544 self.InteractiveTB.set_mode(mode=self.xmode)
1545 1545
1546 1546 def set_custom_exc(self, exc_tuple, handler):
1547 1547 """set_custom_exc(exc_tuple,handler)
1548 1548
1549 1549 Set a custom exception handler, which will be called if any of the
1550 1550 exceptions in exc_tuple occur in the mainloop (specifically, in the
1551 1551 run_code() method).
1552 1552
1553 1553 Parameters
1554 1554 ----------
1555 1555
1556 1556 exc_tuple : tuple of exception classes
1557 1557 A *tuple* of exception classes, for which to call the defined
1558 1558 handler. It is very important that you use a tuple, and NOT A
1559 1559 LIST here, because of the way Python's except statement works. If
1560 1560 you only want to trap a single exception, use a singleton tuple::
1561 1561
1562 1562 exc_tuple == (MyCustomException,)
1563 1563
1564 1564 handler : callable
1565 1565 handler must have the following signature::
1566 1566
1567 1567 def my_handler(self, etype, value, tb, tb_offset=None):
1568 1568 ...
1569 1569 return structured_traceback
1570 1570
1571 1571 Your handler must return a structured traceback (a list of strings),
1572 1572 or None.
1573 1573
1574 1574 This will be made into an instance method (via types.MethodType)
1575 1575 of IPython itself, and it will be called if any of the exceptions
1576 1576 listed in the exc_tuple are caught. If the handler is None, an
1577 1577 internal basic one is used, which just prints basic info.
1578 1578
1579 1579 To protect IPython from crashes, if your handler ever raises an
1580 1580 exception or returns an invalid result, it will be immediately
1581 1581 disabled.
1582 1582
1583 1583 WARNING: by putting in your own exception handler into IPython's main
1584 1584 execution loop, you run a very good chance of nasty crashes. This
1585 1585 facility should only be used if you really know what you are doing."""
1586 1586
1587 1587 assert type(exc_tuple)==type(()) , \
1588 1588 "The custom exceptions must be given AS A TUPLE."
1589 1589
1590 1590 def dummy_handler(self,etype,value,tb,tb_offset=None):
1591 1591 print('*** Simple custom exception handler ***')
1592 1592 print('Exception type :',etype)
1593 1593 print('Exception value:',value)
1594 1594 print('Traceback :',tb)
1595 1595 #print 'Source code :','\n'.join(self.buffer)
1596 1596
1597 1597 def validate_stb(stb):
1598 1598 """validate structured traceback return type
1599 1599
1600 1600 return type of CustomTB *should* be a list of strings, but allow
1601 1601 single strings or None, which are harmless.
1602 1602
1603 1603 This function will *always* return a list of strings,
1604 1604 and will raise a TypeError if stb is inappropriate.
1605 1605 """
1606 1606 msg = "CustomTB must return list of strings, not %r" % stb
1607 1607 if stb is None:
1608 1608 return []
1609 1609 elif isinstance(stb, basestring):
1610 1610 return [stb]
1611 1611 elif not isinstance(stb, list):
1612 1612 raise TypeError(msg)
1613 1613 # it's a list
1614 1614 for line in stb:
1615 1615 # check every element
1616 1616 if not isinstance(line, basestring):
1617 1617 raise TypeError(msg)
1618 1618 return stb
1619 1619
1620 1620 if handler is None:
1621 1621 wrapped = dummy_handler
1622 1622 else:
1623 1623 def wrapped(self,etype,value,tb,tb_offset=None):
1624 1624 """wrap CustomTB handler, to protect IPython from user code
1625 1625
1626 1626 This makes it harder (but not impossible) for custom exception
1627 1627 handlers to crash IPython.
1628 1628 """
1629 1629 try:
1630 1630 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1631 1631 return validate_stb(stb)
1632 1632 except:
1633 1633 # clear custom handler immediately
1634 1634 self.set_custom_exc((), None)
1635 1635 print("Custom TB Handler failed, unregistering", file=io.stderr)
1636 1636 # show the exception in handler first
1637 1637 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1638 1638 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1639 1639 print("The original exception:", file=io.stdout)
1640 1640 stb = self.InteractiveTB.structured_traceback(
1641 1641 (etype,value,tb), tb_offset=tb_offset
1642 1642 )
1643 1643 return stb
1644 1644
1645 1645 self.CustomTB = types.MethodType(wrapped,self)
1646 1646 self.custom_exceptions = exc_tuple
1647 1647
1648 1648 def excepthook(self, etype, value, tb):
1649 1649 """One more defense for GUI apps that call sys.excepthook.
1650 1650
1651 1651 GUI frameworks like wxPython trap exceptions and call
1652 1652 sys.excepthook themselves. I guess this is a feature that
1653 1653 enables them to keep running after exceptions that would
1654 1654 otherwise kill their mainloop. This is a bother for IPython
1655 1655 which excepts to catch all of the program exceptions with a try:
1656 1656 except: statement.
1657 1657
1658 1658 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1659 1659 any app directly invokes sys.excepthook, it will look to the user like
1660 1660 IPython crashed. In order to work around this, we can disable the
1661 1661 CrashHandler and replace it with this excepthook instead, which prints a
1662 1662 regular traceback using our InteractiveTB. In this fashion, apps which
1663 1663 call sys.excepthook will generate a regular-looking exception from
1664 1664 IPython, and the CrashHandler will only be triggered by real IPython
1665 1665 crashes.
1666 1666
1667 1667 This hook should be used sparingly, only in places which are not likely
1668 1668 to be true IPython errors.
1669 1669 """
1670 1670 self.showtraceback((etype,value,tb),tb_offset=0)
1671 1671
1672 1672 def _get_exc_info(self, exc_tuple=None):
1673 1673 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1674 1674
1675 1675 Ensures sys.last_type,value,traceback hold the exc_info we found,
1676 1676 from whichever source.
1677 1677
1678 1678 raises ValueError if none of these contain any information
1679 1679 """
1680 1680 if exc_tuple is None:
1681 1681 etype, value, tb = sys.exc_info()
1682 1682 else:
1683 1683 etype, value, tb = exc_tuple
1684 1684
1685 1685 if etype is None:
1686 1686 if hasattr(sys, 'last_type'):
1687 1687 etype, value, tb = sys.last_type, sys.last_value, \
1688 1688 sys.last_traceback
1689 1689
1690 1690 if etype is None:
1691 1691 raise ValueError("No exception to find")
1692 1692
1693 1693 # Now store the exception info in sys.last_type etc.
1694 1694 # WARNING: these variables are somewhat deprecated and not
1695 1695 # necessarily safe to use in a threaded environment, but tools
1696 1696 # like pdb depend on their existence, so let's set them. If we
1697 1697 # find problems in the field, we'll need to revisit their use.
1698 1698 sys.last_type = etype
1699 1699 sys.last_value = value
1700 1700 sys.last_traceback = tb
1701 1701
1702 1702 return etype, value, tb
1703 1703
1704 1704
1705 1705 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1706 1706 exception_only=False):
1707 1707 """Display the exception that just occurred.
1708 1708
1709 1709 If nothing is known about the exception, this is the method which
1710 1710 should be used throughout the code for presenting user tracebacks,
1711 1711 rather than directly invoking the InteractiveTB object.
1712 1712
1713 1713 A specific showsyntaxerror() also exists, but this method can take
1714 1714 care of calling it if needed, so unless you are explicitly catching a
1715 1715 SyntaxError exception, don't try to analyze the stack manually and
1716 1716 simply call this method."""
1717 1717
1718 1718 try:
1719 1719 try:
1720 1720 etype, value, tb = self._get_exc_info(exc_tuple)
1721 1721 except ValueError:
1722 1722 self.write_err('No traceback available to show.\n')
1723 1723 return
1724 1724
1725 1725 if etype is SyntaxError:
1726 1726 # Though this won't be called by syntax errors in the input
1727 1727 # line, there may be SyntaxError cases with imported code.
1728 1728 self.showsyntaxerror(filename)
1729 1729 elif etype is UsageError:
1730 1730 self.write_err("UsageError: %s" % value)
1731 1731 else:
1732 1732 if exception_only:
1733 1733 stb = ['An exception has occurred, use %tb to see '
1734 1734 'the full traceback.\n']
1735 1735 stb.extend(self.InteractiveTB.get_exception_only(etype,
1736 1736 value))
1737 1737 else:
1738 1738 try:
1739 1739 # Exception classes can customise their traceback - we
1740 1740 # use this in IPython.parallel for exceptions occurring
1741 1741 # in the engines. This should return a list of strings.
1742 1742 stb = value._render_traceback_()
1743 1743 except Exception:
1744 1744 stb = self.InteractiveTB.structured_traceback(etype,
1745 1745 value, tb, tb_offset=tb_offset)
1746 1746
1747 1747 self._showtraceback(etype, value, stb)
1748 1748 if self.call_pdb:
1749 1749 # drop into debugger
1750 1750 self.debugger(force=True)
1751 1751 return
1752 1752
1753 1753 # Actually show the traceback
1754 1754 self._showtraceback(etype, value, stb)
1755 1755
1756 1756 except KeyboardInterrupt:
1757 1757 self.write_err("\nKeyboardInterrupt\n")
1758 1758
1759 1759 def _showtraceback(self, etype, evalue, stb):
1760 1760 """Actually show a traceback.
1761 1761
1762 1762 Subclasses may override this method to put the traceback on a different
1763 1763 place, like a side channel.
1764 1764 """
1765 1765 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1766 1766
1767 1767 def showsyntaxerror(self, filename=None):
1768 1768 """Display the syntax error that just occurred.
1769 1769
1770 1770 This doesn't display a stack trace because there isn't one.
1771 1771
1772 1772 If a filename is given, it is stuffed in the exception instead
1773 1773 of what was there before (because Python's parser always uses
1774 1774 "<string>" when reading from a string).
1775 1775 """
1776 1776 etype, value, last_traceback = self._get_exc_info()
1777 1777
1778 1778 if filename and etype is SyntaxError:
1779 1779 try:
1780 1780 value.filename = filename
1781 1781 except:
1782 1782 # Not the format we expect; leave it alone
1783 1783 pass
1784 1784
1785 1785 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1786 1786 self._showtraceback(etype, value, stb)
1787 1787
1788 1788 # This is overridden in TerminalInteractiveShell to show a message about
1789 1789 # the %paste magic.
1790 1790 def showindentationerror(self):
1791 1791 """Called by run_cell when there's an IndentationError in code entered
1792 1792 at the prompt.
1793 1793
1794 1794 This is overridden in TerminalInteractiveShell to show a message about
1795 1795 the %paste magic."""
1796 1796 self.showsyntaxerror()
1797 1797
1798 1798 #-------------------------------------------------------------------------
1799 1799 # Things related to readline
1800 1800 #-------------------------------------------------------------------------
1801 1801
1802 1802 def init_readline(self):
1803 1803 """Command history completion/saving/reloading."""
1804 1804
1805 1805 if self.readline_use:
1806 1806 import IPython.utils.rlineimpl as readline
1807 1807
1808 1808 self.rl_next_input = None
1809 1809 self.rl_do_indent = False
1810 1810
1811 1811 if not self.readline_use or not readline.have_readline:
1812 1812 self.has_readline = False
1813 1813 self.readline = None
1814 1814 # Set a number of methods that depend on readline to be no-op
1815 1815 self.readline_no_record = no_op_context
1816 1816 self.set_readline_completer = no_op
1817 1817 self.set_custom_completer = no_op
1818 1818 if self.readline_use:
1819 1819 warn('Readline services not available or not loaded.')
1820 1820 else:
1821 1821 self.has_readline = True
1822 1822 self.readline = readline
1823 1823 sys.modules['readline'] = readline
1824 1824
1825 1825 # Platform-specific configuration
1826 1826 if os.name == 'nt':
1827 1827 # FIXME - check with Frederick to see if we can harmonize
1828 1828 # naming conventions with pyreadline to avoid this
1829 1829 # platform-dependent check
1830 1830 self.readline_startup_hook = readline.set_pre_input_hook
1831 1831 else:
1832 1832 self.readline_startup_hook = readline.set_startup_hook
1833 1833
1834 1834 # Load user's initrc file (readline config)
1835 1835 # Or if libedit is used, load editrc.
1836 1836 inputrc_name = os.environ.get('INPUTRC')
1837 1837 if inputrc_name is None:
1838 1838 inputrc_name = '.inputrc'
1839 1839 if readline.uses_libedit:
1840 1840 inputrc_name = '.editrc'
1841 1841 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1842 1842 if os.path.isfile(inputrc_name):
1843 1843 try:
1844 1844 readline.read_init_file(inputrc_name)
1845 1845 except:
1846 1846 warn('Problems reading readline initialization file <%s>'
1847 1847 % inputrc_name)
1848 1848
1849 1849 # Configure readline according to user's prefs
1850 1850 # This is only done if GNU readline is being used. If libedit
1851 1851 # is being used (as on Leopard) the readline config is
1852 1852 # not run as the syntax for libedit is different.
1853 1853 if not readline.uses_libedit:
1854 1854 for rlcommand in self.readline_parse_and_bind:
1855 1855 #print "loading rl:",rlcommand # dbg
1856 1856 readline.parse_and_bind(rlcommand)
1857 1857
1858 1858 # Remove some chars from the delimiters list. If we encounter
1859 1859 # unicode chars, discard them.
1860 1860 delims = readline.get_completer_delims()
1861 1861 if not py3compat.PY3:
1862 1862 delims = delims.encode("ascii", "ignore")
1863 1863 for d in self.readline_remove_delims:
1864 1864 delims = delims.replace(d, "")
1865 1865 delims = delims.replace(ESC_MAGIC, '')
1866 1866 readline.set_completer_delims(delims)
1867 1867 # otherwise we end up with a monster history after a while:
1868 1868 readline.set_history_length(self.history_length)
1869 1869
1870 1870 self.refill_readline_hist()
1871 1871 self.readline_no_record = ReadlineNoRecord(self)
1872 1872
1873 1873 # Configure auto-indent for all platforms
1874 1874 self.set_autoindent(self.autoindent)
1875 1875
1876 1876 def refill_readline_hist(self):
1877 1877 # Load the last 1000 lines from history
1878 1878 self.readline.clear_history()
1879 1879 stdin_encoding = sys.stdin.encoding or "utf-8"
1880 1880 last_cell = u""
1881 1881 for _, _, cell in self.history_manager.get_tail(1000,
1882 1882 include_latest=True):
1883 1883 # Ignore blank lines and consecutive duplicates
1884 1884 cell = cell.rstrip()
1885 1885 if cell and (cell != last_cell):
1886 1886 if self.multiline_history:
1887 1887 self.readline.add_history(py3compat.unicode_to_str(cell,
1888 1888 stdin_encoding))
1889 1889 else:
1890 1890 for line in cell.splitlines():
1891 1891 self.readline.add_history(py3compat.unicode_to_str(line,
1892 1892 stdin_encoding))
1893 1893 last_cell = cell
1894 1894
1895 1895 def set_next_input(self, s):
1896 1896 """ Sets the 'default' input string for the next command line.
1897 1897
1898 1898 Requires readline.
1899 1899
1900 1900 Example:
1901 1901
1902 1902 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1903 1903 [D:\ipython]|2> Hello Word_ # cursor is here
1904 1904 """
1905 1905 self.rl_next_input = py3compat.cast_bytes_py2(s)
1906 1906
1907 1907 # Maybe move this to the terminal subclass?
1908 1908 def pre_readline(self):
1909 1909 """readline hook to be used at the start of each line.
1910 1910
1911 1911 Currently it handles auto-indent only."""
1912 1912
1913 1913 if self.rl_do_indent:
1914 1914 self.readline.insert_text(self._indent_current_str())
1915 1915 if self.rl_next_input is not None:
1916 1916 self.readline.insert_text(self.rl_next_input)
1917 1917 self.rl_next_input = None
1918 1918
1919 1919 def _indent_current_str(self):
1920 1920 """return the current level of indentation as a string"""
1921 1921 return self.input_splitter.indent_spaces * ' '
1922 1922
1923 1923 #-------------------------------------------------------------------------
1924 1924 # Things related to text completion
1925 1925 #-------------------------------------------------------------------------
1926 1926
1927 1927 def init_completer(self):
1928 1928 """Initialize the completion machinery.
1929 1929
1930 1930 This creates completion machinery that can be used by client code,
1931 1931 either interactively in-process (typically triggered by the readline
1932 1932 library), programatically (such as in test suites) or out-of-prcess
1933 1933 (typically over the network by remote frontends).
1934 1934 """
1935 1935 from IPython.core.completer import IPCompleter
1936 1936 from IPython.core.completerlib import (module_completer,
1937 1937 magic_run_completer, cd_completer, reset_completer)
1938 1938
1939 1939 self.Completer = IPCompleter(shell=self,
1940 1940 namespace=self.user_ns,
1941 1941 global_namespace=self.user_global_ns,
1942 1942 alias_table=self.alias_manager.alias_table,
1943 1943 use_readline=self.has_readline,
1944 1944 config=self.config,
1945 1945 )
1946 1946 self.configurables.append(self.Completer)
1947 1947
1948 1948 # Add custom completers to the basic ones built into IPCompleter
1949 1949 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1950 1950 self.strdispatchers['complete_command'] = sdisp
1951 1951 self.Completer.custom_completers = sdisp
1952 1952
1953 1953 self.set_hook('complete_command', module_completer, str_key = 'import')
1954 1954 self.set_hook('complete_command', module_completer, str_key = 'from')
1955 1955 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1956 1956 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1957 1957 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1958 1958
1959 1959 # Only configure readline if we truly are using readline. IPython can
1960 1960 # do tab-completion over the network, in GUIs, etc, where readline
1961 1961 # itself may be absent
1962 1962 if self.has_readline:
1963 1963 self.set_readline_completer()
1964 1964
1965 1965 def complete(self, text, line=None, cursor_pos=None):
1966 1966 """Return the completed text and a list of completions.
1967 1967
1968 1968 Parameters
1969 1969 ----------
1970 1970
1971 1971 text : string
1972 1972 A string of text to be completed on. It can be given as empty and
1973 1973 instead a line/position pair are given. In this case, the
1974 1974 completer itself will split the line like readline does.
1975 1975
1976 1976 line : string, optional
1977 1977 The complete line that text is part of.
1978 1978
1979 1979 cursor_pos : int, optional
1980 1980 The position of the cursor on the input line.
1981 1981
1982 1982 Returns
1983 1983 -------
1984 1984 text : string
1985 1985 The actual text that was completed.
1986 1986
1987 1987 matches : list
1988 1988 A sorted list with all possible completions.
1989 1989
1990 1990 The optional arguments allow the completion to take more context into
1991 1991 account, and are part of the low-level completion API.
1992 1992
1993 1993 This is a wrapper around the completion mechanism, similar to what
1994 1994 readline does at the command line when the TAB key is hit. By
1995 1995 exposing it as a method, it can be used by other non-readline
1996 1996 environments (such as GUIs) for text completion.
1997 1997
1998 1998 Simple usage example:
1999 1999
2000 2000 In [1]: x = 'hello'
2001 2001
2002 2002 In [2]: _ip.complete('x.l')
2003 2003 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2004 2004 """
2005 2005
2006 2006 # Inject names into __builtin__ so we can complete on the added names.
2007 2007 with self.builtin_trap:
2008 2008 return self.Completer.complete(text, line, cursor_pos)
2009 2009
2010 2010 def set_custom_completer(self, completer, pos=0):
2011 2011 """Adds a new custom completer function.
2012 2012
2013 2013 The position argument (defaults to 0) is the index in the completers
2014 2014 list where you want the completer to be inserted."""
2015 2015
2016 2016 newcomp = types.MethodType(completer,self.Completer)
2017 2017 self.Completer.matchers.insert(pos,newcomp)
2018 2018
2019 2019 def set_readline_completer(self):
2020 2020 """Reset readline's completer to be our own."""
2021 2021 self.readline.set_completer(self.Completer.rlcomplete)
2022 2022
2023 2023 def set_completer_frame(self, frame=None):
2024 2024 """Set the frame of the completer."""
2025 2025 if frame:
2026 2026 self.Completer.namespace = frame.f_locals
2027 2027 self.Completer.global_namespace = frame.f_globals
2028 2028 else:
2029 2029 self.Completer.namespace = self.user_ns
2030 2030 self.Completer.global_namespace = self.user_global_ns
2031 2031
2032 2032 #-------------------------------------------------------------------------
2033 2033 # Things related to magics
2034 2034 #-------------------------------------------------------------------------
2035 2035
2036 2036 def init_magics(self):
2037 2037 from IPython.core import magics as m
2038 2038 self.magics_manager = magic.MagicsManager(shell=self,
2039 2039 confg=self.config,
2040 2040 user_magics=m.UserMagics(self))
2041 2041 self.configurables.append(self.magics_manager)
2042 2042
2043 2043 # Expose as public API from the magics manager
2044 2044 self.register_magics = self.magics_manager.register
2045 2045 self.register_magic_function = self.magics_manager.register_function
2046 2046 self.define_magic = self.magics_manager.define_magic
2047 2047
2048 2048 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2049 2049 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2050 2050 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2051 2051 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2052 2052 )
2053 2053
2054 2054 # Register Magic Aliases
2055 2055 mman = self.magics_manager
2056 2056 mman.register_alias('ed', 'edit')
2057 2057 mman.register_alias('hist', 'history')
2058 2058 mman.register_alias('rep', 'recall')
2059 2059
2060 2060 # FIXME: Move the color initialization to the DisplayHook, which
2061 2061 # should be split into a prompt manager and displayhook. We probably
2062 2062 # even need a centralize colors management object.
2063 2063 self.magic('colors %s' % self.colors)
2064 2064
2065 2065 def run_line_magic(self, magic_name, line):
2066 2066 """Execute the given line magic.
2067 2067
2068 2068 Parameters
2069 2069 ----------
2070 2070 magic_name : str
2071 2071 Name of the desired magic function, without '%' prefix.
2072 2072
2073 2073 line : str
2074 2074 The rest of the input line as a single string.
2075 2075 """
2076 2076 fn = self.find_line_magic(magic_name)
2077 2077 if fn is None:
2078 2078 cm = self.find_cell_magic(magic_name)
2079 2079 etpl = "Line magic function `%%%s` not found%s."
2080 2080 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2081 2081 'did you mean that instead?)' % magic_name )
2082 2082 error(etpl % (magic_name, extra))
2083 2083 else:
2084 2084 # Note: this is the distance in the stack to the user's frame.
2085 2085 # This will need to be updated if the internal calling logic gets
2086 2086 # refactored, or else we'll be expanding the wrong variables.
2087 2087 stack_depth = 2
2088 2088 magic_arg_s = self.var_expand(line, stack_depth)
2089 2089 # Put magic args in a list so we can call with f(*a) syntax
2090 2090 args = [magic_arg_s]
2091 2091 # Grab local namespace if we need it:
2092 2092 if getattr(fn, "needs_local_scope", False):
2093 2093 args.append(sys._getframe(stack_depth).f_locals)
2094 2094 with self.builtin_trap:
2095 2095 result = fn(*args)
2096 2096 return result
2097 2097
2098 2098 def run_cell_magic(self, magic_name, line, cell):
2099 2099 """Execute the given cell magic.
2100 2100
2101 2101 Parameters
2102 2102 ----------
2103 2103 magic_name : str
2104 2104 Name of the desired magic function, without '%' prefix.
2105 2105
2106 2106 line : str
2107 2107 The rest of the first input line as a single string.
2108 2108
2109 2109 cell : str
2110 2110 The body of the cell as a (possibly multiline) string.
2111 2111 """
2112 2112 fn = self.find_cell_magic(magic_name)
2113 2113 if fn is None:
2114 2114 lm = self.find_line_magic(magic_name)
2115 2115 etpl = "Cell magic function `%%%%%s` not found%s."
2116 2116 extra = '' if lm is None else (' (But line magic `%%%s` exists, '
2117 2117 'did you mean that instead?)' % magic_name )
2118 2118 error(etpl % (magic_name, extra))
2119 2119 else:
2120 2120 # Note: this is the distance in the stack to the user's frame.
2121 2121 # This will need to be updated if the internal calling logic gets
2122 2122 # refactored, or else we'll be expanding the wrong variables.
2123 2123 stack_depth = 2
2124 2124 magic_arg_s = self.var_expand(line, stack_depth)
2125 2125 with self.builtin_trap:
2126 2126 result = fn(magic_arg_s, cell)
2127 2127 return result
2128 2128
2129 2129 def find_line_magic(self, magic_name):
2130 2130 """Find and return a line magic by name.
2131 2131
2132 2132 Returns None if the magic isn't found."""
2133 2133 return self.magics_manager.magics['line'].get(magic_name)
2134 2134
2135 2135 def find_cell_magic(self, magic_name):
2136 2136 """Find and return a cell magic by name.
2137 2137
2138 2138 Returns None if the magic isn't found."""
2139 2139 return self.magics_manager.magics['cell'].get(magic_name)
2140 2140
2141 2141 def find_magic(self, magic_name, magic_kind='line'):
2142 2142 """Find and return a magic of the given type by name.
2143 2143
2144 2144 Returns None if the magic isn't found."""
2145 2145 return self.magics_manager.magics[magic_kind].get(magic_name)
2146 2146
2147 2147 def magic(self, arg_s):
2148 2148 """DEPRECATED. Use run_line_magic() instead.
2149 2149
2150 2150 Call a magic function by name.
2151 2151
2152 2152 Input: a string containing the name of the magic function to call and
2153 2153 any additional arguments to be passed to the magic.
2154 2154
2155 2155 magic('name -opt foo bar') is equivalent to typing at the ipython
2156 2156 prompt:
2157 2157
2158 2158 In[1]: %name -opt foo bar
2159 2159
2160 2160 To call a magic without arguments, simply use magic('name').
2161 2161
2162 2162 This provides a proper Python function to call IPython's magics in any
2163 2163 valid Python code you can type at the interpreter, including loops and
2164 2164 compound statements.
2165 2165 """
2166 2166 # TODO: should we issue a loud deprecation warning here?
2167 2167 magic_name, _, magic_arg_s = arg_s.partition(' ')
2168 2168 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2169 2169 return self.run_line_magic(magic_name, magic_arg_s)
2170 2170
2171 2171 #-------------------------------------------------------------------------
2172 2172 # Things related to macros
2173 2173 #-------------------------------------------------------------------------
2174 2174
2175 2175 def define_macro(self, name, themacro):
2176 2176 """Define a new macro
2177 2177
2178 2178 Parameters
2179 2179 ----------
2180 2180 name : str
2181 2181 The name of the macro.
2182 2182 themacro : str or Macro
2183 2183 The action to do upon invoking the macro. If a string, a new
2184 2184 Macro object is created by passing the string to it.
2185 2185 """
2186 2186
2187 2187 from IPython.core import macro
2188 2188
2189 2189 if isinstance(themacro, basestring):
2190 2190 themacro = macro.Macro(themacro)
2191 2191 if not isinstance(themacro, macro.Macro):
2192 2192 raise ValueError('A macro must be a string or a Macro instance.')
2193 2193 self.user_ns[name] = themacro
2194 2194
2195 2195 #-------------------------------------------------------------------------
2196 2196 # Things related to the running of system commands
2197 2197 #-------------------------------------------------------------------------
2198 2198
2199 2199 def system_piped(self, cmd):
2200 2200 """Call the given cmd in a subprocess, piping stdout/err
2201 2201
2202 2202 Parameters
2203 2203 ----------
2204 2204 cmd : str
2205 2205 Command to execute (can not end in '&', as background processes are
2206 2206 not supported. Should not be a command that expects input
2207 2207 other than simple text.
2208 2208 """
2209 2209 if cmd.rstrip().endswith('&'):
2210 2210 # this is *far* from a rigorous test
2211 2211 # We do not support backgrounding processes because we either use
2212 2212 # pexpect or pipes to read from. Users can always just call
2213 2213 # os.system() or use ip.system=ip.system_raw
2214 2214 # if they really want a background process.
2215 2215 raise OSError("Background processes not supported.")
2216 2216
2217 2217 # we explicitly do NOT return the subprocess status code, because
2218 2218 # a non-None value would trigger :func:`sys.displayhook` calls.
2219 2219 # Instead, we store the exit_code in user_ns.
2220 2220 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2221 2221
2222 2222 def system_raw(self, cmd):
2223 2223 """Call the given cmd in a subprocess using os.system
2224 2224
2225 2225 Parameters
2226 2226 ----------
2227 2227 cmd : str
2228 2228 Command to execute.
2229 2229 """
2230 2230 cmd = self.var_expand(cmd, depth=1)
2231 2231 # protect os.system from UNC paths on Windows, which it can't handle:
2232 2232 if sys.platform == 'win32':
2233 2233 from IPython.utils._process_win32 import AvoidUNCPath
2234 2234 with AvoidUNCPath() as path:
2235 2235 if path is not None:
2236 2236 cmd = '"pushd %s &&"%s' % (path, cmd)
2237 2237 cmd = py3compat.unicode_to_str(cmd)
2238 2238 ec = os.system(cmd)
2239 2239 else:
2240 2240 cmd = py3compat.unicode_to_str(cmd)
2241 2241 ec = os.system(cmd)
2242 2242
2243 2243 # We explicitly do NOT return the subprocess status code, because
2244 2244 # a non-None value would trigger :func:`sys.displayhook` calls.
2245 2245 # Instead, we store the exit_code in user_ns.
2246 2246 self.user_ns['_exit_code'] = ec
2247 2247
2248 2248 # use piped system by default, because it is better behaved
2249 2249 system = system_piped
2250 2250
2251 2251 def getoutput(self, cmd, split=True, depth=0):
2252 2252 """Get output (possibly including stderr) from a subprocess.
2253 2253
2254 2254 Parameters
2255 2255 ----------
2256 2256 cmd : str
2257 2257 Command to execute (can not end in '&', as background processes are
2258 2258 not supported.
2259 2259 split : bool, optional
2260 2260 If True, split the output into an IPython SList. Otherwise, an
2261 2261 IPython LSString is returned. These are objects similar to normal
2262 2262 lists and strings, with a few convenience attributes for easier
2263 2263 manipulation of line-based output. You can use '?' on them for
2264 2264 details.
2265 2265 depth : int, optional
2266 2266 How many frames above the caller are the local variables which should
2267 2267 be expanded in the command string? The default (0) assumes that the
2268 2268 expansion variables are in the stack frame calling this function.
2269 2269 """
2270 2270 if cmd.rstrip().endswith('&'):
2271 2271 # this is *far* from a rigorous test
2272 2272 raise OSError("Background processes not supported.")
2273 2273 out = getoutput(self.var_expand(cmd, depth=depth+1))
2274 2274 if split:
2275 2275 out = SList(out.splitlines())
2276 2276 else:
2277 2277 out = LSString(out)
2278 2278 return out
2279 2279
2280 2280 #-------------------------------------------------------------------------
2281 2281 # Things related to aliases
2282 2282 #-------------------------------------------------------------------------
2283 2283
2284 2284 def init_alias(self):
2285 2285 self.alias_manager = AliasManager(shell=self, config=self.config)
2286 2286 self.configurables.append(self.alias_manager)
2287 2287 self.ns_table['alias'] = self.alias_manager.alias_table,
2288 2288
2289 2289 #-------------------------------------------------------------------------
2290 2290 # Things related to extensions and plugins
2291 2291 #-------------------------------------------------------------------------
2292 2292
2293 2293 def init_extension_manager(self):
2294 2294 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2295 2295 self.configurables.append(self.extension_manager)
2296 2296
2297 2297 def init_plugin_manager(self):
2298 2298 self.plugin_manager = PluginManager(config=self.config)
2299 2299 self.configurables.append(self.plugin_manager)
2300 2300
2301 2301
2302 2302 #-------------------------------------------------------------------------
2303 2303 # Things related to payloads
2304 2304 #-------------------------------------------------------------------------
2305 2305
2306 2306 def init_payload(self):
2307 2307 self.payload_manager = PayloadManager(config=self.config)
2308 2308 self.configurables.append(self.payload_manager)
2309 2309
2310 2310 #-------------------------------------------------------------------------
2311 2311 # Things related to the prefilter
2312 2312 #-------------------------------------------------------------------------
2313 2313
2314 2314 def init_prefilter(self):
2315 2315 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2316 2316 self.configurables.append(self.prefilter_manager)
2317 2317 # Ultimately this will be refactored in the new interpreter code, but
2318 2318 # for now, we should expose the main prefilter method (there's legacy
2319 2319 # code out there that may rely on this).
2320 2320 self.prefilter = self.prefilter_manager.prefilter_lines
2321 2321
2322 2322 def auto_rewrite_input(self, cmd):
2323 2323 """Print to the screen the rewritten form of the user's command.
2324 2324
2325 2325 This shows visual feedback by rewriting input lines that cause
2326 2326 automatic calling to kick in, like::
2327 2327
2328 2328 /f x
2329 2329
2330 2330 into::
2331 2331
2332 2332 ------> f(x)
2333 2333
2334 2334 after the user's input prompt. This helps the user understand that the
2335 2335 input line was transformed automatically by IPython.
2336 2336 """
2337 2337 if not self.show_rewritten_input:
2338 2338 return
2339 2339
2340 2340 rw = self.prompt_manager.render('rewrite') + cmd
2341 2341
2342 2342 try:
2343 2343 # plain ascii works better w/ pyreadline, on some machines, so
2344 2344 # we use it and only print uncolored rewrite if we have unicode
2345 2345 rw = str(rw)
2346 2346 print(rw, file=io.stdout)
2347 2347 except UnicodeEncodeError:
2348 2348 print("------> " + cmd)
2349 2349
2350 2350 #-------------------------------------------------------------------------
2351 2351 # Things related to extracting values/expressions from kernel and user_ns
2352 2352 #-------------------------------------------------------------------------
2353 2353
2354 2354 def _simple_error(self):
2355 2355 etype, value = sys.exc_info()[:2]
2356 2356 return u'[ERROR] {e.__name__}: {v}'.format(e=etype, v=value)
2357 2357
2358 2358 def user_variables(self, names):
2359 2359 """Get a list of variable names from the user's namespace.
2360 2360
2361 2361 Parameters
2362 2362 ----------
2363 2363 names : list of strings
2364 2364 A list of names of variables to be read from the user namespace.
2365 2365
2366 2366 Returns
2367 2367 -------
2368 2368 A dict, keyed by the input names and with the repr() of each value.
2369 2369 """
2370 2370 out = {}
2371 2371 user_ns = self.user_ns
2372 2372 for varname in names:
2373 2373 try:
2374 2374 value = repr(user_ns[varname])
2375 2375 except:
2376 2376 value = self._simple_error()
2377 2377 out[varname] = value
2378 2378 return out
2379 2379
2380 2380 def user_expressions(self, expressions):
2381 2381 """Evaluate a dict of expressions in the user's namespace.
2382 2382
2383 2383 Parameters
2384 2384 ----------
2385 2385 expressions : dict
2386 2386 A dict with string keys and string values. The expression values
2387 2387 should be valid Python expressions, each of which will be evaluated
2388 2388 in the user namespace.
2389 2389
2390 2390 Returns
2391 2391 -------
2392 2392 A dict, keyed like the input expressions dict, with the repr() of each
2393 2393 value.
2394 2394 """
2395 2395 out = {}
2396 2396 user_ns = self.user_ns
2397 2397 global_ns = self.user_global_ns
2398 2398 for key, expr in expressions.iteritems():
2399 2399 try:
2400 2400 value = repr(eval(expr, global_ns, user_ns))
2401 2401 except:
2402 2402 value = self._simple_error()
2403 2403 out[key] = value
2404 2404 return out
2405 2405
2406 2406 #-------------------------------------------------------------------------
2407 2407 # Things related to the running of code
2408 2408 #-------------------------------------------------------------------------
2409 2409
2410 2410 def ex(self, cmd):
2411 2411 """Execute a normal python statement in user namespace."""
2412 2412 with self.builtin_trap:
2413 2413 exec cmd in self.user_global_ns, self.user_ns
2414 2414
2415 2415 def ev(self, expr):
2416 2416 """Evaluate python expression expr in user namespace.
2417 2417
2418 2418 Returns the result of evaluation
2419 2419 """
2420 2420 with self.builtin_trap:
2421 2421 return eval(expr, self.user_global_ns, self.user_ns)
2422 2422
2423 2423 def safe_execfile(self, fname, *where, **kw):
2424 2424 """A safe version of the builtin execfile().
2425 2425
2426 2426 This version will never throw an exception, but instead print
2427 2427 helpful error messages to the screen. This only works on pure
2428 2428 Python files with the .py extension.
2429 2429
2430 2430 Parameters
2431 2431 ----------
2432 2432 fname : string
2433 2433 The name of the file to be executed.
2434 2434 where : tuple
2435 2435 One or two namespaces, passed to execfile() as (globals,locals).
2436 2436 If only one is given, it is passed as both.
2437 2437 exit_ignore : bool (False)
2438 2438 If True, then silence SystemExit for non-zero status (it is always
2439 2439 silenced for zero status, as it is so common).
2440 2440 raise_exceptions : bool (False)
2441 2441 If True raise exceptions everywhere. Meant for testing.
2442 2442
2443 2443 """
2444 2444 kw.setdefault('exit_ignore', False)
2445 2445 kw.setdefault('raise_exceptions', False)
2446 2446
2447 2447 fname = os.path.abspath(os.path.expanduser(fname))
2448 2448
2449 2449 # Make sure we can open the file
2450 2450 try:
2451 2451 with open(fname) as thefile:
2452 2452 pass
2453 2453 except:
2454 2454 warn('Could not open file <%s> for safe execution.' % fname)
2455 2455 return
2456 2456
2457 2457 # Find things also in current directory. This is needed to mimic the
2458 2458 # behavior of running a script from the system command line, where
2459 2459 # Python inserts the script's directory into sys.path
2460 2460 dname = os.path.dirname(fname)
2461 2461
2462 2462 with prepended_to_syspath(dname):
2463 2463 # Ensure that __file__ is always defined to match Python behavior
2464 2464 save_fname = self.user_ns.get('__file__',None)
2465 2465 self.user_ns['__file__'] = fname
2466 2466 try:
2467 2467 py3compat.execfile(fname,*where)
2468 2468 except SystemExit as status:
2469 2469 # If the call was made with 0 or None exit status (sys.exit(0)
2470 2470 # or sys.exit() ), don't bother showing a traceback, as both of
2471 2471 # these are considered normal by the OS:
2472 2472 # > python -c'import sys;sys.exit(0)'; echo $?
2473 2473 # 0
2474 2474 # > python -c'import sys;sys.exit()'; echo $?
2475 2475 # 0
2476 2476 # For other exit status, we show the exception unless
2477 2477 # explicitly silenced, but only in short form.
2478 2478 if kw['raise_exceptions']:
2479 2479 raise
2480 2480 if status.code not in (0, None) and not kw['exit_ignore']:
2481 2481 self.showtraceback(exception_only=True)
2482 2482 except:
2483 2483 if kw['raise_exceptions']:
2484 2484 raise
2485 2485 self.showtraceback()
2486 2486 finally:
2487 2487 self.user_ns['__file__'] = save_fname
2488 2488
2489 2489 def safe_execfile_ipy(self, fname):
2490 2490 """Like safe_execfile, but for .ipy files with IPython syntax.
2491 2491
2492 2492 Parameters
2493 2493 ----------
2494 2494 fname : str
2495 2495 The name of the file to execute. The filename must have a
2496 2496 .ipy extension.
2497 2497 """
2498 2498 fname = os.path.abspath(os.path.expanduser(fname))
2499 2499
2500 2500 # Make sure we can open the file
2501 2501 try:
2502 2502 with open(fname) as thefile:
2503 2503 pass
2504 2504 except:
2505 2505 warn('Could not open file <%s> for safe execution.' % fname)
2506 2506 return
2507 2507
2508 2508 # Find things also in current directory. This is needed to mimic the
2509 2509 # behavior of running a script from the system command line, where
2510 2510 # Python inserts the script's directory into sys.path
2511 2511 dname = os.path.dirname(fname)
2512 2512
2513 2513 with prepended_to_syspath(dname):
2514 2514 # Ensure that __file__ is always defined to match Python behavior
2515 2515 save_fname = self.user_ns.get('__file__',None)
2516 2516 self.user_ns['__file__'] = fname
2517 2517 try:
2518 2518 with open(fname) as thefile:
2519 2519 # self.run_cell currently captures all exceptions
2520 2520 # raised in user code. It would be nice if there were
2521 2521 # versions of runlines, execfile that did raise, so
2522 2522 # we could catch the errors.
2523 2523 self.run_cell(thefile.read(), store_history=False)
2524 2524 except:
2525 2525 self.showtraceback()
2526 2526 warn('Unknown failure executing file: <%s>' % fname)
2527 2527 finally:
2528 2528 self.user_ns['__file__'] = save_fname
2529 2529
2530 2530 def safe_run_module(self, mod_name, where):
2531 2531 """A safe version of runpy.run_module().
2532 2532
2533 2533 This version will never throw an exception, but instead print
2534 2534 helpful error messages to the screen.
2535 2535
2536 2536 Parameters
2537 2537 ----------
2538 2538 mod_name : string
2539 2539 The name of the module to be executed.
2540 2540 where : dict
2541 2541 The globals namespace.
2542 2542 """
2543 2543 try:
2544 2544 where.update(
2545 2545 runpy.run_module(str(mod_name), run_name="__main__",
2546 2546 alter_sys=True)
2547 2547 )
2548 2548 except:
2549 2549 self.showtraceback()
2550 2550 warn('Unknown failure executing module: <%s>' % mod_name)
2551 2551
2552 2552 def _run_cached_cell_magic(self, magic_name, line):
2553 2553 """Special method to call a cell magic with the data stored in self.
2554 2554 """
2555 2555 cell = self._current_cell_magic_body
2556 2556 self._current_cell_magic_body = None
2557 2557 return self.run_cell_magic(magic_name, line, cell)
2558 2558
2559 2559 def run_cell(self, raw_cell, store_history=False, silent=False):
2560 2560 """Run a complete IPython cell.
2561 2561
2562 2562 Parameters
2563 2563 ----------
2564 2564 raw_cell : str
2565 2565 The code (including IPython code such as %magic functions) to run.
2566 2566 store_history : bool
2567 2567 If True, the raw and translated cell will be stored in IPython's
2568 2568 history. For user code calling back into IPython's machinery, this
2569 2569 should be set to False.
2570 2570 silent : bool
2571 If True, avoid side-effets, such as implicit displayhooks, history,
2571 If True, avoid side-effects, such as implicit displayhooks and
2572 2572 and logging. silent=True forces store_history=False.
2573 2573 """
2574 2574 if (not raw_cell) or raw_cell.isspace():
2575 2575 return
2576 2576
2577 2577 if silent:
2578 2578 store_history = False
2579 2579
2580 2580 self.input_splitter.push(raw_cell)
2581 2581
2582 2582 # Check for cell magics, which leave state behind. This interface is
2583 2583 # ugly, we need to do something cleaner later... Now the logic is
2584 2584 # simply that the input_splitter remembers if there was a cell magic,
2585 2585 # and in that case we grab the cell body.
2586 2586 if self.input_splitter.cell_magic_parts:
2587 2587 self._current_cell_magic_body = \
2588 2588 ''.join(self.input_splitter.cell_magic_parts)
2589 2589 cell = self.input_splitter.source_reset()
2590 2590
2591 2591 with self.builtin_trap:
2592 2592 prefilter_failed = False
2593 2593 if len(cell.splitlines()) == 1:
2594 2594 try:
2595 2595 # use prefilter_lines to handle trailing newlines
2596 2596 # restore trailing newline for ast.parse
2597 2597 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2598 2598 except AliasError as e:
2599 2599 error(e)
2600 2600 prefilter_failed = True
2601 2601 except Exception:
2602 2602 # don't allow prefilter errors to crash IPython
2603 2603 self.showtraceback()
2604 2604 prefilter_failed = True
2605 2605
2606 2606 # Store raw and processed history
2607 2607 if store_history:
2608 2608 self.history_manager.store_inputs(self.execution_count,
2609 2609 cell, raw_cell)
2610 2610 if not silent:
2611 2611 self.logger.log(cell, raw_cell)
2612 2612
2613 2613 if not prefilter_failed:
2614 2614 # don't run if prefilter failed
2615 2615 cell_name = self.compile.cache(cell, self.execution_count)
2616 2616
2617 2617 with self.display_trap:
2618 2618 try:
2619 2619 code_ast = self.compile.ast_parse(cell,
2620 2620 filename=cell_name)
2621 2621 except IndentationError:
2622 2622 self.showindentationerror()
2623 2623 if store_history:
2624 2624 self.execution_count += 1
2625 2625 return None
2626 2626 except (OverflowError, SyntaxError, ValueError, TypeError,
2627 2627 MemoryError):
2628 2628 self.showsyntaxerror()
2629 2629 if store_history:
2630 2630 self.execution_count += 1
2631 2631 return None
2632 2632
2633 2633 interactivity = "none" if silent else self.ast_node_interactivity
2634 2634 self.run_ast_nodes(code_ast.body, cell_name,
2635 2635 interactivity=interactivity)
2636 2636
2637 2637 # Execute any registered post-execution functions.
2638 2638 # unless we are silent
2639 2639 post_exec = [] if silent else self._post_execute.iteritems()
2640 2640
2641 2641 for func, status in post_exec:
2642 2642 if self.disable_failing_post_execute and not status:
2643 2643 continue
2644 2644 try:
2645 2645 func()
2646 2646 except KeyboardInterrupt:
2647 2647 print("\nKeyboardInterrupt", file=io.stderr)
2648 2648 except Exception:
2649 2649 # register as failing:
2650 2650 self._post_execute[func] = False
2651 2651 self.showtraceback()
2652 2652 print('\n'.join([
2653 2653 "post-execution function %r produced an error." % func,
2654 2654 "If this problem persists, you can disable failing post-exec functions with:",
2655 2655 "",
2656 2656 " get_ipython().disable_failing_post_execute = True"
2657 2657 ]), file=io.stderr)
2658 2658
2659 2659 if store_history:
2660 2660 # Write output to the database. Does nothing unless
2661 2661 # history output logging is enabled.
2662 2662 self.history_manager.store_output(self.execution_count)
2663 2663 # Each cell is a *single* input, regardless of how many lines it has
2664 2664 self.execution_count += 1
2665 2665
2666 2666 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr'):
2667 2667 """Run a sequence of AST nodes. The execution mode depends on the
2668 2668 interactivity parameter.
2669 2669
2670 2670 Parameters
2671 2671 ----------
2672 2672 nodelist : list
2673 2673 A sequence of AST nodes to run.
2674 2674 cell_name : str
2675 2675 Will be passed to the compiler as the filename of the cell. Typically
2676 2676 the value returned by ip.compile.cache(cell).
2677 2677 interactivity : str
2678 2678 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2679 2679 run interactively (displaying output from expressions). 'last_expr'
2680 2680 will run the last node interactively only if it is an expression (i.e.
2681 2681 expressions in loops or other blocks are not displayed. Other values
2682 2682 for this parameter will raise a ValueError.
2683 2683 """
2684 2684 if not nodelist:
2685 2685 return
2686 2686
2687 2687 if interactivity == 'last_expr':
2688 2688 if isinstance(nodelist[-1], ast.Expr):
2689 2689 interactivity = "last"
2690 2690 else:
2691 2691 interactivity = "none"
2692 2692
2693 2693 if interactivity == 'none':
2694 2694 to_run_exec, to_run_interactive = nodelist, []
2695 2695 elif interactivity == 'last':
2696 2696 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2697 2697 elif interactivity == 'all':
2698 2698 to_run_exec, to_run_interactive = [], nodelist
2699 2699 else:
2700 2700 raise ValueError("Interactivity was %r" % interactivity)
2701 2701
2702 2702 exec_count = self.execution_count
2703 2703
2704 2704 try:
2705 2705 for i, node in enumerate(to_run_exec):
2706 2706 mod = ast.Module([node])
2707 2707 code = self.compile(mod, cell_name, "exec")
2708 2708 if self.run_code(code):
2709 2709 return True
2710 2710
2711 2711 for i, node in enumerate(to_run_interactive):
2712 2712 mod = ast.Interactive([node])
2713 2713 code = self.compile(mod, cell_name, "single")
2714 2714 if self.run_code(code):
2715 2715 return True
2716 2716
2717 2717 # Flush softspace
2718 2718 if softspace(sys.stdout, 0):
2719 2719 print()
2720 2720
2721 2721 except:
2722 2722 # It's possible to have exceptions raised here, typically by
2723 2723 # compilation of odd code (such as a naked 'return' outside a
2724 2724 # function) that did parse but isn't valid. Typically the exception
2725 2725 # is a SyntaxError, but it's safest just to catch anything and show
2726 2726 # the user a traceback.
2727 2727
2728 2728 # We do only one try/except outside the loop to minimize the impact
2729 2729 # on runtime, and also because if any node in the node list is
2730 2730 # broken, we should stop execution completely.
2731 2731 self.showtraceback()
2732 2732
2733 2733 return False
2734 2734
2735 2735 def run_code(self, code_obj):
2736 2736 """Execute a code object.
2737 2737
2738 2738 When an exception occurs, self.showtraceback() is called to display a
2739 2739 traceback.
2740 2740
2741 2741 Parameters
2742 2742 ----------
2743 2743 code_obj : code object
2744 2744 A compiled code object, to be executed
2745 2745
2746 2746 Returns
2747 2747 -------
2748 2748 False : successful execution.
2749 2749 True : an error occurred.
2750 2750 """
2751 2751
2752 2752 # Set our own excepthook in case the user code tries to call it
2753 2753 # directly, so that the IPython crash handler doesn't get triggered
2754 2754 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2755 2755
2756 2756 # we save the original sys.excepthook in the instance, in case config
2757 2757 # code (such as magics) needs access to it.
2758 2758 self.sys_excepthook = old_excepthook
2759 2759 outflag = 1 # happens in more places, so it's easier as default
2760 2760 try:
2761 2761 try:
2762 2762 self.hooks.pre_run_code_hook()
2763 2763 #rprint('Running code', repr(code_obj)) # dbg
2764 2764 exec code_obj in self.user_global_ns, self.user_ns
2765 2765 finally:
2766 2766 # Reset our crash handler in place
2767 2767 sys.excepthook = old_excepthook
2768 2768 except SystemExit:
2769 2769 self.showtraceback(exception_only=True)
2770 2770 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2771 2771 except self.custom_exceptions:
2772 2772 etype,value,tb = sys.exc_info()
2773 2773 self.CustomTB(etype,value,tb)
2774 2774 except:
2775 2775 self.showtraceback()
2776 2776 else:
2777 2777 outflag = 0
2778 2778 return outflag
2779 2779
2780 2780 # For backwards compatibility
2781 2781 runcode = run_code
2782 2782
2783 2783 #-------------------------------------------------------------------------
2784 2784 # Things related to GUI support and pylab
2785 2785 #-------------------------------------------------------------------------
2786 2786
2787 2787 def enable_gui(self, gui=None):
2788 2788 raise NotImplementedError('Implement enable_gui in a subclass')
2789 2789
2790 2790 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2791 2791 """Activate pylab support at runtime.
2792 2792
2793 2793 This turns on support for matplotlib, preloads into the interactive
2794 2794 namespace all of numpy and pylab, and configures IPython to correctly
2795 2795 interact with the GUI event loop. The GUI backend to be used can be
2796 2796 optionally selected with the optional :param:`gui` argument.
2797 2797
2798 2798 Parameters
2799 2799 ----------
2800 2800 gui : optional, string
2801 2801
2802 2802 If given, dictates the choice of matplotlib GUI backend to use
2803 2803 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2804 2804 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2805 2805 matplotlib (as dictated by the matplotlib build-time options plus the
2806 2806 user's matplotlibrc configuration file). Note that not all backends
2807 2807 make sense in all contexts, for example a terminal ipython can't
2808 2808 display figures inline.
2809 2809 """
2810 2810 from IPython.core.pylabtools import mpl_runner
2811 2811 # We want to prevent the loading of pylab to pollute the user's
2812 2812 # namespace as shown by the %who* magics, so we execute the activation
2813 2813 # code in an empty namespace, and we update *both* user_ns and
2814 2814 # user_ns_hidden with this information.
2815 2815 ns = {}
2816 2816 try:
2817 2817 gui = pylab_activate(ns, gui, import_all, self, welcome_message=welcome_message)
2818 2818 except KeyError:
2819 2819 error("Backend %r not supported" % gui)
2820 2820 return
2821 2821 self.user_ns.update(ns)
2822 2822 self.user_ns_hidden.update(ns)
2823 2823 # Now we must activate the gui pylab wants to use, and fix %run to take
2824 2824 # plot updates into account
2825 2825 self.enable_gui(gui)
2826 2826 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2827 2827 mpl_runner(self.safe_execfile)
2828 2828
2829 2829 #-------------------------------------------------------------------------
2830 2830 # Utilities
2831 2831 #-------------------------------------------------------------------------
2832 2832
2833 2833 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2834 2834 """Expand python variables in a string.
2835 2835
2836 2836 The depth argument indicates how many frames above the caller should
2837 2837 be walked to look for the local namespace where to expand variables.
2838 2838
2839 2839 The global namespace for expansion is always the user's interactive
2840 2840 namespace.
2841 2841 """
2842 2842 ns = self.user_ns.copy()
2843 2843 ns.update(sys._getframe(depth+1).f_locals)
2844 2844 try:
2845 2845 # We have to use .vformat() here, because 'self' is a valid and common
2846 2846 # name, and expanding **ns for .format() would make it collide with
2847 2847 # the 'self' argument of the method.
2848 2848 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2849 2849 except Exception:
2850 2850 # if formatter couldn't format, just let it go untransformed
2851 2851 pass
2852 2852 return cmd
2853 2853
2854 2854 def mktempfile(self, data=None, prefix='ipython_edit_'):
2855 2855 """Make a new tempfile and return its filename.
2856 2856
2857 2857 This makes a call to tempfile.mktemp, but it registers the created
2858 2858 filename internally so ipython cleans it up at exit time.
2859 2859
2860 2860 Optional inputs:
2861 2861
2862 2862 - data(None): if data is given, it gets written out to the temp file
2863 2863 immediately, and the file is closed again."""
2864 2864
2865 2865 filename = tempfile.mktemp('.py', prefix)
2866 2866 self.tempfiles.append(filename)
2867 2867
2868 2868 if data:
2869 2869 tmp_file = open(filename,'w')
2870 2870 tmp_file.write(data)
2871 2871 tmp_file.close()
2872 2872 return filename
2873 2873
2874 2874 # TODO: This should be removed when Term is refactored.
2875 2875 def write(self,data):
2876 2876 """Write a string to the default output"""
2877 2877 io.stdout.write(data)
2878 2878
2879 2879 # TODO: This should be removed when Term is refactored.
2880 2880 def write_err(self,data):
2881 2881 """Write a string to the default error output"""
2882 2882 io.stderr.write(data)
2883 2883
2884 2884 def ask_yes_no(self, prompt, default=None):
2885 2885 if self.quiet:
2886 2886 return True
2887 2887 return ask_yes_no(prompt,default)
2888 2888
2889 2889 def show_usage(self):
2890 2890 """Show a usage message"""
2891 2891 page.page(IPython.core.usage.interactive_usage)
2892 2892
2893 2893 def extract_input_lines(self, range_str, raw=False):
2894 2894 """Return as a string a set of input history slices.
2895 2895
2896 2896 Parameters
2897 2897 ----------
2898 2898 range_str : string
2899 2899 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
2900 2900 since this function is for use by magic functions which get their
2901 2901 arguments as strings. The number before the / is the session
2902 2902 number: ~n goes n back from the current session.
2903 2903
2904 2904 Optional Parameters:
2905 2905 - raw(False): by default, the processed input is used. If this is
2906 2906 true, the raw input history is used instead.
2907 2907
2908 2908 Note that slices can be called with two notations:
2909 2909
2910 2910 N:M -> standard python form, means including items N...(M-1).
2911 2911
2912 2912 N-M -> include items N..M (closed endpoint)."""
2913 2913 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
2914 2914 return "\n".join(x for _, _, x in lines)
2915 2915
2916 2916 def find_user_code(self, target, raw=True, py_only=False):
2917 2917 """Get a code string from history, file, url, or a string or macro.
2918 2918
2919 2919 This is mainly used by magic functions.
2920 2920
2921 2921 Parameters
2922 2922 ----------
2923 2923
2924 2924 target : str
2925 2925
2926 2926 A string specifying code to retrieve. This will be tried respectively
2927 2927 as: ranges of input history (see %history for syntax), url,
2928 2928 correspnding .py file, filename, or an expression evaluating to a
2929 2929 string or Macro in the user namespace.
2930 2930
2931 2931 raw : bool
2932 2932 If true (default), retrieve raw history. Has no effect on the other
2933 2933 retrieval mechanisms.
2934 2934
2935 2935 py_only : bool (default False)
2936 2936 Only try to fetch python code, do not try alternative methods to decode file
2937 2937 if unicode fails.
2938 2938
2939 2939 Returns
2940 2940 -------
2941 2941 A string of code.
2942 2942
2943 2943 ValueError is raised if nothing is found, and TypeError if it evaluates
2944 2944 to an object of another type. In each case, .args[0] is a printable
2945 2945 message.
2946 2946 """
2947 2947 code = self.extract_input_lines(target, raw=raw) # Grab history
2948 2948 if code:
2949 2949 return code
2950 2950 utarget = unquote_filename(target)
2951 2951 try:
2952 2952 if utarget.startswith(('http://', 'https://')):
2953 2953 return openpy.read_py_url(utarget, skip_encoding_cookie=True)
2954 2954 except UnicodeDecodeError:
2955 2955 if not py_only :
2956 2956 response = urllib.urlopen(target)
2957 2957 return response.read().decode('latin1')
2958 2958 raise ValueError(("'%s' seem to be unreadable.") % utarget)
2959 2959
2960 2960 potential_target = [target]
2961 2961 try :
2962 2962 potential_target.insert(0,get_py_filename(target))
2963 2963 except IOError:
2964 2964 pass
2965 2965
2966 2966 for tgt in potential_target :
2967 2967 if os.path.isfile(tgt): # Read file
2968 2968 try :
2969 2969 return openpy.read_py_file(tgt, skip_encoding_cookie=True)
2970 2970 except UnicodeDecodeError :
2971 2971 if not py_only :
2972 2972 with io_open(tgt,'r', encoding='latin1') as f :
2973 2973 return f.read()
2974 2974 raise ValueError(("'%s' seem to be unreadable.") % target)
2975 2975
2976 2976 try: # User namespace
2977 2977 codeobj = eval(target, self.user_ns)
2978 2978 except Exception:
2979 2979 raise ValueError(("'%s' was not found in history, as a file, url, "
2980 2980 "nor in the user namespace.") % target)
2981 2981 if isinstance(codeobj, basestring):
2982 2982 return codeobj
2983 2983 elif isinstance(codeobj, Macro):
2984 2984 return codeobj.value
2985 2985
2986 2986 raise TypeError("%s is neither a string nor a macro." % target,
2987 2987 codeobj)
2988 2988
2989 2989 #-------------------------------------------------------------------------
2990 2990 # Things related to IPython exiting
2991 2991 #-------------------------------------------------------------------------
2992 2992 def atexit_operations(self):
2993 2993 """This will be executed at the time of exit.
2994 2994
2995 2995 Cleanup operations and saving of persistent data that is done
2996 2996 unconditionally by IPython should be performed here.
2997 2997
2998 2998 For things that may depend on startup flags or platform specifics (such
2999 2999 as having readline or not), register a separate atexit function in the
3000 3000 code that has the appropriate information, rather than trying to
3001 3001 clutter
3002 3002 """
3003 3003 # Close the history session (this stores the end time and line count)
3004 3004 # this must be *before* the tempfile cleanup, in case of temporary
3005 3005 # history db
3006 3006 self.history_manager.end_session()
3007 3007
3008 3008 # Cleanup all tempfiles left around
3009 3009 for tfile in self.tempfiles:
3010 3010 try:
3011 3011 os.unlink(tfile)
3012 3012 except OSError:
3013 3013 pass
3014 3014
3015 3015 # Clear all user namespaces to release all references cleanly.
3016 3016 self.reset(new_session=False)
3017 3017
3018 3018 # Run user hooks
3019 3019 self.hooks.shutdown_hook()
3020 3020
3021 3021 def cleanup(self):
3022 3022 self.restore_sys_module_state()
3023 3023
3024 3024
3025 3025 class InteractiveShellABC(object):
3026 3026 """An abstract base class for InteractiveShell."""
3027 3027 __metaclass__ = abc.ABCMeta
3028 3028
3029 3029 InteractiveShellABC.register(InteractiveShell)
@@ -1,930 +1,931 b''
1 1 #!/usr/bin/env python
2 2 """A simple interactive kernel that talks to a frontend over 0MQ.
3 3
4 4 Things to do:
5 5
6 6 * Implement `set_parent` logic. Right before doing exec, the Kernel should
7 7 call set_parent on all the PUB objects with the message about to be executed.
8 8 * Implement random port and security key logic.
9 9 * Implement control messages.
10 10 * Implement event loop and poll version.
11 11 """
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16 from __future__ import print_function
17 17
18 18 # Standard library imports
19 19 import __builtin__
20 20 import atexit
21 21 import sys
22 22 import time
23 23 import traceback
24 24 import logging
25 25 import uuid
26 26
27 27 from datetime import datetime
28 28 from signal import (
29 29 signal, getsignal, default_int_handler, SIGINT, SIG_IGN
30 30 )
31 31
32 32 # System library imports
33 33 import zmq
34 34 from zmq.eventloop import ioloop
35 35 from zmq.eventloop.zmqstream import ZMQStream
36 36
37 37 # Local imports
38 38 from IPython.config.configurable import Configurable
39 39 from IPython.config.application import boolean_flag, catch_config_error
40 40 from IPython.core.application import ProfileDir
41 41 from IPython.core.error import StdinNotImplementedError
42 42 from IPython.core.shellapp import (
43 43 InteractiveShellApp, shell_flags, shell_aliases
44 44 )
45 45 from IPython.utils import io
46 46 from IPython.utils import py3compat
47 47 from IPython.utils.frame import extract_module_locals
48 48 from IPython.utils.jsonutil import json_clean
49 49 from IPython.utils.traitlets import (
50 50 Any, Instance, Float, Dict, CaselessStrEnum, List, Set, Integer, Unicode
51 51 )
52 52
53 53 from entry_point import base_launch_kernel
54 54 from kernelapp import KernelApp, kernel_flags, kernel_aliases
55 55 from serialize import serialize_object, unpack_apply_message
56 56 from session import Session, Message
57 57 from zmqshell import ZMQInteractiveShell
58 58
59 59
60 60 #-----------------------------------------------------------------------------
61 61 # Main kernel class
62 62 #-----------------------------------------------------------------------------
63 63
64 64 class Kernel(Configurable):
65 65
66 66 #---------------------------------------------------------------------------
67 67 # Kernel interface
68 68 #---------------------------------------------------------------------------
69 69
70 70 # attribute to override with a GUI
71 71 eventloop = Any(None)
72 72 def _eventloop_changed(self, name, old, new):
73 73 """schedule call to eventloop from IOLoop"""
74 74 loop = ioloop.IOLoop.instance()
75 75 loop.add_timeout(time.time()+0.1, self.enter_eventloop)
76 76
77 77 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
78 78 session = Instance(Session)
79 79 profile_dir = Instance('IPython.core.profiledir.ProfileDir')
80 80 shell_streams = List()
81 81 control_stream = Instance(ZMQStream)
82 82 iopub_socket = Instance(zmq.Socket)
83 83 stdin_socket = Instance(zmq.Socket)
84 84 log = Instance(logging.Logger)
85 85
86 86 user_module = Any()
87 87 def _user_module_changed(self, name, old, new):
88 88 if self.shell is not None:
89 89 self.shell.user_module = new
90 90
91 91 user_ns = Dict(default_value=None)
92 92 def _user_ns_changed(self, name, old, new):
93 93 if self.shell is not None:
94 94 self.shell.user_ns = new
95 95 self.shell.init_user_ns()
96 96
97 97 # identities:
98 98 int_id = Integer(-1)
99 99 ident = Unicode()
100 100
101 101 def _ident_default(self):
102 102 return unicode(uuid.uuid4())
103 103
104 104
105 105 # Private interface
106 106
107 107 # Time to sleep after flushing the stdout/err buffers in each execute
108 108 # cycle. While this introduces a hard limit on the minimal latency of the
109 109 # execute cycle, it helps prevent output synchronization problems for
110 110 # clients.
111 111 # Units are in seconds. The minimum zmq latency on local host is probably
112 112 # ~150 microseconds, set this to 500us for now. We may need to increase it
113 113 # a little if it's not enough after more interactive testing.
114 114 _execute_sleep = Float(0.0005, config=True)
115 115
116 116 # Frequency of the kernel's event loop.
117 117 # Units are in seconds, kernel subclasses for GUI toolkits may need to
118 118 # adapt to milliseconds.
119 119 _poll_interval = Float(0.05, config=True)
120 120
121 121 # If the shutdown was requested over the network, we leave here the
122 122 # necessary reply message so it can be sent by our registered atexit
123 123 # handler. This ensures that the reply is only sent to clients truly at
124 124 # the end of our shutdown process (which happens after the underlying
125 125 # IPython shell's own shutdown).
126 126 _shutdown_message = None
127 127
128 128 # This is a dict of port number that the kernel is listening on. It is set
129 129 # by record_ports and used by connect_request.
130 130 _recorded_ports = Dict()
131 131
132 132 # set of aborted msg_ids
133 133 aborted = Set()
134 134
135 135
136 136 def __init__(self, **kwargs):
137 137 super(Kernel, self).__init__(**kwargs)
138 138
139 139 # Initialize the InteractiveShell subclass
140 140 self.shell = ZMQInteractiveShell.instance(config=self.config,
141 141 profile_dir = self.profile_dir,
142 142 user_module = self.user_module,
143 143 user_ns = self.user_ns,
144 144 )
145 145 self.shell.displayhook.session = self.session
146 146 self.shell.displayhook.pub_socket = self.iopub_socket
147 147 self.shell.displayhook.topic = self._topic('pyout')
148 148 self.shell.display_pub.session = self.session
149 149 self.shell.display_pub.pub_socket = self.iopub_socket
150 150 self.shell.data_pub.session = self.session
151 151 self.shell.data_pub.pub_socket = self.iopub_socket
152 152
153 153 # TMP - hack while developing
154 154 self.shell._reply_content = None
155 155
156 156 # Build dict of handlers for message types
157 157 msg_types = [ 'execute_request', 'complete_request',
158 158 'object_info_request', 'history_request',
159 159 'connect_request', 'shutdown_request',
160 160 'apply_request',
161 161 ]
162 162 self.shell_handlers = {}
163 163 for msg_type in msg_types:
164 164 self.shell_handlers[msg_type] = getattr(self, msg_type)
165 165
166 166 control_msg_types = msg_types + [ 'clear_request', 'abort_request' ]
167 167 self.control_handlers = {}
168 168 for msg_type in control_msg_types:
169 169 self.control_handlers[msg_type] = getattr(self, msg_type)
170 170
171 171 def dispatch_control(self, msg):
172 172 """dispatch control requests"""
173 173 idents,msg = self.session.feed_identities(msg, copy=False)
174 174 try:
175 175 msg = self.session.unserialize(msg, content=True, copy=False)
176 176 except:
177 177 self.log.error("Invalid Control Message", exc_info=True)
178 178 return
179 179
180 180 self.log.debug("Control received: %s", msg)
181 181
182 182 header = msg['header']
183 183 msg_id = header['msg_id']
184 184 msg_type = header['msg_type']
185 185
186 186 handler = self.control_handlers.get(msg_type, None)
187 187 if handler is None:
188 188 self.log.error("UNKNOWN CONTROL MESSAGE TYPE: %r", msg_type)
189 189 else:
190 190 try:
191 191 handler(self.control_stream, idents, msg)
192 192 except Exception:
193 193 self.log.error("Exception in control handler:", exc_info=True)
194 194
195 195 def dispatch_shell(self, stream, msg):
196 196 """dispatch shell requests"""
197 197 # flush control requests first
198 198 if self.control_stream:
199 199 self.control_stream.flush()
200 200
201 201 idents,msg = self.session.feed_identities(msg, copy=False)
202 202 try:
203 203 msg = self.session.unserialize(msg, content=True, copy=False)
204 204 except:
205 205 self.log.error("Invalid Message", exc_info=True)
206 206 return
207 207
208 208 header = msg['header']
209 209 msg_id = header['msg_id']
210 210 msg_type = msg['header']['msg_type']
211 211
212 212 # Print some info about this message and leave a '--->' marker, so it's
213 213 # easier to trace visually the message chain when debugging. Each
214 214 # handler prints its message at the end.
215 215 self.log.debug('\n*** MESSAGE TYPE:%s***', msg_type)
216 216 self.log.debug(' Content: %s\n --->\n ', msg['content'])
217 217
218 218 if msg_id in self.aborted:
219 219 self.aborted.remove(msg_id)
220 220 # is it safe to assume a msg_id will not be resubmitted?
221 221 reply_type = msg_type.split('_')[0] + '_reply'
222 222 status = {'status' : 'aborted'}
223 223 md = {'engine' : self.ident}
224 224 md.update(status)
225 225 reply_msg = self.session.send(stream, reply_type, metadata=md,
226 226 content=status, parent=msg, ident=idents)
227 227 return
228 228
229 229 handler = self.shell_handlers.get(msg_type, None)
230 230 if handler is None:
231 231 self.log.error("UNKNOWN MESSAGE TYPE: %r", msg_type)
232 232 else:
233 233 # ensure default_int_handler during handler call
234 234 sig = signal(SIGINT, default_int_handler)
235 235 try:
236 236 handler(stream, idents, msg)
237 237 except Exception:
238 238 self.log.error("Exception in message handler:", exc_info=True)
239 239 finally:
240 240 signal(SIGINT, sig)
241 241
242 242 def enter_eventloop(self):
243 243 """enter eventloop"""
244 244 self.log.info("entering eventloop")
245 245 # restore default_int_handler
246 246 signal(SIGINT, default_int_handler)
247 247 while self.eventloop is not None:
248 248 try:
249 249 self.eventloop(self)
250 250 except KeyboardInterrupt:
251 251 # Ctrl-C shouldn't crash the kernel
252 252 self.log.error("KeyboardInterrupt caught in kernel")
253 253 continue
254 254 else:
255 255 # eventloop exited cleanly, this means we should stop (right?)
256 256 self.eventloop = None
257 257 break
258 258 self.log.info("exiting eventloop")
259 259
260 260 def start(self):
261 261 """register dispatchers for streams"""
262 262 self.shell.exit_now = False
263 263 if self.control_stream:
264 264 self.control_stream.on_recv(self.dispatch_control, copy=False)
265 265
266 266 def make_dispatcher(stream):
267 267 def dispatcher(msg):
268 268 return self.dispatch_shell(stream, msg)
269 269 return dispatcher
270 270
271 271 for s in self.shell_streams:
272 272 s.on_recv(make_dispatcher(s), copy=False)
273 273
274 274 def do_one_iteration(self):
275 275 """step eventloop just once"""
276 276 if self.control_stream:
277 277 self.control_stream.flush()
278 278 for stream in self.shell_streams:
279 279 # handle at most one request per iteration
280 280 stream.flush(zmq.POLLIN, 1)
281 281 stream.flush(zmq.POLLOUT)
282 282
283 283
284 284 def record_ports(self, ports):
285 285 """Record the ports that this kernel is using.
286 286
287 287 The creator of the Kernel instance must call this methods if they
288 288 want the :meth:`connect_request` method to return the port numbers.
289 289 """
290 290 self._recorded_ports = ports
291 291
292 292 #---------------------------------------------------------------------------
293 293 # Kernel request handlers
294 294 #---------------------------------------------------------------------------
295 295
296 296 def _make_metadata(self, other=None):
297 297 """init metadata dict, for execute/apply_reply"""
298 298 new_md = {
299 299 'dependencies_met' : True,
300 300 'engine' : self.ident,
301 301 'started': datetime.now(),
302 302 }
303 303 if other:
304 304 new_md.update(other)
305 305 return new_md
306 306
307 307 def _publish_pyin(self, code, parent, execution_count):
308 308 """Publish the code request on the pyin stream."""
309 309
310 310 self.session.send(self.iopub_socket, u'pyin',
311 311 {u'code':code, u'execution_count': execution_count},
312 312 parent=parent, ident=self._topic('pyin')
313 313 )
314 314
315 315 def _publish_status(self, status, parent=None):
316 316 """send status (busy/idle) on IOPub"""
317 317 self.session.send(self.iopub_socket,
318 318 u'status',
319 319 {u'execution_state': status},
320 320 parent=parent,
321 321 ident=self._topic('status'),
322 322 )
323 323
324 324
325 325 def execute_request(self, stream, ident, parent):
326 326 """handle an execute_request"""
327 327
328 328 self._publish_status(u'busy', parent)
329 329
330 330 try:
331 331 content = parent[u'content']
332 332 code = content[u'code']
333 333 silent = content[u'silent']
334 store_history = content.get(u'store_history', not silent)
334 335 except:
335 336 self.log.error("Got bad msg: ")
336 337 self.log.error("%s", parent)
337 338 return
338 339
339 340 md = self._make_metadata(parent['metadata'])
340 341
341 342 shell = self.shell # we'll need this a lot here
342 343
343 344 # Replace raw_input. Note that is not sufficient to replace
344 345 # raw_input in the user namespace.
345 346 if content.get('allow_stdin', False):
346 347 raw_input = lambda prompt='': self._raw_input(prompt, ident, parent)
347 348 else:
348 349 raw_input = lambda prompt='' : self._no_raw_input()
349 350
350 351 if py3compat.PY3:
351 352 __builtin__.input = raw_input
352 353 else:
353 354 __builtin__.raw_input = raw_input
354 355
355 356 # Set the parent message of the display hook and out streams.
356 357 shell.displayhook.set_parent(parent)
357 358 shell.display_pub.set_parent(parent)
358 359 shell.data_pub.set_parent(parent)
359 360 sys.stdout.set_parent(parent)
360 361 sys.stderr.set_parent(parent)
361 362
362 363 # Re-broadcast our input for the benefit of listening clients, and
363 364 # start computing output
364 365 if not silent:
365 366 self._publish_pyin(code, parent, shell.execution_count)
366 367
367 368 reply_content = {}
368 369 try:
369 370 # FIXME: the shell calls the exception handler itself.
370 shell.run_cell(code, store_history=not silent, silent=silent)
371 shell.run_cell(code, store_history=store_history, silent=silent)
371 372 except:
372 373 status = u'error'
373 374 # FIXME: this code right now isn't being used yet by default,
374 375 # because the run_cell() call above directly fires off exception
375 376 # reporting. This code, therefore, is only active in the scenario
376 377 # where runlines itself has an unhandled exception. We need to
377 378 # uniformize this, for all exception construction to come from a
378 379 # single location in the codbase.
379 380 etype, evalue, tb = sys.exc_info()
380 381 tb_list = traceback.format_exception(etype, evalue, tb)
381 382 reply_content.update(shell._showtraceback(etype, evalue, tb_list))
382 383 else:
383 384 status = u'ok'
384 385
385 386 reply_content[u'status'] = status
386 387
387 388 # Return the execution counter so clients can display prompts
388 389 reply_content['execution_count'] = shell.execution_count - 1
389 390
390 391 # FIXME - fish exception info out of shell, possibly left there by
391 392 # runlines. We'll need to clean up this logic later.
392 393 if shell._reply_content is not None:
393 394 reply_content.update(shell._reply_content)
394 395 e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method='execute')
395 396 reply_content['engine_info'] = e_info
396 397 # reset after use
397 398 shell._reply_content = None
398 399
399 400 # At this point, we can tell whether the main code execution succeeded
400 401 # or not. If it did, we proceed to evaluate user_variables/expressions
401 402 if reply_content['status'] == 'ok':
402 403 reply_content[u'user_variables'] = \
403 404 shell.user_variables(content.get(u'user_variables', []))
404 405 reply_content[u'user_expressions'] = \
405 406 shell.user_expressions(content.get(u'user_expressions', {}))
406 407 else:
407 408 # If there was an error, don't even try to compute variables or
408 409 # expressions
409 410 reply_content[u'user_variables'] = {}
410 411 reply_content[u'user_expressions'] = {}
411 412
412 413 # Payloads should be retrieved regardless of outcome, so we can both
413 414 # recover partial output (that could have been generated early in a
414 415 # block, before an error) and clear the payload system always.
415 416 reply_content[u'payload'] = shell.payload_manager.read_payload()
416 417 # Be agressive about clearing the payload because we don't want
417 418 # it to sit in memory until the next execute_request comes in.
418 419 shell.payload_manager.clear_payload()
419 420
420 421 # Flush output before sending the reply.
421 422 sys.stdout.flush()
422 423 sys.stderr.flush()
423 424 # FIXME: on rare occasions, the flush doesn't seem to make it to the
424 425 # clients... This seems to mitigate the problem, but we definitely need
425 426 # to better understand what's going on.
426 427 if self._execute_sleep:
427 428 time.sleep(self._execute_sleep)
428 429
429 430 # Send the reply.
430 431 reply_content = json_clean(reply_content)
431 432
432 433 md['status'] = reply_content['status']
433 434 if reply_content['status'] == 'error' and \
434 435 reply_content['ename'] == 'UnmetDependency':
435 436 md['dependencies_met'] = False
436 437
437 438 reply_msg = self.session.send(stream, u'execute_reply',
438 439 reply_content, parent, metadata=md,
439 440 ident=ident)
440 441
441 442 self.log.debug("%s", reply_msg)
442 443
443 444 if not silent and reply_msg['content']['status'] == u'error':
444 445 self._abort_queues()
445 446
446 447 self._publish_status(u'idle', parent)
447 448
448 449 def complete_request(self, stream, ident, parent):
449 450 txt, matches = self._complete(parent)
450 451 matches = {'matches' : matches,
451 452 'matched_text' : txt,
452 453 'status' : 'ok'}
453 454 matches = json_clean(matches)
454 455 completion_msg = self.session.send(stream, 'complete_reply',
455 456 matches, parent, ident)
456 457 self.log.debug("%s", completion_msg)
457 458
458 459 def object_info_request(self, stream, ident, parent):
459 460 content = parent['content']
460 461 object_info = self.shell.object_inspect(content['oname'],
461 462 detail_level = content.get('detail_level', 0)
462 463 )
463 464 # Before we send this object over, we scrub it for JSON usage
464 465 oinfo = json_clean(object_info)
465 466 msg = self.session.send(stream, 'object_info_reply',
466 467 oinfo, parent, ident)
467 468 self.log.debug("%s", msg)
468 469
469 470 def history_request(self, stream, ident, parent):
470 471 # We need to pull these out, as passing **kwargs doesn't work with
471 472 # unicode keys before Python 2.6.5.
472 473 hist_access_type = parent['content']['hist_access_type']
473 474 raw = parent['content']['raw']
474 475 output = parent['content']['output']
475 476 if hist_access_type == 'tail':
476 477 n = parent['content']['n']
477 478 hist = self.shell.history_manager.get_tail(n, raw=raw, output=output,
478 479 include_latest=True)
479 480
480 481 elif hist_access_type == 'range':
481 482 session = parent['content']['session']
482 483 start = parent['content']['start']
483 484 stop = parent['content']['stop']
484 485 hist = self.shell.history_manager.get_range(session, start, stop,
485 486 raw=raw, output=output)
486 487
487 488 elif hist_access_type == 'search':
488 489 pattern = parent['content']['pattern']
489 490 hist = self.shell.history_manager.search(pattern, raw=raw,
490 491 output=output)
491 492
492 493 else:
493 494 hist = []
494 495 hist = list(hist)
495 496 content = {'history' : hist}
496 497 content = json_clean(content)
497 498 msg = self.session.send(stream, 'history_reply',
498 499 content, parent, ident)
499 500 self.log.debug("Sending history reply with %i entries", len(hist))
500 501
501 502 def connect_request(self, stream, ident, parent):
502 503 if self._recorded_ports is not None:
503 504 content = self._recorded_ports.copy()
504 505 else:
505 506 content = {}
506 507 msg = self.session.send(stream, 'connect_reply',
507 508 content, parent, ident)
508 509 self.log.debug("%s", msg)
509 510
510 511 def shutdown_request(self, stream, ident, parent):
511 512 self.shell.exit_now = True
512 513 content = dict(status='ok')
513 514 content.update(parent['content'])
514 515 self.session.send(stream, u'shutdown_reply', content, parent, ident=ident)
515 516 # same content, but different msg_id for broadcasting on IOPub
516 517 self._shutdown_message = self.session.msg(u'shutdown_reply',
517 518 content, parent
518 519 )
519 520
520 521 self._at_shutdown()
521 522 # call sys.exit after a short delay
522 523 loop = ioloop.IOLoop.instance()
523 524 loop.add_timeout(time.time()+0.1, loop.stop)
524 525
525 526 #---------------------------------------------------------------------------
526 527 # Engine methods
527 528 #---------------------------------------------------------------------------
528 529
529 530 def apply_request(self, stream, ident, parent):
530 531 try:
531 532 content = parent[u'content']
532 533 bufs = parent[u'buffers']
533 534 msg_id = parent['header']['msg_id']
534 535 except:
535 536 self.log.error("Got bad msg: %s", parent, exc_info=True)
536 537 return
537 538
538 539 self._publish_status(u'busy', parent)
539 540
540 541 # Set the parent message of the display hook and out streams.
541 542 shell = self.shell
542 543 shell.displayhook.set_parent(parent)
543 544 shell.display_pub.set_parent(parent)
544 545 shell.data_pub.set_parent(parent)
545 546 sys.stdout.set_parent(parent)
546 547 sys.stderr.set_parent(parent)
547 548
548 549 # pyin_msg = self.session.msg(u'pyin',{u'code':code}, parent=parent)
549 550 # self.iopub_socket.send(pyin_msg)
550 551 # self.session.send(self.iopub_socket, u'pyin', {u'code':code},parent=parent)
551 552 md = self._make_metadata(parent['metadata'])
552 553 try:
553 554 working = shell.user_ns
554 555
555 556 prefix = "_"+str(msg_id).replace("-","")+"_"
556 557
557 558 f,args,kwargs = unpack_apply_message(bufs, working, copy=False)
558 559
559 560 fname = getattr(f, '__name__', 'f')
560 561
561 562 fname = prefix+"f"
562 563 argname = prefix+"args"
563 564 kwargname = prefix+"kwargs"
564 565 resultname = prefix+"result"
565 566
566 567 ns = { fname : f, argname : args, kwargname : kwargs , resultname : None }
567 568 # print ns
568 569 working.update(ns)
569 570 code = "%s = %s(*%s,**%s)" % (resultname, fname, argname, kwargname)
570 571 try:
571 572 exec code in shell.user_global_ns, shell.user_ns
572 573 result = working.get(resultname)
573 574 finally:
574 575 for key in ns.iterkeys():
575 576 working.pop(key)
576 577
577 578 result_buf = serialize_object(result,
578 579 buffer_threshold=self.session.buffer_threshold,
579 580 item_threshold=self.session.item_threshold,
580 581 )
581 582
582 583 except:
583 584 # invoke IPython traceback formatting
584 585 shell.showtraceback()
585 586 # FIXME - fish exception info out of shell, possibly left there by
586 587 # run_code. We'll need to clean up this logic later.
587 588 reply_content = {}
588 589 if shell._reply_content is not None:
589 590 reply_content.update(shell._reply_content)
590 591 e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method='apply')
591 592 reply_content['engine_info'] = e_info
592 593 # reset after use
593 594 shell._reply_content = None
594 595
595 596 self.session.send(self.iopub_socket, u'pyerr', reply_content, parent=parent,
596 597 ident=self._topic('pyerr'))
597 598 result_buf = []
598 599
599 600 if reply_content['ename'] == 'UnmetDependency':
600 601 md['dependencies_met'] = False
601 602 else:
602 603 reply_content = {'status' : 'ok'}
603 604
604 605 # put 'ok'/'error' status in header, for scheduler introspection:
605 606 md['status'] = reply_content['status']
606 607
607 608 # flush i/o
608 609 sys.stdout.flush()
609 610 sys.stderr.flush()
610 611
611 612 reply_msg = self.session.send(stream, u'apply_reply', reply_content,
612 613 parent=parent, ident=ident,buffers=result_buf, metadata=md)
613 614
614 615 self._publish_status(u'idle', parent)
615 616
616 617 #---------------------------------------------------------------------------
617 618 # Control messages
618 619 #---------------------------------------------------------------------------
619 620
620 621 def abort_request(self, stream, ident, parent):
621 622 """abort a specifig msg by id"""
622 623 msg_ids = parent['content'].get('msg_ids', None)
623 624 if isinstance(msg_ids, basestring):
624 625 msg_ids = [msg_ids]
625 626 if not msg_ids:
626 627 self.abort_queues()
627 628 for mid in msg_ids:
628 629 self.aborted.add(str(mid))
629 630
630 631 content = dict(status='ok')
631 632 reply_msg = self.session.send(stream, 'abort_reply', content=content,
632 633 parent=parent, ident=ident)
633 634 self.log.debug("%s", reply_msg)
634 635
635 636 def clear_request(self, stream, idents, parent):
636 637 """Clear our namespace."""
637 638 self.shell.reset(False)
638 639 msg = self.session.send(stream, 'clear_reply', ident=idents, parent=parent,
639 640 content = dict(status='ok'))
640 641
641 642
642 643 #---------------------------------------------------------------------------
643 644 # Protected interface
644 645 #---------------------------------------------------------------------------
645 646
646 647
647 648 def _wrap_exception(self, method=None):
648 649 # import here, because _wrap_exception is only used in parallel,
649 650 # and parallel has higher min pyzmq version
650 651 from IPython.parallel.error import wrap_exception
651 652 e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method=method)
652 653 content = wrap_exception(e_info)
653 654 return content
654 655
655 656 def _topic(self, topic):
656 657 """prefixed topic for IOPub messages"""
657 658 if self.int_id >= 0:
658 659 base = "engine.%i" % self.int_id
659 660 else:
660 661 base = "kernel.%s" % self.ident
661 662
662 663 return py3compat.cast_bytes("%s.%s" % (base, topic))
663 664
664 665 def _abort_queues(self):
665 666 for stream in self.shell_streams:
666 667 if stream:
667 668 self._abort_queue(stream)
668 669
669 670 def _abort_queue(self, stream):
670 671 poller = zmq.Poller()
671 672 poller.register(stream.socket, zmq.POLLIN)
672 673 while True:
673 674 idents,msg = self.session.recv(stream, zmq.NOBLOCK, content=True)
674 675 if msg is None:
675 676 return
676 677
677 678 self.log.info("Aborting:")
678 679 self.log.info("%s", msg)
679 680 msg_type = msg['header']['msg_type']
680 681 reply_type = msg_type.split('_')[0] + '_reply'
681 682
682 683 status = {'status' : 'aborted'}
683 684 md = {'engine' : self.ident}
684 685 md.update(status)
685 686 reply_msg = self.session.send(stream, reply_type, metadata=md,
686 687 content=status, parent=msg, ident=idents)
687 688 self.log.debug("%s", reply_msg)
688 689 # We need to wait a bit for requests to come in. This can probably
689 690 # be set shorter for true asynchronous clients.
690 691 poller.poll(50)
691 692
692 693
693 694 def _no_raw_input(self):
694 695 """Raise StdinNotImplentedError if active frontend doesn't support
695 696 stdin."""
696 697 raise StdinNotImplementedError("raw_input was called, but this "
697 698 "frontend does not support stdin.")
698 699
699 700 def _raw_input(self, prompt, ident, parent):
700 701 # Flush output before making the request.
701 702 sys.stderr.flush()
702 703 sys.stdout.flush()
703 704
704 705 # Send the input request.
705 706 content = json_clean(dict(prompt=prompt))
706 707 self.session.send(self.stdin_socket, u'input_request', content, parent,
707 708 ident=ident)
708 709
709 710 # Await a response.
710 711 while True:
711 712 try:
712 713 ident, reply = self.session.recv(self.stdin_socket, 0)
713 714 except Exception:
714 715 self.log.warn("Invalid Message:", exc_info=True)
715 716 else:
716 717 break
717 718 try:
718 719 value = reply['content']['value']
719 720 except:
720 721 self.log.error("Got bad raw_input reply: ")
721 722 self.log.error("%s", parent)
722 723 value = ''
723 724 if value == '\x04':
724 725 # EOF
725 726 raise EOFError
726 727 return value
727 728
728 729 def _complete(self, msg):
729 730 c = msg['content']
730 731 try:
731 732 cpos = int(c['cursor_pos'])
732 733 except:
733 734 # If we don't get something that we can convert to an integer, at
734 735 # least attempt the completion guessing the cursor is at the end of
735 736 # the text, if there's any, and otherwise of the line
736 737 cpos = len(c['text'])
737 738 if cpos==0:
738 739 cpos = len(c['line'])
739 740 return self.shell.complete(c['text'], c['line'], cpos)
740 741
741 742 def _object_info(self, context):
742 743 symbol, leftover = self._symbol_from_context(context)
743 744 if symbol is not None and not leftover:
744 745 doc = getattr(symbol, '__doc__', '')
745 746 else:
746 747 doc = ''
747 748 object_info = dict(docstring = doc)
748 749 return object_info
749 750
750 751 def _symbol_from_context(self, context):
751 752 if not context:
752 753 return None, context
753 754
754 755 base_symbol_string = context[0]
755 756 symbol = self.shell.user_ns.get(base_symbol_string, None)
756 757 if symbol is None:
757 758 symbol = __builtin__.__dict__.get(base_symbol_string, None)
758 759 if symbol is None:
759 760 return None, context
760 761
761 762 context = context[1:]
762 763 for i, name in enumerate(context):
763 764 new_symbol = getattr(symbol, name, None)
764 765 if new_symbol is None:
765 766 return symbol, context[i:]
766 767 else:
767 768 symbol = new_symbol
768 769
769 770 return symbol, []
770 771
771 772 def _at_shutdown(self):
772 773 """Actions taken at shutdown by the kernel, called by python's atexit.
773 774 """
774 775 # io.rprint("Kernel at_shutdown") # dbg
775 776 if self._shutdown_message is not None:
776 777 self.session.send(self.iopub_socket, self._shutdown_message, ident=self._topic('shutdown'))
777 778 self.log.debug("%s", self._shutdown_message)
778 779 [ s.flush(zmq.POLLOUT) for s in self.shell_streams ]
779 780
780 781 #-----------------------------------------------------------------------------
781 782 # Aliases and Flags for the IPKernelApp
782 783 #-----------------------------------------------------------------------------
783 784
784 785 flags = dict(kernel_flags)
785 786 flags.update(shell_flags)
786 787
787 788 addflag = lambda *args: flags.update(boolean_flag(*args))
788 789
789 790 flags['pylab'] = (
790 791 {'IPKernelApp' : {'pylab' : 'auto'}},
791 792 """Pre-load matplotlib and numpy for interactive use with
792 793 the default matplotlib backend."""
793 794 )
794 795
795 796 aliases = dict(kernel_aliases)
796 797 aliases.update(shell_aliases)
797 798
798 799 #-----------------------------------------------------------------------------
799 800 # The IPKernelApp class
800 801 #-----------------------------------------------------------------------------
801 802
802 803 class IPKernelApp(KernelApp, InteractiveShellApp):
803 804 name = 'ipkernel'
804 805
805 806 aliases = Dict(aliases)
806 807 flags = Dict(flags)
807 808 classes = [Kernel, ZMQInteractiveShell, ProfileDir, Session]
808 809
809 810 @catch_config_error
810 811 def initialize(self, argv=None):
811 812 super(IPKernelApp, self).initialize(argv)
812 813 self.init_path()
813 814 self.init_shell()
814 815 self.init_gui_pylab()
815 816 self.init_extensions()
816 817 self.init_code()
817 818
818 819 def init_kernel(self):
819 820
820 821 shell_stream = ZMQStream(self.shell_socket)
821 822
822 823 kernel = Kernel(config=self.config, session=self.session,
823 824 shell_streams=[shell_stream],
824 825 iopub_socket=self.iopub_socket,
825 826 stdin_socket=self.stdin_socket,
826 827 log=self.log,
827 828 profile_dir=self.profile_dir,
828 829 )
829 830 self.kernel = kernel
830 831 kernel.record_ports(self.ports)
831 832 shell = kernel.shell
832 833
833 834 def init_gui_pylab(self):
834 835 """Enable GUI event loop integration, taking pylab into account."""
835 836
836 837 # Provide a wrapper for :meth:`InteractiveShellApp.init_gui_pylab`
837 838 # to ensure that any exception is printed straight to stderr.
838 839 # Normally _showtraceback associates the reply with an execution,
839 840 # which means frontends will never draw it, as this exception
840 841 # is not associated with any execute request.
841 842
842 843 shell = self.shell
843 844 _showtraceback = shell._showtraceback
844 845 try:
845 846 # replace pyerr-sending traceback with stderr
846 847 def print_tb(etype, evalue, stb):
847 848 print ("GUI event loop or pylab initialization failed",
848 849 file=io.stderr)
849 850 print (shell.InteractiveTB.stb2text(stb), file=io.stderr)
850 851 shell._showtraceback = print_tb
851 852 InteractiveShellApp.init_gui_pylab(self)
852 853 finally:
853 854 shell._showtraceback = _showtraceback
854 855
855 856 def init_shell(self):
856 857 self.shell = self.kernel.shell
857 858 self.shell.configurables.append(self)
858 859
859 860
860 861 #-----------------------------------------------------------------------------
861 862 # Kernel main and launch functions
862 863 #-----------------------------------------------------------------------------
863 864
864 865 def launch_kernel(*args, **kwargs):
865 866 """Launches a localhost IPython kernel, binding to the specified ports.
866 867
867 868 This function simply calls entry_point.base_launch_kernel with the right
868 869 first command to start an ipkernel. See base_launch_kernel for arguments.
869 870
870 871 Returns
871 872 -------
872 873 A tuple of form:
873 874 (kernel_process, shell_port, iopub_port, stdin_port, hb_port)
874 875 where kernel_process is a Popen object and the ports are integers.
875 876 """
876 877 return base_launch_kernel('from IPython.zmq.ipkernel import main; main()',
877 878 *args, **kwargs)
878 879
879 880
880 881 def embed_kernel(module=None, local_ns=None, **kwargs):
881 882 """Embed and start an IPython kernel in a given scope.
882 883
883 884 Parameters
884 885 ----------
885 886 module : ModuleType, optional
886 887 The module to load into IPython globals (default: caller)
887 888 local_ns : dict, optional
888 889 The namespace to load into IPython user namespace (default: caller)
889 890
890 891 kwargs : various, optional
891 892 Further keyword args are relayed to the KernelApp constructor,
892 893 allowing configuration of the Kernel. Will only have an effect
893 894 on the first embed_kernel call for a given process.
894 895
895 896 """
896 897 # get the app if it exists, or set it up if it doesn't
897 898 if IPKernelApp.initialized():
898 899 app = IPKernelApp.instance()
899 900 else:
900 901 app = IPKernelApp.instance(**kwargs)
901 902 app.initialize([])
902 903 # Undo unnecessary sys module mangling from init_sys_modules.
903 904 # This would not be necessary if we could prevent it
904 905 # in the first place by using a different InteractiveShell
905 906 # subclass, as in the regular embed case.
906 907 main = app.kernel.shell._orig_sys_modules_main_mod
907 908 if main is not None:
908 909 sys.modules[app.kernel.shell._orig_sys_modules_main_name] = main
909 910
910 911 # load the calling scope if not given
911 912 (caller_module, caller_locals) = extract_module_locals(1)
912 913 if module is None:
913 914 module = caller_module
914 915 if local_ns is None:
915 916 local_ns = caller_locals
916 917
917 918 app.kernel.user_module = module
918 919 app.kernel.user_ns = local_ns
919 920 app.shell.set_completer_frame()
920 921 app.start()
921 922
922 923 def main():
923 924 """Run an IPKernel as an application"""
924 925 app = IPKernelApp.instance()
925 926 app.initialize()
926 927 app.start()
927 928
928 929
929 930 if __name__ == '__main__':
930 931 main()
@@ -1,994 +1,999 b''
1 1 """Base classes to manage the interaction with a running kernel.
2 2
3 3 TODO
4 4 * Create logger to handle debugging and console messages.
5 5 """
6 6
7 7 #-----------------------------------------------------------------------------
8 8 # Copyright (C) 2008-2011 The IPython Development Team
9 9 #
10 10 # Distributed under the terms of the BSD License. The full license is in
11 11 # the file COPYING, distributed as part of this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 # Standard library imports.
19 19 import atexit
20 20 import errno
21 21 import json
22 22 from subprocess import Popen
23 23 import os
24 24 import signal
25 25 import sys
26 26 from threading import Thread
27 27 import time
28 28
29 29 # System library imports.
30 30 import zmq
31 31 # import ZMQError in top-level namespace, to avoid ugly attribute-error messages
32 32 # during garbage collection of threads at exit:
33 33 from zmq import ZMQError
34 34 from zmq.eventloop import ioloop, zmqstream
35 35
36 36 # Local imports.
37 37 from IPython.config.loader import Config
38 38 from IPython.utils.localinterfaces import LOCALHOST, LOCAL_IPS
39 39 from IPython.utils.traitlets import (
40 40 HasTraits, Any, Instance, Type, Unicode, Integer, Bool
41 41 )
42 42 from IPython.utils.py3compat import str_to_bytes
43 43 from IPython.zmq.entry_point import write_connection_file
44 44 from session import Session
45 45
46 46 #-----------------------------------------------------------------------------
47 47 # Constants and exceptions
48 48 #-----------------------------------------------------------------------------
49 49
50 50 class InvalidPortNumber(Exception):
51 51 pass
52 52
53 53 #-----------------------------------------------------------------------------
54 54 # Utility functions
55 55 #-----------------------------------------------------------------------------
56 56
57 57 # some utilities to validate message structure, these might get moved elsewhere
58 58 # if they prove to have more generic utility
59 59
60 60 def validate_string_list(lst):
61 61 """Validate that the input is a list of strings.
62 62
63 63 Raises ValueError if not."""
64 64 if not isinstance(lst, list):
65 65 raise ValueError('input %r must be a list' % lst)
66 66 for x in lst:
67 67 if not isinstance(x, basestring):
68 68 raise ValueError('element %r in list must be a string' % x)
69 69
70 70
71 71 def validate_string_dict(dct):
72 72 """Validate that the input is a dict with string keys and values.
73 73
74 74 Raises ValueError if not."""
75 75 for k,v in dct.iteritems():
76 76 if not isinstance(k, basestring):
77 77 raise ValueError('key %r in dict must be a string' % k)
78 78 if not isinstance(v, basestring):
79 79 raise ValueError('value %r in dict must be a string' % v)
80 80
81 81
82 82 #-----------------------------------------------------------------------------
83 83 # ZMQ Socket Channel classes
84 84 #-----------------------------------------------------------------------------
85 85
86 86 class ZMQSocketChannel(Thread):
87 87 """The base class for the channels that use ZMQ sockets.
88 88 """
89 89 context = None
90 90 session = None
91 91 socket = None
92 92 ioloop = None
93 93 stream = None
94 94 _address = None
95 95 _exiting = False
96 96
97 97 def __init__(self, context, session, address):
98 98 """Create a channel
99 99
100 100 Parameters
101 101 ----------
102 102 context : :class:`zmq.Context`
103 103 The ZMQ context to use.
104 104 session : :class:`session.Session`
105 105 The session to use.
106 106 address : tuple
107 107 Standard (ip, port) tuple that the kernel is listening on.
108 108 """
109 109 super(ZMQSocketChannel, self).__init__()
110 110 self.daemon = True
111 111
112 112 self.context = context
113 113 self.session = session
114 114 if address[1] == 0:
115 115 message = 'The port number for a channel cannot be 0.'
116 116 raise InvalidPortNumber(message)
117 117 self._address = address
118 118 atexit.register(self._notice_exit)
119 119
120 120 def _notice_exit(self):
121 121 self._exiting = True
122 122
123 123 def _run_loop(self):
124 124 """Run my loop, ignoring EINTR events in the poller"""
125 125 while True:
126 126 try:
127 127 self.ioloop.start()
128 128 except ZMQError as e:
129 129 if e.errno == errno.EINTR:
130 130 continue
131 131 else:
132 132 raise
133 133 except Exception:
134 134 if self._exiting:
135 135 break
136 136 else:
137 137 raise
138 138 else:
139 139 break
140 140
141 141 def stop(self):
142 142 """Stop the channel's activity.
143 143
144 144 This calls :method:`Thread.join` and returns when the thread
145 145 terminates. :class:`RuntimeError` will be raised if
146 146 :method:`self.start` is called again.
147 147 """
148 148 self.join()
149 149
150 150 @property
151 151 def address(self):
152 152 """Get the channel's address as an (ip, port) tuple.
153 153
154 154 By the default, the address is (localhost, 0), where 0 means a random
155 155 port.
156 156 """
157 157 return self._address
158 158
159 159 def _queue_send(self, msg):
160 160 """Queue a message to be sent from the IOLoop's thread.
161 161
162 162 Parameters
163 163 ----------
164 164 msg : message to send
165 165
166 166 This is threadsafe, as it uses IOLoop.add_callback to give the loop's
167 167 thread control of the action.
168 168 """
169 169 def thread_send():
170 170 self.session.send(self.stream, msg)
171 171 self.ioloop.add_callback(thread_send)
172 172
173 173 def _handle_recv(self, msg):
174 174 """callback for stream.on_recv
175 175
176 176 unpacks message, and calls handlers with it.
177 177 """
178 178 ident,smsg = self.session.feed_identities(msg)
179 179 self.call_handlers(self.session.unserialize(smsg))
180 180
181 181
182 182
183 183 class ShellSocketChannel(ZMQSocketChannel):
184 184 """The DEALER channel for issues request/replies to the kernel.
185 185 """
186 186
187 187 command_queue = None
188 188 # flag for whether execute requests should be allowed to call raw_input:
189 189 allow_stdin = True
190 190
191 191 def __init__(self, context, session, address):
192 192 super(ShellSocketChannel, self).__init__(context, session, address)
193 193 self.ioloop = ioloop.IOLoop()
194 194
195 195 def run(self):
196 196 """The thread's main activity. Call start() instead."""
197 197 self.socket = self.context.socket(zmq.DEALER)
198 198 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
199 199 self.socket.connect('tcp://%s:%i' % self.address)
200 200 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
201 201 self.stream.on_recv(self._handle_recv)
202 202 self._run_loop()
203 203 try:
204 204 self.socket.close()
205 205 except:
206 206 pass
207 207
208 208 def stop(self):
209 209 self.ioloop.stop()
210 210 super(ShellSocketChannel, self).stop()
211 211
212 212 def call_handlers(self, msg):
213 213 """This method is called in the ioloop thread when a message arrives.
214 214
215 215 Subclasses should override this method to handle incoming messages.
216 216 It is important to remember that this method is called in the thread
217 217 so that some logic must be done to ensure that the application leve
218 218 handlers are called in the application thread.
219 219 """
220 220 raise NotImplementedError('call_handlers must be defined in a subclass.')
221 221
222 def execute(self, code, silent=False,
222 def execute(self, code, silent=False, store_history=True,
223 223 user_variables=None, user_expressions=None, allow_stdin=None):
224 224 """Execute code in the kernel.
225 225
226 226 Parameters
227 227 ----------
228 228 code : str
229 229 A string of Python code.
230 230
231 231 silent : bool, optional (default False)
232 If set, the kernel will execute the code as quietly possible.
232 If set, the kernel will execute the code as quietly possible, and
233 will force store_history to be False.
234
235 store_history : bool, optional (default True)
236 If set, the kernel will store command history. This is forced
237 to be False if silent is True.
233 238
234 239 user_variables : list, optional
235 240 A list of variable names to pull from the user's namespace. They
236 241 will come back as a dict with these names as keys and their
237 242 :func:`repr` as values.
238 243
239 244 user_expressions : dict, optional
240 245 A dict with string keys and to pull from the user's
241 246 namespace. They will come back as a dict with these names as keys
242 247 and their :func:`repr` as values.
243 248
244 249 allow_stdin : bool, optional
245 250 Flag for
246 251 A dict with string keys and to pull from the user's
247 252 namespace. They will come back as a dict with these names as keys
248 253 and their :func:`repr` as values.
249 254
250 255 Returns
251 256 -------
252 257 The msg_id of the message sent.
253 258 """
254 259 if user_variables is None:
255 260 user_variables = []
256 261 if user_expressions is None:
257 262 user_expressions = {}
258 263 if allow_stdin is None:
259 264 allow_stdin = self.allow_stdin
260 265
261 266
262 267 # Don't waste network traffic if inputs are invalid
263 268 if not isinstance(code, basestring):
264 269 raise ValueError('code %r must be a string' % code)
265 270 validate_string_list(user_variables)
266 271 validate_string_dict(user_expressions)
267 272
268 273 # Create class for content/msg creation. Related to, but possibly
269 274 # not in Session.
270 content = dict(code=code, silent=silent,
275 content = dict(code=code, silent=silent, store_history=store_history,
271 276 user_variables=user_variables,
272 277 user_expressions=user_expressions,
273 278 allow_stdin=allow_stdin,
274 279 )
275 280 msg = self.session.msg('execute_request', content)
276 281 self._queue_send(msg)
277 282 return msg['header']['msg_id']
278 283
279 284 def complete(self, text, line, cursor_pos, block=None):
280 285 """Tab complete text in the kernel's namespace.
281 286
282 287 Parameters
283 288 ----------
284 289 text : str
285 290 The text to complete.
286 291 line : str
287 292 The full line of text that is the surrounding context for the
288 293 text to complete.
289 294 cursor_pos : int
290 295 The position of the cursor in the line where the completion was
291 296 requested.
292 297 block : str, optional
293 298 The full block of code in which the completion is being requested.
294 299
295 300 Returns
296 301 -------
297 302 The msg_id of the message sent.
298 303 """
299 304 content = dict(text=text, line=line, block=block, cursor_pos=cursor_pos)
300 305 msg = self.session.msg('complete_request', content)
301 306 self._queue_send(msg)
302 307 return msg['header']['msg_id']
303 308
304 309 def object_info(self, oname, detail_level=0):
305 310 """Get metadata information about an object.
306 311
307 312 Parameters
308 313 ----------
309 314 oname : str
310 315 A string specifying the object name.
311 316 detail_level : int, optional
312 317 The level of detail for the introspection (0-2)
313 318
314 319 Returns
315 320 -------
316 321 The msg_id of the message sent.
317 322 """
318 323 content = dict(oname=oname, detail_level=detail_level)
319 324 msg = self.session.msg('object_info_request', content)
320 325 self._queue_send(msg)
321 326 return msg['header']['msg_id']
322 327
323 328 def history(self, raw=True, output=False, hist_access_type='range', **kwargs):
324 329 """Get entries from the history list.
325 330
326 331 Parameters
327 332 ----------
328 333 raw : bool
329 334 If True, return the raw input.
330 335 output : bool
331 336 If True, then return the output as well.
332 337 hist_access_type : str
333 338 'range' (fill in session, start and stop params), 'tail' (fill in n)
334 339 or 'search' (fill in pattern param).
335 340
336 341 session : int
337 342 For a range request, the session from which to get lines. Session
338 343 numbers are positive integers; negative ones count back from the
339 344 current session.
340 345 start : int
341 346 The first line number of a history range.
342 347 stop : int
343 348 The final (excluded) line number of a history range.
344 349
345 350 n : int
346 351 The number of lines of history to get for a tail request.
347 352
348 353 pattern : str
349 354 The glob-syntax pattern for a search request.
350 355
351 356 Returns
352 357 -------
353 358 The msg_id of the message sent.
354 359 """
355 360 content = dict(raw=raw, output=output, hist_access_type=hist_access_type,
356 361 **kwargs)
357 362 msg = self.session.msg('history_request', content)
358 363 self._queue_send(msg)
359 364 return msg['header']['msg_id']
360 365
361 366 def shutdown(self, restart=False):
362 367 """Request an immediate kernel shutdown.
363 368
364 369 Upon receipt of the (empty) reply, client code can safely assume that
365 370 the kernel has shut down and it's safe to forcefully terminate it if
366 371 it's still alive.
367 372
368 373 The kernel will send the reply via a function registered with Python's
369 374 atexit module, ensuring it's truly done as the kernel is done with all
370 375 normal operation.
371 376 """
372 377 # Send quit message to kernel. Once we implement kernel-side setattr,
373 378 # this should probably be done that way, but for now this will do.
374 379 msg = self.session.msg('shutdown_request', {'restart':restart})
375 380 self._queue_send(msg)
376 381 return msg['header']['msg_id']
377 382
378 383
379 384
380 385 class SubSocketChannel(ZMQSocketChannel):
381 386 """The SUB channel which listens for messages that the kernel publishes.
382 387 """
383 388
384 389 def __init__(self, context, session, address):
385 390 super(SubSocketChannel, self).__init__(context, session, address)
386 391 self.ioloop = ioloop.IOLoop()
387 392
388 393 def run(self):
389 394 """The thread's main activity. Call start() instead."""
390 395 self.socket = self.context.socket(zmq.SUB)
391 396 self.socket.setsockopt(zmq.SUBSCRIBE,b'')
392 397 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
393 398 self.socket.connect('tcp://%s:%i' % self.address)
394 399 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
395 400 self.stream.on_recv(self._handle_recv)
396 401 self._run_loop()
397 402 try:
398 403 self.socket.close()
399 404 except:
400 405 pass
401 406
402 407 def stop(self):
403 408 self.ioloop.stop()
404 409 super(SubSocketChannel, self).stop()
405 410
406 411 def call_handlers(self, msg):
407 412 """This method is called in the ioloop thread when a message arrives.
408 413
409 414 Subclasses should override this method to handle incoming messages.
410 415 It is important to remember that this method is called in the thread
411 416 so that some logic must be done to ensure that the application leve
412 417 handlers are called in the application thread.
413 418 """
414 419 raise NotImplementedError('call_handlers must be defined in a subclass.')
415 420
416 421 def flush(self, timeout=1.0):
417 422 """Immediately processes all pending messages on the SUB channel.
418 423
419 424 Callers should use this method to ensure that :method:`call_handlers`
420 425 has been called for all messages that have been received on the
421 426 0MQ SUB socket of this channel.
422 427
423 428 This method is thread safe.
424 429
425 430 Parameters
426 431 ----------
427 432 timeout : float, optional
428 433 The maximum amount of time to spend flushing, in seconds. The
429 434 default is one second.
430 435 """
431 436 # We do the IOLoop callback process twice to ensure that the IOLoop
432 437 # gets to perform at least one full poll.
433 438 stop_time = time.time() + timeout
434 439 for i in xrange(2):
435 440 self._flushed = False
436 441 self.ioloop.add_callback(self._flush)
437 442 while not self._flushed and time.time() < stop_time:
438 443 time.sleep(0.01)
439 444
440 445 def _flush(self):
441 446 """Callback for :method:`self.flush`."""
442 447 self.stream.flush()
443 448 self._flushed = True
444 449
445 450
446 451 class StdInSocketChannel(ZMQSocketChannel):
447 452 """A reply channel to handle raw_input requests that the kernel makes."""
448 453
449 454 msg_queue = None
450 455
451 456 def __init__(self, context, session, address):
452 457 super(StdInSocketChannel, self).__init__(context, session, address)
453 458 self.ioloop = ioloop.IOLoop()
454 459
455 460 def run(self):
456 461 """The thread's main activity. Call start() instead."""
457 462 self.socket = self.context.socket(zmq.DEALER)
458 463 self.socket.setsockopt(zmq.IDENTITY, self.session.bsession)
459 464 self.socket.connect('tcp://%s:%i' % self.address)
460 465 self.stream = zmqstream.ZMQStream(self.socket, self.ioloop)
461 466 self.stream.on_recv(self._handle_recv)
462 467 self._run_loop()
463 468 try:
464 469 self.socket.close()
465 470 except:
466 471 pass
467 472
468 473
469 474 def stop(self):
470 475 self.ioloop.stop()
471 476 super(StdInSocketChannel, self).stop()
472 477
473 478 def call_handlers(self, msg):
474 479 """This method is called in the ioloop thread when a message arrives.
475 480
476 481 Subclasses should override this method to handle incoming messages.
477 482 It is important to remember that this method is called in the thread
478 483 so that some logic must be done to ensure that the application leve
479 484 handlers are called in the application thread.
480 485 """
481 486 raise NotImplementedError('call_handlers must be defined in a subclass.')
482 487
483 488 def input(self, string):
484 489 """Send a string of raw input to the kernel."""
485 490 content = dict(value=string)
486 491 msg = self.session.msg('input_reply', content)
487 492 self._queue_send(msg)
488 493
489 494
490 495 class HBSocketChannel(ZMQSocketChannel):
491 496 """The heartbeat channel which monitors the kernel heartbeat.
492 497
493 498 Note that the heartbeat channel is paused by default. As long as you start
494 499 this channel, the kernel manager will ensure that it is paused and un-paused
495 500 as appropriate.
496 501 """
497 502
498 503 time_to_dead = 3.0
499 504 socket = None
500 505 poller = None
501 506 _running = None
502 507 _pause = None
503 508 _beating = None
504 509
505 510 def __init__(self, context, session, address):
506 511 super(HBSocketChannel, self).__init__(context, session, address)
507 512 self._running = False
508 513 self._pause =True
509 514 self.poller = zmq.Poller()
510 515
511 516 def _create_socket(self):
512 517 if self.socket is not None:
513 518 # close previous socket, before opening a new one
514 519 self.poller.unregister(self.socket)
515 520 self.socket.close()
516 521 self.socket = self.context.socket(zmq.REQ)
517 522 self.socket.setsockopt(zmq.LINGER, 0)
518 523 self.socket.connect('tcp://%s:%i' % self.address)
519 524
520 525 self.poller.register(self.socket, zmq.POLLIN)
521 526
522 527 def _poll(self, start_time):
523 528 """poll for heartbeat replies until we reach self.time_to_dead
524 529
525 530 Ignores interrupts, and returns the result of poll(), which
526 531 will be an empty list if no messages arrived before the timeout,
527 532 or the event tuple if there is a message to receive.
528 533 """
529 534
530 535 until_dead = self.time_to_dead - (time.time() - start_time)
531 536 # ensure poll at least once
532 537 until_dead = max(until_dead, 1e-3)
533 538 events = []
534 539 while True:
535 540 try:
536 541 events = self.poller.poll(1000 * until_dead)
537 542 except ZMQError as e:
538 543 if e.errno == errno.EINTR:
539 544 # ignore interrupts during heartbeat
540 545 # this may never actually happen
541 546 until_dead = self.time_to_dead - (time.time() - start_time)
542 547 until_dead = max(until_dead, 1e-3)
543 548 pass
544 549 else:
545 550 raise
546 551 except Exception:
547 552 if self._exiting:
548 553 break
549 554 else:
550 555 raise
551 556 else:
552 557 break
553 558 return events
554 559
555 560 def run(self):
556 561 """The thread's main activity. Call start() instead."""
557 562 self._create_socket()
558 563 self._running = True
559 564 self._beating = True
560 565
561 566 while self._running:
562 567 if self._pause:
563 568 # just sleep, and skip the rest of the loop
564 569 time.sleep(self.time_to_dead)
565 570 continue
566 571
567 572 since_last_heartbeat = 0.0
568 573 # io.rprint('Ping from HB channel') # dbg
569 574 # no need to catch EFSM here, because the previous event was
570 575 # either a recv or connect, which cannot be followed by EFSM
571 576 self.socket.send(b'ping')
572 577 request_time = time.time()
573 578 ready = self._poll(request_time)
574 579 if ready:
575 580 self._beating = True
576 581 # the poll above guarantees we have something to recv
577 582 self.socket.recv()
578 583 # sleep the remainder of the cycle
579 584 remainder = self.time_to_dead - (time.time() - request_time)
580 585 if remainder > 0:
581 586 time.sleep(remainder)
582 587 continue
583 588 else:
584 589 # nothing was received within the time limit, signal heart failure
585 590 self._beating = False
586 591 since_last_heartbeat = time.time() - request_time
587 592 self.call_handlers(since_last_heartbeat)
588 593 # and close/reopen the socket, because the REQ/REP cycle has been broken
589 594 self._create_socket()
590 595 continue
591 596 try:
592 597 self.socket.close()
593 598 except:
594 599 pass
595 600
596 601 def pause(self):
597 602 """Pause the heartbeat."""
598 603 self._pause = True
599 604
600 605 def unpause(self):
601 606 """Unpause the heartbeat."""
602 607 self._pause = False
603 608
604 609 def is_beating(self):
605 610 """Is the heartbeat running and responsive (and not paused)."""
606 611 if self.is_alive() and not self._pause and self._beating:
607 612 return True
608 613 else:
609 614 return False
610 615
611 616 def stop(self):
612 617 self._running = False
613 618 super(HBSocketChannel, self).stop()
614 619
615 620 def call_handlers(self, since_last_heartbeat):
616 621 """This method is called in the ioloop thread when a message arrives.
617 622
618 623 Subclasses should override this method to handle incoming messages.
619 624 It is important to remember that this method is called in the thread
620 625 so that some logic must be done to ensure that the application level
621 626 handlers are called in the application thread.
622 627 """
623 628 raise NotImplementedError('call_handlers must be defined in a subclass.')
624 629
625 630
626 631 #-----------------------------------------------------------------------------
627 632 # Main kernel manager class
628 633 #-----------------------------------------------------------------------------
629 634
630 635 class KernelManager(HasTraits):
631 636 """ Manages a kernel for a frontend.
632 637
633 638 The SUB channel is for the frontend to receive messages published by the
634 639 kernel.
635 640
636 641 The REQ channel is for the frontend to make requests of the kernel.
637 642
638 643 The REP channel is for the kernel to request stdin (raw_input) from the
639 644 frontend.
640 645 """
641 646 # config object for passing to child configurables
642 647 config = Instance(Config)
643 648
644 649 # The PyZMQ Context to use for communication with the kernel.
645 650 context = Instance(zmq.Context)
646 651 def _context_default(self):
647 652 return zmq.Context.instance()
648 653
649 654 # The Session to use for communication with the kernel.
650 655 session = Instance(Session)
651 656
652 657 # The kernel process with which the KernelManager is communicating.
653 658 kernel = Instance(Popen)
654 659
655 660 # The addresses for the communication channels.
656 661 connection_file = Unicode('')
657 662 ip = Unicode(LOCALHOST)
658 663 def _ip_changed(self, name, old, new):
659 664 if new == '*':
660 665 self.ip = '0.0.0.0'
661 666 shell_port = Integer(0)
662 667 iopub_port = Integer(0)
663 668 stdin_port = Integer(0)
664 669 hb_port = Integer(0)
665 670
666 671 # The classes to use for the various channels.
667 672 shell_channel_class = Type(ShellSocketChannel)
668 673 sub_channel_class = Type(SubSocketChannel)
669 674 stdin_channel_class = Type(StdInSocketChannel)
670 675 hb_channel_class = Type(HBSocketChannel)
671 676
672 677 # Protected traits.
673 678 _launch_args = Any
674 679 _shell_channel = Any
675 680 _sub_channel = Any
676 681 _stdin_channel = Any
677 682 _hb_channel = Any
678 683 _connection_file_written=Bool(False)
679 684
680 685 def __init__(self, **kwargs):
681 686 super(KernelManager, self).__init__(**kwargs)
682 687 if self.session is None:
683 688 self.session = Session(config=self.config)
684 689
685 690 def __del__(self):
686 691 self.cleanup_connection_file()
687 692
688 693
689 694 #--------------------------------------------------------------------------
690 695 # Channel management methods:
691 696 #--------------------------------------------------------------------------
692 697
693 698 def start_channels(self, shell=True, sub=True, stdin=True, hb=True):
694 699 """Starts the channels for this kernel.
695 700
696 701 This will create the channels if they do not exist and then start
697 702 them. If port numbers of 0 are being used (random ports) then you
698 703 must first call :method:`start_kernel`. If the channels have been
699 704 stopped and you call this, :class:`RuntimeError` will be raised.
700 705 """
701 706 if shell:
702 707 self.shell_channel.start()
703 708 if sub:
704 709 self.sub_channel.start()
705 710 if stdin:
706 711 self.stdin_channel.start()
707 712 self.shell_channel.allow_stdin = True
708 713 else:
709 714 self.shell_channel.allow_stdin = False
710 715 if hb:
711 716 self.hb_channel.start()
712 717
713 718 def stop_channels(self):
714 719 """Stops all the running channels for this kernel.
715 720 """
716 721 if self.shell_channel.is_alive():
717 722 self.shell_channel.stop()
718 723 if self.sub_channel.is_alive():
719 724 self.sub_channel.stop()
720 725 if self.stdin_channel.is_alive():
721 726 self.stdin_channel.stop()
722 727 if self.hb_channel.is_alive():
723 728 self.hb_channel.stop()
724 729
725 730 @property
726 731 def channels_running(self):
727 732 """Are any of the channels created and running?"""
728 733 return (self.shell_channel.is_alive() or self.sub_channel.is_alive() or
729 734 self.stdin_channel.is_alive() or self.hb_channel.is_alive())
730 735
731 736 #--------------------------------------------------------------------------
732 737 # Kernel process management methods:
733 738 #--------------------------------------------------------------------------
734 739
735 740 def cleanup_connection_file(self):
736 741 """cleanup connection file *if we wrote it*
737 742
738 743 Will not raise if the connection file was already removed somehow.
739 744 """
740 745 if self._connection_file_written:
741 746 # cleanup connection files on full shutdown of kernel we started
742 747 self._connection_file_written = False
743 748 try:
744 749 os.remove(self.connection_file)
745 750 except OSError:
746 751 pass
747 752
748 753 def load_connection_file(self):
749 754 """load connection info from JSON dict in self.connection_file"""
750 755 with open(self.connection_file) as f:
751 756 cfg = json.loads(f.read())
752 757
753 758 self.ip = cfg['ip']
754 759 self.shell_port = cfg['shell_port']
755 760 self.stdin_port = cfg['stdin_port']
756 761 self.iopub_port = cfg['iopub_port']
757 762 self.hb_port = cfg['hb_port']
758 763 self.session.key = str_to_bytes(cfg['key'])
759 764
760 765 def write_connection_file(self):
761 766 """write connection info to JSON dict in self.connection_file"""
762 767 if self._connection_file_written:
763 768 return
764 769 self.connection_file,cfg = write_connection_file(self.connection_file,
765 770 ip=self.ip, key=self.session.key,
766 771 stdin_port=self.stdin_port, iopub_port=self.iopub_port,
767 772 shell_port=self.shell_port, hb_port=self.hb_port)
768 773 # write_connection_file also sets default ports:
769 774 self.shell_port = cfg['shell_port']
770 775 self.stdin_port = cfg['stdin_port']
771 776 self.iopub_port = cfg['iopub_port']
772 777 self.hb_port = cfg['hb_port']
773 778
774 779 self._connection_file_written = True
775 780
776 781 def start_kernel(self, **kw):
777 782 """Starts a kernel process and configures the manager to use it.
778 783
779 784 If random ports (port=0) are being used, this method must be called
780 785 before the channels are created.
781 786
782 787 Parameters:
783 788 -----------
784 789 launcher : callable, optional (default None)
785 790 A custom function for launching the kernel process (generally a
786 791 wrapper around ``entry_point.base_launch_kernel``). In most cases,
787 792 it should not be necessary to use this parameter.
788 793
789 794 **kw : optional
790 795 See respective options for IPython and Python kernels.
791 796 """
792 797 if self.ip not in LOCAL_IPS:
793 798 raise RuntimeError("Can only launch a kernel on a local interface. "
794 799 "Make sure that the '*_address' attributes are "
795 800 "configured properly. "
796 801 "Currently valid addresses are: %s"%LOCAL_IPS
797 802 )
798 803
799 804 # write connection file / get default ports
800 805 self.write_connection_file()
801 806
802 807 self._launch_args = kw.copy()
803 808 launch_kernel = kw.pop('launcher', None)
804 809 if launch_kernel is None:
805 810 from ipkernel import launch_kernel
806 811 self.kernel = launch_kernel(fname=self.connection_file, **kw)
807 812
808 813 def shutdown_kernel(self, restart=False):
809 814 """ Attempts to the stop the kernel process cleanly. If the kernel
810 815 cannot be stopped, it is killed, if possible.
811 816 """
812 817 # FIXME: Shutdown does not work on Windows due to ZMQ errors!
813 818 if sys.platform == 'win32':
814 819 self.kill_kernel()
815 820 return
816 821
817 822 # Pause the heart beat channel if it exists.
818 823 if self._hb_channel is not None:
819 824 self._hb_channel.pause()
820 825
821 826 # Don't send any additional kernel kill messages immediately, to give
822 827 # the kernel a chance to properly execute shutdown actions. Wait for at
823 828 # most 1s, checking every 0.1s.
824 829 self.shell_channel.shutdown(restart=restart)
825 830 for i in range(10):
826 831 if self.is_alive:
827 832 time.sleep(0.1)
828 833 else:
829 834 break
830 835 else:
831 836 # OK, we've waited long enough.
832 837 if self.has_kernel:
833 838 self.kill_kernel()
834 839
835 840 if not restart and self._connection_file_written:
836 841 # cleanup connection files on full shutdown of kernel we started
837 842 self._connection_file_written = False
838 843 try:
839 844 os.remove(self.connection_file)
840 845 except IOError:
841 846 pass
842 847
843 848 def restart_kernel(self, now=False, **kw):
844 849 """Restarts a kernel with the arguments that were used to launch it.
845 850
846 851 If the old kernel was launched with random ports, the same ports will be
847 852 used for the new kernel.
848 853
849 854 Parameters
850 855 ----------
851 856 now : bool, optional
852 857 If True, the kernel is forcefully restarted *immediately*, without
853 858 having a chance to do any cleanup action. Otherwise the kernel is
854 859 given 1s to clean up before a forceful restart is issued.
855 860
856 861 In all cases the kernel is restarted, the only difference is whether
857 862 it is given a chance to perform a clean shutdown or not.
858 863
859 864 **kw : optional
860 865 Any options specified here will replace those used to launch the
861 866 kernel.
862 867 """
863 868 if self._launch_args is None:
864 869 raise RuntimeError("Cannot restart the kernel. "
865 870 "No previous call to 'start_kernel'.")
866 871 else:
867 872 # Stop currently running kernel.
868 873 if self.has_kernel:
869 874 if now:
870 875 self.kill_kernel()
871 876 else:
872 877 self.shutdown_kernel(restart=True)
873 878
874 879 # Start new kernel.
875 880 self._launch_args.update(kw)
876 881 self.start_kernel(**self._launch_args)
877 882
878 883 # FIXME: Messages get dropped in Windows due to probable ZMQ bug
879 884 # unless there is some delay here.
880 885 if sys.platform == 'win32':
881 886 time.sleep(0.2)
882 887
883 888 @property
884 889 def has_kernel(self):
885 890 """Returns whether a kernel process has been specified for the kernel
886 891 manager.
887 892 """
888 893 return self.kernel is not None
889 894
890 895 def kill_kernel(self):
891 896 """ Kill the running kernel. """
892 897 if self.has_kernel:
893 898 # Pause the heart beat channel if it exists.
894 899 if self._hb_channel is not None:
895 900 self._hb_channel.pause()
896 901
897 902 # Attempt to kill the kernel.
898 903 try:
899 904 self.kernel.kill()
900 905 except OSError as e:
901 906 # In Windows, we will get an Access Denied error if the process
902 907 # has already terminated. Ignore it.
903 908 if sys.platform == 'win32':
904 909 if e.winerror != 5:
905 910 raise
906 911 # On Unix, we may get an ESRCH error if the process has already
907 912 # terminated. Ignore it.
908 913 else:
909 914 from errno import ESRCH
910 915 if e.errno != ESRCH:
911 916 raise
912 917 self.kernel = None
913 918 else:
914 919 raise RuntimeError("Cannot kill kernel. No kernel is running!")
915 920
916 921 def interrupt_kernel(self):
917 922 """ Interrupts the kernel. Unlike ``signal_kernel``, this operation is
918 923 well supported on all platforms.
919 924 """
920 925 if self.has_kernel:
921 926 if sys.platform == 'win32':
922 927 from parentpoller import ParentPollerWindows as Poller
923 928 Poller.send_interrupt(self.kernel.win32_interrupt_event)
924 929 else:
925 930 self.kernel.send_signal(signal.SIGINT)
926 931 else:
927 932 raise RuntimeError("Cannot interrupt kernel. No kernel is running!")
928 933
929 934 def signal_kernel(self, signum):
930 935 """ Sends a signal to the kernel. Note that since only SIGTERM is
931 936 supported on Windows, this function is only useful on Unix systems.
932 937 """
933 938 if self.has_kernel:
934 939 self.kernel.send_signal(signum)
935 940 else:
936 941 raise RuntimeError("Cannot signal kernel. No kernel is running!")
937 942
938 943 @property
939 944 def is_alive(self):
940 945 """Is the kernel process still running?"""
941 946 if self.has_kernel:
942 947 if self.kernel.poll() is None:
943 948 return True
944 949 else:
945 950 return False
946 951 elif self._hb_channel is not None:
947 952 # We didn't start the kernel with this KernelManager so we
948 953 # use the heartbeat.
949 954 return self._hb_channel.is_beating()
950 955 else:
951 956 # no heartbeat and not local, we can't tell if it's running,
952 957 # so naively return True
953 958 return True
954 959
955 960 #--------------------------------------------------------------------------
956 961 # Channels used for communication with the kernel:
957 962 #--------------------------------------------------------------------------
958 963
959 964 @property
960 965 def shell_channel(self):
961 966 """Get the REQ socket channel object to make requests of the kernel."""
962 967 if self._shell_channel is None:
963 968 self._shell_channel = self.shell_channel_class(self.context,
964 969 self.session,
965 970 (self.ip, self.shell_port))
966 971 return self._shell_channel
967 972
968 973 @property
969 974 def sub_channel(self):
970 975 """Get the SUB socket channel object."""
971 976 if self._sub_channel is None:
972 977 self._sub_channel = self.sub_channel_class(self.context,
973 978 self.session,
974 979 (self.ip, self.iopub_port))
975 980 return self._sub_channel
976 981
977 982 @property
978 983 def stdin_channel(self):
979 984 """Get the REP socket channel object to handle stdin (raw_input)."""
980 985 if self._stdin_channel is None:
981 986 self._stdin_channel = self.stdin_channel_class(self.context,
982 987 self.session,
983 988 (self.ip, self.stdin_port))
984 989 return self._stdin_channel
985 990
986 991 @property
987 992 def hb_channel(self):
988 993 """Get the heartbeat socket channel object to check that the
989 994 kernel is alive."""
990 995 if self._hb_channel is None:
991 996 self._hb_channel = self.hb_channel_class(self.context,
992 997 self.session,
993 998 (self.ip, self.hb_port))
994 999 return self._hb_channel
@@ -1,997 +1,1002 b''
1 1 .. _messaging:
2 2
3 3 ======================
4 4 Messaging in IPython
5 5 ======================
6 6
7 7
8 8 Introduction
9 9 ============
10 10
11 11 This document explains the basic communications design and messaging
12 12 specification for how the various IPython objects interact over a network
13 13 transport. The current implementation uses the ZeroMQ_ library for messaging
14 14 within and between hosts.
15 15
16 16 .. Note::
17 17
18 18 This document should be considered the authoritative description of the
19 19 IPython messaging protocol, and all developers are strongly encouraged to
20 20 keep it updated as the implementation evolves, so that we have a single
21 21 common reference for all protocol details.
22 22
23 23 The basic design is explained in the following diagram:
24 24
25 25 .. image:: figs/frontend-kernel.png
26 26 :width: 450px
27 27 :alt: IPython kernel/frontend messaging architecture.
28 28 :align: center
29 29 :target: ../_images/frontend-kernel.png
30 30
31 31 A single kernel can be simultaneously connected to one or more frontends. The
32 32 kernel has three sockets that serve the following functions:
33 33
34 34 1. stdin: this ROUTER socket is connected to all frontends, and it allows
35 35 the kernel to request input from the active frontend when :func:`raw_input` is called.
36 36 The frontend that executed the code has a DEALER socket that acts as a 'virtual keyboard'
37 37 for the kernel while this communication is happening (illustrated in the
38 38 figure by the black outline around the central keyboard). In practice,
39 39 frontends may display such kernel requests using a special input widget or
40 40 otherwise indicating that the user is to type input for the kernel instead
41 41 of normal commands in the frontend.
42 42
43 43 2. Shell: this single ROUTER socket allows multiple incoming connections from
44 44 frontends, and this is the socket where requests for code execution, object
45 45 information, prompts, etc. are made to the kernel by any frontend. The
46 46 communication on this socket is a sequence of request/reply actions from
47 47 each frontend and the kernel.
48 48
49 49 3. IOPub: this socket is the 'broadcast channel' where the kernel publishes all
50 50 side effects (stdout, stderr, etc.) as well as the requests coming from any
51 51 client over the shell socket and its own requests on the stdin socket. There
52 52 are a number of actions in Python which generate side effects: :func:`print`
53 53 writes to ``sys.stdout``, errors generate tracebacks, etc. Additionally, in
54 54 a multi-client scenario, we want all frontends to be able to know what each
55 55 other has sent to the kernel (this can be useful in collaborative scenarios,
56 56 for example). This socket allows both side effects and the information
57 57 about communications taking place with one client over the shell channel
58 58 to be made available to all clients in a uniform manner.
59 59
60 60 All messages are tagged with enough information (details below) for clients
61 61 to know which messages come from their own interaction with the kernel and
62 62 which ones are from other clients, so they can display each type
63 63 appropriately.
64 64
65 65 The actual format of the messages allowed on each of these channels is
66 66 specified below. Messages are dicts of dicts with string keys and values that
67 67 are reasonably representable in JSON. Our current implementation uses JSON
68 68 explicitly as its message format, but this shouldn't be considered a permanent
69 69 feature. As we've discovered that JSON has non-trivial performance issues due
70 70 to excessive copying, we may in the future move to a pure pickle-based raw
71 71 message format. However, it should be possible to easily convert from the raw
72 72 objects to JSON, since we may have non-python clients (e.g. a web frontend).
73 73 As long as it's easy to make a JSON version of the objects that is a faithful
74 74 representation of all the data, we can communicate with such clients.
75 75
76 76 .. Note::
77 77
78 78 Not all of these have yet been fully fleshed out, but the key ones are, see
79 79 kernel and frontend files for actual implementation details.
80 80
81 81 General Message Format
82 82 ======================
83 83
84 84 A message is defined by the following four-dictionary structure::
85 85
86 86 {
87 87 # The message header contains a pair of unique identifiers for the
88 88 # originating session and the actual message id, in addition to the
89 89 # username for the process that generated the message. This is useful in
90 90 # collaborative settings where multiple users may be interacting with the
91 91 # same kernel simultaneously, so that frontends can label the various
92 92 # messages in a meaningful way.
93 93 'header' : {
94 94 'msg_id' : uuid,
95 95 'username' : str,
96 96 'session' : uuid
97 97 # All recognized message type strings are listed below.
98 98 'msg_type' : str,
99 99 },
100 100
101 101 # In a chain of messages, the header from the parent is copied so that
102 102 # clients can track where messages come from.
103 103 'parent_header' : dict,
104 104
105 105 # The actual content of the message must be a dict, whose structure
106 106 # depends on the message type.
107 107 'content' : dict,
108 108
109 109 # Any metadata associated with the message.
110 110 'metadata' : dict,
111 111 }
112 112
113 113
114 114 Python functional API
115 115 =====================
116 116
117 117 As messages are dicts, they map naturally to a ``func(**kw)`` call form. We
118 118 should develop, at a few key points, functional forms of all the requests that
119 119 take arguments in this manner and automatically construct the necessary dict
120 120 for sending.
121 121
122 122 In addition, the Python implementation of the message specification extends
123 123 messages upon deserialization to the following form for convenience::
124 124
125 125 {
126 126 'header' : dict,
127 127 # The msg's unique identifier and type are always stored in the header,
128 128 # but the Python implementation copies them to the top level.
129 129 'msg_id' : uuid,
130 130 'msg_type' : str,
131 131 'parent_header' : dict,
132 132 'content' : dict,
133 133 'metadata' : dict,
134 134 }
135 135
136 136 All messages sent to or received by any IPython process should have this
137 137 extended structure.
138 138
139 139
140 140 Messages on the shell ROUTER/DEALER sockets
141 141 ===========================================
142 142
143 143 .. _execute:
144 144
145 145 Execute
146 146 -------
147 147
148 148 This message type is used by frontends to ask the kernel to execute code on
149 149 behalf of the user, in a namespace reserved to the user's variables (and thus
150 150 separate from the kernel's own internal code and variables).
151 151
152 152 Message type: ``execute_request``::
153 153
154 154 content = {
155 155 # Source code to be executed by the kernel, one or more lines.
156 156 'code' : str,
157 157
158 158 # A boolean flag which, if True, signals the kernel to execute
159 159 # this code as quietly as possible. This means that the kernel
160 160 # will compile the code with 'exec' instead of 'single' (so
161 # sys.displayhook will not fire), and will *not*:
161 # sys.displayhook will not fire), forces store_history to be False,
162 # and will *not*:
162 163 # - broadcast exceptions on the PUB socket
163 164 # - do any logging
164 # - populate any history
165 165 #
166 166 # The default is False.
167 167 'silent' : bool,
168 168
169 # A boolean flag which, if True, signals the kernel to populate history
170 # The default is True if silent is False. If silent is True, store_history
171 # is forced to be False.
172 'store_history' : bool,
173
169 174 # A list of variable names from the user's namespace to be retrieved. What
170 175 # returns is a JSON string of the variable's repr(), not a python object.
171 176 'user_variables' : list,
172 177
173 178 # Similarly, a dict mapping names to expressions to be evaluated in the
174 179 # user's dict.
175 180 'user_expressions' : dict,
176 181
177 182 # Some frontends (e.g. the Notebook) do not support stdin requests. If
178 183 # raw_input is called from code executed from such a frontend, a
179 184 # StdinNotImplementedError will be raised.
180 185 'allow_stdin' : True,
181 186
182 187 }
183 188
184 189 The ``code`` field contains a single string (possibly multiline). The kernel
185 190 is responsible for splitting this into one or more independent execution blocks
186 191 and deciding whether to compile these in 'single' or 'exec' mode (see below for
187 192 detailed execution semantics).
188 193
189 194 The ``user_`` fields deserve a detailed explanation. In the past, IPython had
190 195 the notion of a prompt string that allowed arbitrary code to be evaluated, and
191 196 this was put to good use by many in creating prompts that displayed system
192 197 status, path information, and even more esoteric uses like remote instrument
193 198 status aqcuired over the network. But now that IPython has a clean separation
194 199 between the kernel and the clients, the kernel has no prompt knowledge; prompts
195 200 are a frontend-side feature, and it should be even possible for different
196 201 frontends to display different prompts while interacting with the same kernel.
197 202
198 203 The kernel now provides the ability to retrieve data from the user's namespace
199 204 after the execution of the main ``code``, thanks to two fields in the
200 205 ``execute_request`` message:
201 206
202 207 - ``user_variables``: If only variables from the user's namespace are needed, a
203 208 list of variable names can be passed and a dict with these names as keys and
204 209 their :func:`repr()` as values will be returned.
205 210
206 211 - ``user_expressions``: For more complex expressions that require function
207 212 evaluations, a dict can be provided with string keys and arbitrary python
208 213 expressions as values. The return message will contain also a dict with the
209 214 same keys and the :func:`repr()` of the evaluated expressions as value.
210 215
211 216 With this information, frontends can display any status information they wish
212 217 in the form that best suits each frontend (a status line, a popup, inline for a
213 218 terminal, etc).
214 219
215 220 .. Note::
216 221
217 222 In order to obtain the current execution counter for the purposes of
218 223 displaying input prompts, frontends simply make an execution request with an
219 224 empty code string and ``silent=True``.
220 225
221 226 Execution semantics
222 227 ~~~~~~~~~~~~~~~~~~~
223 228
224 229 When the silent flag is false, the execution of use code consists of the
225 230 following phases (in silent mode, only the ``code`` field is executed):
226 231
227 232 1. Run the ``pre_runcode_hook``.
228 233
229 234 2. Execute the ``code`` field, see below for details.
230 235
231 236 3. If #2 succeeds, compute ``user_variables`` and ``user_expressions`` are
232 237 computed. This ensures that any error in the latter don't harm the main
233 238 code execution.
234 239
235 240 4. Call any method registered with :meth:`register_post_execute`.
236 241
237 242 .. warning::
238 243
239 244 The API for running code before/after the main code block is likely to
240 245 change soon. Both the ``pre_runcode_hook`` and the
241 246 :meth:`register_post_execute` are susceptible to modification, as we find a
242 247 consistent model for both.
243 248
244 249 To understand how the ``code`` field is executed, one must know that Python
245 250 code can be compiled in one of three modes (controlled by the ``mode`` argument
246 251 to the :func:`compile` builtin):
247 252
248 253 *single*
249 254 Valid for a single interactive statement (though the source can contain
250 255 multiple lines, such as a for loop). When compiled in this mode, the
251 256 generated bytecode contains special instructions that trigger the calling of
252 257 :func:`sys.displayhook` for any expression in the block that returns a value.
253 258 This means that a single statement can actually produce multiple calls to
254 259 :func:`sys.displayhook`, if for example it contains a loop where each
255 260 iteration computes an unassigned expression would generate 10 calls::
256 261
257 262 for i in range(10):
258 263 i**2
259 264
260 265 *exec*
261 266 An arbitrary amount of source code, this is how modules are compiled.
262 267 :func:`sys.displayhook` is *never* implicitly called.
263 268
264 269 *eval*
265 270 A single expression that returns a value. :func:`sys.displayhook` is *never*
266 271 implicitly called.
267 272
268 273
269 274 The ``code`` field is split into individual blocks each of which is valid for
270 275 execution in 'single' mode, and then:
271 276
272 277 - If there is only a single block: it is executed in 'single' mode.
273 278
274 279 - If there is more than one block:
275 280
276 281 * if the last one is a single line long, run all but the last in 'exec' mode
277 282 and the very last one in 'single' mode. This makes it easy to type simple
278 283 expressions at the end to see computed values.
279 284
280 285 * if the last one is no more than two lines long, run all but the last in
281 286 'exec' mode and the very last one in 'single' mode. This makes it easy to
282 287 type simple expressions at the end to see computed values. - otherwise
283 288 (last one is also multiline), run all in 'exec' mode
284 289
285 290 * otherwise (last one is also multiline), run all in 'exec' mode as a single
286 291 unit.
287 292
288 293 Any error in retrieving the ``user_variables`` or evaluating the
289 294 ``user_expressions`` will result in a simple error message in the return fields
290 295 of the form::
291 296
292 297 [ERROR] ExceptionType: Exception message
293 298
294 299 The user can simply send the same variable name or expression for evaluation to
295 300 see a regular traceback.
296 301
297 302 Errors in any registered post_execute functions are also reported similarly,
298 303 and the failing function is removed from the post_execution set so that it does
299 304 not continue triggering failures.
300 305
301 306 Upon completion of the execution request, the kernel *always* sends a reply,
302 307 with a status code indicating what happened and additional data depending on
303 308 the outcome. See :ref:`below <execution_results>` for the possible return
304 309 codes and associated data.
305 310
306 311
307 312 Execution counter (old prompt number)
308 313 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
309 314
310 315 The kernel has a single, monotonically increasing counter of all execution
311 requests that are made with ``silent=False``. This counter is used to populate
316 requests that are made with ``store_history=True``. This counter is used to populate
312 317 the ``In[n]``, ``Out[n]`` and ``_n`` variables, so clients will likely want to
313 318 display it in some form to the user, which will typically (but not necessarily)
314 319 be done in the prompts. The value of this counter will be returned as the
315 320 ``execution_count`` field of all ``execute_reply`` messages.
316 321
317 322 .. _execution_results:
318 323
319 324 Execution results
320 325 ~~~~~~~~~~~~~~~~~
321 326
322 327 Message type: ``execute_reply``::
323 328
324 329 content = {
325 330 # One of: 'ok' OR 'error' OR 'abort'
326 331 'status' : str,
327 332
328 # The global kernel counter that increases by one with each non-silent
329 # executed request. This will typically be used by clients to display
330 # prompt numbers to the user. If the request was a silent one, this will
333 # The global kernel counter that increases by one with each request that
334 # stores history. This will typically be used by clients to display
335 # prompt numbers to the user. If the request did not store history, this will
331 336 # be the current value of the counter in the kernel.
332 337 'execution_count' : int,
333 338 }
334 339
335 340 When status is 'ok', the following extra fields are present::
336 341
337 342 {
338 343 # 'payload' will be a list of payload dicts.
339 344 # Each execution payload is a dict with string keys that may have been
340 345 # produced by the code being executed. It is retrieved by the kernel at
341 346 # the end of the execution and sent back to the front end, which can take
342 347 # action on it as needed. See main text for further details.
343 348 'payload' : list(dict),
344 349
345 350 # Results for the user_variables and user_expressions.
346 351 'user_variables' : dict,
347 352 'user_expressions' : dict,
348 353 }
349 354
350 355 .. admonition:: Execution payloads
351 356
352 357 The notion of an 'execution payload' is different from a return value of a
353 358 given set of code, which normally is just displayed on the pyout stream
354 359 through the PUB socket. The idea of a payload is to allow special types of
355 360 code, typically magics, to populate a data container in the IPython kernel
356 361 that will be shipped back to the caller via this channel. The kernel
357 362 has an API for this in the PayloadManager::
358 363
359 364 ip.payload_manager.write_payload(payload_dict)
360 365
361 366 which appends a dictionary to the list of payloads.
362 367
363 368
364 369 When status is 'error', the following extra fields are present::
365 370
366 371 {
367 372 'ename' : str, # Exception name, as a string
368 373 'evalue' : str, # Exception value, as a string
369 374
370 375 # The traceback will contain a list of frames, represented each as a
371 376 # string. For now we'll stick to the existing design of ultraTB, which
372 377 # controls exception level of detail statefully. But eventually we'll
373 378 # want to grow into a model where more information is collected and
374 379 # packed into the traceback object, with clients deciding how little or
375 380 # how much of it to unpack. But for now, let's start with a simple list
376 381 # of strings, since that requires only minimal changes to ultratb as
377 382 # written.
378 383 'traceback' : list,
379 384 }
380 385
381 386
382 387 When status is 'abort', there are for now no additional data fields. This
383 388 happens when the kernel was interrupted by a signal.
384 389
385 390 Kernel attribute access
386 391 -----------------------
387 392
388 393 .. warning::
389 394
390 395 This part of the messaging spec is not actually implemented in the kernel
391 396 yet.
392 397
393 398 While this protocol does not specify full RPC access to arbitrary methods of
394 399 the kernel object, the kernel does allow read (and in some cases write) access
395 400 to certain attributes.
396 401
397 402 The policy for which attributes can be read is: any attribute of the kernel, or
398 403 its sub-objects, that belongs to a :class:`Configurable` object and has been
399 404 declared at the class-level with Traits validation, is in principle accessible
400 405 as long as its name does not begin with a leading underscore. The attribute
401 406 itself will have metadata indicating whether it allows remote read and/or write
402 407 access. The message spec follows for attribute read and write requests.
403 408
404 409 Message type: ``getattr_request``::
405 410
406 411 content = {
407 412 # The (possibly dotted) name of the attribute
408 413 'name' : str,
409 414 }
410 415
411 416 When a ``getattr_request`` fails, there are two possible error types:
412 417
413 418 - AttributeError: this type of error was raised when trying to access the
414 419 given name by the kernel itself. This means that the attribute likely
415 420 doesn't exist.
416 421
417 422 - AccessError: the attribute exists but its value is not readable remotely.
418 423
419 424
420 425 Message type: ``getattr_reply``::
421 426
422 427 content = {
423 428 # One of ['ok', 'AttributeError', 'AccessError'].
424 429 'status' : str,
425 430 # If status is 'ok', a JSON object.
426 431 'value' : object,
427 432 }
428 433
429 434 Message type: ``setattr_request``::
430 435
431 436 content = {
432 437 # The (possibly dotted) name of the attribute
433 438 'name' : str,
434 439
435 440 # A JSON-encoded object, that will be validated by the Traits
436 441 # information in the kernel
437 442 'value' : object,
438 443 }
439 444
440 445 When a ``setattr_request`` fails, there are also two possible error types with
441 446 similar meanings as those of the ``getattr_request`` case, but for writing.
442 447
443 448 Message type: ``setattr_reply``::
444 449
445 450 content = {
446 451 # One of ['ok', 'AttributeError', 'AccessError'].
447 452 'status' : str,
448 453 }
449 454
450 455
451 456
452 457 Object information
453 458 ------------------
454 459
455 460 One of IPython's most used capabilities is the introspection of Python objects
456 461 in the user's namespace, typically invoked via the ``?`` and ``??`` characters
457 462 (which in reality are shorthands for the ``%pinfo`` magic). This is used often
458 463 enough that it warrants an explicit message type, especially because frontends
459 464 may want to get object information in response to user keystrokes (like Tab or
460 465 F1) besides from the user explicitly typing code like ``x??``.
461 466
462 467 Message type: ``object_info_request``::
463 468
464 469 content = {
465 470 # The (possibly dotted) name of the object to be searched in all
466 471 # relevant namespaces
467 472 'name' : str,
468 473
469 474 # The level of detail desired. The default (0) is equivalent to typing
470 475 # 'x?' at the prompt, 1 is equivalent to 'x??'.
471 476 'detail_level' : int,
472 477 }
473 478
474 479 The returned information will be a dictionary with keys very similar to the
475 480 field names that IPython prints at the terminal.
476 481
477 482 Message type: ``object_info_reply``::
478 483
479 484 content = {
480 485 # The name the object was requested under
481 486 'name' : str,
482 487
483 488 # Boolean flag indicating whether the named object was found or not. If
484 489 # it's false, all other fields will be empty.
485 490 'found' : bool,
486 491
487 492 # Flags for magics and system aliases
488 493 'ismagic' : bool,
489 494 'isalias' : bool,
490 495
491 496 # The name of the namespace where the object was found ('builtin',
492 497 # 'magics', 'alias', 'interactive', etc.)
493 498 'namespace' : str,
494 499
495 500 # The type name will be type.__name__ for normal Python objects, but it
496 501 # can also be a string like 'Magic function' or 'System alias'
497 502 'type_name' : str,
498 503
499 504 # The string form of the object, possibly truncated for length if
500 505 # detail_level is 0
501 506 'string_form' : str,
502 507
503 508 # For objects with a __class__ attribute this will be set
504 509 'base_class' : str,
505 510
506 511 # For objects with a __len__ attribute this will be set
507 512 'length' : int,
508 513
509 514 # If the object is a function, class or method whose file we can find,
510 515 # we give its full path
511 516 'file' : str,
512 517
513 518 # For pure Python callable objects, we can reconstruct the object
514 519 # definition line which provides its call signature. For convenience this
515 520 # is returned as a single 'definition' field, but below the raw parts that
516 521 # compose it are also returned as the argspec field.
517 522 'definition' : str,
518 523
519 524 # The individual parts that together form the definition string. Clients
520 525 # with rich display capabilities may use this to provide a richer and more
521 526 # precise representation of the definition line (e.g. by highlighting
522 527 # arguments based on the user's cursor position). For non-callable
523 528 # objects, this field is empty.
524 529 'argspec' : { # The names of all the arguments
525 530 args : list,
526 531 # The name of the varargs (*args), if any
527 532 varargs : str,
528 533 # The name of the varkw (**kw), if any
529 534 varkw : str,
530 535 # The values (as strings) of all default arguments. Note
531 536 # that these must be matched *in reverse* with the 'args'
532 537 # list above, since the first positional args have no default
533 538 # value at all.
534 539 defaults : list,
535 540 },
536 541
537 542 # For instances, provide the constructor signature (the definition of
538 543 # the __init__ method):
539 544 'init_definition' : str,
540 545
541 546 # Docstrings: for any object (function, method, module, package) with a
542 547 # docstring, we show it. But in addition, we may provide additional
543 548 # docstrings. For example, for instances we will show the constructor
544 549 # and class docstrings as well, if available.
545 550 'docstring' : str,
546 551
547 552 # For instances, provide the constructor and class docstrings
548 553 'init_docstring' : str,
549 554 'class_docstring' : str,
550 555
551 556 # If it's a callable object whose call method has a separate docstring and
552 557 # definition line:
553 558 'call_def' : str,
554 559 'call_docstring' : str,
555 560
556 561 # If detail_level was 1, we also try to find the source code that
557 562 # defines the object, if possible. The string 'None' will indicate
558 563 # that no source was found.
559 564 'source' : str,
560 565 }
561 566
562 567
563 568 Complete
564 569 --------
565 570
566 571 Message type: ``complete_request``::
567 572
568 573 content = {
569 574 # The text to be completed, such as 'a.is'
570 575 'text' : str,
571 576
572 577 # The full line, such as 'print a.is'. This allows completers to
573 578 # make decisions that may require information about more than just the
574 579 # current word.
575 580 'line' : str,
576 581
577 582 # The entire block of text where the line is. This may be useful in the
578 583 # case of multiline completions where more context may be needed. Note: if
579 584 # in practice this field proves unnecessary, remove it to lighten the
580 585 # messages.
581 586
582 587 'block' : str,
583 588
584 589 # The position of the cursor where the user hit 'TAB' on the line.
585 590 'cursor_pos' : int,
586 591 }
587 592
588 593 Message type: ``complete_reply``::
589 594
590 595 content = {
591 596 # The list of all matches to the completion request, such as
592 597 # ['a.isalnum', 'a.isalpha'] for the above example.
593 598 'matches' : list
594 599 }
595 600
596 601
597 602 History
598 603 -------
599 604
600 605 For clients to explicitly request history from a kernel. The kernel has all
601 606 the actual execution history stored in a single location, so clients can
602 607 request it from the kernel when needed.
603 608
604 609 Message type: ``history_request``::
605 610
606 611 content = {
607 612
608 613 # If True, also return output history in the resulting dict.
609 614 'output' : bool,
610 615
611 616 # If True, return the raw input history, else the transformed input.
612 617 'raw' : bool,
613 618
614 619 # So far, this can be 'range', 'tail' or 'search'.
615 620 'hist_access_type' : str,
616 621
617 622 # If hist_access_type is 'range', get a range of input cells. session can
618 623 # be a positive session number, or a negative number to count back from
619 624 # the current session.
620 625 'session' : int,
621 626 # start and stop are line numbers within that session.
622 627 'start' : int,
623 628 'stop' : int,
624 629
625 630 # If hist_access_type is 'tail', get the last n cells.
626 631 'n' : int,
627 632
628 633 # If hist_access_type is 'search', get cells matching the specified glob
629 634 # pattern (with * and ? as wildcards).
630 635 'pattern' : str,
631 636
632 637 }
633 638
634 639 Message type: ``history_reply``::
635 640
636 641 content = {
637 642 # A list of 3 tuples, either:
638 643 # (session, line_number, input) or
639 644 # (session, line_number, (input, output)),
640 645 # depending on whether output was False or True, respectively.
641 646 'history' : list,
642 647 }
643 648
644 649
645 650 Connect
646 651 -------
647 652
648 653 When a client connects to the request/reply socket of the kernel, it can issue
649 654 a connect request to get basic information about the kernel, such as the ports
650 655 the other ZeroMQ sockets are listening on. This allows clients to only have
651 656 to know about a single port (the shell channel) to connect to a kernel.
652 657
653 658 Message type: ``connect_request``::
654 659
655 660 content = {
656 661 }
657 662
658 663 Message type: ``connect_reply``::
659 664
660 665 content = {
661 666 'shell_port' : int # The port the shell ROUTER socket is listening on.
662 667 'iopub_port' : int # The port the PUB socket is listening on.
663 668 'stdin_port' : int # The port the stdin ROUTER socket is listening on.
664 669 'hb_port' : int # The port the heartbeat socket is listening on.
665 670 }
666 671
667 672
668 673
669 674 Kernel shutdown
670 675 ---------------
671 676
672 677 The clients can request the kernel to shut itself down; this is used in
673 678 multiple cases:
674 679
675 680 - when the user chooses to close the client application via a menu or window
676 681 control.
677 682 - when the user types 'exit' or 'quit' (or their uppercase magic equivalents).
678 683 - when the user chooses a GUI method (like the 'Ctrl-C' shortcut in the
679 684 IPythonQt client) to force a kernel restart to get a clean kernel without
680 685 losing client-side state like history or inlined figures.
681 686
682 687 The client sends a shutdown request to the kernel, and once it receives the
683 688 reply message (which is otherwise empty), it can assume that the kernel has
684 689 completed shutdown safely.
685 690
686 691 Upon their own shutdown, client applications will typically execute a last
687 692 minute sanity check and forcefully terminate any kernel that is still alive, to
688 693 avoid leaving stray processes in the user's machine.
689 694
690 695 For both shutdown request and reply, there is no actual content that needs to
691 696 be sent, so the content dict is empty.
692 697
693 698 Message type: ``shutdown_request``::
694 699
695 700 content = {
696 701 'restart' : bool # whether the shutdown is final, or precedes a restart
697 702 }
698 703
699 704 Message type: ``shutdown_reply``::
700 705
701 706 content = {
702 707 'restart' : bool # whether the shutdown is final, or precedes a restart
703 708 }
704 709
705 710 .. Note::
706 711
707 712 When the clients detect a dead kernel thanks to inactivity on the heartbeat
708 713 socket, they simply send a forceful process termination signal, since a dead
709 714 process is unlikely to respond in any useful way to messages.
710 715
711 716
712 717 Messages on the PUB/SUB socket
713 718 ==============================
714 719
715 720 Streams (stdout, stderr, etc)
716 721 ------------------------------
717 722
718 723 Message type: ``stream``::
719 724
720 725 content = {
721 726 # The name of the stream is one of 'stdin', 'stdout', 'stderr'
722 727 'name' : str,
723 728
724 729 # The data is an arbitrary string to be written to that stream
725 730 'data' : str,
726 731 }
727 732
728 733 When a kernel receives a raw_input call, it should also broadcast it on the pub
729 734 socket with the names 'stdin' and 'stdin_reply'. This will allow other clients
730 735 to monitor/display kernel interactions and possibly replay them to their user
731 736 or otherwise expose them.
732 737
733 738 Display Data
734 739 ------------
735 740
736 741 This type of message is used to bring back data that should be diplayed (text,
737 742 html, svg, etc.) in the frontends. This data is published to all frontends.
738 743 Each message can have multiple representations of the data; it is up to the
739 744 frontend to decide which to use and how. A single message should contain all
740 745 possible representations of the same information. Each representation should
741 746 be a JSON'able data structure, and should be a valid MIME type.
742 747
743 748 Some questions remain about this design:
744 749
745 750 * Do we use this message type for pyout/displayhook? Probably not, because
746 751 the displayhook also has to handle the Out prompt display. On the other hand
747 752 we could put that information into the metadata secion.
748 753
749 754 Message type: ``display_data``::
750 755
751 756 content = {
752 757
753 758 # Who create the data
754 759 'source' : str,
755 760
756 761 # The data dict contains key/value pairs, where the kids are MIME
757 762 # types and the values are the raw data of the representation in that
758 763 # format. The data dict must minimally contain the ``text/plain``
759 764 # MIME type which is used as a backup representation.
760 765 'data' : dict,
761 766
762 767 # Any metadata that describes the data
763 768 'metadata' : dict
764 769 }
765 770
766 771
767 772 Raw Data Publication
768 773 --------------------
769 774
770 775 ``display_data`` lets you publish *representations* of data, such as images and html.
771 776 This ``data_pub`` message lets you publish *actual raw data*, sent via message buffers.
772 777
773 778 data_pub messages are constructed via the :func:`IPython.lib.datapub.publish_data` function:
774 779
775 780 .. sourcecode:: python
776 781
777 782 from IPython.zmq.datapub import publish_data
778 783 ns = dict(x=my_array)
779 784 publish_data(ns)
780 785
781 786
782 787 Message type: ``data_pub``::
783 788
784 789 content = {
785 790 # the keys of the data dict, after it has been unserialized
786 791 keys = ['a', 'b']
787 792 }
788 793 # the namespace dict will be serialized in the message buffers,
789 794 # which will have a length of at least one
790 795 buffers = ['pdict', ...]
791 796
792 797
793 798 The interpretation of a sequence of data_pub messages for a given parent request should be
794 799 to update a single namespace with subsequent results.
795 800
796 801 .. note::
797 802
798 803 No frontends directly handle data_pub messages at this time.
799 804 It is currently only used by the client/engines in :mod:`IPython.parallel`,
800 805 where engines may publish *data* to the Client,
801 806 of which the Client can then publish *representations* via ``display_data``
802 807 to various frontends.
803 808
804 809 Python inputs
805 810 -------------
806 811
807 812 These messages are the re-broadcast of the ``execute_request``.
808 813
809 814 Message type: ``pyin``::
810 815
811 816 content = {
812 817 'code' : str, # Source code to be executed, one or more lines
813 818
814 819 # The counter for this execution is also provided so that clients can
815 820 # display it, since IPython automatically creates variables called _iN
816 821 # (for input prompt In[N]).
817 822 'execution_count' : int
818 823 }
819 824
820 825 Python outputs
821 826 --------------
822 827
823 828 When Python produces output from code that has been compiled in with the
824 829 'single' flag to :func:`compile`, any expression that produces a value (such as
825 830 ``1+1``) is passed to ``sys.displayhook``, which is a callable that can do with
826 831 this value whatever it wants. The default behavior of ``sys.displayhook`` in
827 832 the Python interactive prompt is to print to ``sys.stdout`` the :func:`repr` of
828 833 the value as long as it is not ``None`` (which isn't printed at all). In our
829 834 case, the kernel instantiates as ``sys.displayhook`` an object which has
830 835 similar behavior, but which instead of printing to stdout, broadcasts these
831 836 values as ``pyout`` messages for clients to display appropriately.
832 837
833 838 IPython's displayhook can handle multiple simultaneous formats depending on its
834 839 configuration. The default pretty-printed repr text is always given with the
835 840 ``data`` entry in this message. Any other formats are provided in the
836 841 ``extra_formats`` list. Frontends are free to display any or all of these
837 842 according to its capabilities. ``extra_formats`` list contains 3-tuples of an ID
838 843 string, a type string, and the data. The ID is unique to the formatter
839 844 implementation that created the data. Frontends will typically ignore the ID
840 845 unless if it has requested a particular formatter. The type string tells the
841 846 frontend how to interpret the data. It is often, but not always a MIME type.
842 847 Frontends should ignore types that it does not understand. The data itself is
843 848 any JSON object and depends on the format. It is often, but not always a string.
844 849
845 850 Message type: ``pyout``::
846 851
847 852 content = {
848 853
849 854 # The counter for this execution is also provided so that clients can
850 855 # display it, since IPython automatically creates variables called _N
851 856 # (for prompt N).
852 857 'execution_count' : int,
853 858
854 859 # The data dict contains key/value pairs, where the kids are MIME
855 860 # types and the values are the raw data of the representation in that
856 861 # format. The data dict must minimally contain the ``text/plain``
857 862 # MIME type which is used as a backup representation.
858 863 'data' : dict,
859 864
860 865 }
861 866
862 867 Python errors
863 868 -------------
864 869
865 870 When an error occurs during code execution
866 871
867 872 Message type: ``pyerr``::
868 873
869 874 content = {
870 875 # Similar content to the execute_reply messages for the 'error' case,
871 876 # except the 'status' field is omitted.
872 877 }
873 878
874 879 Kernel status
875 880 -------------
876 881
877 882 This message type is used by frontends to monitor the status of the kernel.
878 883
879 884 Message type: ``status``::
880 885
881 886 content = {
882 887 # When the kernel starts to execute code, it will enter the 'busy'
883 888 # state and when it finishes, it will enter the 'idle' state.
884 889 execution_state : ('busy', 'idle')
885 890 }
886 891
887 892 Kernel crashes
888 893 --------------
889 894
890 895 When the kernel has an unexpected exception, caught by the last-resort
891 896 sys.excepthook, we should broadcast the crash handler's output before exiting.
892 897 This will allow clients to notice that a kernel died, inform the user and
893 898 propose further actions.
894 899
895 900 Message type: ``crash``::
896 901
897 902 content = {
898 903 # Similarly to the 'error' case for execute_reply messages, this will
899 904 # contain ename, etype and traceback fields.
900 905
901 906 # An additional field with supplementary information such as where to
902 907 # send the crash message
903 908 'info' : str,
904 909 }
905 910
906 911
907 912 Future ideas
908 913 ------------
909 914
910 915 Other potential message types, currently unimplemented, listed below as ideas.
911 916
912 917 Message type: ``file``::
913 918
914 919 content = {
915 920 'path' : 'cool.jpg',
916 921 'mimetype' : str,
917 922 'data' : str,
918 923 }
919 924
920 925
921 926 Messages on the stdin ROUTER/DEALER sockets
922 927 ===========================================
923 928
924 929 This is a socket where the request/reply pattern goes in the opposite direction:
925 930 from the kernel to a *single* frontend, and its purpose is to allow
926 931 ``raw_input`` and similar operations that read from ``sys.stdin`` on the kernel
927 932 to be fulfilled by the client. The request should be made to the frontend that
928 933 made the execution request that prompted ``raw_input`` to be called. For now we
929 934 will keep these messages as simple as possible, since they only mean to convey
930 935 the ``raw_input(prompt)`` call.
931 936
932 937 Message type: ``input_request``::
933 938
934 939 content = { 'prompt' : str }
935 940
936 941 Message type: ``input_reply``::
937 942
938 943 content = { 'value' : str }
939 944
940 945 .. Note::
941 946
942 947 We do not explicitly try to forward the raw ``sys.stdin`` object, because in
943 948 practice the kernel should behave like an interactive program. When a
944 949 program is opened on the console, the keyboard effectively takes over the
945 950 ``stdin`` file descriptor, and it can't be used for raw reading anymore.
946 951 Since the IPython kernel effectively behaves like a console program (albeit
947 952 one whose "keyboard" is actually living in a separate process and
948 953 transported over the zmq connection), raw ``stdin`` isn't expected to be
949 954 available.
950 955
951 956
952 957 Heartbeat for kernels
953 958 =====================
954 959
955 960 Initially we had considered using messages like those above over ZMQ for a
956 961 kernel 'heartbeat' (a way to detect quickly and reliably whether a kernel is
957 962 alive at all, even if it may be busy executing user code). But this has the
958 963 problem that if the kernel is locked inside extension code, it wouldn't execute
959 964 the python heartbeat code. But it turns out that we can implement a basic
960 965 heartbeat with pure ZMQ, without using any Python messaging at all.
961 966
962 967 The monitor sends out a single zmq message (right now, it is a str of the
963 968 monitor's lifetime in seconds), and gets the same message right back, prefixed
964 969 with the zmq identity of the DEALER socket in the heartbeat process. This can be
965 970 a uuid, or even a full message, but there doesn't seem to be a need for packing
966 971 up a message when the sender and receiver are the exact same Python object.
967 972
968 973 The model is this::
969 974
970 975 monitor.send(str(self.lifetime)) # '1.2345678910'
971 976
972 977 and the monitor receives some number of messages of the form::
973 978
974 979 ['uuid-abcd-dead-beef', '1.2345678910']
975 980
976 981 where the first part is the zmq.IDENTITY of the heart's DEALER on the engine, and
977 982 the rest is the message sent by the monitor. No Python code ever has any
978 983 access to the message between the monitor's send, and the monitor's recv.
979 984
980 985
981 986 ToDo
982 987 ====
983 988
984 989 Missing things include:
985 990
986 991 * Important: finish thinking through the payload concept and API.
987 992
988 993 * Important: ensure that we have a good solution for magics like %edit. It's
989 994 likely that with the payload concept we can build a full solution, but not
990 995 100% clear yet.
991 996
992 997 * Finishing the details of the heartbeat protocol.
993 998
994 999 * Signal handling: specify what kind of information kernel should broadcast (or
995 1000 not) when it receives signals.
996 1001
997 1002 .. include:: ../links.rst
General Comments 0
You need to be logged in to leave comments. Login now