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