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