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