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