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