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