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