##// END OF EJS Templates
Fix extensions test suite (small, but now it runs and passes!)
Fernando Perez -
Show More
@@ -1,2525 +1,2525 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Main IPython Component
3 Main IPython Component
4 """
4 """
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
8 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
8 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
9 # Copyright (C) 2008-2009 The IPython Development Team
9 # Copyright (C) 2008-2009 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 from __future__ import with_statement
19 from __future__ import with_statement
20
20
21 import __builtin__
21 import __builtin__
22 import StringIO
22 import StringIO
23 import bdb
23 import bdb
24 import codeop
24 import codeop
25 import exceptions
25 import exceptions
26 import new
26 import new
27 import os
27 import os
28 import re
28 import re
29 import string
29 import string
30 import sys
30 import sys
31 import tempfile
31 import tempfile
32 from contextlib import nested
32 from contextlib import nested
33
33
34 from IPython.core import debugger, oinspect
34 from IPython.core import debugger, oinspect
35 from IPython.core import history as ipcorehist
35 from IPython.core import history as ipcorehist
36 from IPython.core import prefilter
36 from IPython.core import prefilter
37 from IPython.core import shadowns
37 from IPython.core import shadowns
38 from IPython.core import ultratb
38 from IPython.core import ultratb
39 from IPython.core.alias import AliasManager
39 from IPython.core.alias import AliasManager
40 from IPython.core.builtin_trap import BuiltinTrap
40 from IPython.core.builtin_trap import BuiltinTrap
41 from IPython.core.component import Component
41 from IPython.core.component import Component
42 from IPython.core.display_trap import DisplayTrap
42 from IPython.core.display_trap import DisplayTrap
43 from IPython.core.error import TryNext, UsageError
43 from IPython.core.error import TryNext, UsageError
44 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
44 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
45 from IPython.core.logger import Logger
45 from IPython.core.logger import Logger
46 from IPython.core.magic import Magic
46 from IPython.core.magic import Magic
47 from IPython.core.prefilter import PrefilterManager
47 from IPython.core.prefilter import PrefilterManager
48 from IPython.core.prompts import CachedOutput
48 from IPython.core.prompts import CachedOutput
49 from IPython.core.pylabtools import pylab_activate
49 from IPython.core.pylabtools import pylab_activate
50 from IPython.core.usage import interactive_usage, default_banner
50 from IPython.core.usage import interactive_usage, default_banner
51 from IPython.external.Itpl import ItplNS
51 from IPython.external.Itpl import ItplNS
52 from IPython.lib.inputhook import enable_gui
52 from IPython.lib.inputhook import enable_gui
53 from IPython.lib.backgroundjobs import BackgroundJobManager
53 from IPython.lib.backgroundjobs import BackgroundJobManager
54 from IPython.utils import PyColorize
54 from IPython.utils import PyColorize
55 from IPython.utils import pickleshare
55 from IPython.utils import pickleshare
56 from IPython.utils.genutils import get_ipython_dir
56 from IPython.utils.genutils import get_ipython_dir
57 from IPython.utils.ipstruct import Struct
57 from IPython.utils.ipstruct import Struct
58 from IPython.utils.platutils import toggle_set_term_title, set_term_title
58 from IPython.utils.platutils import toggle_set_term_title, set_term_title
59 from IPython.utils.strdispatch import StrDispatch
59 from IPython.utils.strdispatch import StrDispatch
60 from IPython.utils.syspathcontext import prepended_to_syspath
60 from IPython.utils.syspathcontext import prepended_to_syspath
61
61
62 # XXX - need to clean up this import * line
62 # XXX - need to clean up this import * line
63 from IPython.utils.genutils import *
63 from IPython.utils.genutils import *
64
64
65 # from IPython.utils import growl
65 # from IPython.utils import growl
66 # growl.start("IPython")
66 # growl.start("IPython")
67
67
68 from IPython.utils.traitlets import (
68 from IPython.utils.traitlets import (
69 Int, Str, CBool, CaselessStrEnum, Enum, List, Unicode
69 Int, Str, CBool, CaselessStrEnum, Enum, List, Unicode
70 )
70 )
71
71
72 #-----------------------------------------------------------------------------
72 #-----------------------------------------------------------------------------
73 # Globals
73 # Globals
74 #-----------------------------------------------------------------------------
74 #-----------------------------------------------------------------------------
75
75
76 # store the builtin raw_input globally, and use this always, in case user code
76 # store the builtin raw_input globally, and use this always, in case user code
77 # overwrites it (like wx.py.PyShell does)
77 # overwrites it (like wx.py.PyShell does)
78 raw_input_original = raw_input
78 raw_input_original = raw_input
79
79
80 # compiled regexps for autoindent management
80 # compiled regexps for autoindent management
81 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
81 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
82
82
83 #-----------------------------------------------------------------------------
83 #-----------------------------------------------------------------------------
84 # Utilities
84 # Utilities
85 #-----------------------------------------------------------------------------
85 #-----------------------------------------------------------------------------
86
86
87 ini_spaces_re = re.compile(r'^(\s+)')
87 ini_spaces_re = re.compile(r'^(\s+)')
88
88
89
89
90 def num_ini_spaces(strng):
90 def num_ini_spaces(strng):
91 """Return the number of initial spaces in a string"""
91 """Return the number of initial spaces in a string"""
92
92
93 ini_spaces = ini_spaces_re.match(strng)
93 ini_spaces = ini_spaces_re.match(strng)
94 if ini_spaces:
94 if ini_spaces:
95 return ini_spaces.end()
95 return ini_spaces.end()
96 else:
96 else:
97 return 0
97 return 0
98
98
99
99
100 def softspace(file, newvalue):
100 def softspace(file, newvalue):
101 """Copied from code.py, to remove the dependency"""
101 """Copied from code.py, to remove the dependency"""
102
102
103 oldvalue = 0
103 oldvalue = 0
104 try:
104 try:
105 oldvalue = file.softspace
105 oldvalue = file.softspace
106 except AttributeError:
106 except AttributeError:
107 pass
107 pass
108 try:
108 try:
109 file.softspace = newvalue
109 file.softspace = newvalue
110 except (AttributeError, TypeError):
110 except (AttributeError, TypeError):
111 # "attribute-less object" or "read-only attributes"
111 # "attribute-less object" or "read-only attributes"
112 pass
112 pass
113 return oldvalue
113 return oldvalue
114
114
115
115
116 def no_op(*a, **kw): pass
116 def no_op(*a, **kw): pass
117
117
118 class SpaceInInput(exceptions.Exception): pass
118 class SpaceInInput(exceptions.Exception): pass
119
119
120 class Bunch: pass
120 class Bunch: pass
121
121
122 class InputList(list):
122 class InputList(list):
123 """Class to store user input.
123 """Class to store user input.
124
124
125 It's basically a list, but slices return a string instead of a list, thus
125 It's basically a list, but slices return a string instead of a list, thus
126 allowing things like (assuming 'In' is an instance):
126 allowing things like (assuming 'In' is an instance):
127
127
128 exec In[4:7]
128 exec In[4:7]
129
129
130 or
130 or
131
131
132 exec In[5:9] + In[14] + In[21:25]"""
132 exec In[5:9] + In[14] + In[21:25]"""
133
133
134 def __getslice__(self,i,j):
134 def __getslice__(self,i,j):
135 return ''.join(list.__getslice__(self,i,j))
135 return ''.join(list.__getslice__(self,i,j))
136
136
137
137
138 class SyntaxTB(ultratb.ListTB):
138 class SyntaxTB(ultratb.ListTB):
139 """Extension which holds some state: the last exception value"""
139 """Extension which holds some state: the last exception value"""
140
140
141 def __init__(self,color_scheme = 'NoColor'):
141 def __init__(self,color_scheme = 'NoColor'):
142 ultratb.ListTB.__init__(self,color_scheme)
142 ultratb.ListTB.__init__(self,color_scheme)
143 self.last_syntax_error = None
143 self.last_syntax_error = None
144
144
145 def __call__(self, etype, value, elist):
145 def __call__(self, etype, value, elist):
146 self.last_syntax_error = value
146 self.last_syntax_error = value
147 ultratb.ListTB.__call__(self,etype,value,elist)
147 ultratb.ListTB.__call__(self,etype,value,elist)
148
148
149 def clear_err_state(self):
149 def clear_err_state(self):
150 """Return the current error state and clear it"""
150 """Return the current error state and clear it"""
151 e = self.last_syntax_error
151 e = self.last_syntax_error
152 self.last_syntax_error = None
152 self.last_syntax_error = None
153 return e
153 return e
154
154
155
155
156 def get_default_editor():
156 def get_default_editor():
157 try:
157 try:
158 ed = os.environ['EDITOR']
158 ed = os.environ['EDITOR']
159 except KeyError:
159 except KeyError:
160 if os.name == 'posix':
160 if os.name == 'posix':
161 ed = 'vi' # the only one guaranteed to be there!
161 ed = 'vi' # the only one guaranteed to be there!
162 else:
162 else:
163 ed = 'notepad' # same in Windows!
163 ed = 'notepad' # same in Windows!
164 return ed
164 return ed
165
165
166
166
167 def get_default_colors():
167 def get_default_colors():
168 if sys.platform=='darwin':
168 if sys.platform=='darwin':
169 return "LightBG"
169 return "LightBG"
170 elif os.name=='nt':
170 elif os.name=='nt':
171 return 'Linux'
171 return 'Linux'
172 else:
172 else:
173 return 'Linux'
173 return 'Linux'
174
174
175
175
176 class SeparateStr(Str):
176 class SeparateStr(Str):
177 """A Str subclass to validate separate_in, separate_out, etc.
177 """A Str subclass to validate separate_in, separate_out, etc.
178
178
179 This is a Str based traitlet that converts '0'->'' and '\\n'->'\n'.
179 This is a Str based traitlet that converts '0'->'' and '\\n'->'\n'.
180 """
180 """
181
181
182 def validate(self, obj, value):
182 def validate(self, obj, value):
183 if value == '0': value = ''
183 if value == '0': value = ''
184 value = value.replace('\\n','\n')
184 value = value.replace('\\n','\n')
185 return super(SeparateStr, self).validate(obj, value)
185 return super(SeparateStr, self).validate(obj, value)
186
186
187
187
188 def make_user_namespaces(user_ns=None, user_global_ns=None):
188 def make_user_namespaces(user_ns=None, user_global_ns=None):
189 """Return a valid local and global user interactive namespaces.
189 """Return a valid local and global user interactive namespaces.
190
190
191 This builds a dict with the minimal information needed to operate as a
191 This builds a dict with the minimal information needed to operate as a
192 valid IPython user namespace, which you can pass to the various
192 valid IPython user namespace, which you can pass to the various
193 embedding classes in ipython. The default implementation returns the
193 embedding classes in ipython. The default implementation returns the
194 same dict for both the locals and the globals to allow functions to
194 same dict for both the locals and the globals to allow functions to
195 refer to variables in the namespace. Customized implementations can
195 refer to variables in the namespace. Customized implementations can
196 return different dicts. The locals dictionary can actually be anything
196 return different dicts. The locals dictionary can actually be anything
197 following the basic mapping protocol of a dict, but the globals dict
197 following the basic mapping protocol of a dict, but the globals dict
198 must be a true dict, not even a subclass. It is recommended that any
198 must be a true dict, not even a subclass. It is recommended that any
199 custom object for the locals namespace synchronize with the globals
199 custom object for the locals namespace synchronize with the globals
200 dict somehow.
200 dict somehow.
201
201
202 Raises TypeError if the provided globals namespace is not a true dict.
202 Raises TypeError if the provided globals namespace is not a true dict.
203
203
204 Parameters
204 Parameters
205 ----------
205 ----------
206 user_ns : dict-like, optional
206 user_ns : dict-like, optional
207 The current user namespace. The items in this namespace should
207 The current user namespace. The items in this namespace should
208 be included in the output. If None, an appropriate blank
208 be included in the output. If None, an appropriate blank
209 namespace should be created.
209 namespace should be created.
210 user_global_ns : dict, optional
210 user_global_ns : dict, optional
211 The current user global namespace. The items in this namespace
211 The current user global namespace. The items in this namespace
212 should be included in the output. If None, an appropriate
212 should be included in the output. If None, an appropriate
213 blank namespace should be created.
213 blank namespace should be created.
214
214
215 Returns
215 Returns
216 -------
216 -------
217 A pair of dictionary-like object to be used as the local namespace
217 A pair of dictionary-like object to be used as the local namespace
218 of the interpreter and a dict to be used as the global namespace.
218 of the interpreter and a dict to be used as the global namespace.
219 """
219 """
220
220
221 if user_ns is None:
221 if user_ns is None:
222 # Set __name__ to __main__ to better match the behavior of the
222 # Set __name__ to __main__ to better match the behavior of the
223 # normal interpreter.
223 # normal interpreter.
224 user_ns = {'__name__' :'__main__',
224 user_ns = {'__name__' :'__main__',
225 '__builtins__' : __builtin__,
225 '__builtins__' : __builtin__,
226 }
226 }
227 else:
227 else:
228 user_ns.setdefault('__name__','__main__')
228 user_ns.setdefault('__name__','__main__')
229 user_ns.setdefault('__builtins__',__builtin__)
229 user_ns.setdefault('__builtins__',__builtin__)
230
230
231 if user_global_ns is None:
231 if user_global_ns is None:
232 user_global_ns = user_ns
232 user_global_ns = user_ns
233 if type(user_global_ns) is not dict:
233 if type(user_global_ns) is not dict:
234 raise TypeError("user_global_ns must be a true dict; got %r"
234 raise TypeError("user_global_ns must be a true dict; got %r"
235 % type(user_global_ns))
235 % type(user_global_ns))
236
236
237 return user_ns, user_global_ns
237 return user_ns, user_global_ns
238
238
239 #-----------------------------------------------------------------------------
239 #-----------------------------------------------------------------------------
240 # Main IPython class
240 # Main IPython class
241 #-----------------------------------------------------------------------------
241 #-----------------------------------------------------------------------------
242
242
243
243
244 class InteractiveShell(Component, Magic):
244 class InteractiveShell(Component, Magic):
245 """An enhanced, interactive shell for Python."""
245 """An enhanced, interactive shell for Python."""
246
246
247 autocall = Enum((0,1,2), default_value=1, config=True)
247 autocall = Enum((0,1,2), default_value=1, config=True)
248 autoedit_syntax = CBool(False, config=True)
248 autoedit_syntax = CBool(False, config=True)
249 autoindent = CBool(True, config=True)
249 autoindent = CBool(True, config=True)
250 automagic = CBool(True, config=True)
250 automagic = CBool(True, config=True)
251 banner = Str('')
251 banner = Str('')
252 banner1 = Str(default_banner, config=True)
252 banner1 = Str(default_banner, config=True)
253 banner2 = Str('', config=True)
253 banner2 = Str('', config=True)
254 cache_size = Int(1000, config=True)
254 cache_size = Int(1000, config=True)
255 color_info = CBool(True, config=True)
255 color_info = CBool(True, config=True)
256 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
256 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
257 default_value=get_default_colors(), config=True)
257 default_value=get_default_colors(), config=True)
258 confirm_exit = CBool(True, config=True)
258 confirm_exit = CBool(True, config=True)
259 debug = CBool(False, config=True)
259 debug = CBool(False, config=True)
260 deep_reload = CBool(False, config=True)
260 deep_reload = CBool(False, config=True)
261 # This display_banner only controls whether or not self.show_banner()
261 # This display_banner only controls whether or not self.show_banner()
262 # is called when mainloop/interact are called. The default is False
262 # is called when mainloop/interact are called. The default is False
263 # because for the terminal based application, the banner behavior
263 # because for the terminal based application, the banner behavior
264 # is controlled by Global.display_banner, which IPythonApp looks at
264 # is controlled by Global.display_banner, which IPythonApp looks at
265 # to determine if *it* should call show_banner() by hand or not.
265 # to determine if *it* should call show_banner() by hand or not.
266 display_banner = CBool(False) # This isn't configurable!
266 display_banner = CBool(False) # This isn't configurable!
267 embedded = CBool(False)
267 embedded = CBool(False)
268 embedded_active = CBool(False)
268 embedded_active = CBool(False)
269 editor = Str(get_default_editor(), config=True)
269 editor = Str(get_default_editor(), config=True)
270 filename = Str("<ipython console>")
270 filename = Str("<ipython console>")
271 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
271 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
272 logstart = CBool(False, config=True)
272 logstart = CBool(False, config=True)
273 logfile = Str('', config=True)
273 logfile = Str('', config=True)
274 logappend = Str('', config=True)
274 logappend = Str('', config=True)
275 object_info_string_level = Enum((0,1,2), default_value=0,
275 object_info_string_level = Enum((0,1,2), default_value=0,
276 config=True)
276 config=True)
277 pager = Str('less', config=True)
277 pager = Str('less', config=True)
278 pdb = CBool(False, config=True)
278 pdb = CBool(False, config=True)
279 pprint = CBool(True, config=True)
279 pprint = CBool(True, config=True)
280 profile = Str('', config=True)
280 profile = Str('', config=True)
281 prompt_in1 = Str('In [\\#]: ', config=True)
281 prompt_in1 = Str('In [\\#]: ', config=True)
282 prompt_in2 = Str(' .\\D.: ', config=True)
282 prompt_in2 = Str(' .\\D.: ', config=True)
283 prompt_out = Str('Out[\\#]: ', config=True)
283 prompt_out = Str('Out[\\#]: ', config=True)
284 prompts_pad_left = CBool(True, config=True)
284 prompts_pad_left = CBool(True, config=True)
285 quiet = CBool(False, config=True)
285 quiet = CBool(False, config=True)
286
286
287 readline_use = CBool(True, config=True)
287 readline_use = CBool(True, config=True)
288 readline_merge_completions = CBool(True, config=True)
288 readline_merge_completions = CBool(True, config=True)
289 readline_omit__names = Enum((0,1,2), default_value=0, config=True)
289 readline_omit__names = Enum((0,1,2), default_value=0, config=True)
290 readline_remove_delims = Str('-/~', config=True)
290 readline_remove_delims = Str('-/~', config=True)
291 readline_parse_and_bind = List([
291 readline_parse_and_bind = List([
292 'tab: complete',
292 'tab: complete',
293 '"\C-l": possible-completions',
293 '"\C-l": possible-completions',
294 'set show-all-if-ambiguous on',
294 'set show-all-if-ambiguous on',
295 '"\C-o": tab-insert',
295 '"\C-o": tab-insert',
296 '"\M-i": " "',
296 '"\M-i": " "',
297 '"\M-o": "\d\d\d\d"',
297 '"\M-o": "\d\d\d\d"',
298 '"\M-I": "\d\d\d\d"',
298 '"\M-I": "\d\d\d\d"',
299 '"\C-r": reverse-search-history',
299 '"\C-r": reverse-search-history',
300 '"\C-s": forward-search-history',
300 '"\C-s": forward-search-history',
301 '"\C-p": history-search-backward',
301 '"\C-p": history-search-backward',
302 '"\C-n": history-search-forward',
302 '"\C-n": history-search-forward',
303 '"\e[A": history-search-backward',
303 '"\e[A": history-search-backward',
304 '"\e[B": history-search-forward',
304 '"\e[B": history-search-forward',
305 '"\C-k": kill-line',
305 '"\C-k": kill-line',
306 '"\C-u": unix-line-discard',
306 '"\C-u": unix-line-discard',
307 ], allow_none=False, config=True)
307 ], allow_none=False, config=True)
308
308
309 screen_length = Int(0, config=True)
309 screen_length = Int(0, config=True)
310
310
311 # Use custom TraitletTypes that convert '0'->'' and '\\n'->'\n'
311 # Use custom TraitletTypes that convert '0'->'' and '\\n'->'\n'
312 separate_in = SeparateStr('\n', config=True)
312 separate_in = SeparateStr('\n', config=True)
313 separate_out = SeparateStr('', config=True)
313 separate_out = SeparateStr('', config=True)
314 separate_out2 = SeparateStr('', config=True)
314 separate_out2 = SeparateStr('', config=True)
315
315
316 system_header = Str('IPython system call: ', config=True)
316 system_header = Str('IPython system call: ', config=True)
317 system_verbose = CBool(False, config=True)
317 system_verbose = CBool(False, config=True)
318 term_title = CBool(False, config=True)
318 term_title = CBool(False, config=True)
319 wildcards_case_sensitive = CBool(True, config=True)
319 wildcards_case_sensitive = CBool(True, config=True)
320 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
320 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
321 default_value='Context', config=True)
321 default_value='Context', config=True)
322
322
323 autoexec = List(allow_none=False)
323 autoexec = List(allow_none=False)
324
324
325 # class attribute to indicate whether the class supports threads or not.
325 # class attribute to indicate whether the class supports threads or not.
326 # Subclasses with thread support should override this as needed.
326 # Subclasses with thread support should override this as needed.
327 isthreaded = False
327 isthreaded = False
328
328
329 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
329 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
330 user_ns=None, user_global_ns=None,
330 user_ns=None, user_global_ns=None,
331 banner1=None, banner2=None, display_banner=None,
331 banner1=None, banner2=None, display_banner=None,
332 custom_exceptions=((),None)):
332 custom_exceptions=((),None)):
333
333
334 # This is where traitlets with a config_key argument are updated
334 # This is where traitlets with a config_key argument are updated
335 # from the values on config.
335 # from the values on config.
336 super(InteractiveShell, self).__init__(parent, config=config)
336 super(InteractiveShell, self).__init__(parent, config=config)
337
337
338 # These are relatively independent and stateless
338 # These are relatively independent and stateless
339 self.init_ipython_dir(ipython_dir)
339 self.init_ipython_dir(ipython_dir)
340 self.init_instance_attrs()
340 self.init_instance_attrs()
341 self.init_term_title()
341 self.init_term_title()
342 self.init_usage(usage)
342 self.init_usage(usage)
343 self.init_banner(banner1, banner2, display_banner)
343 self.init_banner(banner1, banner2, display_banner)
344
344
345 # Create namespaces (user_ns, user_global_ns, etc.)
345 # Create namespaces (user_ns, user_global_ns, etc.)
346 self.init_create_namespaces(user_ns, user_global_ns)
346 self.init_create_namespaces(user_ns, user_global_ns)
347 # This has to be done after init_create_namespaces because it uses
347 # This has to be done after init_create_namespaces because it uses
348 # something in self.user_ns, but before init_sys_modules, which
348 # something in self.user_ns, but before init_sys_modules, which
349 # is the first thing to modify sys.
349 # is the first thing to modify sys.
350 self.save_sys_module_state()
350 self.save_sys_module_state()
351 self.init_sys_modules()
351 self.init_sys_modules()
352
352
353 self.init_history()
353 self.init_history()
354 self.init_encoding()
354 self.init_encoding()
355 self.init_prefilter()
355 self.init_prefilter()
356
356
357 Magic.__init__(self, self)
357 Magic.__init__(self, self)
358
358
359 self.init_syntax_highlighting()
359 self.init_syntax_highlighting()
360 self.init_hooks()
360 self.init_hooks()
361 self.init_pushd_popd_magic()
361 self.init_pushd_popd_magic()
362 self.init_traceback_handlers(custom_exceptions)
362 self.init_traceback_handlers(custom_exceptions)
363 self.init_user_ns()
363 self.init_user_ns()
364 self.init_logger()
364 self.init_logger()
365 self.init_alias()
365 self.init_alias()
366 self.init_builtins()
366 self.init_builtins()
367
367
368 # pre_config_initialization
368 # pre_config_initialization
369 self.init_shadow_hist()
369 self.init_shadow_hist()
370
370
371 # The next section should contain averything that was in ipmaker.
371 # The next section should contain averything that was in ipmaker.
372 self.init_logstart()
372 self.init_logstart()
373
373
374 # The following was in post_config_initialization
374 # The following was in post_config_initialization
375 self.init_inspector()
375 self.init_inspector()
376 self.init_readline()
376 self.init_readline()
377 self.init_prompts()
377 self.init_prompts()
378 self.init_displayhook()
378 self.init_displayhook()
379 self.init_reload_doctest()
379 self.init_reload_doctest()
380 self.init_magics()
380 self.init_magics()
381 self.init_pdb()
381 self.init_pdb()
382 self.hooks.late_startup_hook()
382 self.hooks.late_startup_hook()
383
383
384 def get_ipython(self):
384 def get_ipython(self):
385 """Return the currently running IPython instance."""
385 """Return the currently running IPython instance."""
386 return self
386 return self
387
387
388 #-------------------------------------------------------------------------
388 #-------------------------------------------------------------------------
389 # Traitlet changed handlers
389 # Traitlet changed handlers
390 #-------------------------------------------------------------------------
390 #-------------------------------------------------------------------------
391
391
392 def _banner1_changed(self):
392 def _banner1_changed(self):
393 self.compute_banner()
393 self.compute_banner()
394
394
395 def _banner2_changed(self):
395 def _banner2_changed(self):
396 self.compute_banner()
396 self.compute_banner()
397
397
398 def _ipython_dir_changed(self, name, new):
398 def _ipython_dir_changed(self, name, new):
399 if not os.path.isdir(new):
399 if not os.path.isdir(new):
400 os.makedirs(new, mode = 0777)
400 os.makedirs(new, mode = 0777)
401 if not os.path.isdir(self.ipython_extension_dir):
401 if not os.path.isdir(self.ipython_extension_dir):
402 os.makedirs(self.ipython_extension_dir, mode = 0777)
402 os.makedirs(self.ipython_extension_dir, mode = 0777)
403
403
404 @property
404 @property
405 def ipython_extension_dir(self):
405 def ipython_extension_dir(self):
406 return os.path.join(self.ipython_dir, 'extensions')
406 return os.path.join(self.ipython_dir, 'extensions')
407
407
408 @property
408 @property
409 def usable_screen_length(self):
409 def usable_screen_length(self):
410 if self.screen_length == 0:
410 if self.screen_length == 0:
411 return 0
411 return 0
412 else:
412 else:
413 num_lines_bot = self.separate_in.count('\n')+1
413 num_lines_bot = self.separate_in.count('\n')+1
414 return self.screen_length - num_lines_bot
414 return self.screen_length - num_lines_bot
415
415
416 def _term_title_changed(self, name, new_value):
416 def _term_title_changed(self, name, new_value):
417 self.init_term_title()
417 self.init_term_title()
418
418
419 def set_autoindent(self,value=None):
419 def set_autoindent(self,value=None):
420 """Set the autoindent flag, checking for readline support.
420 """Set the autoindent flag, checking for readline support.
421
421
422 If called with no arguments, it acts as a toggle."""
422 If called with no arguments, it acts as a toggle."""
423
423
424 if not self.has_readline:
424 if not self.has_readline:
425 if os.name == 'posix':
425 if os.name == 'posix':
426 warn("The auto-indent feature requires the readline library")
426 warn("The auto-indent feature requires the readline library")
427 self.autoindent = 0
427 self.autoindent = 0
428 return
428 return
429 if value is None:
429 if value is None:
430 self.autoindent = not self.autoindent
430 self.autoindent = not self.autoindent
431 else:
431 else:
432 self.autoindent = value
432 self.autoindent = value
433
433
434 #-------------------------------------------------------------------------
434 #-------------------------------------------------------------------------
435 # init_* methods called by __init__
435 # init_* methods called by __init__
436 #-------------------------------------------------------------------------
436 #-------------------------------------------------------------------------
437
437
438 def init_ipython_dir(self, ipython_dir):
438 def init_ipython_dir(self, ipython_dir):
439 if ipython_dir is not None:
439 if ipython_dir is not None:
440 self.ipython_dir = ipython_dir
440 self.ipython_dir = ipython_dir
441 self.config.Global.ipython_dir = self.ipython_dir
441 self.config.Global.ipython_dir = self.ipython_dir
442 return
442 return
443
443
444 if hasattr(self.config.Global, 'ipython_dir'):
444 if hasattr(self.config.Global, 'ipython_dir'):
445 self.ipython_dir = self.config.Global.ipython_dir
445 self.ipython_dir = self.config.Global.ipython_dir
446 else:
446 else:
447 self.ipython_dir = get_ipython_dir()
447 self.ipython_dir = get_ipython_dir()
448
448
449 # All children can just read this
449 # All children can just read this
450 self.config.Global.ipython_dir = self.ipython_dir
450 self.config.Global.ipython_dir = self.ipython_dir
451
451
452 def init_instance_attrs(self):
452 def init_instance_attrs(self):
453 self.jobs = BackgroundJobManager()
453 self.jobs = BackgroundJobManager()
454 self.more = False
454 self.more = False
455
455
456 # command compiler
456 # command compiler
457 self.compile = codeop.CommandCompiler()
457 self.compile = codeop.CommandCompiler()
458
458
459 # User input buffer
459 # User input buffer
460 self.buffer = []
460 self.buffer = []
461
461
462 # Make an empty namespace, which extension writers can rely on both
462 # Make an empty namespace, which extension writers can rely on both
463 # existing and NEVER being used by ipython itself. This gives them a
463 # existing and NEVER being used by ipython itself. This gives them a
464 # convenient location for storing additional information and state
464 # convenient location for storing additional information and state
465 # their extensions may require, without fear of collisions with other
465 # their extensions may require, without fear of collisions with other
466 # ipython names that may develop later.
466 # ipython names that may develop later.
467 self.meta = Struct()
467 self.meta = Struct()
468
468
469 # Object variable to store code object waiting execution. This is
469 # Object variable to store code object waiting execution. This is
470 # used mainly by the multithreaded shells, but it can come in handy in
470 # used mainly by the multithreaded shells, but it can come in handy in
471 # other situations. No need to use a Queue here, since it's a single
471 # other situations. No need to use a Queue here, since it's a single
472 # item which gets cleared once run.
472 # item which gets cleared once run.
473 self.code_to_run = None
473 self.code_to_run = None
474
474
475 # Flag to mark unconditional exit
475 # Flag to mark unconditional exit
476 self.exit_now = False
476 self.exit_now = False
477
477
478 # Temporary files used for various purposes. Deleted at exit.
478 # Temporary files used for various purposes. Deleted at exit.
479 self.tempfiles = []
479 self.tempfiles = []
480
480
481 # Keep track of readline usage (later set by init_readline)
481 # Keep track of readline usage (later set by init_readline)
482 self.has_readline = False
482 self.has_readline = False
483
483
484 # keep track of where we started running (mainly for crash post-mortem)
484 # keep track of where we started running (mainly for crash post-mortem)
485 # This is not being used anywhere currently.
485 # This is not being used anywhere currently.
486 self.starting_dir = os.getcwd()
486 self.starting_dir = os.getcwd()
487
487
488 # Indentation management
488 # Indentation management
489 self.indent_current_nsp = 0
489 self.indent_current_nsp = 0
490
490
491 def init_term_title(self):
491 def init_term_title(self):
492 # Enable or disable the terminal title.
492 # Enable or disable the terminal title.
493 if self.term_title:
493 if self.term_title:
494 toggle_set_term_title(True)
494 toggle_set_term_title(True)
495 set_term_title('IPython: ' + abbrev_cwd())
495 set_term_title('IPython: ' + abbrev_cwd())
496 else:
496 else:
497 toggle_set_term_title(False)
497 toggle_set_term_title(False)
498
498
499 def init_usage(self, usage=None):
499 def init_usage(self, usage=None):
500 if usage is None:
500 if usage is None:
501 self.usage = interactive_usage
501 self.usage = interactive_usage
502 else:
502 else:
503 self.usage = usage
503 self.usage = usage
504
504
505 def init_encoding(self):
505 def init_encoding(self):
506 # Get system encoding at startup time. Certain terminals (like Emacs
506 # Get system encoding at startup time. Certain terminals (like Emacs
507 # under Win32 have it set to None, and we need to have a known valid
507 # under Win32 have it set to None, and we need to have a known valid
508 # encoding to use in the raw_input() method
508 # encoding to use in the raw_input() method
509 try:
509 try:
510 self.stdin_encoding = sys.stdin.encoding or 'ascii'
510 self.stdin_encoding = sys.stdin.encoding or 'ascii'
511 except AttributeError:
511 except AttributeError:
512 self.stdin_encoding = 'ascii'
512 self.stdin_encoding = 'ascii'
513
513
514 def init_syntax_highlighting(self):
514 def init_syntax_highlighting(self):
515 # Python source parser/formatter for syntax highlighting
515 # Python source parser/formatter for syntax highlighting
516 pyformat = PyColorize.Parser().format
516 pyformat = PyColorize.Parser().format
517 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
517 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
518
518
519 def init_pushd_popd_magic(self):
519 def init_pushd_popd_magic(self):
520 # for pushd/popd management
520 # for pushd/popd management
521 try:
521 try:
522 self.home_dir = get_home_dir()
522 self.home_dir = get_home_dir()
523 except HomeDirError, msg:
523 except HomeDirError, msg:
524 fatal(msg)
524 fatal(msg)
525
525
526 self.dir_stack = []
526 self.dir_stack = []
527
527
528 def init_logger(self):
528 def init_logger(self):
529 self.logger = Logger(self, logfname='ipython_log.py', logmode='rotate')
529 self.logger = Logger(self, logfname='ipython_log.py', logmode='rotate')
530 # local shortcut, this is used a LOT
530 # local shortcut, this is used a LOT
531 self.log = self.logger.log
531 self.log = self.logger.log
532
532
533 def init_logstart(self):
533 def init_logstart(self):
534 if self.logappend:
534 if self.logappend:
535 self.magic_logstart(self.logappend + ' append')
535 self.magic_logstart(self.logappend + ' append')
536 elif self.logfile:
536 elif self.logfile:
537 self.magic_logstart(self.logfile)
537 self.magic_logstart(self.logfile)
538 elif self.logstart:
538 elif self.logstart:
539 self.magic_logstart()
539 self.magic_logstart()
540
540
541 def init_builtins(self):
541 def init_builtins(self):
542 self.builtin_trap = BuiltinTrap(self)
542 self.builtin_trap = BuiltinTrap(self)
543
543
544 def init_inspector(self):
544 def init_inspector(self):
545 # Object inspector
545 # Object inspector
546 self.inspector = oinspect.Inspector(oinspect.InspectColors,
546 self.inspector = oinspect.Inspector(oinspect.InspectColors,
547 PyColorize.ANSICodeColors,
547 PyColorize.ANSICodeColors,
548 'NoColor',
548 'NoColor',
549 self.object_info_string_level)
549 self.object_info_string_level)
550
550
551 def init_prompts(self):
551 def init_prompts(self):
552 # Initialize cache, set in/out prompts and printing system
552 # Initialize cache, set in/out prompts and printing system
553 self.outputcache = CachedOutput(self,
553 self.outputcache = CachedOutput(self,
554 self.cache_size,
554 self.cache_size,
555 self.pprint,
555 self.pprint,
556 input_sep = self.separate_in,
556 input_sep = self.separate_in,
557 output_sep = self.separate_out,
557 output_sep = self.separate_out,
558 output_sep2 = self.separate_out2,
558 output_sep2 = self.separate_out2,
559 ps1 = self.prompt_in1,
559 ps1 = self.prompt_in1,
560 ps2 = self.prompt_in2,
560 ps2 = self.prompt_in2,
561 ps_out = self.prompt_out,
561 ps_out = self.prompt_out,
562 pad_left = self.prompts_pad_left)
562 pad_left = self.prompts_pad_left)
563
563
564 # user may have over-ridden the default print hook:
564 # user may have over-ridden the default print hook:
565 try:
565 try:
566 self.outputcache.__class__.display = self.hooks.display
566 self.outputcache.__class__.display = self.hooks.display
567 except AttributeError:
567 except AttributeError:
568 pass
568 pass
569
569
570 def init_displayhook(self):
570 def init_displayhook(self):
571 self.display_trap = DisplayTrap(self, self.outputcache)
571 self.display_trap = DisplayTrap(self, self.outputcache)
572
572
573 def init_reload_doctest(self):
573 def init_reload_doctest(self):
574 # Do a proper resetting of doctest, including the necessary displayhook
574 # Do a proper resetting of doctest, including the necessary displayhook
575 # monkeypatching
575 # monkeypatching
576 try:
576 try:
577 doctest_reload()
577 doctest_reload()
578 except ImportError:
578 except ImportError:
579 warn("doctest module does not exist.")
579 warn("doctest module does not exist.")
580
580
581 #-------------------------------------------------------------------------
581 #-------------------------------------------------------------------------
582 # Things related to the banner
582 # Things related to the banner
583 #-------------------------------------------------------------------------
583 #-------------------------------------------------------------------------
584
584
585 def init_banner(self, banner1, banner2, display_banner):
585 def init_banner(self, banner1, banner2, display_banner):
586 if banner1 is not None:
586 if banner1 is not None:
587 self.banner1 = banner1
587 self.banner1 = banner1
588 if banner2 is not None:
588 if banner2 is not None:
589 self.banner2 = banner2
589 self.banner2 = banner2
590 if display_banner is not None:
590 if display_banner is not None:
591 self.display_banner = display_banner
591 self.display_banner = display_banner
592 self.compute_banner()
592 self.compute_banner()
593
593
594 def show_banner(self, banner=None):
594 def show_banner(self, banner=None):
595 if banner is None:
595 if banner is None:
596 banner = self.banner
596 banner = self.banner
597 self.write(banner)
597 self.write(banner)
598
598
599 def compute_banner(self):
599 def compute_banner(self):
600 self.banner = self.banner1 + '\n'
600 self.banner = self.banner1 + '\n'
601 if self.profile:
601 if self.profile:
602 self.banner += '\nIPython profile: %s\n' % self.profile
602 self.banner += '\nIPython profile: %s\n' % self.profile
603 if self.banner2:
603 if self.banner2:
604 self.banner += '\n' + self.banner2 + '\n'
604 self.banner += '\n' + self.banner2 + '\n'
605
605
606 #-------------------------------------------------------------------------
606 #-------------------------------------------------------------------------
607 # Things related to injections into the sys module
607 # Things related to injections into the sys module
608 #-------------------------------------------------------------------------
608 #-------------------------------------------------------------------------
609
609
610 def save_sys_module_state(self):
610 def save_sys_module_state(self):
611 """Save the state of hooks in the sys module.
611 """Save the state of hooks in the sys module.
612
612
613 This has to be called after self.user_ns is created.
613 This has to be called after self.user_ns is created.
614 """
614 """
615 self._orig_sys_module_state = {}
615 self._orig_sys_module_state = {}
616 self._orig_sys_module_state['stdin'] = sys.stdin
616 self._orig_sys_module_state['stdin'] = sys.stdin
617 self._orig_sys_module_state['stdout'] = sys.stdout
617 self._orig_sys_module_state['stdout'] = sys.stdout
618 self._orig_sys_module_state['stderr'] = sys.stderr
618 self._orig_sys_module_state['stderr'] = sys.stderr
619 self._orig_sys_module_state['excepthook'] = sys.excepthook
619 self._orig_sys_module_state['excepthook'] = sys.excepthook
620 try:
620 try:
621 self._orig_sys_modules_main_name = self.user_ns['__name__']
621 self._orig_sys_modules_main_name = self.user_ns['__name__']
622 except KeyError:
622 except KeyError:
623 pass
623 pass
624
624
625 def restore_sys_module_state(self):
625 def restore_sys_module_state(self):
626 """Restore the state of the sys module."""
626 """Restore the state of the sys module."""
627 try:
627 try:
628 for k, v in self._orig_sys_module_state.items():
628 for k, v in self._orig_sys_module_state.items():
629 setattr(sys, k, v)
629 setattr(sys, k, v)
630 except AttributeError:
630 except AttributeError:
631 pass
631 pass
632 try:
632 try:
633 delattr(sys, 'ipcompleter')
633 delattr(sys, 'ipcompleter')
634 except AttributeError:
634 except AttributeError:
635 pass
635 pass
636 # Reset what what done in self.init_sys_modules
636 # Reset what what done in self.init_sys_modules
637 try:
637 try:
638 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
638 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
639 except (AttributeError, KeyError):
639 except (AttributeError, KeyError):
640 pass
640 pass
641
641
642 #-------------------------------------------------------------------------
642 #-------------------------------------------------------------------------
643 # Things related to hooks
643 # Things related to hooks
644 #-------------------------------------------------------------------------
644 #-------------------------------------------------------------------------
645
645
646 def init_hooks(self):
646 def init_hooks(self):
647 # hooks holds pointers used for user-side customizations
647 # hooks holds pointers used for user-side customizations
648 self.hooks = Struct()
648 self.hooks = Struct()
649
649
650 self.strdispatchers = {}
650 self.strdispatchers = {}
651
651
652 # Set all default hooks, defined in the IPython.hooks module.
652 # Set all default hooks, defined in the IPython.hooks module.
653 import IPython.core.hooks
653 import IPython.core.hooks
654 hooks = IPython.core.hooks
654 hooks = IPython.core.hooks
655 for hook_name in hooks.__all__:
655 for hook_name in hooks.__all__:
656 # default hooks have priority 100, i.e. low; user hooks should have
656 # default hooks have priority 100, i.e. low; user hooks should have
657 # 0-100 priority
657 # 0-100 priority
658 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
658 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
659
659
660 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
660 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
661 """set_hook(name,hook) -> sets an internal IPython hook.
661 """set_hook(name,hook) -> sets an internal IPython hook.
662
662
663 IPython exposes some of its internal API as user-modifiable hooks. By
663 IPython exposes some of its internal API as user-modifiable hooks. By
664 adding your function to one of these hooks, you can modify IPython's
664 adding your function to one of these hooks, you can modify IPython's
665 behavior to call at runtime your own routines."""
665 behavior to call at runtime your own routines."""
666
666
667 # At some point in the future, this should validate the hook before it
667 # At some point in the future, this should validate the hook before it
668 # accepts it. Probably at least check that the hook takes the number
668 # accepts it. Probably at least check that the hook takes the number
669 # of args it's supposed to.
669 # of args it's supposed to.
670
670
671 f = new.instancemethod(hook,self,self.__class__)
671 f = new.instancemethod(hook,self,self.__class__)
672
672
673 # check if the hook is for strdispatcher first
673 # check if the hook is for strdispatcher first
674 if str_key is not None:
674 if str_key is not None:
675 sdp = self.strdispatchers.get(name, StrDispatch())
675 sdp = self.strdispatchers.get(name, StrDispatch())
676 sdp.add_s(str_key, f, priority )
676 sdp.add_s(str_key, f, priority )
677 self.strdispatchers[name] = sdp
677 self.strdispatchers[name] = sdp
678 return
678 return
679 if re_key is not None:
679 if re_key is not None:
680 sdp = self.strdispatchers.get(name, StrDispatch())
680 sdp = self.strdispatchers.get(name, StrDispatch())
681 sdp.add_re(re.compile(re_key), f, priority )
681 sdp.add_re(re.compile(re_key), f, priority )
682 self.strdispatchers[name] = sdp
682 self.strdispatchers[name] = sdp
683 return
683 return
684
684
685 dp = getattr(self.hooks, name, None)
685 dp = getattr(self.hooks, name, None)
686 if name not in IPython.core.hooks.__all__:
686 if name not in IPython.core.hooks.__all__:
687 print "Warning! Hook '%s' is not one of %s" % (name, IPython.core.hooks.__all__ )
687 print "Warning! Hook '%s' is not one of %s" % (name, IPython.core.hooks.__all__ )
688 if not dp:
688 if not dp:
689 dp = IPython.core.hooks.CommandChainDispatcher()
689 dp = IPython.core.hooks.CommandChainDispatcher()
690
690
691 try:
691 try:
692 dp.add(f,priority)
692 dp.add(f,priority)
693 except AttributeError:
693 except AttributeError:
694 # it was not commandchain, plain old func - replace
694 # it was not commandchain, plain old func - replace
695 dp = f
695 dp = f
696
696
697 setattr(self.hooks,name, dp)
697 setattr(self.hooks,name, dp)
698
698
699 #-------------------------------------------------------------------------
699 #-------------------------------------------------------------------------
700 # Things related to the "main" module
700 # Things related to the "main" module
701 #-------------------------------------------------------------------------
701 #-------------------------------------------------------------------------
702
702
703 def new_main_mod(self,ns=None):
703 def new_main_mod(self,ns=None):
704 """Return a new 'main' module object for user code execution.
704 """Return a new 'main' module object for user code execution.
705 """
705 """
706 main_mod = self._user_main_module
706 main_mod = self._user_main_module
707 init_fakemod_dict(main_mod,ns)
707 init_fakemod_dict(main_mod,ns)
708 return main_mod
708 return main_mod
709
709
710 def cache_main_mod(self,ns,fname):
710 def cache_main_mod(self,ns,fname):
711 """Cache a main module's namespace.
711 """Cache a main module's namespace.
712
712
713 When scripts are executed via %run, we must keep a reference to the
713 When scripts are executed via %run, we must keep a reference to the
714 namespace of their __main__ module (a FakeModule instance) around so
714 namespace of their __main__ module (a FakeModule instance) around so
715 that Python doesn't clear it, rendering objects defined therein
715 that Python doesn't clear it, rendering objects defined therein
716 useless.
716 useless.
717
717
718 This method keeps said reference in a private dict, keyed by the
718 This method keeps said reference in a private dict, keyed by the
719 absolute path of the module object (which corresponds to the script
719 absolute path of the module object (which corresponds to the script
720 path). This way, for multiple executions of the same script we only
720 path). This way, for multiple executions of the same script we only
721 keep one copy of the namespace (the last one), thus preventing memory
721 keep one copy of the namespace (the last one), thus preventing memory
722 leaks from old references while allowing the objects from the last
722 leaks from old references while allowing the objects from the last
723 execution to be accessible.
723 execution to be accessible.
724
724
725 Note: we can not allow the actual FakeModule instances to be deleted,
725 Note: we can not allow the actual FakeModule instances to be deleted,
726 because of how Python tears down modules (it hard-sets all their
726 because of how Python tears down modules (it hard-sets all their
727 references to None without regard for reference counts). This method
727 references to None without regard for reference counts). This method
728 must therefore make a *copy* of the given namespace, to allow the
728 must therefore make a *copy* of the given namespace, to allow the
729 original module's __dict__ to be cleared and reused.
729 original module's __dict__ to be cleared and reused.
730
730
731
731
732 Parameters
732 Parameters
733 ----------
733 ----------
734 ns : a namespace (a dict, typically)
734 ns : a namespace (a dict, typically)
735
735
736 fname : str
736 fname : str
737 Filename associated with the namespace.
737 Filename associated with the namespace.
738
738
739 Examples
739 Examples
740 --------
740 --------
741
741
742 In [10]: import IPython
742 In [10]: import IPython
743
743
744 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
744 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
745
745
746 In [12]: IPython.__file__ in _ip._main_ns_cache
746 In [12]: IPython.__file__ in _ip._main_ns_cache
747 Out[12]: True
747 Out[12]: True
748 """
748 """
749 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
749 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
750
750
751 def clear_main_mod_cache(self):
751 def clear_main_mod_cache(self):
752 """Clear the cache of main modules.
752 """Clear the cache of main modules.
753
753
754 Mainly for use by utilities like %reset.
754 Mainly for use by utilities like %reset.
755
755
756 Examples
756 Examples
757 --------
757 --------
758
758
759 In [15]: import IPython
759 In [15]: import IPython
760
760
761 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
761 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
762
762
763 In [17]: len(_ip._main_ns_cache) > 0
763 In [17]: len(_ip._main_ns_cache) > 0
764 Out[17]: True
764 Out[17]: True
765
765
766 In [18]: _ip.clear_main_mod_cache()
766 In [18]: _ip.clear_main_mod_cache()
767
767
768 In [19]: len(_ip._main_ns_cache) == 0
768 In [19]: len(_ip._main_ns_cache) == 0
769 Out[19]: True
769 Out[19]: True
770 """
770 """
771 self._main_ns_cache.clear()
771 self._main_ns_cache.clear()
772
772
773 #-------------------------------------------------------------------------
773 #-------------------------------------------------------------------------
774 # Things related to debugging
774 # Things related to debugging
775 #-------------------------------------------------------------------------
775 #-------------------------------------------------------------------------
776
776
777 def init_pdb(self):
777 def init_pdb(self):
778 # Set calling of pdb on exceptions
778 # Set calling of pdb on exceptions
779 # self.call_pdb is a property
779 # self.call_pdb is a property
780 self.call_pdb = self.pdb
780 self.call_pdb = self.pdb
781
781
782 def _get_call_pdb(self):
782 def _get_call_pdb(self):
783 return self._call_pdb
783 return self._call_pdb
784
784
785 def _set_call_pdb(self,val):
785 def _set_call_pdb(self,val):
786
786
787 if val not in (0,1,False,True):
787 if val not in (0,1,False,True):
788 raise ValueError,'new call_pdb value must be boolean'
788 raise ValueError,'new call_pdb value must be boolean'
789
789
790 # store value in instance
790 # store value in instance
791 self._call_pdb = val
791 self._call_pdb = val
792
792
793 # notify the actual exception handlers
793 # notify the actual exception handlers
794 self.InteractiveTB.call_pdb = val
794 self.InteractiveTB.call_pdb = val
795 if self.isthreaded:
795 if self.isthreaded:
796 try:
796 try:
797 self.sys_excepthook.call_pdb = val
797 self.sys_excepthook.call_pdb = val
798 except:
798 except:
799 warn('Failed to activate pdb for threaded exception handler')
799 warn('Failed to activate pdb for threaded exception handler')
800
800
801 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
801 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
802 'Control auto-activation of pdb at exceptions')
802 'Control auto-activation of pdb at exceptions')
803
803
804 def debugger(self,force=False):
804 def debugger(self,force=False):
805 """Call the pydb/pdb debugger.
805 """Call the pydb/pdb debugger.
806
806
807 Keywords:
807 Keywords:
808
808
809 - force(False): by default, this routine checks the instance call_pdb
809 - force(False): by default, this routine checks the instance call_pdb
810 flag and does not actually invoke the debugger if the flag is false.
810 flag and does not actually invoke the debugger if the flag is false.
811 The 'force' option forces the debugger to activate even if the flag
811 The 'force' option forces the debugger to activate even if the flag
812 is false.
812 is false.
813 """
813 """
814
814
815 if not (force or self.call_pdb):
815 if not (force or self.call_pdb):
816 return
816 return
817
817
818 if not hasattr(sys,'last_traceback'):
818 if not hasattr(sys,'last_traceback'):
819 error('No traceback has been produced, nothing to debug.')
819 error('No traceback has been produced, nothing to debug.')
820 return
820 return
821
821
822 # use pydb if available
822 # use pydb if available
823 if debugger.has_pydb:
823 if debugger.has_pydb:
824 from pydb import pm
824 from pydb import pm
825 else:
825 else:
826 # fallback to our internal debugger
826 # fallback to our internal debugger
827 pm = lambda : self.InteractiveTB.debugger(force=True)
827 pm = lambda : self.InteractiveTB.debugger(force=True)
828 self.history_saving_wrapper(pm)()
828 self.history_saving_wrapper(pm)()
829
829
830 #-------------------------------------------------------------------------
830 #-------------------------------------------------------------------------
831 # Things related to IPython's various namespaces
831 # Things related to IPython's various namespaces
832 #-------------------------------------------------------------------------
832 #-------------------------------------------------------------------------
833
833
834 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
834 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
835 # Create the namespace where the user will operate. user_ns is
835 # Create the namespace where the user will operate. user_ns is
836 # normally the only one used, and it is passed to the exec calls as
836 # normally the only one used, and it is passed to the exec calls as
837 # the locals argument. But we do carry a user_global_ns namespace
837 # the locals argument. But we do carry a user_global_ns namespace
838 # given as the exec 'globals' argument, This is useful in embedding
838 # given as the exec 'globals' argument, This is useful in embedding
839 # situations where the ipython shell opens in a context where the
839 # situations where the ipython shell opens in a context where the
840 # distinction between locals and globals is meaningful. For
840 # distinction between locals and globals is meaningful. For
841 # non-embedded contexts, it is just the same object as the user_ns dict.
841 # non-embedded contexts, it is just the same object as the user_ns dict.
842
842
843 # FIXME. For some strange reason, __builtins__ is showing up at user
843 # FIXME. For some strange reason, __builtins__ is showing up at user
844 # level as a dict instead of a module. This is a manual fix, but I
844 # level as a dict instead of a module. This is a manual fix, but I
845 # should really track down where the problem is coming from. Alex
845 # should really track down where the problem is coming from. Alex
846 # Schmolck reported this problem first.
846 # Schmolck reported this problem first.
847
847
848 # A useful post by Alex Martelli on this topic:
848 # A useful post by Alex Martelli on this topic:
849 # Re: inconsistent value from __builtins__
849 # Re: inconsistent value from __builtins__
850 # Von: Alex Martelli <aleaxit@yahoo.com>
850 # Von: Alex Martelli <aleaxit@yahoo.com>
851 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
851 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
852 # Gruppen: comp.lang.python
852 # Gruppen: comp.lang.python
853
853
854 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
854 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
855 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
855 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
856 # > <type 'dict'>
856 # > <type 'dict'>
857 # > >>> print type(__builtins__)
857 # > >>> print type(__builtins__)
858 # > <type 'module'>
858 # > <type 'module'>
859 # > Is this difference in return value intentional?
859 # > Is this difference in return value intentional?
860
860
861 # Well, it's documented that '__builtins__' can be either a dictionary
861 # Well, it's documented that '__builtins__' can be either a dictionary
862 # or a module, and it's been that way for a long time. Whether it's
862 # or a module, and it's been that way for a long time. Whether it's
863 # intentional (or sensible), I don't know. In any case, the idea is
863 # intentional (or sensible), I don't know. In any case, the idea is
864 # that if you need to access the built-in namespace directly, you
864 # that if you need to access the built-in namespace directly, you
865 # should start with "import __builtin__" (note, no 's') which will
865 # should start with "import __builtin__" (note, no 's') which will
866 # definitely give you a module. Yeah, it's somewhat confusing:-(.
866 # definitely give you a module. Yeah, it's somewhat confusing:-(.
867
867
868 # These routines return properly built dicts as needed by the rest of
868 # These routines return properly built dicts as needed by the rest of
869 # the code, and can also be used by extension writers to generate
869 # the code, and can also be used by extension writers to generate
870 # properly initialized namespaces.
870 # properly initialized namespaces.
871 user_ns, user_global_ns = make_user_namespaces(user_ns, user_global_ns)
871 user_ns, user_global_ns = make_user_namespaces(user_ns, user_global_ns)
872
872
873 # Assign namespaces
873 # Assign namespaces
874 # This is the namespace where all normal user variables live
874 # This is the namespace where all normal user variables live
875 self.user_ns = user_ns
875 self.user_ns = user_ns
876 self.user_global_ns = user_global_ns
876 self.user_global_ns = user_global_ns
877
877
878 # An auxiliary namespace that checks what parts of the user_ns were
878 # An auxiliary namespace that checks what parts of the user_ns were
879 # loaded at startup, so we can list later only variables defined in
879 # loaded at startup, so we can list later only variables defined in
880 # actual interactive use. Since it is always a subset of user_ns, it
880 # actual interactive use. Since it is always a subset of user_ns, it
881 # doesn't need to be separately tracked in the ns_table.
881 # doesn't need to be separately tracked in the ns_table.
882 self.user_config_ns = {}
882 self.user_config_ns = {}
883
883
884 # A namespace to keep track of internal data structures to prevent
884 # A namespace to keep track of internal data structures to prevent
885 # them from cluttering user-visible stuff. Will be updated later
885 # them from cluttering user-visible stuff. Will be updated later
886 self.internal_ns = {}
886 self.internal_ns = {}
887
887
888 # Now that FakeModule produces a real module, we've run into a nasty
888 # Now that FakeModule produces a real module, we've run into a nasty
889 # problem: after script execution (via %run), the module where the user
889 # problem: after script execution (via %run), the module where the user
890 # code ran is deleted. Now that this object is a true module (needed
890 # code ran is deleted. Now that this object is a true module (needed
891 # so docetst and other tools work correctly), the Python module
891 # so docetst and other tools work correctly), the Python module
892 # teardown mechanism runs over it, and sets to None every variable
892 # teardown mechanism runs over it, and sets to None every variable
893 # present in that module. Top-level references to objects from the
893 # present in that module. Top-level references to objects from the
894 # script survive, because the user_ns is updated with them. However,
894 # script survive, because the user_ns is updated with them. However,
895 # calling functions defined in the script that use other things from
895 # calling functions defined in the script that use other things from
896 # the script will fail, because the function's closure had references
896 # the script will fail, because the function's closure had references
897 # to the original objects, which are now all None. So we must protect
897 # to the original objects, which are now all None. So we must protect
898 # these modules from deletion by keeping a cache.
898 # these modules from deletion by keeping a cache.
899 #
899 #
900 # To avoid keeping stale modules around (we only need the one from the
900 # To avoid keeping stale modules around (we only need the one from the
901 # last run), we use a dict keyed with the full path to the script, so
901 # last run), we use a dict keyed with the full path to the script, so
902 # only the last version of the module is held in the cache. Note,
902 # only the last version of the module is held in the cache. Note,
903 # however, that we must cache the module *namespace contents* (their
903 # however, that we must cache the module *namespace contents* (their
904 # __dict__). Because if we try to cache the actual modules, old ones
904 # __dict__). Because if we try to cache the actual modules, old ones
905 # (uncached) could be destroyed while still holding references (such as
905 # (uncached) could be destroyed while still holding references (such as
906 # those held by GUI objects that tend to be long-lived)>
906 # those held by GUI objects that tend to be long-lived)>
907 #
907 #
908 # The %reset command will flush this cache. See the cache_main_mod()
908 # The %reset command will flush this cache. See the cache_main_mod()
909 # and clear_main_mod_cache() methods for details on use.
909 # and clear_main_mod_cache() methods for details on use.
910
910
911 # This is the cache used for 'main' namespaces
911 # This is the cache used for 'main' namespaces
912 self._main_ns_cache = {}
912 self._main_ns_cache = {}
913 # And this is the single instance of FakeModule whose __dict__ we keep
913 # And this is the single instance of FakeModule whose __dict__ we keep
914 # copying and clearing for reuse on each %run
914 # copying and clearing for reuse on each %run
915 self._user_main_module = FakeModule()
915 self._user_main_module = FakeModule()
916
916
917 # A table holding all the namespaces IPython deals with, so that
917 # A table holding all the namespaces IPython deals with, so that
918 # introspection facilities can search easily.
918 # introspection facilities can search easily.
919 self.ns_table = {'user':user_ns,
919 self.ns_table = {'user':user_ns,
920 'user_global':user_global_ns,
920 'user_global':user_global_ns,
921 'internal':self.internal_ns,
921 'internal':self.internal_ns,
922 'builtin':__builtin__.__dict__
922 'builtin':__builtin__.__dict__
923 }
923 }
924
924
925 # Similarly, track all namespaces where references can be held and that
925 # Similarly, track all namespaces where references can be held and that
926 # we can safely clear (so it can NOT include builtin). This one can be
926 # we can safely clear (so it can NOT include builtin). This one can be
927 # a simple list.
927 # a simple list.
928 self.ns_refs_table = [ user_ns, user_global_ns, self.user_config_ns,
928 self.ns_refs_table = [ user_ns, user_global_ns, self.user_config_ns,
929 self.internal_ns, self._main_ns_cache ]
929 self.internal_ns, self._main_ns_cache ]
930
930
931 def init_sys_modules(self):
931 def init_sys_modules(self):
932 # We need to insert into sys.modules something that looks like a
932 # We need to insert into sys.modules something that looks like a
933 # module but which accesses the IPython namespace, for shelve and
933 # module but which accesses the IPython namespace, for shelve and
934 # pickle to work interactively. Normally they rely on getting
934 # pickle to work interactively. Normally they rely on getting
935 # everything out of __main__, but for embedding purposes each IPython
935 # everything out of __main__, but for embedding purposes each IPython
936 # instance has its own private namespace, so we can't go shoving
936 # instance has its own private namespace, so we can't go shoving
937 # everything into __main__.
937 # everything into __main__.
938
938
939 # note, however, that we should only do this for non-embedded
939 # note, however, that we should only do this for non-embedded
940 # ipythons, which really mimic the __main__.__dict__ with their own
940 # ipythons, which really mimic the __main__.__dict__ with their own
941 # namespace. Embedded instances, on the other hand, should not do
941 # namespace. Embedded instances, on the other hand, should not do
942 # this because they need to manage the user local/global namespaces
942 # this because they need to manage the user local/global namespaces
943 # only, but they live within a 'normal' __main__ (meaning, they
943 # only, but they live within a 'normal' __main__ (meaning, they
944 # shouldn't overtake the execution environment of the script they're
944 # shouldn't overtake the execution environment of the script they're
945 # embedded in).
945 # embedded in).
946
946
947 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
947 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
948
948
949 try:
949 try:
950 main_name = self.user_ns['__name__']
950 main_name = self.user_ns['__name__']
951 except KeyError:
951 except KeyError:
952 raise KeyError('user_ns dictionary MUST have a "__name__" key')
952 raise KeyError('user_ns dictionary MUST have a "__name__" key')
953 else:
953 else:
954 sys.modules[main_name] = FakeModule(self.user_ns)
954 sys.modules[main_name] = FakeModule(self.user_ns)
955
955
956 def init_user_ns(self):
956 def init_user_ns(self):
957 """Initialize all user-visible namespaces to their minimum defaults.
957 """Initialize all user-visible namespaces to their minimum defaults.
958
958
959 Certain history lists are also initialized here, as they effectively
959 Certain history lists are also initialized here, as they effectively
960 act as user namespaces.
960 act as user namespaces.
961
961
962 Notes
962 Notes
963 -----
963 -----
964 All data structures here are only filled in, they are NOT reset by this
964 All data structures here are only filled in, they are NOT reset by this
965 method. If they were not empty before, data will simply be added to
965 method. If they were not empty before, data will simply be added to
966 therm.
966 therm.
967 """
967 """
968 # This function works in two parts: first we put a few things in
968 # This function works in two parts: first we put a few things in
969 # user_ns, and we sync that contents into user_config_ns so that these
969 # user_ns, and we sync that contents into user_config_ns so that these
970 # initial variables aren't shown by %who. After the sync, we add the
970 # initial variables aren't shown by %who. After the sync, we add the
971 # rest of what we *do* want the user to see with %who even on a new
971 # rest of what we *do* want the user to see with %who even on a new
972 # session.
972 # session.
973 ns = {}
973 ns = {}
974
974
975 # Put 'help' in the user namespace
975 # Put 'help' in the user namespace
976 try:
976 try:
977 from site import _Helper
977 from site import _Helper
978 ns['help'] = _Helper()
978 ns['help'] = _Helper()
979 except ImportError:
979 except ImportError:
980 warn('help() not available - check site.py')
980 warn('help() not available - check site.py')
981
981
982 # make global variables for user access to the histories
982 # make global variables for user access to the histories
983 ns['_ih'] = self.input_hist
983 ns['_ih'] = self.input_hist
984 ns['_oh'] = self.output_hist
984 ns['_oh'] = self.output_hist
985 ns['_dh'] = self.dir_hist
985 ns['_dh'] = self.dir_hist
986
986
987 ns['_sh'] = shadowns
987 ns['_sh'] = shadowns
988
988
989 # Sync what we've added so far to user_config_ns so these aren't seen
989 # Sync what we've added so far to user_config_ns so these aren't seen
990 # by %who
990 # by %who
991 self.user_config_ns.update(ns)
991 self.user_config_ns.update(ns)
992
992
993 # Now, continue adding more contents
993 # Now, continue adding more contents
994
994
995 # user aliases to input and output histories
995 # user aliases to input and output histories
996 ns['In'] = self.input_hist
996 ns['In'] = self.input_hist
997 ns['Out'] = self.output_hist
997 ns['Out'] = self.output_hist
998
998
999 # Store myself as the public api!!!
999 # Store myself as the public api!!!
1000 ns['get_ipython'] = self.get_ipython
1000 ns['get_ipython'] = self.get_ipython
1001
1001
1002 # And update the real user's namespace
1002 # And update the real user's namespace
1003 self.user_ns.update(ns)
1003 self.user_ns.update(ns)
1004
1004
1005
1005
1006 def reset(self):
1006 def reset(self):
1007 """Clear all internal namespaces.
1007 """Clear all internal namespaces.
1008
1008
1009 Note that this is much more aggressive than %reset, since it clears
1009 Note that this is much more aggressive than %reset, since it clears
1010 fully all namespaces, as well as all input/output lists.
1010 fully all namespaces, as well as all input/output lists.
1011 """
1011 """
1012 for ns in self.ns_refs_table:
1012 for ns in self.ns_refs_table:
1013 ns.clear()
1013 ns.clear()
1014
1014
1015 self.alias_manager.clear_aliases()
1015 self.alias_manager.clear_aliases()
1016
1016
1017 # Clear input and output histories
1017 # Clear input and output histories
1018 self.input_hist[:] = []
1018 self.input_hist[:] = []
1019 self.input_hist_raw[:] = []
1019 self.input_hist_raw[:] = []
1020 self.output_hist.clear()
1020 self.output_hist.clear()
1021
1021
1022 # Restore the user namespaces to minimal usability
1022 # Restore the user namespaces to minimal usability
1023 self.init_user_ns()
1023 self.init_user_ns()
1024
1024
1025 # Restore the default and user aliases
1025 # Restore the default and user aliases
1026 self.alias_manager.init_aliases()
1026 self.alias_manager.init_aliases()
1027
1027
1028 def push(self, variables, interactive=True):
1028 def push(self, variables, interactive=True):
1029 """Inject a group of variables into the IPython user namespace.
1029 """Inject a group of variables into the IPython user namespace.
1030
1030
1031 Parameters
1031 Parameters
1032 ----------
1032 ----------
1033 variables : dict, str or list/tuple of str
1033 variables : dict, str or list/tuple of str
1034 The variables to inject into the user's namespace. If a dict,
1034 The variables to inject into the user's namespace. If a dict,
1035 a simple update is done. If a str, the string is assumed to
1035 a simple update is done. If a str, the string is assumed to
1036 have variable names separated by spaces. A list/tuple of str
1036 have variable names separated by spaces. A list/tuple of str
1037 can also be used to give the variable names. If just the variable
1037 can also be used to give the variable names. If just the variable
1038 names are give (list/tuple/str) then the variable values looked
1038 names are give (list/tuple/str) then the variable values looked
1039 up in the callers frame.
1039 up in the callers frame.
1040 interactive : bool
1040 interactive : bool
1041 If True (default), the variables will be listed with the ``who``
1041 If True (default), the variables will be listed with the ``who``
1042 magic.
1042 magic.
1043 """
1043 """
1044 vdict = None
1044 vdict = None
1045
1045
1046 # We need a dict of name/value pairs to do namespace updates.
1046 # We need a dict of name/value pairs to do namespace updates.
1047 if isinstance(variables, dict):
1047 if isinstance(variables, dict):
1048 vdict = variables
1048 vdict = variables
1049 elif isinstance(variables, (basestring, list, tuple)):
1049 elif isinstance(variables, (basestring, list, tuple)):
1050 if isinstance(variables, basestring):
1050 if isinstance(variables, basestring):
1051 vlist = variables.split()
1051 vlist = variables.split()
1052 else:
1052 else:
1053 vlist = variables
1053 vlist = variables
1054 vdict = {}
1054 vdict = {}
1055 cf = sys._getframe(1)
1055 cf = sys._getframe(1)
1056 for name in vlist:
1056 for name in vlist:
1057 try:
1057 try:
1058 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1058 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1059 except:
1059 except:
1060 print ('Could not get variable %s from %s' %
1060 print ('Could not get variable %s from %s' %
1061 (name,cf.f_code.co_name))
1061 (name,cf.f_code.co_name))
1062 else:
1062 else:
1063 raise ValueError('variables must be a dict/str/list/tuple')
1063 raise ValueError('variables must be a dict/str/list/tuple')
1064
1064
1065 # Propagate variables to user namespace
1065 # Propagate variables to user namespace
1066 self.user_ns.update(vdict)
1066 self.user_ns.update(vdict)
1067
1067
1068 # And configure interactive visibility
1068 # And configure interactive visibility
1069 config_ns = self.user_config_ns
1069 config_ns = self.user_config_ns
1070 if interactive:
1070 if interactive:
1071 for name, val in vdict.iteritems():
1071 for name, val in vdict.iteritems():
1072 config_ns.pop(name, None)
1072 config_ns.pop(name, None)
1073 else:
1073 else:
1074 for name,val in vdict.iteritems():
1074 for name,val in vdict.iteritems():
1075 config_ns[name] = val
1075 config_ns[name] = val
1076
1076
1077 #-------------------------------------------------------------------------
1077 #-------------------------------------------------------------------------
1078 # Things related to history management
1078 # Things related to history management
1079 #-------------------------------------------------------------------------
1079 #-------------------------------------------------------------------------
1080
1080
1081 def init_history(self):
1081 def init_history(self):
1082 # List of input with multi-line handling.
1082 # List of input with multi-line handling.
1083 self.input_hist = InputList()
1083 self.input_hist = InputList()
1084 # This one will hold the 'raw' input history, without any
1084 # This one will hold the 'raw' input history, without any
1085 # pre-processing. This will allow users to retrieve the input just as
1085 # pre-processing. This will allow users to retrieve the input just as
1086 # it was exactly typed in by the user, with %hist -r.
1086 # it was exactly typed in by the user, with %hist -r.
1087 self.input_hist_raw = InputList()
1087 self.input_hist_raw = InputList()
1088
1088
1089 # list of visited directories
1089 # list of visited directories
1090 try:
1090 try:
1091 self.dir_hist = [os.getcwd()]
1091 self.dir_hist = [os.getcwd()]
1092 except OSError:
1092 except OSError:
1093 self.dir_hist = []
1093 self.dir_hist = []
1094
1094
1095 # dict of output history
1095 # dict of output history
1096 self.output_hist = {}
1096 self.output_hist = {}
1097
1097
1098 # Now the history file
1098 # Now the history file
1099 if self.profile:
1099 if self.profile:
1100 histfname = 'history-%s' % self.profile
1100 histfname = 'history-%s' % self.profile
1101 else:
1101 else:
1102 histfname = 'history'
1102 histfname = 'history'
1103 self.histfile = os.path.join(self.ipython_dir, histfname)
1103 self.histfile = os.path.join(self.ipython_dir, histfname)
1104
1104
1105 # Fill the history zero entry, user counter starts at 1
1105 # Fill the history zero entry, user counter starts at 1
1106 self.input_hist.append('\n')
1106 self.input_hist.append('\n')
1107 self.input_hist_raw.append('\n')
1107 self.input_hist_raw.append('\n')
1108
1108
1109 def init_shadow_hist(self):
1109 def init_shadow_hist(self):
1110 try:
1110 try:
1111 self.db = pickleshare.PickleShareDB(self.ipython_dir + "/db")
1111 self.db = pickleshare.PickleShareDB(self.ipython_dir + "/db")
1112 except exceptions.UnicodeDecodeError:
1112 except exceptions.UnicodeDecodeError:
1113 print "Your ipython_dir can't be decoded to unicode!"
1113 print "Your ipython_dir can't be decoded to unicode!"
1114 print "Please set HOME environment variable to something that"
1114 print "Please set HOME environment variable to something that"
1115 print r"only has ASCII characters, e.g. c:\home"
1115 print r"only has ASCII characters, e.g. c:\home"
1116 print "Now it is", self.ipython_dir
1116 print "Now it is", self.ipython_dir
1117 sys.exit()
1117 sys.exit()
1118 self.shadowhist = ipcorehist.ShadowHist(self.db)
1118 self.shadowhist = ipcorehist.ShadowHist(self.db)
1119
1119
1120 def savehist(self):
1120 def savehist(self):
1121 """Save input history to a file (via readline library)."""
1121 """Save input history to a file (via readline library)."""
1122
1122
1123 try:
1123 try:
1124 self.readline.write_history_file(self.histfile)
1124 self.readline.write_history_file(self.histfile)
1125 except:
1125 except:
1126 print 'Unable to save IPython command history to file: ' + \
1126 print 'Unable to save IPython command history to file: ' + \
1127 `self.histfile`
1127 `self.histfile`
1128
1128
1129 def reloadhist(self):
1129 def reloadhist(self):
1130 """Reload the input history from disk file."""
1130 """Reload the input history from disk file."""
1131
1131
1132 try:
1132 try:
1133 self.readline.clear_history()
1133 self.readline.clear_history()
1134 self.readline.read_history_file(self.shell.histfile)
1134 self.readline.read_history_file(self.shell.histfile)
1135 except AttributeError:
1135 except AttributeError:
1136 pass
1136 pass
1137
1137
1138 def history_saving_wrapper(self, func):
1138 def history_saving_wrapper(self, func):
1139 """ Wrap func for readline history saving
1139 """ Wrap func for readline history saving
1140
1140
1141 Convert func into callable that saves & restores
1141 Convert func into callable that saves & restores
1142 history around the call """
1142 history around the call """
1143
1143
1144 if not self.has_readline:
1144 if not self.has_readline:
1145 return func
1145 return func
1146
1146
1147 def wrapper():
1147 def wrapper():
1148 self.savehist()
1148 self.savehist()
1149 try:
1149 try:
1150 func()
1150 func()
1151 finally:
1151 finally:
1152 readline.read_history_file(self.histfile)
1152 readline.read_history_file(self.histfile)
1153 return wrapper
1153 return wrapper
1154
1154
1155 #-------------------------------------------------------------------------
1155 #-------------------------------------------------------------------------
1156 # Things related to exception handling and tracebacks (not debugging)
1156 # Things related to exception handling and tracebacks (not debugging)
1157 #-------------------------------------------------------------------------
1157 #-------------------------------------------------------------------------
1158
1158
1159 def init_traceback_handlers(self, custom_exceptions):
1159 def init_traceback_handlers(self, custom_exceptions):
1160 # Syntax error handler.
1160 # Syntax error handler.
1161 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
1161 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
1162
1162
1163 # The interactive one is initialized with an offset, meaning we always
1163 # The interactive one is initialized with an offset, meaning we always
1164 # want to remove the topmost item in the traceback, which is our own
1164 # want to remove the topmost item in the traceback, which is our own
1165 # internal code. Valid modes: ['Plain','Context','Verbose']
1165 # internal code. Valid modes: ['Plain','Context','Verbose']
1166 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1166 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1167 color_scheme='NoColor',
1167 color_scheme='NoColor',
1168 tb_offset = 1)
1168 tb_offset = 1)
1169
1169
1170 # The instance will store a pointer to the system-wide exception hook,
1170 # The instance will store a pointer to the system-wide exception hook,
1171 # so that runtime code (such as magics) can access it. This is because
1171 # so that runtime code (such as magics) can access it. This is because
1172 # during the read-eval loop, it may get temporarily overwritten.
1172 # during the read-eval loop, it may get temporarily overwritten.
1173 self.sys_excepthook = sys.excepthook
1173 self.sys_excepthook = sys.excepthook
1174
1174
1175 # and add any custom exception handlers the user may have specified
1175 # and add any custom exception handlers the user may have specified
1176 self.set_custom_exc(*custom_exceptions)
1176 self.set_custom_exc(*custom_exceptions)
1177
1177
1178 def set_custom_exc(self,exc_tuple,handler):
1178 def set_custom_exc(self,exc_tuple,handler):
1179 """set_custom_exc(exc_tuple,handler)
1179 """set_custom_exc(exc_tuple,handler)
1180
1180
1181 Set a custom exception handler, which will be called if any of the
1181 Set a custom exception handler, which will be called if any of the
1182 exceptions in exc_tuple occur in the mainloop (specifically, in the
1182 exceptions in exc_tuple occur in the mainloop (specifically, in the
1183 runcode() method.
1183 runcode() method.
1184
1184
1185 Inputs:
1185 Inputs:
1186
1186
1187 - exc_tuple: a *tuple* of valid exceptions to call the defined
1187 - exc_tuple: a *tuple* of valid exceptions to call the defined
1188 handler for. It is very important that you use a tuple, and NOT A
1188 handler for. It is very important that you use a tuple, and NOT A
1189 LIST here, because of the way Python's except statement works. If
1189 LIST here, because of the way Python's except statement works. If
1190 you only want to trap a single exception, use a singleton tuple:
1190 you only want to trap a single exception, use a singleton tuple:
1191
1191
1192 exc_tuple == (MyCustomException,)
1192 exc_tuple == (MyCustomException,)
1193
1193
1194 - handler: this must be defined as a function with the following
1194 - handler: this must be defined as a function with the following
1195 basic interface: def my_handler(self,etype,value,tb).
1195 basic interface: def my_handler(self,etype,value,tb).
1196
1196
1197 This will be made into an instance method (via new.instancemethod)
1197 This will be made into an instance method (via new.instancemethod)
1198 of IPython itself, and it will be called if any of the exceptions
1198 of IPython itself, and it will be called if any of the exceptions
1199 listed in the exc_tuple are caught. If the handler is None, an
1199 listed in the exc_tuple are caught. If the handler is None, an
1200 internal basic one is used, which just prints basic info.
1200 internal basic one is used, which just prints basic info.
1201
1201
1202 WARNING: by putting in your own exception handler into IPython's main
1202 WARNING: by putting in your own exception handler into IPython's main
1203 execution loop, you run a very good chance of nasty crashes. This
1203 execution loop, you run a very good chance of nasty crashes. This
1204 facility should only be used if you really know what you are doing."""
1204 facility should only be used if you really know what you are doing."""
1205
1205
1206 assert type(exc_tuple)==type(()) , \
1206 assert type(exc_tuple)==type(()) , \
1207 "The custom exceptions must be given AS A TUPLE."
1207 "The custom exceptions must be given AS A TUPLE."
1208
1208
1209 def dummy_handler(self,etype,value,tb):
1209 def dummy_handler(self,etype,value,tb):
1210 print '*** Simple custom exception handler ***'
1210 print '*** Simple custom exception handler ***'
1211 print 'Exception type :',etype
1211 print 'Exception type :',etype
1212 print 'Exception value:',value
1212 print 'Exception value:',value
1213 print 'Traceback :',tb
1213 print 'Traceback :',tb
1214 print 'Source code :','\n'.join(self.buffer)
1214 print 'Source code :','\n'.join(self.buffer)
1215
1215
1216 if handler is None: handler = dummy_handler
1216 if handler is None: handler = dummy_handler
1217
1217
1218 self.CustomTB = new.instancemethod(handler,self,self.__class__)
1218 self.CustomTB = new.instancemethod(handler,self,self.__class__)
1219 self.custom_exceptions = exc_tuple
1219 self.custom_exceptions = exc_tuple
1220
1220
1221 def excepthook(self, etype, value, tb):
1221 def excepthook(self, etype, value, tb):
1222 """One more defense for GUI apps that call sys.excepthook.
1222 """One more defense for GUI apps that call sys.excepthook.
1223
1223
1224 GUI frameworks like wxPython trap exceptions and call
1224 GUI frameworks like wxPython trap exceptions and call
1225 sys.excepthook themselves. I guess this is a feature that
1225 sys.excepthook themselves. I guess this is a feature that
1226 enables them to keep running after exceptions that would
1226 enables them to keep running after exceptions that would
1227 otherwise kill their mainloop. This is a bother for IPython
1227 otherwise kill their mainloop. This is a bother for IPython
1228 which excepts to catch all of the program exceptions with a try:
1228 which excepts to catch all of the program exceptions with a try:
1229 except: statement.
1229 except: statement.
1230
1230
1231 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1231 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1232 any app directly invokes sys.excepthook, it will look to the user like
1232 any app directly invokes sys.excepthook, it will look to the user like
1233 IPython crashed. In order to work around this, we can disable the
1233 IPython crashed. In order to work around this, we can disable the
1234 CrashHandler and replace it with this excepthook instead, which prints a
1234 CrashHandler and replace it with this excepthook instead, which prints a
1235 regular traceback using our InteractiveTB. In this fashion, apps which
1235 regular traceback using our InteractiveTB. In this fashion, apps which
1236 call sys.excepthook will generate a regular-looking exception from
1236 call sys.excepthook will generate a regular-looking exception from
1237 IPython, and the CrashHandler will only be triggered by real IPython
1237 IPython, and the CrashHandler will only be triggered by real IPython
1238 crashes.
1238 crashes.
1239
1239
1240 This hook should be used sparingly, only in places which are not likely
1240 This hook should be used sparingly, only in places which are not likely
1241 to be true IPython errors.
1241 to be true IPython errors.
1242 """
1242 """
1243 self.showtraceback((etype,value,tb),tb_offset=0)
1243 self.showtraceback((etype,value,tb),tb_offset=0)
1244
1244
1245 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1245 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1246 """Display the exception that just occurred.
1246 """Display the exception that just occurred.
1247
1247
1248 If nothing is known about the exception, this is the method which
1248 If nothing is known about the exception, this is the method which
1249 should be used throughout the code for presenting user tracebacks,
1249 should be used throughout the code for presenting user tracebacks,
1250 rather than directly invoking the InteractiveTB object.
1250 rather than directly invoking the InteractiveTB object.
1251
1251
1252 A specific showsyntaxerror() also exists, but this method can take
1252 A specific showsyntaxerror() also exists, but this method can take
1253 care of calling it if needed, so unless you are explicitly catching a
1253 care of calling it if needed, so unless you are explicitly catching a
1254 SyntaxError exception, don't try to analyze the stack manually and
1254 SyntaxError exception, don't try to analyze the stack manually and
1255 simply call this method."""
1255 simply call this method."""
1256
1256
1257
1257
1258 # Though this won't be called by syntax errors in the input line,
1258 # Though this won't be called by syntax errors in the input line,
1259 # there may be SyntaxError cases whith imported code.
1259 # there may be SyntaxError cases whith imported code.
1260
1260
1261 try:
1261 try:
1262 if exc_tuple is None:
1262 if exc_tuple is None:
1263 etype, value, tb = sys.exc_info()
1263 etype, value, tb = sys.exc_info()
1264 else:
1264 else:
1265 etype, value, tb = exc_tuple
1265 etype, value, tb = exc_tuple
1266
1266
1267 if etype is SyntaxError:
1267 if etype is SyntaxError:
1268 self.showsyntaxerror(filename)
1268 self.showsyntaxerror(filename)
1269 elif etype is UsageError:
1269 elif etype is UsageError:
1270 print "UsageError:", value
1270 print "UsageError:", value
1271 else:
1271 else:
1272 # WARNING: these variables are somewhat deprecated and not
1272 # WARNING: these variables are somewhat deprecated and not
1273 # necessarily safe to use in a threaded environment, but tools
1273 # necessarily safe to use in a threaded environment, but tools
1274 # like pdb depend on their existence, so let's set them. If we
1274 # like pdb depend on their existence, so let's set them. If we
1275 # find problems in the field, we'll need to revisit their use.
1275 # find problems in the field, we'll need to revisit their use.
1276 sys.last_type = etype
1276 sys.last_type = etype
1277 sys.last_value = value
1277 sys.last_value = value
1278 sys.last_traceback = tb
1278 sys.last_traceback = tb
1279
1279
1280 if etype in self.custom_exceptions:
1280 if etype in self.custom_exceptions:
1281 self.CustomTB(etype,value,tb)
1281 self.CustomTB(etype,value,tb)
1282 else:
1282 else:
1283 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1283 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1284 if self.InteractiveTB.call_pdb:
1284 if self.InteractiveTB.call_pdb:
1285 # pdb mucks up readline, fix it back
1285 # pdb mucks up readline, fix it back
1286 self.set_completer()
1286 self.set_completer()
1287 except KeyboardInterrupt:
1287 except KeyboardInterrupt:
1288 self.write("\nKeyboardInterrupt\n")
1288 self.write("\nKeyboardInterrupt\n")
1289
1289
1290 def showsyntaxerror(self, filename=None):
1290 def showsyntaxerror(self, filename=None):
1291 """Display the syntax error that just occurred.
1291 """Display the syntax error that just occurred.
1292
1292
1293 This doesn't display a stack trace because there isn't one.
1293 This doesn't display a stack trace because there isn't one.
1294
1294
1295 If a filename is given, it is stuffed in the exception instead
1295 If a filename is given, it is stuffed in the exception instead
1296 of what was there before (because Python's parser always uses
1296 of what was there before (because Python's parser always uses
1297 "<string>" when reading from a string).
1297 "<string>" when reading from a string).
1298 """
1298 """
1299 etype, value, last_traceback = sys.exc_info()
1299 etype, value, last_traceback = sys.exc_info()
1300
1300
1301 # See note about these variables in showtraceback() below
1301 # See note about these variables in showtraceback() below
1302 sys.last_type = etype
1302 sys.last_type = etype
1303 sys.last_value = value
1303 sys.last_value = value
1304 sys.last_traceback = last_traceback
1304 sys.last_traceback = last_traceback
1305
1305
1306 if filename and etype is SyntaxError:
1306 if filename and etype is SyntaxError:
1307 # Work hard to stuff the correct filename in the exception
1307 # Work hard to stuff the correct filename in the exception
1308 try:
1308 try:
1309 msg, (dummy_filename, lineno, offset, line) = value
1309 msg, (dummy_filename, lineno, offset, line) = value
1310 except:
1310 except:
1311 # Not the format we expect; leave it alone
1311 # Not the format we expect; leave it alone
1312 pass
1312 pass
1313 else:
1313 else:
1314 # Stuff in the right filename
1314 # Stuff in the right filename
1315 try:
1315 try:
1316 # Assume SyntaxError is a class exception
1316 # Assume SyntaxError is a class exception
1317 value = SyntaxError(msg, (filename, lineno, offset, line))
1317 value = SyntaxError(msg, (filename, lineno, offset, line))
1318 except:
1318 except:
1319 # If that failed, assume SyntaxError is a string
1319 # If that failed, assume SyntaxError is a string
1320 value = msg, (filename, lineno, offset, line)
1320 value = msg, (filename, lineno, offset, line)
1321 self.SyntaxTB(etype,value,[])
1321 self.SyntaxTB(etype,value,[])
1322
1322
1323 def edit_syntax_error(self):
1323 def edit_syntax_error(self):
1324 """The bottom half of the syntax error handler called in the main loop.
1324 """The bottom half of the syntax error handler called in the main loop.
1325
1325
1326 Loop until syntax error is fixed or user cancels.
1326 Loop until syntax error is fixed or user cancels.
1327 """
1327 """
1328
1328
1329 while self.SyntaxTB.last_syntax_error:
1329 while self.SyntaxTB.last_syntax_error:
1330 # copy and clear last_syntax_error
1330 # copy and clear last_syntax_error
1331 err = self.SyntaxTB.clear_err_state()
1331 err = self.SyntaxTB.clear_err_state()
1332 if not self._should_recompile(err):
1332 if not self._should_recompile(err):
1333 return
1333 return
1334 try:
1334 try:
1335 # may set last_syntax_error again if a SyntaxError is raised
1335 # may set last_syntax_error again if a SyntaxError is raised
1336 self.safe_execfile(err.filename,self.user_ns)
1336 self.safe_execfile(err.filename,self.user_ns)
1337 except:
1337 except:
1338 self.showtraceback()
1338 self.showtraceback()
1339 else:
1339 else:
1340 try:
1340 try:
1341 f = file(err.filename)
1341 f = file(err.filename)
1342 try:
1342 try:
1343 # This should be inside a display_trap block and I
1343 # This should be inside a display_trap block and I
1344 # think it is.
1344 # think it is.
1345 sys.displayhook(f.read())
1345 sys.displayhook(f.read())
1346 finally:
1346 finally:
1347 f.close()
1347 f.close()
1348 except:
1348 except:
1349 self.showtraceback()
1349 self.showtraceback()
1350
1350
1351 def _should_recompile(self,e):
1351 def _should_recompile(self,e):
1352 """Utility routine for edit_syntax_error"""
1352 """Utility routine for edit_syntax_error"""
1353
1353
1354 if e.filename in ('<ipython console>','<input>','<string>',
1354 if e.filename in ('<ipython console>','<input>','<string>',
1355 '<console>','<BackgroundJob compilation>',
1355 '<console>','<BackgroundJob compilation>',
1356 None):
1356 None):
1357
1357
1358 return False
1358 return False
1359 try:
1359 try:
1360 if (self.autoedit_syntax and
1360 if (self.autoedit_syntax and
1361 not self.ask_yes_no('Return to editor to correct syntax error? '
1361 not self.ask_yes_no('Return to editor to correct syntax error? '
1362 '[Y/n] ','y')):
1362 '[Y/n] ','y')):
1363 return False
1363 return False
1364 except EOFError:
1364 except EOFError:
1365 return False
1365 return False
1366
1366
1367 def int0(x):
1367 def int0(x):
1368 try:
1368 try:
1369 return int(x)
1369 return int(x)
1370 except TypeError:
1370 except TypeError:
1371 return 0
1371 return 0
1372 # always pass integer line and offset values to editor hook
1372 # always pass integer line and offset values to editor hook
1373 try:
1373 try:
1374 self.hooks.fix_error_editor(e.filename,
1374 self.hooks.fix_error_editor(e.filename,
1375 int0(e.lineno),int0(e.offset),e.msg)
1375 int0(e.lineno),int0(e.offset),e.msg)
1376 except TryNext:
1376 except TryNext:
1377 warn('Could not open editor')
1377 warn('Could not open editor')
1378 return False
1378 return False
1379 return True
1379 return True
1380
1380
1381 #-------------------------------------------------------------------------
1381 #-------------------------------------------------------------------------
1382 # Things related to tab completion
1382 # Things related to tab completion
1383 #-------------------------------------------------------------------------
1383 #-------------------------------------------------------------------------
1384
1384
1385 def complete(self, text):
1385 def complete(self, text):
1386 """Return a sorted list of all possible completions on text.
1386 """Return a sorted list of all possible completions on text.
1387
1387
1388 Inputs:
1388 Inputs:
1389
1389
1390 - text: a string of text to be completed on.
1390 - text: a string of text to be completed on.
1391
1391
1392 This is a wrapper around the completion mechanism, similar to what
1392 This is a wrapper around the completion mechanism, similar to what
1393 readline does at the command line when the TAB key is hit. By
1393 readline does at the command line when the TAB key is hit. By
1394 exposing it as a method, it can be used by other non-readline
1394 exposing it as a method, it can be used by other non-readline
1395 environments (such as GUIs) for text completion.
1395 environments (such as GUIs) for text completion.
1396
1396
1397 Simple usage example:
1397 Simple usage example:
1398
1398
1399 In [7]: x = 'hello'
1399 In [7]: x = 'hello'
1400
1400
1401 In [8]: x
1401 In [8]: x
1402 Out[8]: 'hello'
1402 Out[8]: 'hello'
1403
1403
1404 In [9]: print x
1404 In [9]: print x
1405 hello
1405 hello
1406
1406
1407 In [10]: _ip.complete('x.l')
1407 In [10]: _ip.complete('x.l')
1408 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1408 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1409 """
1409 """
1410
1410
1411 # Inject names into __builtin__ so we can complete on the added names.
1411 # Inject names into __builtin__ so we can complete on the added names.
1412 with self.builtin_trap:
1412 with self.builtin_trap:
1413 complete = self.Completer.complete
1413 complete = self.Completer.complete
1414 state = 0
1414 state = 0
1415 # use a dict so we get unique keys, since ipyhton's multiple
1415 # use a dict so we get unique keys, since ipyhton's multiple
1416 # completers can return duplicates. When we make 2.4 a requirement,
1416 # completers can return duplicates. When we make 2.4 a requirement,
1417 # start using sets instead, which are faster.
1417 # start using sets instead, which are faster.
1418 comps = {}
1418 comps = {}
1419 while True:
1419 while True:
1420 newcomp = complete(text,state,line_buffer=text)
1420 newcomp = complete(text,state,line_buffer=text)
1421 if newcomp is None:
1421 if newcomp is None:
1422 break
1422 break
1423 comps[newcomp] = 1
1423 comps[newcomp] = 1
1424 state += 1
1424 state += 1
1425 outcomps = comps.keys()
1425 outcomps = comps.keys()
1426 outcomps.sort()
1426 outcomps.sort()
1427 #print "T:",text,"OC:",outcomps # dbg
1427 #print "T:",text,"OC:",outcomps # dbg
1428 #print "vars:",self.user_ns.keys()
1428 #print "vars:",self.user_ns.keys()
1429 return outcomps
1429 return outcomps
1430
1430
1431 def set_custom_completer(self,completer,pos=0):
1431 def set_custom_completer(self,completer,pos=0):
1432 """Adds a new custom completer function.
1432 """Adds a new custom completer function.
1433
1433
1434 The position argument (defaults to 0) is the index in the completers
1434 The position argument (defaults to 0) is the index in the completers
1435 list where you want the completer to be inserted."""
1435 list where you want the completer to be inserted."""
1436
1436
1437 newcomp = new.instancemethod(completer,self.Completer,
1437 newcomp = new.instancemethod(completer,self.Completer,
1438 self.Completer.__class__)
1438 self.Completer.__class__)
1439 self.Completer.matchers.insert(pos,newcomp)
1439 self.Completer.matchers.insert(pos,newcomp)
1440
1440
1441 def set_completer(self):
1441 def set_completer(self):
1442 """Reset readline's completer to be our own."""
1442 """Reset readline's completer to be our own."""
1443 self.readline.set_completer(self.Completer.complete)
1443 self.readline.set_completer(self.Completer.complete)
1444
1444
1445 def set_completer_frame(self, frame=None):
1445 def set_completer_frame(self, frame=None):
1446 """Set the frame of the completer."""
1446 """Set the frame of the completer."""
1447 if frame:
1447 if frame:
1448 self.Completer.namespace = frame.f_locals
1448 self.Completer.namespace = frame.f_locals
1449 self.Completer.global_namespace = frame.f_globals
1449 self.Completer.global_namespace = frame.f_globals
1450 else:
1450 else:
1451 self.Completer.namespace = self.user_ns
1451 self.Completer.namespace = self.user_ns
1452 self.Completer.global_namespace = self.user_global_ns
1452 self.Completer.global_namespace = self.user_global_ns
1453
1453
1454 #-------------------------------------------------------------------------
1454 #-------------------------------------------------------------------------
1455 # Things related to readline
1455 # Things related to readline
1456 #-------------------------------------------------------------------------
1456 #-------------------------------------------------------------------------
1457
1457
1458 def init_readline(self):
1458 def init_readline(self):
1459 """Command history completion/saving/reloading."""
1459 """Command history completion/saving/reloading."""
1460
1460
1461 if self.readline_use:
1461 if self.readline_use:
1462 import IPython.utils.rlineimpl as readline
1462 import IPython.utils.rlineimpl as readline
1463
1463
1464 self.rl_next_input = None
1464 self.rl_next_input = None
1465 self.rl_do_indent = False
1465 self.rl_do_indent = False
1466
1466
1467 if not self.readline_use or not readline.have_readline:
1467 if not self.readline_use or not readline.have_readline:
1468 self.has_readline = False
1468 self.has_readline = False
1469 self.readline = None
1469 self.readline = None
1470 # Set a number of methods that depend on readline to be no-op
1470 # Set a number of methods that depend on readline to be no-op
1471 self.savehist = no_op
1471 self.savehist = no_op
1472 self.reloadhist = no_op
1472 self.reloadhist = no_op
1473 self.set_completer = no_op
1473 self.set_completer = no_op
1474 self.set_custom_completer = no_op
1474 self.set_custom_completer = no_op
1475 self.set_completer_frame = no_op
1475 self.set_completer_frame = no_op
1476 warn('Readline services not available or not loaded.')
1476 warn('Readline services not available or not loaded.')
1477 else:
1477 else:
1478 self.has_readline = True
1478 self.has_readline = True
1479 self.readline = readline
1479 self.readline = readline
1480 sys.modules['readline'] = readline
1480 sys.modules['readline'] = readline
1481 import atexit
1481 import atexit
1482 from IPython.core.completer import IPCompleter
1482 from IPython.core.completer import IPCompleter
1483 self.Completer = IPCompleter(self,
1483 self.Completer = IPCompleter(self,
1484 self.user_ns,
1484 self.user_ns,
1485 self.user_global_ns,
1485 self.user_global_ns,
1486 self.readline_omit__names,
1486 self.readline_omit__names,
1487 self.alias_manager.alias_table)
1487 self.alias_manager.alias_table)
1488 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1488 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1489 self.strdispatchers['complete_command'] = sdisp
1489 self.strdispatchers['complete_command'] = sdisp
1490 self.Completer.custom_completers = sdisp
1490 self.Completer.custom_completers = sdisp
1491 # Platform-specific configuration
1491 # Platform-specific configuration
1492 if os.name == 'nt':
1492 if os.name == 'nt':
1493 self.readline_startup_hook = readline.set_pre_input_hook
1493 self.readline_startup_hook = readline.set_pre_input_hook
1494 else:
1494 else:
1495 self.readline_startup_hook = readline.set_startup_hook
1495 self.readline_startup_hook = readline.set_startup_hook
1496
1496
1497 # Load user's initrc file (readline config)
1497 # Load user's initrc file (readline config)
1498 # Or if libedit is used, load editrc.
1498 # Or if libedit is used, load editrc.
1499 inputrc_name = os.environ.get('INPUTRC')
1499 inputrc_name = os.environ.get('INPUTRC')
1500 if inputrc_name is None:
1500 if inputrc_name is None:
1501 home_dir = get_home_dir()
1501 home_dir = get_home_dir()
1502 if home_dir is not None:
1502 if home_dir is not None:
1503 inputrc_name = '.inputrc'
1503 inputrc_name = '.inputrc'
1504 if readline.uses_libedit:
1504 if readline.uses_libedit:
1505 inputrc_name = '.editrc'
1505 inputrc_name = '.editrc'
1506 inputrc_name = os.path.join(home_dir, inputrc_name)
1506 inputrc_name = os.path.join(home_dir, inputrc_name)
1507 if os.path.isfile(inputrc_name):
1507 if os.path.isfile(inputrc_name):
1508 try:
1508 try:
1509 readline.read_init_file(inputrc_name)
1509 readline.read_init_file(inputrc_name)
1510 except:
1510 except:
1511 warn('Problems reading readline initialization file <%s>'
1511 warn('Problems reading readline initialization file <%s>'
1512 % inputrc_name)
1512 % inputrc_name)
1513
1513
1514 # save this in sys so embedded copies can restore it properly
1514 # save this in sys so embedded copies can restore it properly
1515 sys.ipcompleter = self.Completer.complete
1515 sys.ipcompleter = self.Completer.complete
1516 self.set_completer()
1516 self.set_completer()
1517
1517
1518 # Configure readline according to user's prefs
1518 # Configure readline according to user's prefs
1519 # This is only done if GNU readline is being used. If libedit
1519 # This is only done if GNU readline is being used. If libedit
1520 # is being used (as on Leopard) the readline config is
1520 # is being used (as on Leopard) the readline config is
1521 # not run as the syntax for libedit is different.
1521 # not run as the syntax for libedit is different.
1522 if not readline.uses_libedit:
1522 if not readline.uses_libedit:
1523 for rlcommand in self.readline_parse_and_bind:
1523 for rlcommand in self.readline_parse_and_bind:
1524 #print "loading rl:",rlcommand # dbg
1524 #print "loading rl:",rlcommand # dbg
1525 readline.parse_and_bind(rlcommand)
1525 readline.parse_and_bind(rlcommand)
1526
1526
1527 # Remove some chars from the delimiters list. If we encounter
1527 # Remove some chars from the delimiters list. If we encounter
1528 # unicode chars, discard them.
1528 # unicode chars, discard them.
1529 delims = readline.get_completer_delims().encode("ascii", "ignore")
1529 delims = readline.get_completer_delims().encode("ascii", "ignore")
1530 delims = delims.translate(string._idmap,
1530 delims = delims.translate(string._idmap,
1531 self.readline_remove_delims)
1531 self.readline_remove_delims)
1532 readline.set_completer_delims(delims)
1532 readline.set_completer_delims(delims)
1533 # otherwise we end up with a monster history after a while:
1533 # otherwise we end up with a monster history after a while:
1534 readline.set_history_length(1000)
1534 readline.set_history_length(1000)
1535 try:
1535 try:
1536 #print '*** Reading readline history' # dbg
1536 #print '*** Reading readline history' # dbg
1537 readline.read_history_file(self.histfile)
1537 readline.read_history_file(self.histfile)
1538 except IOError:
1538 except IOError:
1539 pass # It doesn't exist yet.
1539 pass # It doesn't exist yet.
1540
1540
1541 atexit.register(self.atexit_operations)
1541 atexit.register(self.atexit_operations)
1542 del atexit
1542 del atexit
1543
1543
1544 # Configure auto-indent for all platforms
1544 # Configure auto-indent for all platforms
1545 self.set_autoindent(self.autoindent)
1545 self.set_autoindent(self.autoindent)
1546
1546
1547 def set_next_input(self, s):
1547 def set_next_input(self, s):
1548 """ Sets the 'default' input string for the next command line.
1548 """ Sets the 'default' input string for the next command line.
1549
1549
1550 Requires readline.
1550 Requires readline.
1551
1551
1552 Example:
1552 Example:
1553
1553
1554 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1554 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1555 [D:\ipython]|2> Hello Word_ # cursor is here
1555 [D:\ipython]|2> Hello Word_ # cursor is here
1556 """
1556 """
1557
1557
1558 self.rl_next_input = s
1558 self.rl_next_input = s
1559
1559
1560 def pre_readline(self):
1560 def pre_readline(self):
1561 """readline hook to be used at the start of each line.
1561 """readline hook to be used at the start of each line.
1562
1562
1563 Currently it handles auto-indent only."""
1563 Currently it handles auto-indent only."""
1564
1564
1565 #debugx('self.indent_current_nsp','pre_readline:')
1565 #debugx('self.indent_current_nsp','pre_readline:')
1566
1566
1567 if self.rl_do_indent:
1567 if self.rl_do_indent:
1568 self.readline.insert_text(self._indent_current_str())
1568 self.readline.insert_text(self._indent_current_str())
1569 if self.rl_next_input is not None:
1569 if self.rl_next_input is not None:
1570 self.readline.insert_text(self.rl_next_input)
1570 self.readline.insert_text(self.rl_next_input)
1571 self.rl_next_input = None
1571 self.rl_next_input = None
1572
1572
1573 def _indent_current_str(self):
1573 def _indent_current_str(self):
1574 """return the current level of indentation as a string"""
1574 """return the current level of indentation as a string"""
1575 return self.indent_current_nsp * ' '
1575 return self.indent_current_nsp * ' '
1576
1576
1577 #-------------------------------------------------------------------------
1577 #-------------------------------------------------------------------------
1578 # Things related to magics
1578 # Things related to magics
1579 #-------------------------------------------------------------------------
1579 #-------------------------------------------------------------------------
1580
1580
1581 def init_magics(self):
1581 def init_magics(self):
1582 # Set user colors (don't do it in the constructor above so that it
1582 # Set user colors (don't do it in the constructor above so that it
1583 # doesn't crash if colors option is invalid)
1583 # doesn't crash if colors option is invalid)
1584 self.magic_colors(self.colors)
1584 self.magic_colors(self.colors)
1585
1585
1586 def magic(self,arg_s):
1586 def magic(self,arg_s):
1587 """Call a magic function by name.
1587 """Call a magic function by name.
1588
1588
1589 Input: a string containing the name of the magic function to call and any
1589 Input: a string containing the name of the magic function to call and any
1590 additional arguments to be passed to the magic.
1590 additional arguments to be passed to the magic.
1591
1591
1592 magic('name -opt foo bar') is equivalent to typing at the ipython
1592 magic('name -opt foo bar') is equivalent to typing at the ipython
1593 prompt:
1593 prompt:
1594
1594
1595 In[1]: %name -opt foo bar
1595 In[1]: %name -opt foo bar
1596
1596
1597 To call a magic without arguments, simply use magic('name').
1597 To call a magic without arguments, simply use magic('name').
1598
1598
1599 This provides a proper Python function to call IPython's magics in any
1599 This provides a proper Python function to call IPython's magics in any
1600 valid Python code you can type at the interpreter, including loops and
1600 valid Python code you can type at the interpreter, including loops and
1601 compound statements.
1601 compound statements.
1602 """
1602 """
1603
1603
1604 args = arg_s.split(' ',1)
1604 args = arg_s.split(' ',1)
1605 magic_name = args[0]
1605 magic_name = args[0]
1606 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1606 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1607
1607
1608 try:
1608 try:
1609 magic_args = args[1]
1609 magic_args = args[1]
1610 except IndexError:
1610 except IndexError:
1611 magic_args = ''
1611 magic_args = ''
1612 fn = getattr(self,'magic_'+magic_name,None)
1612 fn = getattr(self,'magic_'+magic_name,None)
1613 if fn is None:
1613 if fn is None:
1614 error("Magic function `%s` not found." % magic_name)
1614 error("Magic function `%s` not found." % magic_name)
1615 else:
1615 else:
1616 magic_args = self.var_expand(magic_args,1)
1616 magic_args = self.var_expand(magic_args,1)
1617 with nested(self.builtin_trap,):
1617 with nested(self.builtin_trap,):
1618 result = fn(magic_args)
1618 result = fn(magic_args)
1619 return result
1619 return result
1620
1620
1621 def define_magic(self, magicname, func):
1621 def define_magic(self, magicname, func):
1622 """Expose own function as magic function for ipython
1622 """Expose own function as magic function for ipython
1623
1623
1624 def foo_impl(self,parameter_s=''):
1624 def foo_impl(self,parameter_s=''):
1625 'My very own magic!. (Use docstrings, IPython reads them).'
1625 'My very own magic!. (Use docstrings, IPython reads them).'
1626 print 'Magic function. Passed parameter is between < >:'
1626 print 'Magic function. Passed parameter is between < >:'
1627 print '<%s>' % parameter_s
1627 print '<%s>' % parameter_s
1628 print 'The self object is:',self
1628 print 'The self object is:',self
1629
1629
1630 self.define_magic('foo',foo_impl)
1630 self.define_magic('foo',foo_impl)
1631 """
1631 """
1632
1632
1633 import new
1633 import new
1634 im = new.instancemethod(func,self, self.__class__)
1634 im = new.instancemethod(func,self, self.__class__)
1635 old = getattr(self, "magic_" + magicname, None)
1635 old = getattr(self, "magic_" + magicname, None)
1636 setattr(self, "magic_" + magicname, im)
1636 setattr(self, "magic_" + magicname, im)
1637 return old
1637 return old
1638
1638
1639 #-------------------------------------------------------------------------
1639 #-------------------------------------------------------------------------
1640 # Things related to macros
1640 # Things related to macros
1641 #-------------------------------------------------------------------------
1641 #-------------------------------------------------------------------------
1642
1642
1643 def define_macro(self, name, themacro):
1643 def define_macro(self, name, themacro):
1644 """Define a new macro
1644 """Define a new macro
1645
1645
1646 Parameters
1646 Parameters
1647 ----------
1647 ----------
1648 name : str
1648 name : str
1649 The name of the macro.
1649 The name of the macro.
1650 themacro : str or Macro
1650 themacro : str or Macro
1651 The action to do upon invoking the macro. If a string, a new
1651 The action to do upon invoking the macro. If a string, a new
1652 Macro object is created by passing the string to it.
1652 Macro object is created by passing the string to it.
1653 """
1653 """
1654
1654
1655 from IPython.core import macro
1655 from IPython.core import macro
1656
1656
1657 if isinstance(themacro, basestring):
1657 if isinstance(themacro, basestring):
1658 themacro = macro.Macro(themacro)
1658 themacro = macro.Macro(themacro)
1659 if not isinstance(themacro, macro.Macro):
1659 if not isinstance(themacro, macro.Macro):
1660 raise ValueError('A macro must be a string or a Macro instance.')
1660 raise ValueError('A macro must be a string or a Macro instance.')
1661 self.user_ns[name] = themacro
1661 self.user_ns[name] = themacro
1662
1662
1663 #-------------------------------------------------------------------------
1663 #-------------------------------------------------------------------------
1664 # Things related to the running of system commands
1664 # Things related to the running of system commands
1665 #-------------------------------------------------------------------------
1665 #-------------------------------------------------------------------------
1666
1666
1667 def system(self, cmd):
1667 def system(self, cmd):
1668 """Make a system call, using IPython."""
1668 """Make a system call, using IPython."""
1669 return self.hooks.shell_hook(self.var_expand(cmd, depth=2))
1669 return self.hooks.shell_hook(self.var_expand(cmd, depth=2))
1670
1670
1671 #-------------------------------------------------------------------------
1671 #-------------------------------------------------------------------------
1672 # Things related to aliases
1672 # Things related to aliases
1673 #-------------------------------------------------------------------------
1673 #-------------------------------------------------------------------------
1674
1674
1675 def init_alias(self):
1675 def init_alias(self):
1676 self.alias_manager = AliasManager(self, config=self.config)
1676 self.alias_manager = AliasManager(self, config=self.config)
1677 self.ns_table['alias'] = self.alias_manager.alias_table,
1677 self.ns_table['alias'] = self.alias_manager.alias_table,
1678
1678
1679 #-------------------------------------------------------------------------
1679 #-------------------------------------------------------------------------
1680 # Things related to the running of code
1680 # Things related to the running of code
1681 #-------------------------------------------------------------------------
1681 #-------------------------------------------------------------------------
1682
1682
1683 def ex(self, cmd):
1683 def ex(self, cmd):
1684 """Execute a normal python statement in user namespace."""
1684 """Execute a normal python statement in user namespace."""
1685 with nested(self.builtin_trap,):
1685 with nested(self.builtin_trap,):
1686 exec cmd in self.user_global_ns, self.user_ns
1686 exec cmd in self.user_global_ns, self.user_ns
1687
1687
1688 def ev(self, expr):
1688 def ev(self, expr):
1689 """Evaluate python expression expr in user namespace.
1689 """Evaluate python expression expr in user namespace.
1690
1690
1691 Returns the result of evaluation
1691 Returns the result of evaluation
1692 """
1692 """
1693 with nested(self.builtin_trap,):
1693 with nested(self.builtin_trap,):
1694 return eval(expr, self.user_global_ns, self.user_ns)
1694 return eval(expr, self.user_global_ns, self.user_ns)
1695
1695
1696 def mainloop(self, display_banner=None):
1696 def mainloop(self, display_banner=None):
1697 """Start the mainloop.
1697 """Start the mainloop.
1698
1698
1699 If an optional banner argument is given, it will override the
1699 If an optional banner argument is given, it will override the
1700 internally created default banner.
1700 internally created default banner.
1701 """
1701 """
1702
1702
1703 with nested(self.builtin_trap, self.display_trap):
1703 with nested(self.builtin_trap, self.display_trap):
1704
1704
1705 # if you run stuff with -c <cmd>, raw hist is not updated
1705 # if you run stuff with -c <cmd>, raw hist is not updated
1706 # ensure that it's in sync
1706 # ensure that it's in sync
1707 if len(self.input_hist) != len (self.input_hist_raw):
1707 if len(self.input_hist) != len (self.input_hist_raw):
1708 self.input_hist_raw = InputList(self.input_hist)
1708 self.input_hist_raw = InputList(self.input_hist)
1709
1709
1710 while 1:
1710 while 1:
1711 try:
1711 try:
1712 self.interact(display_banner=display_banner)
1712 self.interact(display_banner=display_banner)
1713 #self.interact_with_readline()
1713 #self.interact_with_readline()
1714 # XXX for testing of a readline-decoupled repl loop, call
1714 # XXX for testing of a readline-decoupled repl loop, call
1715 # interact_with_readline above
1715 # interact_with_readline above
1716 break
1716 break
1717 except KeyboardInterrupt:
1717 except KeyboardInterrupt:
1718 # this should not be necessary, but KeyboardInterrupt
1718 # this should not be necessary, but KeyboardInterrupt
1719 # handling seems rather unpredictable...
1719 # handling seems rather unpredictable...
1720 self.write("\nKeyboardInterrupt in interact()\n")
1720 self.write("\nKeyboardInterrupt in interact()\n")
1721
1721
1722 def interact_prompt(self):
1722 def interact_prompt(self):
1723 """ Print the prompt (in read-eval-print loop)
1723 """ Print the prompt (in read-eval-print loop)
1724
1724
1725 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1725 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1726 used in standard IPython flow.
1726 used in standard IPython flow.
1727 """
1727 """
1728 if self.more:
1728 if self.more:
1729 try:
1729 try:
1730 prompt = self.hooks.generate_prompt(True)
1730 prompt = self.hooks.generate_prompt(True)
1731 except:
1731 except:
1732 self.showtraceback()
1732 self.showtraceback()
1733 if self.autoindent:
1733 if self.autoindent:
1734 self.rl_do_indent = True
1734 self.rl_do_indent = True
1735
1735
1736 else:
1736 else:
1737 try:
1737 try:
1738 prompt = self.hooks.generate_prompt(False)
1738 prompt = self.hooks.generate_prompt(False)
1739 except:
1739 except:
1740 self.showtraceback()
1740 self.showtraceback()
1741 self.write(prompt)
1741 self.write(prompt)
1742
1742
1743 def interact_handle_input(self,line):
1743 def interact_handle_input(self,line):
1744 """ Handle the input line (in read-eval-print loop)
1744 """ Handle the input line (in read-eval-print loop)
1745
1745
1746 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1746 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1747 used in standard IPython flow.
1747 used in standard IPython flow.
1748 """
1748 """
1749 if line.lstrip() == line:
1749 if line.lstrip() == line:
1750 self.shadowhist.add(line.strip())
1750 self.shadowhist.add(line.strip())
1751 lineout = self.prefilter_manager.prefilter_lines(line,self.more)
1751 lineout = self.prefilter_manager.prefilter_lines(line,self.more)
1752
1752
1753 if line.strip():
1753 if line.strip():
1754 if self.more:
1754 if self.more:
1755 self.input_hist_raw[-1] += '%s\n' % line
1755 self.input_hist_raw[-1] += '%s\n' % line
1756 else:
1756 else:
1757 self.input_hist_raw.append('%s\n' % line)
1757 self.input_hist_raw.append('%s\n' % line)
1758
1758
1759
1759
1760 self.more = self.push_line(lineout)
1760 self.more = self.push_line(lineout)
1761 if (self.SyntaxTB.last_syntax_error and
1761 if (self.SyntaxTB.last_syntax_error and
1762 self.autoedit_syntax):
1762 self.autoedit_syntax):
1763 self.edit_syntax_error()
1763 self.edit_syntax_error()
1764
1764
1765 def interact_with_readline(self):
1765 def interact_with_readline(self):
1766 """ Demo of using interact_handle_input, interact_prompt
1766 """ Demo of using interact_handle_input, interact_prompt
1767
1767
1768 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1768 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1769 it should work like this.
1769 it should work like this.
1770 """
1770 """
1771 self.readline_startup_hook(self.pre_readline)
1771 self.readline_startup_hook(self.pre_readline)
1772 while not self.exit_now:
1772 while not self.exit_now:
1773 self.interact_prompt()
1773 self.interact_prompt()
1774 if self.more:
1774 if self.more:
1775 self.rl_do_indent = True
1775 self.rl_do_indent = True
1776 else:
1776 else:
1777 self.rl_do_indent = False
1777 self.rl_do_indent = False
1778 line = raw_input_original().decode(self.stdin_encoding)
1778 line = raw_input_original().decode(self.stdin_encoding)
1779 self.interact_handle_input(line)
1779 self.interact_handle_input(line)
1780
1780
1781 def interact(self, display_banner=None):
1781 def interact(self, display_banner=None):
1782 """Closely emulate the interactive Python console."""
1782 """Closely emulate the interactive Python console."""
1783
1783
1784 # batch run -> do not interact
1784 # batch run -> do not interact
1785 if self.exit_now:
1785 if self.exit_now:
1786 return
1786 return
1787
1787
1788 if display_banner is None:
1788 if display_banner is None:
1789 display_banner = self.display_banner
1789 display_banner = self.display_banner
1790 if display_banner:
1790 if display_banner:
1791 self.show_banner()
1791 self.show_banner()
1792
1792
1793 more = 0
1793 more = 0
1794
1794
1795 # Mark activity in the builtins
1795 # Mark activity in the builtins
1796 __builtin__.__dict__['__IPYTHON__active'] += 1
1796 __builtin__.__dict__['__IPYTHON__active'] += 1
1797
1797
1798 if self.has_readline:
1798 if self.has_readline:
1799 self.readline_startup_hook(self.pre_readline)
1799 self.readline_startup_hook(self.pre_readline)
1800 # exit_now is set by a call to %Exit or %Quit, through the
1800 # exit_now is set by a call to %Exit or %Quit, through the
1801 # ask_exit callback.
1801 # ask_exit callback.
1802
1802
1803 while not self.exit_now:
1803 while not self.exit_now:
1804 self.hooks.pre_prompt_hook()
1804 self.hooks.pre_prompt_hook()
1805 if more:
1805 if more:
1806 try:
1806 try:
1807 prompt = self.hooks.generate_prompt(True)
1807 prompt = self.hooks.generate_prompt(True)
1808 except:
1808 except:
1809 self.showtraceback()
1809 self.showtraceback()
1810 if self.autoindent:
1810 if self.autoindent:
1811 self.rl_do_indent = True
1811 self.rl_do_indent = True
1812
1812
1813 else:
1813 else:
1814 try:
1814 try:
1815 prompt = self.hooks.generate_prompt(False)
1815 prompt = self.hooks.generate_prompt(False)
1816 except:
1816 except:
1817 self.showtraceback()
1817 self.showtraceback()
1818 try:
1818 try:
1819 line = self.raw_input(prompt, more)
1819 line = self.raw_input(prompt, more)
1820 if self.exit_now:
1820 if self.exit_now:
1821 # quick exit on sys.std[in|out] close
1821 # quick exit on sys.std[in|out] close
1822 break
1822 break
1823 if self.autoindent:
1823 if self.autoindent:
1824 self.rl_do_indent = False
1824 self.rl_do_indent = False
1825
1825
1826 except KeyboardInterrupt:
1826 except KeyboardInterrupt:
1827 #double-guard against keyboardinterrupts during kbdint handling
1827 #double-guard against keyboardinterrupts during kbdint handling
1828 try:
1828 try:
1829 self.write('\nKeyboardInterrupt\n')
1829 self.write('\nKeyboardInterrupt\n')
1830 self.resetbuffer()
1830 self.resetbuffer()
1831 # keep cache in sync with the prompt counter:
1831 # keep cache in sync with the prompt counter:
1832 self.outputcache.prompt_count -= 1
1832 self.outputcache.prompt_count -= 1
1833
1833
1834 if self.autoindent:
1834 if self.autoindent:
1835 self.indent_current_nsp = 0
1835 self.indent_current_nsp = 0
1836 more = 0
1836 more = 0
1837 except KeyboardInterrupt:
1837 except KeyboardInterrupt:
1838 pass
1838 pass
1839 except EOFError:
1839 except EOFError:
1840 if self.autoindent:
1840 if self.autoindent:
1841 self.rl_do_indent = False
1841 self.rl_do_indent = False
1842 if self.has_readline:
1842 if self.has_readline:
1843 self.readline_startup_hook(None)
1843 self.readline_startup_hook(None)
1844 self.write('\n')
1844 self.write('\n')
1845 self.exit()
1845 self.exit()
1846 except bdb.BdbQuit:
1846 except bdb.BdbQuit:
1847 warn('The Python debugger has exited with a BdbQuit exception.\n'
1847 warn('The Python debugger has exited with a BdbQuit exception.\n'
1848 'Because of how pdb handles the stack, it is impossible\n'
1848 'Because of how pdb handles the stack, it is impossible\n'
1849 'for IPython to properly format this particular exception.\n'
1849 'for IPython to properly format this particular exception.\n'
1850 'IPython will resume normal operation.')
1850 'IPython will resume normal operation.')
1851 except:
1851 except:
1852 # exceptions here are VERY RARE, but they can be triggered
1852 # exceptions here are VERY RARE, but they can be triggered
1853 # asynchronously by signal handlers, for example.
1853 # asynchronously by signal handlers, for example.
1854 self.showtraceback()
1854 self.showtraceback()
1855 else:
1855 else:
1856 more = self.push_line(line)
1856 more = self.push_line(line)
1857 if (self.SyntaxTB.last_syntax_error and
1857 if (self.SyntaxTB.last_syntax_error and
1858 self.autoedit_syntax):
1858 self.autoedit_syntax):
1859 self.edit_syntax_error()
1859 self.edit_syntax_error()
1860
1860
1861 # We are off again...
1861 # We are off again...
1862 __builtin__.__dict__['__IPYTHON__active'] -= 1
1862 __builtin__.__dict__['__IPYTHON__active'] -= 1
1863
1863
1864 def safe_execfile(self, fname, *where, **kw):
1864 def safe_execfile(self, fname, *where, **kw):
1865 """A safe version of the builtin execfile().
1865 """A safe version of the builtin execfile().
1866
1866
1867 This version will never throw an exception, but instead print
1867 This version will never throw an exception, but instead print
1868 helpful error messages to the screen. This only works on pure
1868 helpful error messages to the screen. This only works on pure
1869 Python files with the .py extension.
1869 Python files with the .py extension.
1870
1870
1871 Parameters
1871 Parameters
1872 ----------
1872 ----------
1873 fname : string
1873 fname : string
1874 The name of the file to be executed.
1874 The name of the file to be executed.
1875 where : tuple
1875 where : tuple
1876 One or two namespaces, passed to execfile() as (globals,locals).
1876 One or two namespaces, passed to execfile() as (globals,locals).
1877 If only one is given, it is passed as both.
1877 If only one is given, it is passed as both.
1878 exit_ignore : bool (False)
1878 exit_ignore : bool (False)
1879 If True, then don't print errors for non-zero exit statuses.
1879 If True, then don't print errors for non-zero exit statuses.
1880 """
1880 """
1881 kw.setdefault('exit_ignore', False)
1881 kw.setdefault('exit_ignore', False)
1882
1882
1883 fname = os.path.abspath(os.path.expanduser(fname))
1883 fname = os.path.abspath(os.path.expanduser(fname))
1884
1884
1885 # Make sure we have a .py file
1885 # Make sure we have a .py file
1886 if not fname.endswith('.py'):
1886 if not fname.endswith('.py'):
1887 warn('File must end with .py to be run using execfile: <%s>' % fname)
1887 warn('File must end with .py to be run using execfile: <%s>' % fname)
1888
1888
1889 # Make sure we can open the file
1889 # Make sure we can open the file
1890 try:
1890 try:
1891 with open(fname) as thefile:
1891 with open(fname) as thefile:
1892 pass
1892 pass
1893 except:
1893 except:
1894 warn('Could not open file <%s> for safe execution.' % fname)
1894 warn('Could not open file <%s> for safe execution.' % fname)
1895 return
1895 return
1896
1896
1897 # Find things also in current directory. This is needed to mimic the
1897 # Find things also in current directory. This is needed to mimic the
1898 # behavior of running a script from the system command line, where
1898 # behavior of running a script from the system command line, where
1899 # Python inserts the script's directory into sys.path
1899 # Python inserts the script's directory into sys.path
1900 dname = os.path.dirname(fname)
1900 dname = os.path.dirname(fname)
1901
1901
1902 with prepended_to_syspath(dname):
1902 with prepended_to_syspath(dname):
1903 try:
1903 try:
1904 if sys.platform == 'win32' and sys.version_info < (2,5,1):
1904 if sys.platform == 'win32' and sys.version_info < (2,5,1):
1905 # Work around a bug in Python for Windows. The bug was
1905 # Work around a bug in Python for Windows. The bug was
1906 # fixed in in Python 2.5 r54159 and 54158, but that's still
1906 # fixed in in Python 2.5 r54159 and 54158, but that's still
1907 # SVN Python as of March/07. For details, see:
1907 # SVN Python as of March/07. For details, see:
1908 # http://projects.scipy.org/ipython/ipython/ticket/123
1908 # http://projects.scipy.org/ipython/ipython/ticket/123
1909 try:
1909 try:
1910 globs,locs = where[0:2]
1910 globs,locs = where[0:2]
1911 except:
1911 except:
1912 try:
1912 try:
1913 globs = locs = where[0]
1913 globs = locs = where[0]
1914 except:
1914 except:
1915 globs = locs = globals()
1915 globs = locs = globals()
1916 exec file(fname) in globs,locs
1916 exec file(fname) in globs,locs
1917 else:
1917 else:
1918 execfile(fname,*where)
1918 execfile(fname,*where)
1919 except SyntaxError:
1919 except SyntaxError:
1920 self.showsyntaxerror()
1920 self.showsyntaxerror()
1921 warn('Failure executing file: <%s>' % fname)
1921 warn('Failure executing file: <%s>' % fname)
1922 except SystemExit, status:
1922 except SystemExit, status:
1923 # Code that correctly sets the exit status flag to success (0)
1923 # Code that correctly sets the exit status flag to success (0)
1924 # shouldn't be bothered with a traceback. Note that a plain
1924 # shouldn't be bothered with a traceback. Note that a plain
1925 # sys.exit() does NOT set the message to 0 (it's empty) so that
1925 # sys.exit() does NOT set the message to 0 (it's empty) so that
1926 # will still get a traceback. Note that the structure of the
1926 # will still get a traceback. Note that the structure of the
1927 # SystemExit exception changed between Python 2.4 and 2.5, so
1927 # SystemExit exception changed between Python 2.4 and 2.5, so
1928 # the checks must be done in a version-dependent way.
1928 # the checks must be done in a version-dependent way.
1929 show = False
1929 show = False
1930 if status.args[0]==0 and not kw['exit_ignore']:
1930 if status.args[0]==0 and not kw['exit_ignore']:
1931 show = True
1931 show = True
1932 if show:
1932 if show:
1933 self.showtraceback()
1933 self.showtraceback()
1934 warn('Failure executing file: <%s>' % fname)
1934 warn('Failure executing file: <%s>' % fname)
1935 except:
1935 except:
1936 self.showtraceback()
1936 self.showtraceback()
1937 warn('Failure executing file: <%s>' % fname)
1937 warn('Failure executing file: <%s>' % fname)
1938
1938
1939 def safe_execfile_ipy(self, fname):
1939 def safe_execfile_ipy(self, fname):
1940 """Like safe_execfile, but for .ipy files with IPython syntax.
1940 """Like safe_execfile, but for .ipy files with IPython syntax.
1941
1941
1942 Parameters
1942 Parameters
1943 ----------
1943 ----------
1944 fname : str
1944 fname : str
1945 The name of the file to execute. The filename must have a
1945 The name of the file to execute. The filename must have a
1946 .ipy extension.
1946 .ipy extension.
1947 """
1947 """
1948 fname = os.path.abspath(os.path.expanduser(fname))
1948 fname = os.path.abspath(os.path.expanduser(fname))
1949
1949
1950 # Make sure we have a .py file
1950 # Make sure we have a .py file
1951 if not fname.endswith('.ipy'):
1951 if not fname.endswith('.ipy'):
1952 warn('File must end with .py to be run using execfile: <%s>' % fname)
1952 warn('File must end with .py to be run using execfile: <%s>' % fname)
1953
1953
1954 # Make sure we can open the file
1954 # Make sure we can open the file
1955 try:
1955 try:
1956 with open(fname) as thefile:
1956 with open(fname) as thefile:
1957 pass
1957 pass
1958 except:
1958 except:
1959 warn('Could not open file <%s> for safe execution.' % fname)
1959 warn('Could not open file <%s> for safe execution.' % fname)
1960 return
1960 return
1961
1961
1962 # Find things also in current directory. This is needed to mimic the
1962 # Find things also in current directory. This is needed to mimic the
1963 # behavior of running a script from the system command line, where
1963 # behavior of running a script from the system command line, where
1964 # Python inserts the script's directory into sys.path
1964 # Python inserts the script's directory into sys.path
1965 dname = os.path.dirname(fname)
1965 dname = os.path.dirname(fname)
1966
1966
1967 with prepended_to_syspath(dname):
1967 with prepended_to_syspath(dname):
1968 try:
1968 try:
1969 with open(fname) as thefile:
1969 with open(fname) as thefile:
1970 script = thefile.read()
1970 script = thefile.read()
1971 # self.runlines currently captures all exceptions
1971 # self.runlines currently captures all exceptions
1972 # raise in user code. It would be nice if there were
1972 # raise in user code. It would be nice if there were
1973 # versions of runlines, execfile that did raise, so
1973 # versions of runlines, execfile that did raise, so
1974 # we could catch the errors.
1974 # we could catch the errors.
1975 self.runlines(script, clean=True)
1975 self.runlines(script, clean=True)
1976 except:
1976 except:
1977 self.showtraceback()
1977 self.showtraceback()
1978 warn('Unknown failure executing file: <%s>' % fname)
1978 warn('Unknown failure executing file: <%s>' % fname)
1979
1979
1980 def _is_secondary_block_start(self, s):
1980 def _is_secondary_block_start(self, s):
1981 if not s.endswith(':'):
1981 if not s.endswith(':'):
1982 return False
1982 return False
1983 if (s.startswith('elif') or
1983 if (s.startswith('elif') or
1984 s.startswith('else') or
1984 s.startswith('else') or
1985 s.startswith('except') or
1985 s.startswith('except') or
1986 s.startswith('finally')):
1986 s.startswith('finally')):
1987 return True
1987 return True
1988
1988
1989 def cleanup_ipy_script(self, script):
1989 def cleanup_ipy_script(self, script):
1990 """Make a script safe for self.runlines()
1990 """Make a script safe for self.runlines()
1991
1991
1992 Currently, IPython is lines based, with blocks being detected by
1992 Currently, IPython is lines based, with blocks being detected by
1993 empty lines. This is a problem for block based scripts that may
1993 empty lines. This is a problem for block based scripts that may
1994 not have empty lines after blocks. This script adds those empty
1994 not have empty lines after blocks. This script adds those empty
1995 lines to make scripts safe for running in the current line based
1995 lines to make scripts safe for running in the current line based
1996 IPython.
1996 IPython.
1997 """
1997 """
1998 res = []
1998 res = []
1999 lines = script.splitlines()
1999 lines = script.splitlines()
2000 level = 0
2000 level = 0
2001
2001
2002 for l in lines:
2002 for l in lines:
2003 lstripped = l.lstrip()
2003 lstripped = l.lstrip()
2004 stripped = l.strip()
2004 stripped = l.strip()
2005 if not stripped:
2005 if not stripped:
2006 continue
2006 continue
2007 newlevel = len(l) - len(lstripped)
2007 newlevel = len(l) - len(lstripped)
2008 if level > 0 and newlevel == 0 and \
2008 if level > 0 and newlevel == 0 and \
2009 not self._is_secondary_block_start(stripped):
2009 not self._is_secondary_block_start(stripped):
2010 # add empty line
2010 # add empty line
2011 res.append('')
2011 res.append('')
2012 res.append(l)
2012 res.append(l)
2013 level = newlevel
2013 level = newlevel
2014
2014
2015 return '\n'.join(res) + '\n'
2015 return '\n'.join(res) + '\n'
2016
2016
2017 def runlines(self, lines, clean=False):
2017 def runlines(self, lines, clean=False):
2018 """Run a string of one or more lines of source.
2018 """Run a string of one or more lines of source.
2019
2019
2020 This method is capable of running a string containing multiple source
2020 This method is capable of running a string containing multiple source
2021 lines, as if they had been entered at the IPython prompt. Since it
2021 lines, as if they had been entered at the IPython prompt. Since it
2022 exposes IPython's processing machinery, the given strings can contain
2022 exposes IPython's processing machinery, the given strings can contain
2023 magic calls (%magic), special shell access (!cmd), etc.
2023 magic calls (%magic), special shell access (!cmd), etc.
2024 """
2024 """
2025
2025
2026 if isinstance(lines, (list, tuple)):
2026 if isinstance(lines, (list, tuple)):
2027 lines = '\n'.join(lines)
2027 lines = '\n'.join(lines)
2028
2028
2029 if clean:
2029 if clean:
2030 lines = self.cleanup_ipy_script(lines)
2030 lines = self.cleanup_ipy_script(lines)
2031
2031
2032 # We must start with a clean buffer, in case this is run from an
2032 # We must start with a clean buffer, in case this is run from an
2033 # interactive IPython session (via a magic, for example).
2033 # interactive IPython session (via a magic, for example).
2034 self.resetbuffer()
2034 self.resetbuffer()
2035 lines = lines.splitlines()
2035 lines = lines.splitlines()
2036 more = 0
2036 more = 0
2037
2037
2038 with nested(self.builtin_trap, self.display_trap):
2038 with nested(self.builtin_trap, self.display_trap):
2039 for line in lines:
2039 for line in lines:
2040 # skip blank lines so we don't mess up the prompt counter, but do
2040 # skip blank lines so we don't mess up the prompt counter, but do
2041 # NOT skip even a blank line if we are in a code block (more is
2041 # NOT skip even a blank line if we are in a code block (more is
2042 # true)
2042 # true)
2043
2043
2044 if line or more:
2044 if line or more:
2045 # push to raw history, so hist line numbers stay in sync
2045 # push to raw history, so hist line numbers stay in sync
2046 self.input_hist_raw.append("# " + line + "\n")
2046 self.input_hist_raw.append("# " + line + "\n")
2047 prefiltered = self.prefilter_manager.prefilter_lines(line,more)
2047 prefiltered = self.prefilter_manager.prefilter_lines(line,more)
2048 more = self.push_line(prefiltered)
2048 more = self.push_line(prefiltered)
2049 # IPython's runsource returns None if there was an error
2049 # IPython's runsource returns None if there was an error
2050 # compiling the code. This allows us to stop processing right
2050 # compiling the code. This allows us to stop processing right
2051 # away, so the user gets the error message at the right place.
2051 # away, so the user gets the error message at the right place.
2052 if more is None:
2052 if more is None:
2053 break
2053 break
2054 else:
2054 else:
2055 self.input_hist_raw.append("\n")
2055 self.input_hist_raw.append("\n")
2056 # final newline in case the input didn't have it, so that the code
2056 # final newline in case the input didn't have it, so that the code
2057 # actually does get executed
2057 # actually does get executed
2058 if more:
2058 if more:
2059 self.push_line('\n')
2059 self.push_line('\n')
2060
2060
2061 def runsource(self, source, filename='<input>', symbol='single'):
2061 def runsource(self, source, filename='<input>', symbol='single'):
2062 """Compile and run some source in the interpreter.
2062 """Compile and run some source in the interpreter.
2063
2063
2064 Arguments are as for compile_command().
2064 Arguments are as for compile_command().
2065
2065
2066 One several things can happen:
2066 One several things can happen:
2067
2067
2068 1) The input is incorrect; compile_command() raised an
2068 1) The input is incorrect; compile_command() raised an
2069 exception (SyntaxError or OverflowError). A syntax traceback
2069 exception (SyntaxError or OverflowError). A syntax traceback
2070 will be printed by calling the showsyntaxerror() method.
2070 will be printed by calling the showsyntaxerror() method.
2071
2071
2072 2) The input is incomplete, and more input is required;
2072 2) The input is incomplete, and more input is required;
2073 compile_command() returned None. Nothing happens.
2073 compile_command() returned None. Nothing happens.
2074
2074
2075 3) The input is complete; compile_command() returned a code
2075 3) The input is complete; compile_command() returned a code
2076 object. The code is executed by calling self.runcode() (which
2076 object. The code is executed by calling self.runcode() (which
2077 also handles run-time exceptions, except for SystemExit).
2077 also handles run-time exceptions, except for SystemExit).
2078
2078
2079 The return value is:
2079 The return value is:
2080
2080
2081 - True in case 2
2081 - True in case 2
2082
2082
2083 - False in the other cases, unless an exception is raised, where
2083 - False in the other cases, unless an exception is raised, where
2084 None is returned instead. This can be used by external callers to
2084 None is returned instead. This can be used by external callers to
2085 know whether to continue feeding input or not.
2085 know whether to continue feeding input or not.
2086
2086
2087 The return value can be used to decide whether to use sys.ps1 or
2087 The return value can be used to decide whether to use sys.ps1 or
2088 sys.ps2 to prompt the next line."""
2088 sys.ps2 to prompt the next line."""
2089
2089
2090 # if the source code has leading blanks, add 'if 1:\n' to it
2090 # if the source code has leading blanks, add 'if 1:\n' to it
2091 # this allows execution of indented pasted code. It is tempting
2091 # this allows execution of indented pasted code. It is tempting
2092 # to add '\n' at the end of source to run commands like ' a=1'
2092 # to add '\n' at the end of source to run commands like ' a=1'
2093 # directly, but this fails for more complicated scenarios
2093 # directly, but this fails for more complicated scenarios
2094 source=source.encode(self.stdin_encoding)
2094 source=source.encode(self.stdin_encoding)
2095 if source[:1] in [' ', '\t']:
2095 if source[:1] in [' ', '\t']:
2096 source = 'if 1:\n%s' % source
2096 source = 'if 1:\n%s' % source
2097
2097
2098 try:
2098 try:
2099 code = self.compile(source,filename,symbol)
2099 code = self.compile(source,filename,symbol)
2100 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
2100 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
2101 # Case 1
2101 # Case 1
2102 self.showsyntaxerror(filename)
2102 self.showsyntaxerror(filename)
2103 return None
2103 return None
2104
2104
2105 if code is None:
2105 if code is None:
2106 # Case 2
2106 # Case 2
2107 return True
2107 return True
2108
2108
2109 # Case 3
2109 # Case 3
2110 # We store the code object so that threaded shells and
2110 # We store the code object so that threaded shells and
2111 # custom exception handlers can access all this info if needed.
2111 # custom exception handlers can access all this info if needed.
2112 # The source corresponding to this can be obtained from the
2112 # The source corresponding to this can be obtained from the
2113 # buffer attribute as '\n'.join(self.buffer).
2113 # buffer attribute as '\n'.join(self.buffer).
2114 self.code_to_run = code
2114 self.code_to_run = code
2115 # now actually execute the code object
2115 # now actually execute the code object
2116 if self.runcode(code) == 0:
2116 if self.runcode(code) == 0:
2117 return False
2117 return False
2118 else:
2118 else:
2119 return None
2119 return None
2120
2120
2121 def runcode(self,code_obj):
2121 def runcode(self,code_obj):
2122 """Execute a code object.
2122 """Execute a code object.
2123
2123
2124 When an exception occurs, self.showtraceback() is called to display a
2124 When an exception occurs, self.showtraceback() is called to display a
2125 traceback.
2125 traceback.
2126
2126
2127 Return value: a flag indicating whether the code to be run completed
2127 Return value: a flag indicating whether the code to be run completed
2128 successfully:
2128 successfully:
2129
2129
2130 - 0: successful execution.
2130 - 0: successful execution.
2131 - 1: an error occurred.
2131 - 1: an error occurred.
2132 """
2132 """
2133
2133
2134 # Set our own excepthook in case the user code tries to call it
2134 # Set our own excepthook in case the user code tries to call it
2135 # directly, so that the IPython crash handler doesn't get triggered
2135 # directly, so that the IPython crash handler doesn't get triggered
2136 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2136 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2137
2137
2138 # we save the original sys.excepthook in the instance, in case config
2138 # we save the original sys.excepthook in the instance, in case config
2139 # code (such as magics) needs access to it.
2139 # code (such as magics) needs access to it.
2140 self.sys_excepthook = old_excepthook
2140 self.sys_excepthook = old_excepthook
2141 outflag = 1 # happens in more places, so it's easier as default
2141 outflag = 1 # happens in more places, so it's easier as default
2142 try:
2142 try:
2143 try:
2143 try:
2144 self.hooks.pre_runcode_hook()
2144 self.hooks.pre_runcode_hook()
2145 exec code_obj in self.user_global_ns, self.user_ns
2145 exec code_obj in self.user_global_ns, self.user_ns
2146 finally:
2146 finally:
2147 # Reset our crash handler in place
2147 # Reset our crash handler in place
2148 sys.excepthook = old_excepthook
2148 sys.excepthook = old_excepthook
2149 except SystemExit:
2149 except SystemExit:
2150 self.resetbuffer()
2150 self.resetbuffer()
2151 self.showtraceback()
2151 self.showtraceback()
2152 warn("Type %exit or %quit to exit IPython "
2152 warn("Type %exit or %quit to exit IPython "
2153 "(%Exit or %Quit do so unconditionally).",level=1)
2153 "(%Exit or %Quit do so unconditionally).",level=1)
2154 except self.custom_exceptions:
2154 except self.custom_exceptions:
2155 etype,value,tb = sys.exc_info()
2155 etype,value,tb = sys.exc_info()
2156 self.CustomTB(etype,value,tb)
2156 self.CustomTB(etype,value,tb)
2157 except:
2157 except:
2158 self.showtraceback()
2158 self.showtraceback()
2159 else:
2159 else:
2160 outflag = 0
2160 outflag = 0
2161 if softspace(sys.stdout, 0):
2161 if softspace(sys.stdout, 0):
2162 print
2162 print
2163 # Flush out code object which has been run (and source)
2163 # Flush out code object which has been run (and source)
2164 self.code_to_run = None
2164 self.code_to_run = None
2165 return outflag
2165 return outflag
2166
2166
2167 def push_line(self, line):
2167 def push_line(self, line):
2168 """Push a line to the interpreter.
2168 """Push a line to the interpreter.
2169
2169
2170 The line should not have a trailing newline; it may have
2170 The line should not have a trailing newline; it may have
2171 internal newlines. The line is appended to a buffer and the
2171 internal newlines. The line is appended to a buffer and the
2172 interpreter's runsource() method is called with the
2172 interpreter's runsource() method is called with the
2173 concatenated contents of the buffer as source. If this
2173 concatenated contents of the buffer as source. If this
2174 indicates that the command was executed or invalid, the buffer
2174 indicates that the command was executed or invalid, the buffer
2175 is reset; otherwise, the command is incomplete, and the buffer
2175 is reset; otherwise, the command is incomplete, and the buffer
2176 is left as it was after the line was appended. The return
2176 is left as it was after the line was appended. The return
2177 value is 1 if more input is required, 0 if the line was dealt
2177 value is 1 if more input is required, 0 if the line was dealt
2178 with in some way (this is the same as runsource()).
2178 with in some way (this is the same as runsource()).
2179 """
2179 """
2180
2180
2181 # autoindent management should be done here, and not in the
2181 # autoindent management should be done here, and not in the
2182 # interactive loop, since that one is only seen by keyboard input. We
2182 # interactive loop, since that one is only seen by keyboard input. We
2183 # need this done correctly even for code run via runlines (which uses
2183 # need this done correctly even for code run via runlines (which uses
2184 # push).
2184 # push).
2185
2185
2186 #print 'push line: <%s>' % line # dbg
2186 #print 'push line: <%s>' % line # dbg
2187 for subline in line.splitlines():
2187 for subline in line.splitlines():
2188 self._autoindent_update(subline)
2188 self._autoindent_update(subline)
2189 self.buffer.append(line)
2189 self.buffer.append(line)
2190 more = self.runsource('\n'.join(self.buffer), self.filename)
2190 more = self.runsource('\n'.join(self.buffer), self.filename)
2191 if not more:
2191 if not more:
2192 self.resetbuffer()
2192 self.resetbuffer()
2193 return more
2193 return more
2194
2194
2195 def _autoindent_update(self,line):
2195 def _autoindent_update(self,line):
2196 """Keep track of the indent level."""
2196 """Keep track of the indent level."""
2197
2197
2198 #debugx('line')
2198 #debugx('line')
2199 #debugx('self.indent_current_nsp')
2199 #debugx('self.indent_current_nsp')
2200 if self.autoindent:
2200 if self.autoindent:
2201 if line:
2201 if line:
2202 inisp = num_ini_spaces(line)
2202 inisp = num_ini_spaces(line)
2203 if inisp < self.indent_current_nsp:
2203 if inisp < self.indent_current_nsp:
2204 self.indent_current_nsp = inisp
2204 self.indent_current_nsp = inisp
2205
2205
2206 if line[-1] == ':':
2206 if line[-1] == ':':
2207 self.indent_current_nsp += 4
2207 self.indent_current_nsp += 4
2208 elif dedent_re.match(line):
2208 elif dedent_re.match(line):
2209 self.indent_current_nsp -= 4
2209 self.indent_current_nsp -= 4
2210 else:
2210 else:
2211 self.indent_current_nsp = 0
2211 self.indent_current_nsp = 0
2212
2212
2213 def resetbuffer(self):
2213 def resetbuffer(self):
2214 """Reset the input buffer."""
2214 """Reset the input buffer."""
2215 self.buffer[:] = []
2215 self.buffer[:] = []
2216
2216
2217 def raw_input(self,prompt='',continue_prompt=False):
2217 def raw_input(self,prompt='',continue_prompt=False):
2218 """Write a prompt and read a line.
2218 """Write a prompt and read a line.
2219
2219
2220 The returned line does not include the trailing newline.
2220 The returned line does not include the trailing newline.
2221 When the user enters the EOF key sequence, EOFError is raised.
2221 When the user enters the EOF key sequence, EOFError is raised.
2222
2222
2223 Optional inputs:
2223 Optional inputs:
2224
2224
2225 - prompt(''): a string to be printed to prompt the user.
2225 - prompt(''): a string to be printed to prompt the user.
2226
2226
2227 - continue_prompt(False): whether this line is the first one or a
2227 - continue_prompt(False): whether this line is the first one or a
2228 continuation in a sequence of inputs.
2228 continuation in a sequence of inputs.
2229 """
2229 """
2230 # growl.notify("raw_input: ", "prompt = %r\ncontinue_prompt = %s" % (prompt, continue_prompt))
2230 # growl.notify("raw_input: ", "prompt = %r\ncontinue_prompt = %s" % (prompt, continue_prompt))
2231
2231
2232 # Code run by the user may have modified the readline completer state.
2232 # Code run by the user may have modified the readline completer state.
2233 # We must ensure that our completer is back in place.
2233 # We must ensure that our completer is back in place.
2234
2234
2235 if self.has_readline:
2235 if self.has_readline:
2236 self.set_completer()
2236 self.set_completer()
2237
2237
2238 try:
2238 try:
2239 line = raw_input_original(prompt).decode(self.stdin_encoding)
2239 line = raw_input_original(prompt).decode(self.stdin_encoding)
2240 except ValueError:
2240 except ValueError:
2241 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2241 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2242 " or sys.stdout.close()!\nExiting IPython!")
2242 " or sys.stdout.close()!\nExiting IPython!")
2243 self.ask_exit()
2243 self.ask_exit()
2244 return ""
2244 return ""
2245
2245
2246 # Try to be reasonably smart about not re-indenting pasted input more
2246 # Try to be reasonably smart about not re-indenting pasted input more
2247 # than necessary. We do this by trimming out the auto-indent initial
2247 # than necessary. We do this by trimming out the auto-indent initial
2248 # spaces, if the user's actual input started itself with whitespace.
2248 # spaces, if the user's actual input started itself with whitespace.
2249 #debugx('self.buffer[-1]')
2249 #debugx('self.buffer[-1]')
2250
2250
2251 if self.autoindent:
2251 if self.autoindent:
2252 if num_ini_spaces(line) > self.indent_current_nsp:
2252 if num_ini_spaces(line) > self.indent_current_nsp:
2253 line = line[self.indent_current_nsp:]
2253 line = line[self.indent_current_nsp:]
2254 self.indent_current_nsp = 0
2254 self.indent_current_nsp = 0
2255
2255
2256 # store the unfiltered input before the user has any chance to modify
2256 # store the unfiltered input before the user has any chance to modify
2257 # it.
2257 # it.
2258 if line.strip():
2258 if line.strip():
2259 if continue_prompt:
2259 if continue_prompt:
2260 self.input_hist_raw[-1] += '%s\n' % line
2260 self.input_hist_raw[-1] += '%s\n' % line
2261 if self.has_readline and self.readline_use:
2261 if self.has_readline and self.readline_use:
2262 try:
2262 try:
2263 histlen = self.readline.get_current_history_length()
2263 histlen = self.readline.get_current_history_length()
2264 if histlen > 1:
2264 if histlen > 1:
2265 newhist = self.input_hist_raw[-1].rstrip()
2265 newhist = self.input_hist_raw[-1].rstrip()
2266 self.readline.remove_history_item(histlen-1)
2266 self.readline.remove_history_item(histlen-1)
2267 self.readline.replace_history_item(histlen-2,
2267 self.readline.replace_history_item(histlen-2,
2268 newhist.encode(self.stdin_encoding))
2268 newhist.encode(self.stdin_encoding))
2269 except AttributeError:
2269 except AttributeError:
2270 pass # re{move,place}_history_item are new in 2.4.
2270 pass # re{move,place}_history_item are new in 2.4.
2271 else:
2271 else:
2272 self.input_hist_raw.append('%s\n' % line)
2272 self.input_hist_raw.append('%s\n' % line)
2273 # only entries starting at first column go to shadow history
2273 # only entries starting at first column go to shadow history
2274 if line.lstrip() == line:
2274 if line.lstrip() == line:
2275 self.shadowhist.add(line.strip())
2275 self.shadowhist.add(line.strip())
2276 elif not continue_prompt:
2276 elif not continue_prompt:
2277 self.input_hist_raw.append('\n')
2277 self.input_hist_raw.append('\n')
2278 try:
2278 try:
2279 lineout = self.prefilter_manager.prefilter_lines(line,continue_prompt)
2279 lineout = self.prefilter_manager.prefilter_lines(line,continue_prompt)
2280 except:
2280 except:
2281 # blanket except, in case a user-defined prefilter crashes, so it
2281 # blanket except, in case a user-defined prefilter crashes, so it
2282 # can't take all of ipython with it.
2282 # can't take all of ipython with it.
2283 self.showtraceback()
2283 self.showtraceback()
2284 return ''
2284 return ''
2285 else:
2285 else:
2286 return lineout
2286 return lineout
2287
2287
2288 #-------------------------------------------------------------------------
2288 #-------------------------------------------------------------------------
2289 # Working with components
2289 # Working with components
2290 #-------------------------------------------------------------------------
2290 #-------------------------------------------------------------------------
2291
2291
2292 def get_component(self, name=None, klass=None):
2292 def get_component(self, name=None, klass=None):
2293 """Fetch a component by name and klass in my tree."""
2293 """Fetch a component by name and klass in my tree."""
2294 c = Component.get_instances(root=self, name=name, klass=klass)
2294 c = Component.get_instances(root=self, name=name, klass=klass)
2295 if len(c) == 0:
2295 if len(c) == 0:
2296 return None
2296 return None
2297 if len(c) == 1:
2297 if len(c) == 1:
2298 return c[0]
2298 return c[0]
2299 else:
2299 else:
2300 return c
2300 return c
2301
2301
2302 #-------------------------------------------------------------------------
2302 #-------------------------------------------------------------------------
2303 # IPython extensions
2303 # IPython extensions
2304 #-------------------------------------------------------------------------
2304 #-------------------------------------------------------------------------
2305
2305
2306 def load_extension(self, module_str):
2306 def load_extension(self, module_str):
2307 """Load an IPython extension by its module name.
2307 """Load an IPython extension by its module name.
2308
2308
2309 An IPython extension is an importable Python module that has
2309 An IPython extension is an importable Python module that has
2310 a function with the signature::
2310 a function with the signature::
2311
2311
2312 def load_ipython_extension(ipython):
2312 def load_ipython_extension(ipython):
2313 # Do things with ipython
2313 # Do things with ipython
2314
2314
2315 This function is called after your extension is imported and the
2315 This function is called after your extension is imported and the
2316 currently active :class:`InteractiveShell` instance is passed as
2316 currently active :class:`InteractiveShell` instance is passed as
2317 the only argument. You can do anything you want with IPython at
2317 the only argument. You can do anything you want with IPython at
2318 that point, including defining new magic and aliases, adding new
2318 that point, including defining new magic and aliases, adding new
2319 components, etc.
2319 components, etc.
2320
2320
2321 The :func:`load_ipython_extension` will be called again is you
2321 The :func:`load_ipython_extension` will be called again is you
2322 load or reload the extension again. It is up to the extension
2322 load or reload the extension again. It is up to the extension
2323 author to add code to manage that.
2323 author to add code to manage that.
2324
2324
2325 You can put your extension modules anywhere you want, as long as
2325 You can put your extension modules anywhere you want, as long as
2326 they can be imported by Python's standard import mechanism. However,
2326 they can be imported by Python's standard import mechanism. However,
2327 to make it easy to write extensions, you can also put your extensions
2327 to make it easy to write extensions, you can also put your extensions
2328 in ``os.path.join(self.ipython_dir, 'extensions')``. This directory
2328 in ``os.path.join(self.ipython_dir, 'extensions')``. This directory
2329 is added to ``sys.path`` automatically.
2329 is added to ``sys.path`` automatically.
2330 """
2330 """
2331 from IPython.utils.syspathcontext import prepended_to_syspath
2331 from IPython.utils.syspathcontext import prepended_to_syspath
2332
2332
2333 if module_str not in sys.modules:
2333 if module_str not in sys.modules:
2334 with prepended_to_syspath(self.ipython_extension_dir):
2334 with prepended_to_syspath(self.ipython_extension_dir):
2335 __import__(module_str)
2335 __import__(module_str)
2336 mod = sys.modules[module_str]
2336 mod = sys.modules[module_str]
2337 self._call_load_ipython_extension(mod)
2337 return self._call_load_ipython_extension(mod)
2338
2338
2339 def unload_extension(self, module_str):
2339 def unload_extension(self, module_str):
2340 """Unload an IPython extension by its module name.
2340 """Unload an IPython extension by its module name.
2341
2341
2342 This function looks up the extension's name in ``sys.modules`` and
2342 This function looks up the extension's name in ``sys.modules`` and
2343 simply calls ``mod.unload_ipython_extension(self)``.
2343 simply calls ``mod.unload_ipython_extension(self)``.
2344 """
2344 """
2345 if module_str in sys.modules:
2345 if module_str in sys.modules:
2346 mod = sys.modules[module_str]
2346 mod = sys.modules[module_str]
2347 self._call_unload_ipython_extension(mod)
2347 self._call_unload_ipython_extension(mod)
2348
2348
2349 def reload_extension(self, module_str):
2349 def reload_extension(self, module_str):
2350 """Reload an IPython extension by calling reload.
2350 """Reload an IPython extension by calling reload.
2351
2351
2352 If the module has not been loaded before,
2352 If the module has not been loaded before,
2353 :meth:`InteractiveShell.load_extension` is called. Otherwise
2353 :meth:`InteractiveShell.load_extension` is called. Otherwise
2354 :func:`reload` is called and then the :func:`load_ipython_extension`
2354 :func:`reload` is called and then the :func:`load_ipython_extension`
2355 function of the module, if it exists is called.
2355 function of the module, if it exists is called.
2356 """
2356 """
2357 from IPython.utils.syspathcontext import prepended_to_syspath
2357 from IPython.utils.syspathcontext import prepended_to_syspath
2358
2358
2359 with prepended_to_syspath(self.ipython_extension_dir):
2359 with prepended_to_syspath(self.ipython_extension_dir):
2360 if module_str in sys.modules:
2360 if module_str in sys.modules:
2361 mod = sys.modules[module_str]
2361 mod = sys.modules[module_str]
2362 reload(mod)
2362 reload(mod)
2363 self._call_load_ipython_extension(mod)
2363 self._call_load_ipython_extension(mod)
2364 else:
2364 else:
2365 self.load_extension(module_str)
2365 self.load_extension(module_str)
2366
2366
2367 def _call_load_ipython_extension(self, mod):
2367 def _call_load_ipython_extension(self, mod):
2368 if hasattr(mod, 'load_ipython_extension'):
2368 if hasattr(mod, 'load_ipython_extension'):
2369 mod.load_ipython_extension(self)
2369 return mod.load_ipython_extension(self)
2370
2370
2371 def _call_unload_ipython_extension(self, mod):
2371 def _call_unload_ipython_extension(self, mod):
2372 if hasattr(mod, 'unload_ipython_extension'):
2372 if hasattr(mod, 'unload_ipython_extension'):
2373 mod.unload_ipython_extension(self)
2373 return mod.unload_ipython_extension(self)
2374
2374
2375 #-------------------------------------------------------------------------
2375 #-------------------------------------------------------------------------
2376 # Things related to the prefilter
2376 # Things related to the prefilter
2377 #-------------------------------------------------------------------------
2377 #-------------------------------------------------------------------------
2378
2378
2379 def init_prefilter(self):
2379 def init_prefilter(self):
2380 self.prefilter_manager = PrefilterManager(self, config=self.config)
2380 self.prefilter_manager = PrefilterManager(self, config=self.config)
2381 # Ultimately this will be refactored in the new interpreter code, but
2381 # Ultimately this will be refactored in the new interpreter code, but
2382 # for now, we should expose the main prefilter method (there's legacy
2382 # for now, we should expose the main prefilter method (there's legacy
2383 # code out there that may rely on this).
2383 # code out there that may rely on this).
2384 self.prefilter = self.prefilter_manager.prefilter_lines
2384 self.prefilter = self.prefilter_manager.prefilter_lines
2385
2385
2386 #-------------------------------------------------------------------------
2386 #-------------------------------------------------------------------------
2387 # Utilities
2387 # Utilities
2388 #-------------------------------------------------------------------------
2388 #-------------------------------------------------------------------------
2389
2389
2390 def getoutput(self, cmd):
2390 def getoutput(self, cmd):
2391 return getoutput(self.var_expand(cmd,depth=2),
2391 return getoutput(self.var_expand(cmd,depth=2),
2392 header=self.system_header,
2392 header=self.system_header,
2393 verbose=self.system_verbose)
2393 verbose=self.system_verbose)
2394
2394
2395 def getoutputerror(self, cmd):
2395 def getoutputerror(self, cmd):
2396 return getoutputerror(self.var_expand(cmd,depth=2),
2396 return getoutputerror(self.var_expand(cmd,depth=2),
2397 header=self.system_header,
2397 header=self.system_header,
2398 verbose=self.system_verbose)
2398 verbose=self.system_verbose)
2399
2399
2400 def var_expand(self,cmd,depth=0):
2400 def var_expand(self,cmd,depth=0):
2401 """Expand python variables in a string.
2401 """Expand python variables in a string.
2402
2402
2403 The depth argument indicates how many frames above the caller should
2403 The depth argument indicates how many frames above the caller should
2404 be walked to look for the local namespace where to expand variables.
2404 be walked to look for the local namespace where to expand variables.
2405
2405
2406 The global namespace for expansion is always the user's interactive
2406 The global namespace for expansion is always the user's interactive
2407 namespace.
2407 namespace.
2408 """
2408 """
2409
2409
2410 return str(ItplNS(cmd,
2410 return str(ItplNS(cmd,
2411 self.user_ns, # globals
2411 self.user_ns, # globals
2412 # Skip our own frame in searching for locals:
2412 # Skip our own frame in searching for locals:
2413 sys._getframe(depth+1).f_locals # locals
2413 sys._getframe(depth+1).f_locals # locals
2414 ))
2414 ))
2415
2415
2416 def mktempfile(self,data=None):
2416 def mktempfile(self,data=None):
2417 """Make a new tempfile and return its filename.
2417 """Make a new tempfile and return its filename.
2418
2418
2419 This makes a call to tempfile.mktemp, but it registers the created
2419 This makes a call to tempfile.mktemp, but it registers the created
2420 filename internally so ipython cleans it up at exit time.
2420 filename internally so ipython cleans it up at exit time.
2421
2421
2422 Optional inputs:
2422 Optional inputs:
2423
2423
2424 - data(None): if data is given, it gets written out to the temp file
2424 - data(None): if data is given, it gets written out to the temp file
2425 immediately, and the file is closed again."""
2425 immediately, and the file is closed again."""
2426
2426
2427 filename = tempfile.mktemp('.py','ipython_edit_')
2427 filename = tempfile.mktemp('.py','ipython_edit_')
2428 self.tempfiles.append(filename)
2428 self.tempfiles.append(filename)
2429
2429
2430 if data:
2430 if data:
2431 tmp_file = open(filename,'w')
2431 tmp_file = open(filename,'w')
2432 tmp_file.write(data)
2432 tmp_file.write(data)
2433 tmp_file.close()
2433 tmp_file.close()
2434 return filename
2434 return filename
2435
2435
2436 def write(self,data):
2436 def write(self,data):
2437 """Write a string to the default output"""
2437 """Write a string to the default output"""
2438 Term.cout.write(data)
2438 Term.cout.write(data)
2439
2439
2440 def write_err(self,data):
2440 def write_err(self,data):
2441 """Write a string to the default error output"""
2441 """Write a string to the default error output"""
2442 Term.cerr.write(data)
2442 Term.cerr.write(data)
2443
2443
2444 def ask_yes_no(self,prompt,default=True):
2444 def ask_yes_no(self,prompt,default=True):
2445 if self.quiet:
2445 if self.quiet:
2446 return True
2446 return True
2447 return ask_yes_no(prompt,default)
2447 return ask_yes_no(prompt,default)
2448
2448
2449 #-------------------------------------------------------------------------
2449 #-------------------------------------------------------------------------
2450 # Things related to GUI support and pylab
2450 # Things related to GUI support and pylab
2451 #-------------------------------------------------------------------------
2451 #-------------------------------------------------------------------------
2452
2452
2453 def enable_pylab(self, gui=None):
2453 def enable_pylab(self, gui=None):
2454 """Activate pylab support at runtime.
2454 """Activate pylab support at runtime.
2455
2455
2456 This turns on support for matplotlib, preloads into the interactive
2456 This turns on support for matplotlib, preloads into the interactive
2457 namespace all of numpy and pylab, and configures IPython to correcdtly
2457 namespace all of numpy and pylab, and configures IPython to correcdtly
2458 interact with the GUI event loop. The GUI backend to be used can be
2458 interact with the GUI event loop. The GUI backend to be used can be
2459 optionally selected with the optional :param:`gui` argument.
2459 optionally selected with the optional :param:`gui` argument.
2460
2460
2461 Parameters
2461 Parameters
2462 ----------
2462 ----------
2463 gui : optional, string
2463 gui : optional, string
2464
2464
2465 If given, dictates the choice of matplotlib GUI backend to use
2465 If given, dictates the choice of matplotlib GUI backend to use
2466 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
2466 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
2467 'gtk'), otherwise we use the default chosen by matplotlib (as
2467 'gtk'), otherwise we use the default chosen by matplotlib (as
2468 dictated by the matplotlib build-time options plus the user's
2468 dictated by the matplotlib build-time options plus the user's
2469 matplotlibrc configuration file).
2469 matplotlibrc configuration file).
2470 """
2470 """
2471 # We want to prevent the loading of pylab to pollute the user's
2471 # We want to prevent the loading of pylab to pollute the user's
2472 # namespace as shown by the %who* magics, so we execute the activation
2472 # namespace as shown by the %who* magics, so we execute the activation
2473 # code in an empty namespace, and we update *both* user_ns and
2473 # code in an empty namespace, and we update *both* user_ns and
2474 # user_config_ns with this information.
2474 # user_config_ns with this information.
2475 ns = {}
2475 ns = {}
2476 gui = pylab_activate(ns, gui)
2476 gui = pylab_activate(ns, gui)
2477 self.user_ns.update(ns)
2477 self.user_ns.update(ns)
2478 self.user_config_ns.update(ns)
2478 self.user_config_ns.update(ns)
2479 # Now we must activate the gui pylab wants to use, and fix %run to take
2479 # Now we must activate the gui pylab wants to use, and fix %run to take
2480 # plot updates into account
2480 # plot updates into account
2481 enable_gui(gui)
2481 enable_gui(gui)
2482 self.magic_run = self._pylab_magic_run
2482 self.magic_run = self._pylab_magic_run
2483
2483
2484 #-------------------------------------------------------------------------
2484 #-------------------------------------------------------------------------
2485 # Things related to IPython exiting
2485 # Things related to IPython exiting
2486 #-------------------------------------------------------------------------
2486 #-------------------------------------------------------------------------
2487
2487
2488 def ask_exit(self):
2488 def ask_exit(self):
2489 """ Ask the shell to exit. Can be overiden and used as a callback. """
2489 """ Ask the shell to exit. Can be overiden and used as a callback. """
2490 self.exit_now = True
2490 self.exit_now = True
2491
2491
2492 def exit(self):
2492 def exit(self):
2493 """Handle interactive exit.
2493 """Handle interactive exit.
2494
2494
2495 This method calls the ask_exit callback."""
2495 This method calls the ask_exit callback."""
2496 if self.confirm_exit:
2496 if self.confirm_exit:
2497 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2497 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2498 self.ask_exit()
2498 self.ask_exit()
2499 else:
2499 else:
2500 self.ask_exit()
2500 self.ask_exit()
2501
2501
2502 def atexit_operations(self):
2502 def atexit_operations(self):
2503 """This will be executed at the time of exit.
2503 """This will be executed at the time of exit.
2504
2504
2505 Saving of persistent data should be performed here.
2505 Saving of persistent data should be performed here.
2506 """
2506 """
2507 self.savehist()
2507 self.savehist()
2508
2508
2509 # Cleanup all tempfiles left around
2509 # Cleanup all tempfiles left around
2510 for tfile in self.tempfiles:
2510 for tfile in self.tempfiles:
2511 try:
2511 try:
2512 os.unlink(tfile)
2512 os.unlink(tfile)
2513 except OSError:
2513 except OSError:
2514 pass
2514 pass
2515
2515
2516 # Clear all user namespaces to release all references cleanly.
2516 # Clear all user namespaces to release all references cleanly.
2517 self.reset()
2517 self.reset()
2518
2518
2519 # Run user hooks
2519 # Run user hooks
2520 self.hooks.shutdown_hook()
2520 self.hooks.shutdown_hook()
2521
2521
2522 def cleanup(self):
2522 def cleanup(self):
2523 self.restore_sys_module_state()
2523 self.restore_sys_module_state()
2524
2524
2525
2525
@@ -1,3612 +1,3612 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #*****************************************************************************
5 #*****************************************************************************
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
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 # Modules and globals
14 # Modules and globals
15
15
16 # Python standard modules
16 # Python standard modules
17 import __builtin__
17 import __builtin__
18 import bdb
18 import bdb
19 import inspect
19 import inspect
20 import os
20 import os
21 import pdb
21 import pdb
22 import pydoc
22 import pydoc
23 import sys
23 import sys
24 import shutil
24 import shutil
25 import re
25 import re
26 import tempfile
26 import tempfile
27 import time
27 import time
28 import cPickle as pickle
28 import cPickle as pickle
29 import textwrap
29 import textwrap
30 from cStringIO import StringIO
30 from cStringIO import StringIO
31 from getopt import getopt,GetoptError
31 from getopt import getopt,GetoptError
32 from pprint import pprint, pformat
32 from pprint import pprint, pformat
33
33
34 # cProfile was added in Python2.5
34 # cProfile was added in Python2.5
35 try:
35 try:
36 import cProfile as profile
36 import cProfile as profile
37 import pstats
37 import pstats
38 except ImportError:
38 except ImportError:
39 # profile isn't bundled by default in Debian for license reasons
39 # profile isn't bundled by default in Debian for license reasons
40 try:
40 try:
41 import profile,pstats
41 import profile,pstats
42 except ImportError:
42 except ImportError:
43 profile = pstats = None
43 profile = pstats = None
44
44
45 # Homebrewed
45 # Homebrewed
46 import IPython
46 import IPython
47 import IPython.utils.generics
47 import IPython.utils.generics
48
48
49 from IPython.core import debugger, oinspect
49 from IPython.core import debugger, oinspect
50 from IPython.core.error import TryNext
50 from IPython.core.error import TryNext
51 from IPython.core.error import UsageError
51 from IPython.core.error import UsageError
52 from IPython.core.fakemodule import FakeModule
52 from IPython.core.fakemodule import FakeModule
53 from IPython.core.macro import Macro
53 from IPython.core.macro import Macro
54 from IPython.core.page import page
54 from IPython.core.page import page
55 from IPython.core.prefilter import ESC_MAGIC
55 from IPython.core.prefilter import ESC_MAGIC
56 from IPython.core.pylabtools import mpl_runner
56 from IPython.core.pylabtools import mpl_runner
57 from IPython.lib.inputhook import enable_gui
57 from IPython.lib.inputhook import enable_gui
58 from IPython.external.Itpl import Itpl, itpl, printpl,itplns
58 from IPython.external.Itpl import Itpl, itpl, printpl,itplns
59 from IPython.testing import decorators as testdec
59 from IPython.testing import decorators as testdec
60 from IPython.utils import platutils
60 from IPython.utils import platutils
61 from IPython.utils import wildcard
61 from IPython.utils import wildcard
62 from IPython.utils.PyColorize import Parser
62 from IPython.utils.PyColorize import Parser
63 from IPython.utils.ipstruct import Struct
63 from IPython.utils.ipstruct import Struct
64
64
65 # XXX - We need to switch to explicit imports here with genutils
65 # XXX - We need to switch to explicit imports here with genutils
66 from IPython.utils.genutils import *
66 from IPython.utils.genutils import *
67
67
68 #***************************************************************************
68 #***************************************************************************
69 # Utility functions
69 # Utility functions
70 def on_off(tag):
70 def on_off(tag):
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
72 return ['OFF','ON'][tag]
72 return ['OFF','ON'][tag]
73
73
74 class Bunch: pass
74 class Bunch: pass
75
75
76 def compress_dhist(dh):
76 def compress_dhist(dh):
77 head, tail = dh[:-10], dh[-10:]
77 head, tail = dh[:-10], dh[-10:]
78
78
79 newhead = []
79 newhead = []
80 done = set()
80 done = set()
81 for h in head:
81 for h in head:
82 if h in done:
82 if h in done:
83 continue
83 continue
84 newhead.append(h)
84 newhead.append(h)
85 done.add(h)
85 done.add(h)
86
86
87 return newhead + tail
87 return newhead + tail
88
88
89
89
90 #***************************************************************************
90 #***************************************************************************
91 # Main class implementing Magic functionality
91 # Main class implementing Magic functionality
92
92
93 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
93 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
94 # on construction of the main InteractiveShell object. Something odd is going
94 # on construction of the main InteractiveShell object. Something odd is going
95 # on with super() calls, Component and the MRO... For now leave it as-is, but
95 # on with super() calls, Component and the MRO... For now leave it as-is, but
96 # eventually this needs to be clarified.
96 # eventually this needs to be clarified.
97
97
98 class Magic:
98 class Magic:
99 """Magic functions for InteractiveShell.
99 """Magic functions for InteractiveShell.
100
100
101 Shell functions which can be reached as %function_name. All magic
101 Shell functions which can be reached as %function_name. All magic
102 functions should accept a string, which they can parse for their own
102 functions should accept a string, which they can parse for their own
103 needs. This can make some functions easier to type, eg `%cd ../`
103 needs. This can make some functions easier to type, eg `%cd ../`
104 vs. `%cd("../")`
104 vs. `%cd("../")`
105
105
106 ALL definitions MUST begin with the prefix magic_. The user won't need it
106 ALL definitions MUST begin with the prefix magic_. The user won't need it
107 at the command line, but it is is needed in the definition. """
107 at the command line, but it is is needed in the definition. """
108
108
109 # class globals
109 # class globals
110 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
110 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
111 'Automagic is ON, % prefix NOT needed for magic functions.']
111 'Automagic is ON, % prefix NOT needed for magic functions.']
112
112
113 #......................................................................
113 #......................................................................
114 # some utility functions
114 # some utility functions
115
115
116 def __init__(self,shell):
116 def __init__(self,shell):
117
117
118 self.options_table = {}
118 self.options_table = {}
119 if profile is None:
119 if profile is None:
120 self.magic_prun = self.profile_missing_notice
120 self.magic_prun = self.profile_missing_notice
121 self.shell = shell
121 self.shell = shell
122
122
123 # namespace for holding state we may need
123 # namespace for holding state we may need
124 self._magic_state = Bunch()
124 self._magic_state = Bunch()
125
125
126 def profile_missing_notice(self, *args, **kwargs):
126 def profile_missing_notice(self, *args, **kwargs):
127 error("""\
127 error("""\
128 The profile module could not be found. It has been removed from the standard
128 The profile module could not be found. It has been removed from the standard
129 python packages because of its non-free license. To use profiling, install the
129 python packages because of its non-free license. To use profiling, install the
130 python-profiler package from non-free.""")
130 python-profiler package from non-free.""")
131
131
132 def default_option(self,fn,optstr):
132 def default_option(self,fn,optstr):
133 """Make an entry in the options_table for fn, with value optstr"""
133 """Make an entry in the options_table for fn, with value optstr"""
134
134
135 if fn not in self.lsmagic():
135 if fn not in self.lsmagic():
136 error("%s is not a magic function" % fn)
136 error("%s is not a magic function" % fn)
137 self.options_table[fn] = optstr
137 self.options_table[fn] = optstr
138
138
139 def lsmagic(self):
139 def lsmagic(self):
140 """Return a list of currently available magic functions.
140 """Return a list of currently available magic functions.
141
141
142 Gives a list of the bare names after mangling (['ls','cd', ...], not
142 Gives a list of the bare names after mangling (['ls','cd', ...], not
143 ['magic_ls','magic_cd',...]"""
143 ['magic_ls','magic_cd',...]"""
144
144
145 # FIXME. This needs a cleanup, in the way the magics list is built.
145 # FIXME. This needs a cleanup, in the way the magics list is built.
146
146
147 # magics in class definition
147 # magics in class definition
148 class_magic = lambda fn: fn.startswith('magic_') and \
148 class_magic = lambda fn: fn.startswith('magic_') and \
149 callable(Magic.__dict__[fn])
149 callable(Magic.__dict__[fn])
150 # in instance namespace (run-time user additions)
150 # in instance namespace (run-time user additions)
151 inst_magic = lambda fn: fn.startswith('magic_') and \
151 inst_magic = lambda fn: fn.startswith('magic_') and \
152 callable(self.__dict__[fn])
152 callable(self.__dict__[fn])
153 # and bound magics by user (so they can access self):
153 # and bound magics by user (so they can access self):
154 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
154 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
155 callable(self.__class__.__dict__[fn])
155 callable(self.__class__.__dict__[fn])
156 magics = filter(class_magic,Magic.__dict__.keys()) + \
156 magics = filter(class_magic,Magic.__dict__.keys()) + \
157 filter(inst_magic,self.__dict__.keys()) + \
157 filter(inst_magic,self.__dict__.keys()) + \
158 filter(inst_bound_magic,self.__class__.__dict__.keys())
158 filter(inst_bound_magic,self.__class__.__dict__.keys())
159 out = []
159 out = []
160 for fn in set(magics):
160 for fn in set(magics):
161 out.append(fn.replace('magic_','',1))
161 out.append(fn.replace('magic_','',1))
162 out.sort()
162 out.sort()
163 return out
163 return out
164
164
165 def extract_input_slices(self,slices,raw=False):
165 def extract_input_slices(self,slices,raw=False):
166 """Return as a string a set of input history slices.
166 """Return as a string a set of input history slices.
167
167
168 Inputs:
168 Inputs:
169
169
170 - slices: the set of slices is given as a list of strings (like
170 - slices: the set of slices is given as a list of strings (like
171 ['1','4:8','9'], since this function is for use by magic functions
171 ['1','4:8','9'], since this function is for use by magic functions
172 which get their arguments as strings.
172 which get their arguments as strings.
173
173
174 Optional inputs:
174 Optional inputs:
175
175
176 - raw(False): by default, the processed input is used. If this is
176 - raw(False): by default, the processed input is used. If this is
177 true, the raw input history is used instead.
177 true, the raw input history is used instead.
178
178
179 Note that slices can be called with two notations:
179 Note that slices can be called with two notations:
180
180
181 N:M -> standard python form, means including items N...(M-1).
181 N:M -> standard python form, means including items N...(M-1).
182
182
183 N-M -> include items N..M (closed endpoint)."""
183 N-M -> include items N..M (closed endpoint)."""
184
184
185 if raw:
185 if raw:
186 hist = self.shell.input_hist_raw
186 hist = self.shell.input_hist_raw
187 else:
187 else:
188 hist = self.shell.input_hist
188 hist = self.shell.input_hist
189
189
190 cmds = []
190 cmds = []
191 for chunk in slices:
191 for chunk in slices:
192 if ':' in chunk:
192 if ':' in chunk:
193 ini,fin = map(int,chunk.split(':'))
193 ini,fin = map(int,chunk.split(':'))
194 elif '-' in chunk:
194 elif '-' in chunk:
195 ini,fin = map(int,chunk.split('-'))
195 ini,fin = map(int,chunk.split('-'))
196 fin += 1
196 fin += 1
197 else:
197 else:
198 ini = int(chunk)
198 ini = int(chunk)
199 fin = ini+1
199 fin = ini+1
200 cmds.append(hist[ini:fin])
200 cmds.append(hist[ini:fin])
201 return cmds
201 return cmds
202
202
203 def _ofind(self, oname, namespaces=None):
203 def _ofind(self, oname, namespaces=None):
204 """Find an object in the available namespaces.
204 """Find an object in the available namespaces.
205
205
206 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
206 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
207
207
208 Has special code to detect magic functions.
208 Has special code to detect magic functions.
209 """
209 """
210
210
211 oname = oname.strip()
211 oname = oname.strip()
212
212
213 alias_ns = None
213 alias_ns = None
214 if namespaces is None:
214 if namespaces is None:
215 # Namespaces to search in:
215 # Namespaces to search in:
216 # Put them in a list. The order is important so that we
216 # Put them in a list. The order is important so that we
217 # find things in the same order that Python finds them.
217 # find things in the same order that Python finds them.
218 namespaces = [ ('Interactive', self.shell.user_ns),
218 namespaces = [ ('Interactive', self.shell.user_ns),
219 ('IPython internal', self.shell.internal_ns),
219 ('IPython internal', self.shell.internal_ns),
220 ('Python builtin', __builtin__.__dict__),
220 ('Python builtin', __builtin__.__dict__),
221 ('Alias', self.shell.alias_manager.alias_table),
221 ('Alias', self.shell.alias_manager.alias_table),
222 ]
222 ]
223 alias_ns = self.shell.alias_manager.alias_table
223 alias_ns = self.shell.alias_manager.alias_table
224
224
225 # initialize results to 'null'
225 # initialize results to 'null'
226 found = 0; obj = None; ospace = None; ds = None;
226 found = 0; obj = None; ospace = None; ds = None;
227 ismagic = 0; isalias = 0; parent = None
227 ismagic = 0; isalias = 0; parent = None
228
228
229 # Look for the given name by splitting it in parts. If the head is
229 # Look for the given name by splitting it in parts. If the head is
230 # found, then we look for all the remaining parts as members, and only
230 # found, then we look for all the remaining parts as members, and only
231 # declare success if we can find them all.
231 # declare success if we can find them all.
232 oname_parts = oname.split('.')
232 oname_parts = oname.split('.')
233 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
233 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
234 for nsname,ns in namespaces:
234 for nsname,ns in namespaces:
235 try:
235 try:
236 obj = ns[oname_head]
236 obj = ns[oname_head]
237 except KeyError:
237 except KeyError:
238 continue
238 continue
239 else:
239 else:
240 #print 'oname_rest:', oname_rest # dbg
240 #print 'oname_rest:', oname_rest # dbg
241 for part in oname_rest:
241 for part in oname_rest:
242 try:
242 try:
243 parent = obj
243 parent = obj
244 obj = getattr(obj,part)
244 obj = getattr(obj,part)
245 except:
245 except:
246 # Blanket except b/c some badly implemented objects
246 # Blanket except b/c some badly implemented objects
247 # allow __getattr__ to raise exceptions other than
247 # allow __getattr__ to raise exceptions other than
248 # AttributeError, which then crashes IPython.
248 # AttributeError, which then crashes IPython.
249 break
249 break
250 else:
250 else:
251 # If we finish the for loop (no break), we got all members
251 # If we finish the for loop (no break), we got all members
252 found = 1
252 found = 1
253 ospace = nsname
253 ospace = nsname
254 if ns == alias_ns:
254 if ns == alias_ns:
255 isalias = 1
255 isalias = 1
256 break # namespace loop
256 break # namespace loop
257
257
258 # Try to see if it's magic
258 # Try to see if it's magic
259 if not found:
259 if not found:
260 if oname.startswith(ESC_MAGIC):
260 if oname.startswith(ESC_MAGIC):
261 oname = oname[1:]
261 oname = oname[1:]
262 obj = getattr(self,'magic_'+oname,None)
262 obj = getattr(self,'magic_'+oname,None)
263 if obj is not None:
263 if obj is not None:
264 found = 1
264 found = 1
265 ospace = 'IPython internal'
265 ospace = 'IPython internal'
266 ismagic = 1
266 ismagic = 1
267
267
268 # Last try: special-case some literals like '', [], {}, etc:
268 # Last try: special-case some literals like '', [], {}, etc:
269 if not found and oname_head in ["''",'""','[]','{}','()']:
269 if not found and oname_head in ["''",'""','[]','{}','()']:
270 obj = eval(oname_head)
270 obj = eval(oname_head)
271 found = 1
271 found = 1
272 ospace = 'Interactive'
272 ospace = 'Interactive'
273
273
274 return {'found':found, 'obj':obj, 'namespace':ospace,
274 return {'found':found, 'obj':obj, 'namespace':ospace,
275 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
275 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
276
276
277 def arg_err(self,func):
277 def arg_err(self,func):
278 """Print docstring if incorrect arguments were passed"""
278 """Print docstring if incorrect arguments were passed"""
279 print 'Error in arguments:'
279 print 'Error in arguments:'
280 print OInspect.getdoc(func)
280 print OInspect.getdoc(func)
281
281
282 def format_latex(self,strng):
282 def format_latex(self,strng):
283 """Format a string for latex inclusion."""
283 """Format a string for latex inclusion."""
284
284
285 # Characters that need to be escaped for latex:
285 # Characters that need to be escaped for latex:
286 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
286 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
287 # Magic command names as headers:
287 # Magic command names as headers:
288 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
288 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
289 re.MULTILINE)
289 re.MULTILINE)
290 # Magic commands
290 # Magic commands
291 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
291 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
292 re.MULTILINE)
292 re.MULTILINE)
293 # Paragraph continue
293 # Paragraph continue
294 par_re = re.compile(r'\\$',re.MULTILINE)
294 par_re = re.compile(r'\\$',re.MULTILINE)
295
295
296 # The "\n" symbol
296 # The "\n" symbol
297 newline_re = re.compile(r'\\n')
297 newline_re = re.compile(r'\\n')
298
298
299 # Now build the string for output:
299 # Now build the string for output:
300 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
300 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
301 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
301 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
302 strng)
302 strng)
303 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
303 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
304 strng = par_re.sub(r'\\\\',strng)
304 strng = par_re.sub(r'\\\\',strng)
305 strng = escape_re.sub(r'\\\1',strng)
305 strng = escape_re.sub(r'\\\1',strng)
306 strng = newline_re.sub(r'\\textbackslash{}n',strng)
306 strng = newline_re.sub(r'\\textbackslash{}n',strng)
307 return strng
307 return strng
308
308
309 def format_screen(self,strng):
309 def format_screen(self,strng):
310 """Format a string for screen printing.
310 """Format a string for screen printing.
311
311
312 This removes some latex-type format codes."""
312 This removes some latex-type format codes."""
313 # Paragraph continue
313 # Paragraph continue
314 par_re = re.compile(r'\\$',re.MULTILINE)
314 par_re = re.compile(r'\\$',re.MULTILINE)
315 strng = par_re.sub('',strng)
315 strng = par_re.sub('',strng)
316 return strng
316 return strng
317
317
318 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
318 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
319 """Parse options passed to an argument string.
319 """Parse options passed to an argument string.
320
320
321 The interface is similar to that of getopt(), but it returns back a
321 The interface is similar to that of getopt(), but it returns back a
322 Struct with the options as keys and the stripped argument string still
322 Struct with the options as keys and the stripped argument string still
323 as a string.
323 as a string.
324
324
325 arg_str is quoted as a true sys.argv vector by using shlex.split.
325 arg_str is quoted as a true sys.argv vector by using shlex.split.
326 This allows us to easily expand variables, glob files, quote
326 This allows us to easily expand variables, glob files, quote
327 arguments, etc.
327 arguments, etc.
328
328
329 Options:
329 Options:
330 -mode: default 'string'. If given as 'list', the argument string is
330 -mode: default 'string'. If given as 'list', the argument string is
331 returned as a list (split on whitespace) instead of a string.
331 returned as a list (split on whitespace) instead of a string.
332
332
333 -list_all: put all option values in lists. Normally only options
333 -list_all: put all option values in lists. Normally only options
334 appearing more than once are put in a list.
334 appearing more than once are put in a list.
335
335
336 -posix (True): whether to split the input line in POSIX mode or not,
336 -posix (True): whether to split the input line in POSIX mode or not,
337 as per the conventions outlined in the shlex module from the
337 as per the conventions outlined in the shlex module from the
338 standard library."""
338 standard library."""
339
339
340 # inject default options at the beginning of the input line
340 # inject default options at the beginning of the input line
341 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
341 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
342 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
342 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
343
343
344 mode = kw.get('mode','string')
344 mode = kw.get('mode','string')
345 if mode not in ['string','list']:
345 if mode not in ['string','list']:
346 raise ValueError,'incorrect mode given: %s' % mode
346 raise ValueError,'incorrect mode given: %s' % mode
347 # Get options
347 # Get options
348 list_all = kw.get('list_all',0)
348 list_all = kw.get('list_all',0)
349 posix = kw.get('posix',True)
349 posix = kw.get('posix',True)
350
350
351 # Check if we have more than one argument to warrant extra processing:
351 # Check if we have more than one argument to warrant extra processing:
352 odict = {} # Dictionary with options
352 odict = {} # Dictionary with options
353 args = arg_str.split()
353 args = arg_str.split()
354 if len(args) >= 1:
354 if len(args) >= 1:
355 # If the list of inputs only has 0 or 1 thing in it, there's no
355 # If the list of inputs only has 0 or 1 thing in it, there's no
356 # need to look for options
356 # need to look for options
357 argv = arg_split(arg_str,posix)
357 argv = arg_split(arg_str,posix)
358 # Do regular option processing
358 # Do regular option processing
359 try:
359 try:
360 opts,args = getopt(argv,opt_str,*long_opts)
360 opts,args = getopt(argv,opt_str,*long_opts)
361 except GetoptError,e:
361 except GetoptError,e:
362 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
362 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
363 " ".join(long_opts)))
363 " ".join(long_opts)))
364 for o,a in opts:
364 for o,a in opts:
365 if o.startswith('--'):
365 if o.startswith('--'):
366 o = o[2:]
366 o = o[2:]
367 else:
367 else:
368 o = o[1:]
368 o = o[1:]
369 try:
369 try:
370 odict[o].append(a)
370 odict[o].append(a)
371 except AttributeError:
371 except AttributeError:
372 odict[o] = [odict[o],a]
372 odict[o] = [odict[o],a]
373 except KeyError:
373 except KeyError:
374 if list_all:
374 if list_all:
375 odict[o] = [a]
375 odict[o] = [a]
376 else:
376 else:
377 odict[o] = a
377 odict[o] = a
378
378
379 # Prepare opts,args for return
379 # Prepare opts,args for return
380 opts = Struct(odict)
380 opts = Struct(odict)
381 if mode == 'string':
381 if mode == 'string':
382 args = ' '.join(args)
382 args = ' '.join(args)
383
383
384 return opts,args
384 return opts,args
385
385
386 #......................................................................
386 #......................................................................
387 # And now the actual magic functions
387 # And now the actual magic functions
388
388
389 # Functions for IPython shell work (vars,funcs, config, etc)
389 # Functions for IPython shell work (vars,funcs, config, etc)
390 def magic_lsmagic(self, parameter_s = ''):
390 def magic_lsmagic(self, parameter_s = ''):
391 """List currently available magic functions."""
391 """List currently available magic functions."""
392 mesc = ESC_MAGIC
392 mesc = ESC_MAGIC
393 print 'Available magic functions:\n'+mesc+\
393 print 'Available magic functions:\n'+mesc+\
394 (' '+mesc).join(self.lsmagic())
394 (' '+mesc).join(self.lsmagic())
395 print '\n' + Magic.auto_status[self.shell.automagic]
395 print '\n' + Magic.auto_status[self.shell.automagic]
396 return None
396 return None
397
397
398 def magic_magic(self, parameter_s = ''):
398 def magic_magic(self, parameter_s = ''):
399 """Print information about the magic function system.
399 """Print information about the magic function system.
400
400
401 Supported formats: -latex, -brief, -rest
401 Supported formats: -latex, -brief, -rest
402 """
402 """
403
403
404 mode = ''
404 mode = ''
405 try:
405 try:
406 if parameter_s.split()[0] == '-latex':
406 if parameter_s.split()[0] == '-latex':
407 mode = 'latex'
407 mode = 'latex'
408 if parameter_s.split()[0] == '-brief':
408 if parameter_s.split()[0] == '-brief':
409 mode = 'brief'
409 mode = 'brief'
410 if parameter_s.split()[0] == '-rest':
410 if parameter_s.split()[0] == '-rest':
411 mode = 'rest'
411 mode = 'rest'
412 rest_docs = []
412 rest_docs = []
413 except:
413 except:
414 pass
414 pass
415
415
416 magic_docs = []
416 magic_docs = []
417 for fname in self.lsmagic():
417 for fname in self.lsmagic():
418 mname = 'magic_' + fname
418 mname = 'magic_' + fname
419 for space in (Magic,self,self.__class__):
419 for space in (Magic,self,self.__class__):
420 try:
420 try:
421 fn = space.__dict__[mname]
421 fn = space.__dict__[mname]
422 except KeyError:
422 except KeyError:
423 pass
423 pass
424 else:
424 else:
425 break
425 break
426 if mode == 'brief':
426 if mode == 'brief':
427 # only first line
427 # only first line
428 if fn.__doc__:
428 if fn.__doc__:
429 fndoc = fn.__doc__.split('\n',1)[0]
429 fndoc = fn.__doc__.split('\n',1)[0]
430 else:
430 else:
431 fndoc = 'No documentation'
431 fndoc = 'No documentation'
432 else:
432 else:
433 if fn.__doc__:
433 if fn.__doc__:
434 fndoc = fn.__doc__.rstrip()
434 fndoc = fn.__doc__.rstrip()
435 else:
435 else:
436 fndoc = 'No documentation'
436 fndoc = 'No documentation'
437
437
438
438
439 if mode == 'rest':
439 if mode == 'rest':
440 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
440 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
441 fname,fndoc))
441 fname,fndoc))
442
442
443 else:
443 else:
444 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
444 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
445 fname,fndoc))
445 fname,fndoc))
446
446
447 magic_docs = ''.join(magic_docs)
447 magic_docs = ''.join(magic_docs)
448
448
449 if mode == 'rest':
449 if mode == 'rest':
450 return "".join(rest_docs)
450 return "".join(rest_docs)
451
451
452 if mode == 'latex':
452 if mode == 'latex':
453 print self.format_latex(magic_docs)
453 print self.format_latex(magic_docs)
454 return
454 return
455 else:
455 else:
456 magic_docs = self.format_screen(magic_docs)
456 magic_docs = self.format_screen(magic_docs)
457 if mode == 'brief':
457 if mode == 'brief':
458 return magic_docs
458 return magic_docs
459
459
460 outmsg = """
460 outmsg = """
461 IPython's 'magic' functions
461 IPython's 'magic' functions
462 ===========================
462 ===========================
463
463
464 The magic function system provides a series of functions which allow you to
464 The magic function system provides a series of functions which allow you to
465 control the behavior of IPython itself, plus a lot of system-type
465 control the behavior of IPython itself, plus a lot of system-type
466 features. All these functions are prefixed with a % character, but parameters
466 features. All these functions are prefixed with a % character, but parameters
467 are given without parentheses or quotes.
467 are given without parentheses or quotes.
468
468
469 NOTE: If you have 'automagic' enabled (via the command line option or with the
469 NOTE: If you have 'automagic' enabled (via the command line option or with the
470 %automagic function), you don't need to type in the % explicitly. By default,
470 %automagic function), you don't need to type in the % explicitly. By default,
471 IPython ships with automagic on, so you should only rarely need the % escape.
471 IPython ships with automagic on, so you should only rarely need the % escape.
472
472
473 Example: typing '%cd mydir' (without the quotes) changes you working directory
473 Example: typing '%cd mydir' (without the quotes) changes you working directory
474 to 'mydir', if it exists.
474 to 'mydir', if it exists.
475
475
476 You can define your own magic functions to extend the system. See the supplied
476 You can define your own magic functions to extend the system. See the supplied
477 ipythonrc and example-magic.py files for details (in your ipython
477 ipythonrc and example-magic.py files for details (in your ipython
478 configuration directory, typically $HOME/.ipython/).
478 configuration directory, typically $HOME/.ipython/).
479
479
480 You can also define your own aliased names for magic functions. In your
480 You can also define your own aliased names for magic functions. In your
481 ipythonrc file, placing a line like:
481 ipythonrc file, placing a line like:
482
482
483 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
483 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
484
484
485 will define %pf as a new name for %profile.
485 will define %pf as a new name for %profile.
486
486
487 You can also call magics in code using the magic() function, which IPython
487 You can also call magics in code using the magic() function, which IPython
488 automatically adds to the builtin namespace. Type 'magic?' for details.
488 automatically adds to the builtin namespace. Type 'magic?' for details.
489
489
490 For a list of the available magic functions, use %lsmagic. For a description
490 For a list of the available magic functions, use %lsmagic. For a description
491 of any of them, type %magic_name?, e.g. '%cd?'.
491 of any of them, type %magic_name?, e.g. '%cd?'.
492
492
493 Currently the magic system has the following functions:\n"""
493 Currently the magic system has the following functions:\n"""
494
494
495 mesc = ESC_MAGIC
495 mesc = ESC_MAGIC
496 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
496 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
497 "\n\n%s%s\n\n%s" % (outmsg,
497 "\n\n%s%s\n\n%s" % (outmsg,
498 magic_docs,mesc,mesc,
498 magic_docs,mesc,mesc,
499 (' '+mesc).join(self.lsmagic()),
499 (' '+mesc).join(self.lsmagic()),
500 Magic.auto_status[self.shell.automagic] ) )
500 Magic.auto_status[self.shell.automagic] ) )
501
501
502 page(outmsg,screen_lines=self.shell.usable_screen_length)
502 page(outmsg,screen_lines=self.shell.usable_screen_length)
503
503
504
504
505 def magic_autoindent(self, parameter_s = ''):
505 def magic_autoindent(self, parameter_s = ''):
506 """Toggle autoindent on/off (if available)."""
506 """Toggle autoindent on/off (if available)."""
507
507
508 self.shell.set_autoindent()
508 self.shell.set_autoindent()
509 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
509 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
510
510
511
511
512 def magic_automagic(self, parameter_s = ''):
512 def magic_automagic(self, parameter_s = ''):
513 """Make magic functions callable without having to type the initial %.
513 """Make magic functions callable without having to type the initial %.
514
514
515 Without argumentsl toggles on/off (when off, you must call it as
515 Without argumentsl toggles on/off (when off, you must call it as
516 %automagic, of course). With arguments it sets the value, and you can
516 %automagic, of course). With arguments it sets the value, and you can
517 use any of (case insensitive):
517 use any of (case insensitive):
518
518
519 - on,1,True: to activate
519 - on,1,True: to activate
520
520
521 - off,0,False: to deactivate.
521 - off,0,False: to deactivate.
522
522
523 Note that magic functions have lowest priority, so if there's a
523 Note that magic functions have lowest priority, so if there's a
524 variable whose name collides with that of a magic fn, automagic won't
524 variable whose name collides with that of a magic fn, automagic won't
525 work for that function (you get the variable instead). However, if you
525 work for that function (you get the variable instead). However, if you
526 delete the variable (del var), the previously shadowed magic function
526 delete the variable (del var), the previously shadowed magic function
527 becomes visible to automagic again."""
527 becomes visible to automagic again."""
528
528
529 arg = parameter_s.lower()
529 arg = parameter_s.lower()
530 if parameter_s in ('on','1','true'):
530 if parameter_s in ('on','1','true'):
531 self.shell.automagic = True
531 self.shell.automagic = True
532 elif parameter_s in ('off','0','false'):
532 elif parameter_s in ('off','0','false'):
533 self.shell.automagic = False
533 self.shell.automagic = False
534 else:
534 else:
535 self.shell.automagic = not self.shell.automagic
535 self.shell.automagic = not self.shell.automagic
536 print '\n' + Magic.auto_status[self.shell.automagic]
536 print '\n' + Magic.auto_status[self.shell.automagic]
537
537
538 @testdec.skip_doctest
538 @testdec.skip_doctest
539 def magic_autocall(self, parameter_s = ''):
539 def magic_autocall(self, parameter_s = ''):
540 """Make functions callable without having to type parentheses.
540 """Make functions callable without having to type parentheses.
541
541
542 Usage:
542 Usage:
543
543
544 %autocall [mode]
544 %autocall [mode]
545
545
546 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
546 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
547 value is toggled on and off (remembering the previous state).
547 value is toggled on and off (remembering the previous state).
548
548
549 In more detail, these values mean:
549 In more detail, these values mean:
550
550
551 0 -> fully disabled
551 0 -> fully disabled
552
552
553 1 -> active, but do not apply if there are no arguments on the line.
553 1 -> active, but do not apply if there are no arguments on the line.
554
554
555 In this mode, you get:
555 In this mode, you get:
556
556
557 In [1]: callable
557 In [1]: callable
558 Out[1]: <built-in function callable>
558 Out[1]: <built-in function callable>
559
559
560 In [2]: callable 'hello'
560 In [2]: callable 'hello'
561 ------> callable('hello')
561 ------> callable('hello')
562 Out[2]: False
562 Out[2]: False
563
563
564 2 -> Active always. Even if no arguments are present, the callable
564 2 -> Active always. Even if no arguments are present, the callable
565 object is called:
565 object is called:
566
566
567 In [2]: float
567 In [2]: float
568 ------> float()
568 ------> float()
569 Out[2]: 0.0
569 Out[2]: 0.0
570
570
571 Note that even with autocall off, you can still use '/' at the start of
571 Note that even with autocall off, you can still use '/' at the start of
572 a line to treat the first argument on the command line as a function
572 a line to treat the first argument on the command line as a function
573 and add parentheses to it:
573 and add parentheses to it:
574
574
575 In [8]: /str 43
575 In [8]: /str 43
576 ------> str(43)
576 ------> str(43)
577 Out[8]: '43'
577 Out[8]: '43'
578
578
579 # all-random (note for auto-testing)
579 # all-random (note for auto-testing)
580 """
580 """
581
581
582 if parameter_s:
582 if parameter_s:
583 arg = int(parameter_s)
583 arg = int(parameter_s)
584 else:
584 else:
585 arg = 'toggle'
585 arg = 'toggle'
586
586
587 if not arg in (0,1,2,'toggle'):
587 if not arg in (0,1,2,'toggle'):
588 error('Valid modes: (0->Off, 1->Smart, 2->Full')
588 error('Valid modes: (0->Off, 1->Smart, 2->Full')
589 return
589 return
590
590
591 if arg in (0,1,2):
591 if arg in (0,1,2):
592 self.shell.autocall = arg
592 self.shell.autocall = arg
593 else: # toggle
593 else: # toggle
594 if self.shell.autocall:
594 if self.shell.autocall:
595 self._magic_state.autocall_save = self.shell.autocall
595 self._magic_state.autocall_save = self.shell.autocall
596 self.shell.autocall = 0
596 self.shell.autocall = 0
597 else:
597 else:
598 try:
598 try:
599 self.shell.autocall = self._magic_state.autocall_save
599 self.shell.autocall = self._magic_state.autocall_save
600 except AttributeError:
600 except AttributeError:
601 self.shell.autocall = self._magic_state.autocall_save = 1
601 self.shell.autocall = self._magic_state.autocall_save = 1
602
602
603 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
603 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
604
604
605 def magic_system_verbose(self, parameter_s = ''):
605 def magic_system_verbose(self, parameter_s = ''):
606 """Set verbose printing of system calls.
606 """Set verbose printing of system calls.
607
607
608 If called without an argument, act as a toggle"""
608 If called without an argument, act as a toggle"""
609
609
610 if parameter_s:
610 if parameter_s:
611 val = bool(eval(parameter_s))
611 val = bool(eval(parameter_s))
612 else:
612 else:
613 val = None
613 val = None
614
614
615 if self.shell.system_verbose:
615 if self.shell.system_verbose:
616 self.shell.system_verbose = False
616 self.shell.system_verbose = False
617 else:
617 else:
618 self.shell.system_verbose = True
618 self.shell.system_verbose = True
619 print "System verbose printing is:",\
619 print "System verbose printing is:",\
620 ['OFF','ON'][self.shell.system_verbose]
620 ['OFF','ON'][self.shell.system_verbose]
621
621
622
622
623 def magic_page(self, parameter_s=''):
623 def magic_page(self, parameter_s=''):
624 """Pretty print the object and display it through a pager.
624 """Pretty print the object and display it through a pager.
625
625
626 %page [options] OBJECT
626 %page [options] OBJECT
627
627
628 If no object is given, use _ (last output).
628 If no object is given, use _ (last output).
629
629
630 Options:
630 Options:
631
631
632 -r: page str(object), don't pretty-print it."""
632 -r: page str(object), don't pretty-print it."""
633
633
634 # After a function contributed by Olivier Aubert, slightly modified.
634 # After a function contributed by Olivier Aubert, slightly modified.
635
635
636 # Process options/args
636 # Process options/args
637 opts,args = self.parse_options(parameter_s,'r')
637 opts,args = self.parse_options(parameter_s,'r')
638 raw = 'r' in opts
638 raw = 'r' in opts
639
639
640 oname = args and args or '_'
640 oname = args and args or '_'
641 info = self._ofind(oname)
641 info = self._ofind(oname)
642 if info['found']:
642 if info['found']:
643 txt = (raw and str or pformat)( info['obj'] )
643 txt = (raw and str or pformat)( info['obj'] )
644 page(txt)
644 page(txt)
645 else:
645 else:
646 print 'Object `%s` not found' % oname
646 print 'Object `%s` not found' % oname
647
647
648 def magic_profile(self, parameter_s=''):
648 def magic_profile(self, parameter_s=''):
649 """Print your currently active IPyhton profile."""
649 """Print your currently active IPyhton profile."""
650 if self.shell.profile:
650 if self.shell.profile:
651 printpl('Current IPython profile: $self.shell.profile.')
651 printpl('Current IPython profile: $self.shell.profile.')
652 else:
652 else:
653 print 'No profile active.'
653 print 'No profile active.'
654
654
655 def magic_pinfo(self, parameter_s='', namespaces=None):
655 def magic_pinfo(self, parameter_s='', namespaces=None):
656 """Provide detailed information about an object.
656 """Provide detailed information about an object.
657
657
658 '%pinfo object' is just a synonym for object? or ?object."""
658 '%pinfo object' is just a synonym for object? or ?object."""
659
659
660 #print 'pinfo par: <%s>' % parameter_s # dbg
660 #print 'pinfo par: <%s>' % parameter_s # dbg
661
661
662
662
663 # detail_level: 0 -> obj? , 1 -> obj??
663 # detail_level: 0 -> obj? , 1 -> obj??
664 detail_level = 0
664 detail_level = 0
665 # We need to detect if we got called as 'pinfo pinfo foo', which can
665 # We need to detect if we got called as 'pinfo pinfo foo', which can
666 # happen if the user types 'pinfo foo?' at the cmd line.
666 # happen if the user types 'pinfo foo?' at the cmd line.
667 pinfo,qmark1,oname,qmark2 = \
667 pinfo,qmark1,oname,qmark2 = \
668 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
668 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
669 if pinfo or qmark1 or qmark2:
669 if pinfo or qmark1 or qmark2:
670 detail_level = 1
670 detail_level = 1
671 if "*" in oname:
671 if "*" in oname:
672 self.magic_psearch(oname)
672 self.magic_psearch(oname)
673 else:
673 else:
674 self._inspect('pinfo', oname, detail_level=detail_level,
674 self._inspect('pinfo', oname, detail_level=detail_level,
675 namespaces=namespaces)
675 namespaces=namespaces)
676
676
677 def magic_pdef(self, parameter_s='', namespaces=None):
677 def magic_pdef(self, parameter_s='', namespaces=None):
678 """Print the definition header for any callable object.
678 """Print the definition header for any callable object.
679
679
680 If the object is a class, print the constructor information."""
680 If the object is a class, print the constructor information."""
681 self._inspect('pdef',parameter_s, namespaces)
681 self._inspect('pdef',parameter_s, namespaces)
682
682
683 def magic_pdoc(self, parameter_s='', namespaces=None):
683 def magic_pdoc(self, parameter_s='', namespaces=None):
684 """Print the docstring for an object.
684 """Print the docstring for an object.
685
685
686 If the given object is a class, it will print both the class and the
686 If the given object is a class, it will print both the class and the
687 constructor docstrings."""
687 constructor docstrings."""
688 self._inspect('pdoc',parameter_s, namespaces)
688 self._inspect('pdoc',parameter_s, namespaces)
689
689
690 def magic_psource(self, parameter_s='', namespaces=None):
690 def magic_psource(self, parameter_s='', namespaces=None):
691 """Print (or run through pager) the source code for an object."""
691 """Print (or run through pager) the source code for an object."""
692 self._inspect('psource',parameter_s, namespaces)
692 self._inspect('psource',parameter_s, namespaces)
693
693
694 def magic_pfile(self, parameter_s=''):
694 def magic_pfile(self, parameter_s=''):
695 """Print (or run through pager) the file where an object is defined.
695 """Print (or run through pager) the file where an object is defined.
696
696
697 The file opens at the line where the object definition begins. IPython
697 The file opens at the line where the object definition begins. IPython
698 will honor the environment variable PAGER if set, and otherwise will
698 will honor the environment variable PAGER if set, and otherwise will
699 do its best to print the file in a convenient form.
699 do its best to print the file in a convenient form.
700
700
701 If the given argument is not an object currently defined, IPython will
701 If the given argument is not an object currently defined, IPython will
702 try to interpret it as a filename (automatically adding a .py extension
702 try to interpret it as a filename (automatically adding a .py extension
703 if needed). You can thus use %pfile as a syntax highlighting code
703 if needed). You can thus use %pfile as a syntax highlighting code
704 viewer."""
704 viewer."""
705
705
706 # first interpret argument as an object name
706 # first interpret argument as an object name
707 out = self._inspect('pfile',parameter_s)
707 out = self._inspect('pfile',parameter_s)
708 # if not, try the input as a filename
708 # if not, try the input as a filename
709 if out == 'not found':
709 if out == 'not found':
710 try:
710 try:
711 filename = get_py_filename(parameter_s)
711 filename = get_py_filename(parameter_s)
712 except IOError,msg:
712 except IOError,msg:
713 print msg
713 print msg
714 return
714 return
715 page(self.shell.inspector.format(file(filename).read()))
715 page(self.shell.inspector.format(file(filename).read()))
716
716
717 def _inspect(self,meth,oname,namespaces=None,**kw):
717 def _inspect(self,meth,oname,namespaces=None,**kw):
718 """Generic interface to the inspector system.
718 """Generic interface to the inspector system.
719
719
720 This function is meant to be called by pdef, pdoc & friends."""
720 This function is meant to be called by pdef, pdoc & friends."""
721
721
722 #oname = oname.strip()
722 #oname = oname.strip()
723 #print '1- oname: <%r>' % oname # dbg
723 #print '1- oname: <%r>' % oname # dbg
724 try:
724 try:
725 oname = oname.strip().encode('ascii')
725 oname = oname.strip().encode('ascii')
726 #print '2- oname: <%r>' % oname # dbg
726 #print '2- oname: <%r>' % oname # dbg
727 except UnicodeEncodeError:
727 except UnicodeEncodeError:
728 print 'Python identifiers can only contain ascii characters.'
728 print 'Python identifiers can only contain ascii characters.'
729 return 'not found'
729 return 'not found'
730
730
731 info = Struct(self._ofind(oname, namespaces))
731 info = Struct(self._ofind(oname, namespaces))
732
732
733 if info.found:
733 if info.found:
734 try:
734 try:
735 IPython.utils.generics.inspect_object(info.obj)
735 IPython.utils.generics.inspect_object(info.obj)
736 return
736 return
737 except TryNext:
737 except TryNext:
738 pass
738 pass
739 # Get the docstring of the class property if it exists.
739 # Get the docstring of the class property if it exists.
740 path = oname.split('.')
740 path = oname.split('.')
741 root = '.'.join(path[:-1])
741 root = '.'.join(path[:-1])
742 if info.parent is not None:
742 if info.parent is not None:
743 try:
743 try:
744 target = getattr(info.parent, '__class__')
744 target = getattr(info.parent, '__class__')
745 # The object belongs to a class instance.
745 # The object belongs to a class instance.
746 try:
746 try:
747 target = getattr(target, path[-1])
747 target = getattr(target, path[-1])
748 # The class defines the object.
748 # The class defines the object.
749 if isinstance(target, property):
749 if isinstance(target, property):
750 oname = root + '.__class__.' + path[-1]
750 oname = root + '.__class__.' + path[-1]
751 info = Struct(self._ofind(oname))
751 info = Struct(self._ofind(oname))
752 except AttributeError: pass
752 except AttributeError: pass
753 except AttributeError: pass
753 except AttributeError: pass
754
754
755 pmethod = getattr(self.shell.inspector,meth)
755 pmethod = getattr(self.shell.inspector,meth)
756 formatter = info.ismagic and self.format_screen or None
756 formatter = info.ismagic and self.format_screen or None
757 if meth == 'pdoc':
757 if meth == 'pdoc':
758 pmethod(info.obj,oname,formatter)
758 pmethod(info.obj,oname,formatter)
759 elif meth == 'pinfo':
759 elif meth == 'pinfo':
760 pmethod(info.obj,oname,formatter,info,**kw)
760 pmethod(info.obj,oname,formatter,info,**kw)
761 else:
761 else:
762 pmethod(info.obj,oname)
762 pmethod(info.obj,oname)
763 else:
763 else:
764 print 'Object `%s` not found.' % oname
764 print 'Object `%s` not found.' % oname
765 return 'not found' # so callers can take other action
765 return 'not found' # so callers can take other action
766
766
767 def magic_psearch(self, parameter_s=''):
767 def magic_psearch(self, parameter_s=''):
768 """Search for object in namespaces by wildcard.
768 """Search for object in namespaces by wildcard.
769
769
770 %psearch [options] PATTERN [OBJECT TYPE]
770 %psearch [options] PATTERN [OBJECT TYPE]
771
771
772 Note: ? can be used as a synonym for %psearch, at the beginning or at
772 Note: ? can be used as a synonym for %psearch, at the beginning or at
773 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
773 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
774 rest of the command line must be unchanged (options come first), so
774 rest of the command line must be unchanged (options come first), so
775 for example the following forms are equivalent
775 for example the following forms are equivalent
776
776
777 %psearch -i a* function
777 %psearch -i a* function
778 -i a* function?
778 -i a* function?
779 ?-i a* function
779 ?-i a* function
780
780
781 Arguments:
781 Arguments:
782
782
783 PATTERN
783 PATTERN
784
784
785 where PATTERN is a string containing * as a wildcard similar to its
785 where PATTERN is a string containing * as a wildcard similar to its
786 use in a shell. The pattern is matched in all namespaces on the
786 use in a shell. The pattern is matched in all namespaces on the
787 search path. By default objects starting with a single _ are not
787 search path. By default objects starting with a single _ are not
788 matched, many IPython generated objects have a single
788 matched, many IPython generated objects have a single
789 underscore. The default is case insensitive matching. Matching is
789 underscore. The default is case insensitive matching. Matching is
790 also done on the attributes of objects and not only on the objects
790 also done on the attributes of objects and not only on the objects
791 in a module.
791 in a module.
792
792
793 [OBJECT TYPE]
793 [OBJECT TYPE]
794
794
795 Is the name of a python type from the types module. The name is
795 Is the name of a python type from the types module. The name is
796 given in lowercase without the ending type, ex. StringType is
796 given in lowercase without the ending type, ex. StringType is
797 written string. By adding a type here only objects matching the
797 written string. By adding a type here only objects matching the
798 given type are matched. Using all here makes the pattern match all
798 given type are matched. Using all here makes the pattern match all
799 types (this is the default).
799 types (this is the default).
800
800
801 Options:
801 Options:
802
802
803 -a: makes the pattern match even objects whose names start with a
803 -a: makes the pattern match even objects whose names start with a
804 single underscore. These names are normally ommitted from the
804 single underscore. These names are normally ommitted from the
805 search.
805 search.
806
806
807 -i/-c: make the pattern case insensitive/sensitive. If neither of
807 -i/-c: make the pattern case insensitive/sensitive. If neither of
808 these options is given, the default is read from your ipythonrc
808 these options is given, the default is read from your ipythonrc
809 file. The option name which sets this value is
809 file. The option name which sets this value is
810 'wildcards_case_sensitive'. If this option is not specified in your
810 'wildcards_case_sensitive'. If this option is not specified in your
811 ipythonrc file, IPython's internal default is to do a case sensitive
811 ipythonrc file, IPython's internal default is to do a case sensitive
812 search.
812 search.
813
813
814 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
814 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
815 specifiy can be searched in any of the following namespaces:
815 specifiy can be searched in any of the following namespaces:
816 'builtin', 'user', 'user_global','internal', 'alias', where
816 'builtin', 'user', 'user_global','internal', 'alias', where
817 'builtin' and 'user' are the search defaults. Note that you should
817 'builtin' and 'user' are the search defaults. Note that you should
818 not use quotes when specifying namespaces.
818 not use quotes when specifying namespaces.
819
819
820 'Builtin' contains the python module builtin, 'user' contains all
820 'Builtin' contains the python module builtin, 'user' contains all
821 user data, 'alias' only contain the shell aliases and no python
821 user data, 'alias' only contain the shell aliases and no python
822 objects, 'internal' contains objects used by IPython. The
822 objects, 'internal' contains objects used by IPython. The
823 'user_global' namespace is only used by embedded IPython instances,
823 'user_global' namespace is only used by embedded IPython instances,
824 and it contains module-level globals. You can add namespaces to the
824 and it contains module-level globals. You can add namespaces to the
825 search with -s or exclude them with -e (these options can be given
825 search with -s or exclude them with -e (these options can be given
826 more than once).
826 more than once).
827
827
828 Examples:
828 Examples:
829
829
830 %psearch a* -> objects beginning with an a
830 %psearch a* -> objects beginning with an a
831 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
831 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
832 %psearch a* function -> all functions beginning with an a
832 %psearch a* function -> all functions beginning with an a
833 %psearch re.e* -> objects beginning with an e in module re
833 %psearch re.e* -> objects beginning with an e in module re
834 %psearch r*.e* -> objects that start with e in modules starting in r
834 %psearch r*.e* -> objects that start with e in modules starting in r
835 %psearch r*.* string -> all strings in modules beginning with r
835 %psearch r*.* string -> all strings in modules beginning with r
836
836
837 Case sensitve search:
837 Case sensitve search:
838
838
839 %psearch -c a* list all object beginning with lower case a
839 %psearch -c a* list all object beginning with lower case a
840
840
841 Show objects beginning with a single _:
841 Show objects beginning with a single _:
842
842
843 %psearch -a _* list objects beginning with a single underscore"""
843 %psearch -a _* list objects beginning with a single underscore"""
844 try:
844 try:
845 parameter_s = parameter_s.encode('ascii')
845 parameter_s = parameter_s.encode('ascii')
846 except UnicodeEncodeError:
846 except UnicodeEncodeError:
847 print 'Python identifiers can only contain ascii characters.'
847 print 'Python identifiers can only contain ascii characters.'
848 return
848 return
849
849
850 # default namespaces to be searched
850 # default namespaces to be searched
851 def_search = ['user','builtin']
851 def_search = ['user','builtin']
852
852
853 # Process options/args
853 # Process options/args
854 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
854 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
855 opt = opts.get
855 opt = opts.get
856 shell = self.shell
856 shell = self.shell
857 psearch = shell.inspector.psearch
857 psearch = shell.inspector.psearch
858
858
859 # select case options
859 # select case options
860 if opts.has_key('i'):
860 if opts.has_key('i'):
861 ignore_case = True
861 ignore_case = True
862 elif opts.has_key('c'):
862 elif opts.has_key('c'):
863 ignore_case = False
863 ignore_case = False
864 else:
864 else:
865 ignore_case = not shell.wildcards_case_sensitive
865 ignore_case = not shell.wildcards_case_sensitive
866
866
867 # Build list of namespaces to search from user options
867 # Build list of namespaces to search from user options
868 def_search.extend(opt('s',[]))
868 def_search.extend(opt('s',[]))
869 ns_exclude = ns_exclude=opt('e',[])
869 ns_exclude = ns_exclude=opt('e',[])
870 ns_search = [nm for nm in def_search if nm not in ns_exclude]
870 ns_search = [nm for nm in def_search if nm not in ns_exclude]
871
871
872 # Call the actual search
872 # Call the actual search
873 try:
873 try:
874 psearch(args,shell.ns_table,ns_search,
874 psearch(args,shell.ns_table,ns_search,
875 show_all=opt('a'),ignore_case=ignore_case)
875 show_all=opt('a'),ignore_case=ignore_case)
876 except:
876 except:
877 shell.showtraceback()
877 shell.showtraceback()
878
878
879 def magic_who_ls(self, parameter_s=''):
879 def magic_who_ls(self, parameter_s=''):
880 """Return a sorted list of all interactive variables.
880 """Return a sorted list of all interactive variables.
881
881
882 If arguments are given, only variables of types matching these
882 If arguments are given, only variables of types matching these
883 arguments are returned."""
883 arguments are returned."""
884
884
885 user_ns = self.shell.user_ns
885 user_ns = self.shell.user_ns
886 internal_ns = self.shell.internal_ns
886 internal_ns = self.shell.internal_ns
887 user_config_ns = self.shell.user_config_ns
887 user_config_ns = self.shell.user_config_ns
888 out = [ i for i in user_ns
888 out = [ i for i in user_ns
889 if not i.startswith('_') \
889 if not i.startswith('_') \
890 and not (i in internal_ns or i in user_config_ns) ]
890 and not (i in internal_ns or i in user_config_ns) ]
891
891
892 typelist = parameter_s.split()
892 typelist = parameter_s.split()
893 if typelist:
893 if typelist:
894 typeset = set(typelist)
894 typeset = set(typelist)
895 out = [i for i in out if type(i).__name__ in typeset]
895 out = [i for i in out if type(i).__name__ in typeset]
896
896
897 out.sort()
897 out.sort()
898 return out
898 return out
899
899
900 def magic_who(self, parameter_s=''):
900 def magic_who(self, parameter_s=''):
901 """Print all interactive variables, with some minimal formatting.
901 """Print all interactive variables, with some minimal formatting.
902
902
903 If any arguments are given, only variables whose type matches one of
903 If any arguments are given, only variables whose type matches one of
904 these are printed. For example:
904 these are printed. For example:
905
905
906 %who function str
906 %who function str
907
907
908 will only list functions and strings, excluding all other types of
908 will only list functions and strings, excluding all other types of
909 variables. To find the proper type names, simply use type(var) at a
909 variables. To find the proper type names, simply use type(var) at a
910 command line to see how python prints type names. For example:
910 command line to see how python prints type names. For example:
911
911
912 In [1]: type('hello')\\
912 In [1]: type('hello')\\
913 Out[1]: <type 'str'>
913 Out[1]: <type 'str'>
914
914
915 indicates that the type name for strings is 'str'.
915 indicates that the type name for strings is 'str'.
916
916
917 %who always excludes executed names loaded through your configuration
917 %who always excludes executed names loaded through your configuration
918 file and things which are internal to IPython.
918 file and things which are internal to IPython.
919
919
920 This is deliberate, as typically you may load many modules and the
920 This is deliberate, as typically you may load many modules and the
921 purpose of %who is to show you only what you've manually defined."""
921 purpose of %who is to show you only what you've manually defined."""
922
922
923 varlist = self.magic_who_ls(parameter_s)
923 varlist = self.magic_who_ls(parameter_s)
924 if not varlist:
924 if not varlist:
925 if parameter_s:
925 if parameter_s:
926 print 'No variables match your requested type.'
926 print 'No variables match your requested type.'
927 else:
927 else:
928 print 'Interactive namespace is empty.'
928 print 'Interactive namespace is empty.'
929 return
929 return
930
930
931 # if we have variables, move on...
931 # if we have variables, move on...
932 count = 0
932 count = 0
933 for i in varlist:
933 for i in varlist:
934 print i+'\t',
934 print i+'\t',
935 count += 1
935 count += 1
936 if count > 8:
936 if count > 8:
937 count = 0
937 count = 0
938 print
938 print
939 print
939 print
940
940
941 def magic_whos(self, parameter_s=''):
941 def magic_whos(self, parameter_s=''):
942 """Like %who, but gives some extra information about each variable.
942 """Like %who, but gives some extra information about each variable.
943
943
944 The same type filtering of %who can be applied here.
944 The same type filtering of %who can be applied here.
945
945
946 For all variables, the type is printed. Additionally it prints:
946 For all variables, the type is printed. Additionally it prints:
947
947
948 - For {},[],(): their length.
948 - For {},[],(): their length.
949
949
950 - For numpy and Numeric arrays, a summary with shape, number of
950 - For numpy and Numeric arrays, a summary with shape, number of
951 elements, typecode and size in memory.
951 elements, typecode and size in memory.
952
952
953 - Everything else: a string representation, snipping their middle if
953 - Everything else: a string representation, snipping their middle if
954 too long."""
954 too long."""
955
955
956 varnames = self.magic_who_ls(parameter_s)
956 varnames = self.magic_who_ls(parameter_s)
957 if not varnames:
957 if not varnames:
958 if parameter_s:
958 if parameter_s:
959 print 'No variables match your requested type.'
959 print 'No variables match your requested type.'
960 else:
960 else:
961 print 'Interactive namespace is empty.'
961 print 'Interactive namespace is empty.'
962 return
962 return
963
963
964 # if we have variables, move on...
964 # if we have variables, move on...
965
965
966 # for these types, show len() instead of data:
966 # for these types, show len() instead of data:
967 seq_types = [types.DictType,types.ListType,types.TupleType]
967 seq_types = [types.DictType,types.ListType,types.TupleType]
968
968
969 # for numpy/Numeric arrays, display summary info
969 # for numpy/Numeric arrays, display summary info
970 try:
970 try:
971 import numpy
971 import numpy
972 except ImportError:
972 except ImportError:
973 ndarray_type = None
973 ndarray_type = None
974 else:
974 else:
975 ndarray_type = numpy.ndarray.__name__
975 ndarray_type = numpy.ndarray.__name__
976 try:
976 try:
977 import Numeric
977 import Numeric
978 except ImportError:
978 except ImportError:
979 array_type = None
979 array_type = None
980 else:
980 else:
981 array_type = Numeric.ArrayType.__name__
981 array_type = Numeric.ArrayType.__name__
982
982
983 # Find all variable names and types so we can figure out column sizes
983 # Find all variable names and types so we can figure out column sizes
984 def get_vars(i):
984 def get_vars(i):
985 return self.shell.user_ns[i]
985 return self.shell.user_ns[i]
986
986
987 # some types are well known and can be shorter
987 # some types are well known and can be shorter
988 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
988 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
989 def type_name(v):
989 def type_name(v):
990 tn = type(v).__name__
990 tn = type(v).__name__
991 return abbrevs.get(tn,tn)
991 return abbrevs.get(tn,tn)
992
992
993 varlist = map(get_vars,varnames)
993 varlist = map(get_vars,varnames)
994
994
995 typelist = []
995 typelist = []
996 for vv in varlist:
996 for vv in varlist:
997 tt = type_name(vv)
997 tt = type_name(vv)
998
998
999 if tt=='instance':
999 if tt=='instance':
1000 typelist.append( abbrevs.get(str(vv.__class__),
1000 typelist.append( abbrevs.get(str(vv.__class__),
1001 str(vv.__class__)))
1001 str(vv.__class__)))
1002 else:
1002 else:
1003 typelist.append(tt)
1003 typelist.append(tt)
1004
1004
1005 # column labels and # of spaces as separator
1005 # column labels and # of spaces as separator
1006 varlabel = 'Variable'
1006 varlabel = 'Variable'
1007 typelabel = 'Type'
1007 typelabel = 'Type'
1008 datalabel = 'Data/Info'
1008 datalabel = 'Data/Info'
1009 colsep = 3
1009 colsep = 3
1010 # variable format strings
1010 # variable format strings
1011 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1011 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1012 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1012 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1013 aformat = "%s: %s elems, type `%s`, %s bytes"
1013 aformat = "%s: %s elems, type `%s`, %s bytes"
1014 # find the size of the columns to format the output nicely
1014 # find the size of the columns to format the output nicely
1015 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1015 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1016 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1016 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1017 # table header
1017 # table header
1018 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1018 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1019 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1019 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1020 # and the table itself
1020 # and the table itself
1021 kb = 1024
1021 kb = 1024
1022 Mb = 1048576 # kb**2
1022 Mb = 1048576 # kb**2
1023 for vname,var,vtype in zip(varnames,varlist,typelist):
1023 for vname,var,vtype in zip(varnames,varlist,typelist):
1024 print itpl(vformat),
1024 print itpl(vformat),
1025 if vtype in seq_types:
1025 if vtype in seq_types:
1026 print len(var)
1026 print len(var)
1027 elif vtype in [array_type,ndarray_type]:
1027 elif vtype in [array_type,ndarray_type]:
1028 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1028 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1029 if vtype==ndarray_type:
1029 if vtype==ndarray_type:
1030 # numpy
1030 # numpy
1031 vsize = var.size
1031 vsize = var.size
1032 vbytes = vsize*var.itemsize
1032 vbytes = vsize*var.itemsize
1033 vdtype = var.dtype
1033 vdtype = var.dtype
1034 else:
1034 else:
1035 # Numeric
1035 # Numeric
1036 vsize = Numeric.size(var)
1036 vsize = Numeric.size(var)
1037 vbytes = vsize*var.itemsize()
1037 vbytes = vsize*var.itemsize()
1038 vdtype = var.typecode()
1038 vdtype = var.typecode()
1039
1039
1040 if vbytes < 100000:
1040 if vbytes < 100000:
1041 print aformat % (vshape,vsize,vdtype,vbytes)
1041 print aformat % (vshape,vsize,vdtype,vbytes)
1042 else:
1042 else:
1043 print aformat % (vshape,vsize,vdtype,vbytes),
1043 print aformat % (vshape,vsize,vdtype,vbytes),
1044 if vbytes < Mb:
1044 if vbytes < Mb:
1045 print '(%s kb)' % (vbytes/kb,)
1045 print '(%s kb)' % (vbytes/kb,)
1046 else:
1046 else:
1047 print '(%s Mb)' % (vbytes/Mb,)
1047 print '(%s Mb)' % (vbytes/Mb,)
1048 else:
1048 else:
1049 try:
1049 try:
1050 vstr = str(var)
1050 vstr = str(var)
1051 except UnicodeEncodeError:
1051 except UnicodeEncodeError:
1052 vstr = unicode(var).encode(sys.getdefaultencoding(),
1052 vstr = unicode(var).encode(sys.getdefaultencoding(),
1053 'backslashreplace')
1053 'backslashreplace')
1054 vstr = vstr.replace('\n','\\n')
1054 vstr = vstr.replace('\n','\\n')
1055 if len(vstr) < 50:
1055 if len(vstr) < 50:
1056 print vstr
1056 print vstr
1057 else:
1057 else:
1058 printpl(vfmt_short)
1058 printpl(vfmt_short)
1059
1059
1060 def magic_reset(self, parameter_s=''):
1060 def magic_reset(self, parameter_s=''):
1061 """Resets the namespace by removing all names defined by the user.
1061 """Resets the namespace by removing all names defined by the user.
1062
1062
1063 Input/Output history are left around in case you need them.
1063 Input/Output history are left around in case you need them.
1064
1064
1065 Parameters
1065 Parameters
1066 ----------
1066 ----------
1067 -y : force reset without asking for confirmation.
1067 -y : force reset without asking for confirmation.
1068
1068
1069 Examples
1069 Examples
1070 --------
1070 --------
1071 In [6]: a = 1
1071 In [6]: a = 1
1072
1072
1073 In [7]: a
1073 In [7]: a
1074 Out[7]: 1
1074 Out[7]: 1
1075
1075
1076 In [8]: 'a' in _ip.user_ns
1076 In [8]: 'a' in _ip.user_ns
1077 Out[8]: True
1077 Out[8]: True
1078
1078
1079 In [9]: %reset -f
1079 In [9]: %reset -f
1080
1080
1081 In [10]: 'a' in _ip.user_ns
1081 In [10]: 'a' in _ip.user_ns
1082 Out[10]: False
1082 Out[10]: False
1083 """
1083 """
1084
1084
1085 if parameter_s == '-f':
1085 if parameter_s == '-f':
1086 ans = True
1086 ans = True
1087 else:
1087 else:
1088 ans = self.shell.ask_yes_no(
1088 ans = self.shell.ask_yes_no(
1089 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1089 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1090 if not ans:
1090 if not ans:
1091 print 'Nothing done.'
1091 print 'Nothing done.'
1092 return
1092 return
1093 user_ns = self.shell.user_ns
1093 user_ns = self.shell.user_ns
1094 for i in self.magic_who_ls():
1094 for i in self.magic_who_ls():
1095 del(user_ns[i])
1095 del(user_ns[i])
1096
1096
1097 # Also flush the private list of module references kept for script
1097 # Also flush the private list of module references kept for script
1098 # execution protection
1098 # execution protection
1099 self.shell.clear_main_mod_cache()
1099 self.shell.clear_main_mod_cache()
1100
1100
1101 def magic_logstart(self,parameter_s=''):
1101 def magic_logstart(self,parameter_s=''):
1102 """Start logging anywhere in a session.
1102 """Start logging anywhere in a session.
1103
1103
1104 %logstart [-o|-r|-t] [log_name [log_mode]]
1104 %logstart [-o|-r|-t] [log_name [log_mode]]
1105
1105
1106 If no name is given, it defaults to a file named 'ipython_log.py' in your
1106 If no name is given, it defaults to a file named 'ipython_log.py' in your
1107 current directory, in 'rotate' mode (see below).
1107 current directory, in 'rotate' mode (see below).
1108
1108
1109 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1109 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1110 history up to that point and then continues logging.
1110 history up to that point and then continues logging.
1111
1111
1112 %logstart takes a second optional parameter: logging mode. This can be one
1112 %logstart takes a second optional parameter: logging mode. This can be one
1113 of (note that the modes are given unquoted):\\
1113 of (note that the modes are given unquoted):\\
1114 append: well, that says it.\\
1114 append: well, that says it.\\
1115 backup: rename (if exists) to name~ and start name.\\
1115 backup: rename (if exists) to name~ and start name.\\
1116 global: single logfile in your home dir, appended to.\\
1116 global: single logfile in your home dir, appended to.\\
1117 over : overwrite existing log.\\
1117 over : overwrite existing log.\\
1118 rotate: create rotating logs name.1~, name.2~, etc.
1118 rotate: create rotating logs name.1~, name.2~, etc.
1119
1119
1120 Options:
1120 Options:
1121
1121
1122 -o: log also IPython's output. In this mode, all commands which
1122 -o: log also IPython's output. In this mode, all commands which
1123 generate an Out[NN] prompt are recorded to the logfile, right after
1123 generate an Out[NN] prompt are recorded to the logfile, right after
1124 their corresponding input line. The output lines are always
1124 their corresponding input line. The output lines are always
1125 prepended with a '#[Out]# ' marker, so that the log remains valid
1125 prepended with a '#[Out]# ' marker, so that the log remains valid
1126 Python code.
1126 Python code.
1127
1127
1128 Since this marker is always the same, filtering only the output from
1128 Since this marker is always the same, filtering only the output from
1129 a log is very easy, using for example a simple awk call:
1129 a log is very easy, using for example a simple awk call:
1130
1130
1131 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1131 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1132
1132
1133 -r: log 'raw' input. Normally, IPython's logs contain the processed
1133 -r: log 'raw' input. Normally, IPython's logs contain the processed
1134 input, so that user lines are logged in their final form, converted
1134 input, so that user lines are logged in their final form, converted
1135 into valid Python. For example, %Exit is logged as
1135 into valid Python. For example, %Exit is logged as
1136 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1136 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1137 exactly as typed, with no transformations applied.
1137 exactly as typed, with no transformations applied.
1138
1138
1139 -t: put timestamps before each input line logged (these are put in
1139 -t: put timestamps before each input line logged (these are put in
1140 comments)."""
1140 comments)."""
1141
1141
1142 opts,par = self.parse_options(parameter_s,'ort')
1142 opts,par = self.parse_options(parameter_s,'ort')
1143 log_output = 'o' in opts
1143 log_output = 'o' in opts
1144 log_raw_input = 'r' in opts
1144 log_raw_input = 'r' in opts
1145 timestamp = 't' in opts
1145 timestamp = 't' in opts
1146
1146
1147 logger = self.shell.logger
1147 logger = self.shell.logger
1148
1148
1149 # if no args are given, the defaults set in the logger constructor by
1149 # if no args are given, the defaults set in the logger constructor by
1150 # ipytohn remain valid
1150 # ipytohn remain valid
1151 if par:
1151 if par:
1152 try:
1152 try:
1153 logfname,logmode = par.split()
1153 logfname,logmode = par.split()
1154 except:
1154 except:
1155 logfname = par
1155 logfname = par
1156 logmode = 'backup'
1156 logmode = 'backup'
1157 else:
1157 else:
1158 logfname = logger.logfname
1158 logfname = logger.logfname
1159 logmode = logger.logmode
1159 logmode = logger.logmode
1160 # put logfname into rc struct as if it had been called on the command
1160 # put logfname into rc struct as if it had been called on the command
1161 # line, so it ends up saved in the log header Save it in case we need
1161 # line, so it ends up saved in the log header Save it in case we need
1162 # to restore it...
1162 # to restore it...
1163 old_logfile = self.shell.logfile
1163 old_logfile = self.shell.logfile
1164 if logfname:
1164 if logfname:
1165 logfname = os.path.expanduser(logfname)
1165 logfname = os.path.expanduser(logfname)
1166 self.shell.logfile = logfname
1166 self.shell.logfile = logfname
1167
1167
1168 loghead = '# IPython log file\n\n'
1168 loghead = '# IPython log file\n\n'
1169 try:
1169 try:
1170 started = logger.logstart(logfname,loghead,logmode,
1170 started = logger.logstart(logfname,loghead,logmode,
1171 log_output,timestamp,log_raw_input)
1171 log_output,timestamp,log_raw_input)
1172 except:
1172 except:
1173 rc.opts.logfile = old_logfile
1173 rc.opts.logfile = old_logfile
1174 warn("Couldn't start log: %s" % sys.exc_info()[1])
1174 warn("Couldn't start log: %s" % sys.exc_info()[1])
1175 else:
1175 else:
1176 # log input history up to this point, optionally interleaving
1176 # log input history up to this point, optionally interleaving
1177 # output if requested
1177 # output if requested
1178
1178
1179 if timestamp:
1179 if timestamp:
1180 # disable timestamping for the previous history, since we've
1180 # disable timestamping for the previous history, since we've
1181 # lost those already (no time machine here).
1181 # lost those already (no time machine here).
1182 logger.timestamp = False
1182 logger.timestamp = False
1183
1183
1184 if log_raw_input:
1184 if log_raw_input:
1185 input_hist = self.shell.input_hist_raw
1185 input_hist = self.shell.input_hist_raw
1186 else:
1186 else:
1187 input_hist = self.shell.input_hist
1187 input_hist = self.shell.input_hist
1188
1188
1189 if log_output:
1189 if log_output:
1190 log_write = logger.log_write
1190 log_write = logger.log_write
1191 output_hist = self.shell.output_hist
1191 output_hist = self.shell.output_hist
1192 for n in range(1,len(input_hist)-1):
1192 for n in range(1,len(input_hist)-1):
1193 log_write(input_hist[n].rstrip())
1193 log_write(input_hist[n].rstrip())
1194 if n in output_hist:
1194 if n in output_hist:
1195 log_write(repr(output_hist[n]),'output')
1195 log_write(repr(output_hist[n]),'output')
1196 else:
1196 else:
1197 logger.log_write(input_hist[1:])
1197 logger.log_write(input_hist[1:])
1198 if timestamp:
1198 if timestamp:
1199 # re-enable timestamping
1199 # re-enable timestamping
1200 logger.timestamp = True
1200 logger.timestamp = True
1201
1201
1202 print ('Activating auto-logging. '
1202 print ('Activating auto-logging. '
1203 'Current session state plus future input saved.')
1203 'Current session state plus future input saved.')
1204 logger.logstate()
1204 logger.logstate()
1205
1205
1206 def magic_logstop(self,parameter_s=''):
1206 def magic_logstop(self,parameter_s=''):
1207 """Fully stop logging and close log file.
1207 """Fully stop logging and close log file.
1208
1208
1209 In order to start logging again, a new %logstart call needs to be made,
1209 In order to start logging again, a new %logstart call needs to be made,
1210 possibly (though not necessarily) with a new filename, mode and other
1210 possibly (though not necessarily) with a new filename, mode and other
1211 options."""
1211 options."""
1212 self.logger.logstop()
1212 self.logger.logstop()
1213
1213
1214 def magic_logoff(self,parameter_s=''):
1214 def magic_logoff(self,parameter_s=''):
1215 """Temporarily stop logging.
1215 """Temporarily stop logging.
1216
1216
1217 You must have previously started logging."""
1217 You must have previously started logging."""
1218 self.shell.logger.switch_log(0)
1218 self.shell.logger.switch_log(0)
1219
1219
1220 def magic_logon(self,parameter_s=''):
1220 def magic_logon(self,parameter_s=''):
1221 """Restart logging.
1221 """Restart logging.
1222
1222
1223 This function is for restarting logging which you've temporarily
1223 This function is for restarting logging which you've temporarily
1224 stopped with %logoff. For starting logging for the first time, you
1224 stopped with %logoff. For starting logging for the first time, you
1225 must use the %logstart function, which allows you to specify an
1225 must use the %logstart function, which allows you to specify an
1226 optional log filename."""
1226 optional log filename."""
1227
1227
1228 self.shell.logger.switch_log(1)
1228 self.shell.logger.switch_log(1)
1229
1229
1230 def magic_logstate(self,parameter_s=''):
1230 def magic_logstate(self,parameter_s=''):
1231 """Print the status of the logging system."""
1231 """Print the status of the logging system."""
1232
1232
1233 self.shell.logger.logstate()
1233 self.shell.logger.logstate()
1234
1234
1235 def magic_pdb(self, parameter_s=''):
1235 def magic_pdb(self, parameter_s=''):
1236 """Control the automatic calling of the pdb interactive debugger.
1236 """Control the automatic calling of the pdb interactive debugger.
1237
1237
1238 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1238 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1239 argument it works as a toggle.
1239 argument it works as a toggle.
1240
1240
1241 When an exception is triggered, IPython can optionally call the
1241 When an exception is triggered, IPython can optionally call the
1242 interactive pdb debugger after the traceback printout. %pdb toggles
1242 interactive pdb debugger after the traceback printout. %pdb toggles
1243 this feature on and off.
1243 this feature on and off.
1244
1244
1245 The initial state of this feature is set in your ipythonrc
1245 The initial state of this feature is set in your ipythonrc
1246 configuration file (the variable is called 'pdb').
1246 configuration file (the variable is called 'pdb').
1247
1247
1248 If you want to just activate the debugger AFTER an exception has fired,
1248 If you want to just activate the debugger AFTER an exception has fired,
1249 without having to type '%pdb on' and rerunning your code, you can use
1249 without having to type '%pdb on' and rerunning your code, you can use
1250 the %debug magic."""
1250 the %debug magic."""
1251
1251
1252 par = parameter_s.strip().lower()
1252 par = parameter_s.strip().lower()
1253
1253
1254 if par:
1254 if par:
1255 try:
1255 try:
1256 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1256 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1257 except KeyError:
1257 except KeyError:
1258 print ('Incorrect argument. Use on/1, off/0, '
1258 print ('Incorrect argument. Use on/1, off/0, '
1259 'or nothing for a toggle.')
1259 'or nothing for a toggle.')
1260 return
1260 return
1261 else:
1261 else:
1262 # toggle
1262 # toggle
1263 new_pdb = not self.shell.call_pdb
1263 new_pdb = not self.shell.call_pdb
1264
1264
1265 # set on the shell
1265 # set on the shell
1266 self.shell.call_pdb = new_pdb
1266 self.shell.call_pdb = new_pdb
1267 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1267 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1268
1268
1269 def magic_debug(self, parameter_s=''):
1269 def magic_debug(self, parameter_s=''):
1270 """Activate the interactive debugger in post-mortem mode.
1270 """Activate the interactive debugger in post-mortem mode.
1271
1271
1272 If an exception has just occurred, this lets you inspect its stack
1272 If an exception has just occurred, this lets you inspect its stack
1273 frames interactively. Note that this will always work only on the last
1273 frames interactively. Note that this will always work only on the last
1274 traceback that occurred, so you must call this quickly after an
1274 traceback that occurred, so you must call this quickly after an
1275 exception that you wish to inspect has fired, because if another one
1275 exception that you wish to inspect has fired, because if another one
1276 occurs, it clobbers the previous one.
1276 occurs, it clobbers the previous one.
1277
1277
1278 If you want IPython to automatically do this on every exception, see
1278 If you want IPython to automatically do this on every exception, see
1279 the %pdb magic for more details.
1279 the %pdb magic for more details.
1280 """
1280 """
1281 self.shell.debugger(force=True)
1281 self.shell.debugger(force=True)
1282
1282
1283 @testdec.skip_doctest
1283 @testdec.skip_doctest
1284 def magic_prun(self, parameter_s ='',user_mode=1,
1284 def magic_prun(self, parameter_s ='',user_mode=1,
1285 opts=None,arg_lst=None,prog_ns=None):
1285 opts=None,arg_lst=None,prog_ns=None):
1286
1286
1287 """Run a statement through the python code profiler.
1287 """Run a statement through the python code profiler.
1288
1288
1289 Usage:
1289 Usage:
1290 %prun [options] statement
1290 %prun [options] statement
1291
1291
1292 The given statement (which doesn't require quote marks) is run via the
1292 The given statement (which doesn't require quote marks) is run via the
1293 python profiler in a manner similar to the profile.run() function.
1293 python profiler in a manner similar to the profile.run() function.
1294 Namespaces are internally managed to work correctly; profile.run
1294 Namespaces are internally managed to work correctly; profile.run
1295 cannot be used in IPython because it makes certain assumptions about
1295 cannot be used in IPython because it makes certain assumptions about
1296 namespaces which do not hold under IPython.
1296 namespaces which do not hold under IPython.
1297
1297
1298 Options:
1298 Options:
1299
1299
1300 -l <limit>: you can place restrictions on what or how much of the
1300 -l <limit>: you can place restrictions on what or how much of the
1301 profile gets printed. The limit value can be:
1301 profile gets printed. The limit value can be:
1302
1302
1303 * A string: only information for function names containing this string
1303 * A string: only information for function names containing this string
1304 is printed.
1304 is printed.
1305
1305
1306 * An integer: only these many lines are printed.
1306 * An integer: only these many lines are printed.
1307
1307
1308 * A float (between 0 and 1): this fraction of the report is printed
1308 * A float (between 0 and 1): this fraction of the report is printed
1309 (for example, use a limit of 0.4 to see the topmost 40% only).
1309 (for example, use a limit of 0.4 to see the topmost 40% only).
1310
1310
1311 You can combine several limits with repeated use of the option. For
1311 You can combine several limits with repeated use of the option. For
1312 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1312 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1313 information about class constructors.
1313 information about class constructors.
1314
1314
1315 -r: return the pstats.Stats object generated by the profiling. This
1315 -r: return the pstats.Stats object generated by the profiling. This
1316 object has all the information about the profile in it, and you can
1316 object has all the information about the profile in it, and you can
1317 later use it for further analysis or in other functions.
1317 later use it for further analysis or in other functions.
1318
1318
1319 -s <key>: sort profile by given key. You can provide more than one key
1319 -s <key>: sort profile by given key. You can provide more than one key
1320 by using the option several times: '-s key1 -s key2 -s key3...'. The
1320 by using the option several times: '-s key1 -s key2 -s key3...'. The
1321 default sorting key is 'time'.
1321 default sorting key is 'time'.
1322
1322
1323 The following is copied verbatim from the profile documentation
1323 The following is copied verbatim from the profile documentation
1324 referenced below:
1324 referenced below:
1325
1325
1326 When more than one key is provided, additional keys are used as
1326 When more than one key is provided, additional keys are used as
1327 secondary criteria when the there is equality in all keys selected
1327 secondary criteria when the there is equality in all keys selected
1328 before them.
1328 before them.
1329
1329
1330 Abbreviations can be used for any key names, as long as the
1330 Abbreviations can be used for any key names, as long as the
1331 abbreviation is unambiguous. The following are the keys currently
1331 abbreviation is unambiguous. The following are the keys currently
1332 defined:
1332 defined:
1333
1333
1334 Valid Arg Meaning
1334 Valid Arg Meaning
1335 "calls" call count
1335 "calls" call count
1336 "cumulative" cumulative time
1336 "cumulative" cumulative time
1337 "file" file name
1337 "file" file name
1338 "module" file name
1338 "module" file name
1339 "pcalls" primitive call count
1339 "pcalls" primitive call count
1340 "line" line number
1340 "line" line number
1341 "name" function name
1341 "name" function name
1342 "nfl" name/file/line
1342 "nfl" name/file/line
1343 "stdname" standard name
1343 "stdname" standard name
1344 "time" internal time
1344 "time" internal time
1345
1345
1346 Note that all sorts on statistics are in descending order (placing
1346 Note that all sorts on statistics are in descending order (placing
1347 most time consuming items first), where as name, file, and line number
1347 most time consuming items first), where as name, file, and line number
1348 searches are in ascending order (i.e., alphabetical). The subtle
1348 searches are in ascending order (i.e., alphabetical). The subtle
1349 distinction between "nfl" and "stdname" is that the standard name is a
1349 distinction between "nfl" and "stdname" is that the standard name is a
1350 sort of the name as printed, which means that the embedded line
1350 sort of the name as printed, which means that the embedded line
1351 numbers get compared in an odd way. For example, lines 3, 20, and 40
1351 numbers get compared in an odd way. For example, lines 3, 20, and 40
1352 would (if the file names were the same) appear in the string order
1352 would (if the file names were the same) appear in the string order
1353 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1353 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1354 line numbers. In fact, sort_stats("nfl") is the same as
1354 line numbers. In fact, sort_stats("nfl") is the same as
1355 sort_stats("name", "file", "line").
1355 sort_stats("name", "file", "line").
1356
1356
1357 -T <filename>: save profile results as shown on screen to a text
1357 -T <filename>: save profile results as shown on screen to a text
1358 file. The profile is still shown on screen.
1358 file. The profile is still shown on screen.
1359
1359
1360 -D <filename>: save (via dump_stats) profile statistics to given
1360 -D <filename>: save (via dump_stats) profile statistics to given
1361 filename. This data is in a format understod by the pstats module, and
1361 filename. This data is in a format understod by the pstats module, and
1362 is generated by a call to the dump_stats() method of profile
1362 is generated by a call to the dump_stats() method of profile
1363 objects. The profile is still shown on screen.
1363 objects. The profile is still shown on screen.
1364
1364
1365 If you want to run complete programs under the profiler's control, use
1365 If you want to run complete programs under the profiler's control, use
1366 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1366 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1367 contains profiler specific options as described here.
1367 contains profiler specific options as described here.
1368
1368
1369 You can read the complete documentation for the profile module with::
1369 You can read the complete documentation for the profile module with::
1370
1370
1371 In [1]: import profile; profile.help()
1371 In [1]: import profile; profile.help()
1372 """
1372 """
1373
1373
1374 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1374 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1375 # protect user quote marks
1375 # protect user quote marks
1376 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1376 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1377
1377
1378 if user_mode: # regular user call
1378 if user_mode: # regular user call
1379 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1379 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1380 list_all=1)
1380 list_all=1)
1381 namespace = self.shell.user_ns
1381 namespace = self.shell.user_ns
1382 else: # called to run a program by %run -p
1382 else: # called to run a program by %run -p
1383 try:
1383 try:
1384 filename = get_py_filename(arg_lst[0])
1384 filename = get_py_filename(arg_lst[0])
1385 except IOError,msg:
1385 except IOError,msg:
1386 error(msg)
1386 error(msg)
1387 return
1387 return
1388
1388
1389 arg_str = 'execfile(filename,prog_ns)'
1389 arg_str = 'execfile(filename,prog_ns)'
1390 namespace = locals()
1390 namespace = locals()
1391
1391
1392 opts.merge(opts_def)
1392 opts.merge(opts_def)
1393
1393
1394 prof = profile.Profile()
1394 prof = profile.Profile()
1395 try:
1395 try:
1396 prof = prof.runctx(arg_str,namespace,namespace)
1396 prof = prof.runctx(arg_str,namespace,namespace)
1397 sys_exit = ''
1397 sys_exit = ''
1398 except SystemExit:
1398 except SystemExit:
1399 sys_exit = """*** SystemExit exception caught in code being profiled."""
1399 sys_exit = """*** SystemExit exception caught in code being profiled."""
1400
1400
1401 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1401 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1402
1402
1403 lims = opts.l
1403 lims = opts.l
1404 if lims:
1404 if lims:
1405 lims = [] # rebuild lims with ints/floats/strings
1405 lims = [] # rebuild lims with ints/floats/strings
1406 for lim in opts.l:
1406 for lim in opts.l:
1407 try:
1407 try:
1408 lims.append(int(lim))
1408 lims.append(int(lim))
1409 except ValueError:
1409 except ValueError:
1410 try:
1410 try:
1411 lims.append(float(lim))
1411 lims.append(float(lim))
1412 except ValueError:
1412 except ValueError:
1413 lims.append(lim)
1413 lims.append(lim)
1414
1414
1415 # Trap output.
1415 # Trap output.
1416 stdout_trap = StringIO()
1416 stdout_trap = StringIO()
1417
1417
1418 if hasattr(stats,'stream'):
1418 if hasattr(stats,'stream'):
1419 # In newer versions of python, the stats object has a 'stream'
1419 # In newer versions of python, the stats object has a 'stream'
1420 # attribute to write into.
1420 # attribute to write into.
1421 stats.stream = stdout_trap
1421 stats.stream = stdout_trap
1422 stats.print_stats(*lims)
1422 stats.print_stats(*lims)
1423 else:
1423 else:
1424 # For older versions, we manually redirect stdout during printing
1424 # For older versions, we manually redirect stdout during printing
1425 sys_stdout = sys.stdout
1425 sys_stdout = sys.stdout
1426 try:
1426 try:
1427 sys.stdout = stdout_trap
1427 sys.stdout = stdout_trap
1428 stats.print_stats(*lims)
1428 stats.print_stats(*lims)
1429 finally:
1429 finally:
1430 sys.stdout = sys_stdout
1430 sys.stdout = sys_stdout
1431
1431
1432 output = stdout_trap.getvalue()
1432 output = stdout_trap.getvalue()
1433 output = output.rstrip()
1433 output = output.rstrip()
1434
1434
1435 page(output,screen_lines=self.shell.usable_screen_length)
1435 page(output,screen_lines=self.shell.usable_screen_length)
1436 print sys_exit,
1436 print sys_exit,
1437
1437
1438 dump_file = opts.D[0]
1438 dump_file = opts.D[0]
1439 text_file = opts.T[0]
1439 text_file = opts.T[0]
1440 if dump_file:
1440 if dump_file:
1441 prof.dump_stats(dump_file)
1441 prof.dump_stats(dump_file)
1442 print '\n*** Profile stats marshalled to file',\
1442 print '\n*** Profile stats marshalled to file',\
1443 `dump_file`+'.',sys_exit
1443 `dump_file`+'.',sys_exit
1444 if text_file:
1444 if text_file:
1445 pfile = file(text_file,'w')
1445 pfile = file(text_file,'w')
1446 pfile.write(output)
1446 pfile.write(output)
1447 pfile.close()
1447 pfile.close()
1448 print '\n*** Profile printout saved to text file',\
1448 print '\n*** Profile printout saved to text file',\
1449 `text_file`+'.',sys_exit
1449 `text_file`+'.',sys_exit
1450
1450
1451 if opts.has_key('r'):
1451 if opts.has_key('r'):
1452 return stats
1452 return stats
1453 else:
1453 else:
1454 return None
1454 return None
1455
1455
1456 @testdec.skip_doctest
1456 @testdec.skip_doctest
1457 def magic_run(self, parameter_s ='',runner=None,
1457 def magic_run(self, parameter_s ='',runner=None,
1458 file_finder=get_py_filename):
1458 file_finder=get_py_filename):
1459 """Run the named file inside IPython as a program.
1459 """Run the named file inside IPython as a program.
1460
1460
1461 Usage:\\
1461 Usage:\\
1462 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1462 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1463
1463
1464 Parameters after the filename are passed as command-line arguments to
1464 Parameters after the filename are passed as command-line arguments to
1465 the program (put in sys.argv). Then, control returns to IPython's
1465 the program (put in sys.argv). Then, control returns to IPython's
1466 prompt.
1466 prompt.
1467
1467
1468 This is similar to running at a system prompt:\\
1468 This is similar to running at a system prompt:\\
1469 $ python file args\\
1469 $ python file args\\
1470 but with the advantage of giving you IPython's tracebacks, and of
1470 but with the advantage of giving you IPython's tracebacks, and of
1471 loading all variables into your interactive namespace for further use
1471 loading all variables into your interactive namespace for further use
1472 (unless -p is used, see below).
1472 (unless -p is used, see below).
1473
1473
1474 The file is executed in a namespace initially consisting only of
1474 The file is executed in a namespace initially consisting only of
1475 __name__=='__main__' and sys.argv constructed as indicated. It thus
1475 __name__=='__main__' and sys.argv constructed as indicated. It thus
1476 sees its environment as if it were being run as a stand-alone program
1476 sees its environment as if it were being run as a stand-alone program
1477 (except for sharing global objects such as previously imported
1477 (except for sharing global objects such as previously imported
1478 modules). But after execution, the IPython interactive namespace gets
1478 modules). But after execution, the IPython interactive namespace gets
1479 updated with all variables defined in the program (except for __name__
1479 updated with all variables defined in the program (except for __name__
1480 and sys.argv). This allows for very convenient loading of code for
1480 and sys.argv). This allows for very convenient loading of code for
1481 interactive work, while giving each program a 'clean sheet' to run in.
1481 interactive work, while giving each program a 'clean sheet' to run in.
1482
1482
1483 Options:
1483 Options:
1484
1484
1485 -n: __name__ is NOT set to '__main__', but to the running file's name
1485 -n: __name__ is NOT set to '__main__', but to the running file's name
1486 without extension (as python does under import). This allows running
1486 without extension (as python does under import). This allows running
1487 scripts and reloading the definitions in them without calling code
1487 scripts and reloading the definitions in them without calling code
1488 protected by an ' if __name__ == "__main__" ' clause.
1488 protected by an ' if __name__ == "__main__" ' clause.
1489
1489
1490 -i: run the file in IPython's namespace instead of an empty one. This
1490 -i: run the file in IPython's namespace instead of an empty one. This
1491 is useful if you are experimenting with code written in a text editor
1491 is useful if you are experimenting with code written in a text editor
1492 which depends on variables defined interactively.
1492 which depends on variables defined interactively.
1493
1493
1494 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1494 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1495 being run. This is particularly useful if IPython is being used to
1495 being run. This is particularly useful if IPython is being used to
1496 run unittests, which always exit with a sys.exit() call. In such
1496 run unittests, which always exit with a sys.exit() call. In such
1497 cases you are interested in the output of the test results, not in
1497 cases you are interested in the output of the test results, not in
1498 seeing a traceback of the unittest module.
1498 seeing a traceback of the unittest module.
1499
1499
1500 -t: print timing information at the end of the run. IPython will give
1500 -t: print timing information at the end of the run. IPython will give
1501 you an estimated CPU time consumption for your script, which under
1501 you an estimated CPU time consumption for your script, which under
1502 Unix uses the resource module to avoid the wraparound problems of
1502 Unix uses the resource module to avoid the wraparound problems of
1503 time.clock(). Under Unix, an estimate of time spent on system tasks
1503 time.clock(). Under Unix, an estimate of time spent on system tasks
1504 is also given (for Windows platforms this is reported as 0.0).
1504 is also given (for Windows platforms this is reported as 0.0).
1505
1505
1506 If -t is given, an additional -N<N> option can be given, where <N>
1506 If -t is given, an additional -N<N> option can be given, where <N>
1507 must be an integer indicating how many times you want the script to
1507 must be an integer indicating how many times you want the script to
1508 run. The final timing report will include total and per run results.
1508 run. The final timing report will include total and per run results.
1509
1509
1510 For example (testing the script uniq_stable.py):
1510 For example (testing the script uniq_stable.py):
1511
1511
1512 In [1]: run -t uniq_stable
1512 In [1]: run -t uniq_stable
1513
1513
1514 IPython CPU timings (estimated):\\
1514 IPython CPU timings (estimated):\\
1515 User : 0.19597 s.\\
1515 User : 0.19597 s.\\
1516 System: 0.0 s.\\
1516 System: 0.0 s.\\
1517
1517
1518 In [2]: run -t -N5 uniq_stable
1518 In [2]: run -t -N5 uniq_stable
1519
1519
1520 IPython CPU timings (estimated):\\
1520 IPython CPU timings (estimated):\\
1521 Total runs performed: 5\\
1521 Total runs performed: 5\\
1522 Times : Total Per run\\
1522 Times : Total Per run\\
1523 User : 0.910862 s, 0.1821724 s.\\
1523 User : 0.910862 s, 0.1821724 s.\\
1524 System: 0.0 s, 0.0 s.
1524 System: 0.0 s, 0.0 s.
1525
1525
1526 -d: run your program under the control of pdb, the Python debugger.
1526 -d: run your program under the control of pdb, the Python debugger.
1527 This allows you to execute your program step by step, watch variables,
1527 This allows you to execute your program step by step, watch variables,
1528 etc. Internally, what IPython does is similar to calling:
1528 etc. Internally, what IPython does is similar to calling:
1529
1529
1530 pdb.run('execfile("YOURFILENAME")')
1530 pdb.run('execfile("YOURFILENAME")')
1531
1531
1532 with a breakpoint set on line 1 of your file. You can change the line
1532 with a breakpoint set on line 1 of your file. You can change the line
1533 number for this automatic breakpoint to be <N> by using the -bN option
1533 number for this automatic breakpoint to be <N> by using the -bN option
1534 (where N must be an integer). For example:
1534 (where N must be an integer). For example:
1535
1535
1536 %run -d -b40 myscript
1536 %run -d -b40 myscript
1537
1537
1538 will set the first breakpoint at line 40 in myscript.py. Note that
1538 will set the first breakpoint at line 40 in myscript.py. Note that
1539 the first breakpoint must be set on a line which actually does
1539 the first breakpoint must be set on a line which actually does
1540 something (not a comment or docstring) for it to stop execution.
1540 something (not a comment or docstring) for it to stop execution.
1541
1541
1542 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1542 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1543 first enter 'c' (without qoutes) to start execution up to the first
1543 first enter 'c' (without qoutes) to start execution up to the first
1544 breakpoint.
1544 breakpoint.
1545
1545
1546 Entering 'help' gives information about the use of the debugger. You
1546 Entering 'help' gives information about the use of the debugger. You
1547 can easily see pdb's full documentation with "import pdb;pdb.help()"
1547 can easily see pdb's full documentation with "import pdb;pdb.help()"
1548 at a prompt.
1548 at a prompt.
1549
1549
1550 -p: run program under the control of the Python profiler module (which
1550 -p: run program under the control of the Python profiler module (which
1551 prints a detailed report of execution times, function calls, etc).
1551 prints a detailed report of execution times, function calls, etc).
1552
1552
1553 You can pass other options after -p which affect the behavior of the
1553 You can pass other options after -p which affect the behavior of the
1554 profiler itself. See the docs for %prun for details.
1554 profiler itself. See the docs for %prun for details.
1555
1555
1556 In this mode, the program's variables do NOT propagate back to the
1556 In this mode, the program's variables do NOT propagate back to the
1557 IPython interactive namespace (because they remain in the namespace
1557 IPython interactive namespace (because they remain in the namespace
1558 where the profiler executes them).
1558 where the profiler executes them).
1559
1559
1560 Internally this triggers a call to %prun, see its documentation for
1560 Internally this triggers a call to %prun, see its documentation for
1561 details on the options available specifically for profiling.
1561 details on the options available specifically for profiling.
1562
1562
1563 There is one special usage for which the text above doesn't apply:
1563 There is one special usage for which the text above doesn't apply:
1564 if the filename ends with .ipy, the file is run as ipython script,
1564 if the filename ends with .ipy, the file is run as ipython script,
1565 just as if the commands were written on IPython prompt.
1565 just as if the commands were written on IPython prompt.
1566 """
1566 """
1567
1567
1568 # get arguments and set sys.argv for program to be run.
1568 # get arguments and set sys.argv for program to be run.
1569 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1569 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1570 mode='list',list_all=1)
1570 mode='list',list_all=1)
1571
1571
1572 try:
1572 try:
1573 filename = file_finder(arg_lst[0])
1573 filename = file_finder(arg_lst[0])
1574 except IndexError:
1574 except IndexError:
1575 warn('you must provide at least a filename.')
1575 warn('you must provide at least a filename.')
1576 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1576 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1577 return
1577 return
1578 except IOError,msg:
1578 except IOError,msg:
1579 error(msg)
1579 error(msg)
1580 return
1580 return
1581
1581
1582 if filename.lower().endswith('.ipy'):
1582 if filename.lower().endswith('.ipy'):
1583 self.shell.safe_execfile_ipy(filename)
1583 self.shell.safe_execfile_ipy(filename)
1584 return
1584 return
1585
1585
1586 # Control the response to exit() calls made by the script being run
1586 # Control the response to exit() calls made by the script being run
1587 exit_ignore = opts.has_key('e')
1587 exit_ignore = opts.has_key('e')
1588
1588
1589 # Make sure that the running script gets a proper sys.argv as if it
1589 # Make sure that the running script gets a proper sys.argv as if it
1590 # were run from a system shell.
1590 # were run from a system shell.
1591 save_argv = sys.argv # save it for later restoring
1591 save_argv = sys.argv # save it for later restoring
1592 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1592 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1593
1593
1594 if opts.has_key('i'):
1594 if opts.has_key('i'):
1595 # Run in user's interactive namespace
1595 # Run in user's interactive namespace
1596 prog_ns = self.shell.user_ns
1596 prog_ns = self.shell.user_ns
1597 __name__save = self.shell.user_ns['__name__']
1597 __name__save = self.shell.user_ns['__name__']
1598 prog_ns['__name__'] = '__main__'
1598 prog_ns['__name__'] = '__main__'
1599 main_mod = self.shell.new_main_mod(prog_ns)
1599 main_mod = self.shell.new_main_mod(prog_ns)
1600 else:
1600 else:
1601 # Run in a fresh, empty namespace
1601 # Run in a fresh, empty namespace
1602 if opts.has_key('n'):
1602 if opts.has_key('n'):
1603 name = os.path.splitext(os.path.basename(filename))[0]
1603 name = os.path.splitext(os.path.basename(filename))[0]
1604 else:
1604 else:
1605 name = '__main__'
1605 name = '__main__'
1606
1606
1607 main_mod = self.shell.new_main_mod()
1607 main_mod = self.shell.new_main_mod()
1608 prog_ns = main_mod.__dict__
1608 prog_ns = main_mod.__dict__
1609 prog_ns['__name__'] = name
1609 prog_ns['__name__'] = name
1610
1610
1611 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1611 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1612 # set the __file__ global in the script's namespace
1612 # set the __file__ global in the script's namespace
1613 prog_ns['__file__'] = filename
1613 prog_ns['__file__'] = filename
1614
1614
1615 # pickle fix. See iplib for an explanation. But we need to make sure
1615 # pickle fix. See iplib for an explanation. But we need to make sure
1616 # that, if we overwrite __main__, we replace it at the end
1616 # that, if we overwrite __main__, we replace it at the end
1617 main_mod_name = prog_ns['__name__']
1617 main_mod_name = prog_ns['__name__']
1618
1618
1619 if main_mod_name == '__main__':
1619 if main_mod_name == '__main__':
1620 restore_main = sys.modules['__main__']
1620 restore_main = sys.modules['__main__']
1621 else:
1621 else:
1622 restore_main = False
1622 restore_main = False
1623
1623
1624 # This needs to be undone at the end to prevent holding references to
1624 # This needs to be undone at the end to prevent holding references to
1625 # every single object ever created.
1625 # every single object ever created.
1626 sys.modules[main_mod_name] = main_mod
1626 sys.modules[main_mod_name] = main_mod
1627
1627
1628 stats = None
1628 stats = None
1629 try:
1629 try:
1630 self.shell.savehist()
1630 self.shell.savehist()
1631
1631
1632 if opts.has_key('p'):
1632 if opts.has_key('p'):
1633 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1633 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1634 else:
1634 else:
1635 if opts.has_key('d'):
1635 if opts.has_key('d'):
1636 deb = debugger.Pdb(self.shell.colors)
1636 deb = debugger.Pdb(self.shell.colors)
1637 # reset Breakpoint state, which is moronically kept
1637 # reset Breakpoint state, which is moronically kept
1638 # in a class
1638 # in a class
1639 bdb.Breakpoint.next = 1
1639 bdb.Breakpoint.next = 1
1640 bdb.Breakpoint.bplist = {}
1640 bdb.Breakpoint.bplist = {}
1641 bdb.Breakpoint.bpbynumber = [None]
1641 bdb.Breakpoint.bpbynumber = [None]
1642 # Set an initial breakpoint to stop execution
1642 # Set an initial breakpoint to stop execution
1643 maxtries = 10
1643 maxtries = 10
1644 bp = int(opts.get('b',[1])[0])
1644 bp = int(opts.get('b',[1])[0])
1645 checkline = deb.checkline(filename,bp)
1645 checkline = deb.checkline(filename,bp)
1646 if not checkline:
1646 if not checkline:
1647 for bp in range(bp+1,bp+maxtries+1):
1647 for bp in range(bp+1,bp+maxtries+1):
1648 if deb.checkline(filename,bp):
1648 if deb.checkline(filename,bp):
1649 break
1649 break
1650 else:
1650 else:
1651 msg = ("\nI failed to find a valid line to set "
1651 msg = ("\nI failed to find a valid line to set "
1652 "a breakpoint\n"
1652 "a breakpoint\n"
1653 "after trying up to line: %s.\n"
1653 "after trying up to line: %s.\n"
1654 "Please set a valid breakpoint manually "
1654 "Please set a valid breakpoint manually "
1655 "with the -b option." % bp)
1655 "with the -b option." % bp)
1656 error(msg)
1656 error(msg)
1657 return
1657 return
1658 # if we find a good linenumber, set the breakpoint
1658 # if we find a good linenumber, set the breakpoint
1659 deb.do_break('%s:%s' % (filename,bp))
1659 deb.do_break('%s:%s' % (filename,bp))
1660 # Start file run
1660 # Start file run
1661 print "NOTE: Enter 'c' at the",
1661 print "NOTE: Enter 'c' at the",
1662 print "%s prompt to start your script." % deb.prompt
1662 print "%s prompt to start your script." % deb.prompt
1663 try:
1663 try:
1664 deb.run('execfile("%s")' % filename,prog_ns)
1664 deb.run('execfile("%s")' % filename,prog_ns)
1665
1665
1666 except:
1666 except:
1667 etype, value, tb = sys.exc_info()
1667 etype, value, tb = sys.exc_info()
1668 # Skip three frames in the traceback: the %run one,
1668 # Skip three frames in the traceback: the %run one,
1669 # one inside bdb.py, and the command-line typed by the
1669 # one inside bdb.py, and the command-line typed by the
1670 # user (run by exec in pdb itself).
1670 # user (run by exec in pdb itself).
1671 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1671 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1672 else:
1672 else:
1673 if runner is None:
1673 if runner is None:
1674 runner = self.shell.safe_execfile
1674 runner = self.shell.safe_execfile
1675 if opts.has_key('t'):
1675 if opts.has_key('t'):
1676 # timed execution
1676 # timed execution
1677 try:
1677 try:
1678 nruns = int(opts['N'][0])
1678 nruns = int(opts['N'][0])
1679 if nruns < 1:
1679 if nruns < 1:
1680 error('Number of runs must be >=1')
1680 error('Number of runs must be >=1')
1681 return
1681 return
1682 except (KeyError):
1682 except (KeyError):
1683 nruns = 1
1683 nruns = 1
1684 if nruns == 1:
1684 if nruns == 1:
1685 t0 = clock2()
1685 t0 = clock2()
1686 runner(filename,prog_ns,prog_ns,
1686 runner(filename,prog_ns,prog_ns,
1687 exit_ignore=exit_ignore)
1687 exit_ignore=exit_ignore)
1688 t1 = clock2()
1688 t1 = clock2()
1689 t_usr = t1[0]-t0[0]
1689 t_usr = t1[0]-t0[0]
1690 t_sys = t1[1]-t0[1]
1690 t_sys = t1[1]-t0[1]
1691 print "\nIPython CPU timings (estimated):"
1691 print "\nIPython CPU timings (estimated):"
1692 print " User : %10s s." % t_usr
1692 print " User : %10s s." % t_usr
1693 print " System: %10s s." % t_sys
1693 print " System: %10s s." % t_sys
1694 else:
1694 else:
1695 runs = range(nruns)
1695 runs = range(nruns)
1696 t0 = clock2()
1696 t0 = clock2()
1697 for nr in runs:
1697 for nr in runs:
1698 runner(filename,prog_ns,prog_ns,
1698 runner(filename,prog_ns,prog_ns,
1699 exit_ignore=exit_ignore)
1699 exit_ignore=exit_ignore)
1700 t1 = clock2()
1700 t1 = clock2()
1701 t_usr = t1[0]-t0[0]
1701 t_usr = t1[0]-t0[0]
1702 t_sys = t1[1]-t0[1]
1702 t_sys = t1[1]-t0[1]
1703 print "\nIPython CPU timings (estimated):"
1703 print "\nIPython CPU timings (estimated):"
1704 print "Total runs performed:",nruns
1704 print "Total runs performed:",nruns
1705 print " Times : %10s %10s" % ('Total','Per run')
1705 print " Times : %10s %10s" % ('Total','Per run')
1706 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1706 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1707 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1707 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1708
1708
1709 else:
1709 else:
1710 # regular execution
1710 # regular execution
1711 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1711 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1712
1712
1713 if opts.has_key('i'):
1713 if opts.has_key('i'):
1714 self.shell.user_ns['__name__'] = __name__save
1714 self.shell.user_ns['__name__'] = __name__save
1715 else:
1715 else:
1716 # The shell MUST hold a reference to prog_ns so after %run
1716 # The shell MUST hold a reference to prog_ns so after %run
1717 # exits, the python deletion mechanism doesn't zero it out
1717 # exits, the python deletion mechanism doesn't zero it out
1718 # (leaving dangling references).
1718 # (leaving dangling references).
1719 self.shell.cache_main_mod(prog_ns,filename)
1719 self.shell.cache_main_mod(prog_ns,filename)
1720 # update IPython interactive namespace
1720 # update IPython interactive namespace
1721
1721
1722 # Some forms of read errors on the file may mean the
1722 # Some forms of read errors on the file may mean the
1723 # __name__ key was never set; using pop we don't have to
1723 # __name__ key was never set; using pop we don't have to
1724 # worry about a possible KeyError.
1724 # worry about a possible KeyError.
1725 prog_ns.pop('__name__', None)
1725 prog_ns.pop('__name__', None)
1726
1726
1727 self.shell.user_ns.update(prog_ns)
1727 self.shell.user_ns.update(prog_ns)
1728 finally:
1728 finally:
1729 # It's a bit of a mystery why, but __builtins__ can change from
1729 # It's a bit of a mystery why, but __builtins__ can change from
1730 # being a module to becoming a dict missing some key data after
1730 # being a module to becoming a dict missing some key data after
1731 # %run. As best I can see, this is NOT something IPython is doing
1731 # %run. As best I can see, this is NOT something IPython is doing
1732 # at all, and similar problems have been reported before:
1732 # at all, and similar problems have been reported before:
1733 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1733 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1734 # Since this seems to be done by the interpreter itself, the best
1734 # Since this seems to be done by the interpreter itself, the best
1735 # we can do is to at least restore __builtins__ for the user on
1735 # we can do is to at least restore __builtins__ for the user on
1736 # exit.
1736 # exit.
1737 self.shell.user_ns['__builtins__'] = __builtin__
1737 self.shell.user_ns['__builtins__'] = __builtin__
1738
1738
1739 # Ensure key global structures are restored
1739 # Ensure key global structures are restored
1740 sys.argv = save_argv
1740 sys.argv = save_argv
1741 if restore_main:
1741 if restore_main:
1742 sys.modules['__main__'] = restore_main
1742 sys.modules['__main__'] = restore_main
1743 else:
1743 else:
1744 # Remove from sys.modules the reference to main_mod we'd
1744 # Remove from sys.modules the reference to main_mod we'd
1745 # added. Otherwise it will trap references to objects
1745 # added. Otherwise it will trap references to objects
1746 # contained therein.
1746 # contained therein.
1747 del sys.modules[main_mod_name]
1747 del sys.modules[main_mod_name]
1748
1748
1749 self.shell.reloadhist()
1749 self.shell.reloadhist()
1750
1750
1751 return stats
1751 return stats
1752
1752
1753 @testdec.skip_doctest
1753 @testdec.skip_doctest
1754 def magic_timeit(self, parameter_s =''):
1754 def magic_timeit(self, parameter_s =''):
1755 """Time execution of a Python statement or expression
1755 """Time execution of a Python statement or expression
1756
1756
1757 Usage:\\
1757 Usage:\\
1758 %timeit [-n<N> -r<R> [-t|-c]] statement
1758 %timeit [-n<N> -r<R> [-t|-c]] statement
1759
1759
1760 Time execution of a Python statement or expression using the timeit
1760 Time execution of a Python statement or expression using the timeit
1761 module.
1761 module.
1762
1762
1763 Options:
1763 Options:
1764 -n<N>: execute the given statement <N> times in a loop. If this value
1764 -n<N>: execute the given statement <N> times in a loop. If this value
1765 is not given, a fitting value is chosen.
1765 is not given, a fitting value is chosen.
1766
1766
1767 -r<R>: repeat the loop iteration <R> times and take the best result.
1767 -r<R>: repeat the loop iteration <R> times and take the best result.
1768 Default: 3
1768 Default: 3
1769
1769
1770 -t: use time.time to measure the time, which is the default on Unix.
1770 -t: use time.time to measure the time, which is the default on Unix.
1771 This function measures wall time.
1771 This function measures wall time.
1772
1772
1773 -c: use time.clock to measure the time, which is the default on
1773 -c: use time.clock to measure the time, which is the default on
1774 Windows and measures wall time. On Unix, resource.getrusage is used
1774 Windows and measures wall time. On Unix, resource.getrusage is used
1775 instead and returns the CPU user time.
1775 instead and returns the CPU user time.
1776
1776
1777 -p<P>: use a precision of <P> digits to display the timing result.
1777 -p<P>: use a precision of <P> digits to display the timing result.
1778 Default: 3
1778 Default: 3
1779
1779
1780
1780
1781 Examples:
1781 Examples:
1782
1782
1783 In [1]: %timeit pass
1783 In [1]: %timeit pass
1784 10000000 loops, best of 3: 53.3 ns per loop
1784 10000000 loops, best of 3: 53.3 ns per loop
1785
1785
1786 In [2]: u = None
1786 In [2]: u = None
1787
1787
1788 In [3]: %timeit u is None
1788 In [3]: %timeit u is None
1789 10000000 loops, best of 3: 184 ns per loop
1789 10000000 loops, best of 3: 184 ns per loop
1790
1790
1791 In [4]: %timeit -r 4 u == None
1791 In [4]: %timeit -r 4 u == None
1792 1000000 loops, best of 4: 242 ns per loop
1792 1000000 loops, best of 4: 242 ns per loop
1793
1793
1794 In [5]: import time
1794 In [5]: import time
1795
1795
1796 In [6]: %timeit -n1 time.sleep(2)
1796 In [6]: %timeit -n1 time.sleep(2)
1797 1 loops, best of 3: 2 s per loop
1797 1 loops, best of 3: 2 s per loop
1798
1798
1799
1799
1800 The times reported by %timeit will be slightly higher than those
1800 The times reported by %timeit will be slightly higher than those
1801 reported by the timeit.py script when variables are accessed. This is
1801 reported by the timeit.py script when variables are accessed. This is
1802 due to the fact that %timeit executes the statement in the namespace
1802 due to the fact that %timeit executes the statement in the namespace
1803 of the shell, compared with timeit.py, which uses a single setup
1803 of the shell, compared with timeit.py, which uses a single setup
1804 statement to import function or create variables. Generally, the bias
1804 statement to import function or create variables. Generally, the bias
1805 does not matter as long as results from timeit.py are not mixed with
1805 does not matter as long as results from timeit.py are not mixed with
1806 those from %timeit."""
1806 those from %timeit."""
1807
1807
1808 import timeit
1808 import timeit
1809 import math
1809 import math
1810
1810
1811 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1811 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1812 # certain terminals. Until we figure out a robust way of
1812 # certain terminals. Until we figure out a robust way of
1813 # auto-detecting if the terminal can deal with it, use plain 'us' for
1813 # auto-detecting if the terminal can deal with it, use plain 'us' for
1814 # microseconds. I am really NOT happy about disabling the proper
1814 # microseconds. I am really NOT happy about disabling the proper
1815 # 'micro' prefix, but crashing is worse... If anyone knows what the
1815 # 'micro' prefix, but crashing is worse... If anyone knows what the
1816 # right solution for this is, I'm all ears...
1816 # right solution for this is, I'm all ears...
1817 #
1817 #
1818 # Note: using
1818 # Note: using
1819 #
1819 #
1820 # s = u'\xb5'
1820 # s = u'\xb5'
1821 # s.encode(sys.getdefaultencoding())
1821 # s.encode(sys.getdefaultencoding())
1822 #
1822 #
1823 # is not sufficient, as I've seen terminals where that fails but
1823 # is not sufficient, as I've seen terminals where that fails but
1824 # print s
1824 # print s
1825 #
1825 #
1826 # succeeds
1826 # succeeds
1827 #
1827 #
1828 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1828 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1829
1829
1830 #units = [u"s", u"ms",u'\xb5',"ns"]
1830 #units = [u"s", u"ms",u'\xb5',"ns"]
1831 units = [u"s", u"ms",u'us',"ns"]
1831 units = [u"s", u"ms",u'us',"ns"]
1832
1832
1833 scaling = [1, 1e3, 1e6, 1e9]
1833 scaling = [1, 1e3, 1e6, 1e9]
1834
1834
1835 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1835 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1836 posix=False)
1836 posix=False)
1837 if stmt == "":
1837 if stmt == "":
1838 return
1838 return
1839 timefunc = timeit.default_timer
1839 timefunc = timeit.default_timer
1840 number = int(getattr(opts, "n", 0))
1840 number = int(getattr(opts, "n", 0))
1841 repeat = int(getattr(opts, "r", timeit.default_repeat))
1841 repeat = int(getattr(opts, "r", timeit.default_repeat))
1842 precision = int(getattr(opts, "p", 3))
1842 precision = int(getattr(opts, "p", 3))
1843 if hasattr(opts, "t"):
1843 if hasattr(opts, "t"):
1844 timefunc = time.time
1844 timefunc = time.time
1845 if hasattr(opts, "c"):
1845 if hasattr(opts, "c"):
1846 timefunc = clock
1846 timefunc = clock
1847
1847
1848 timer = timeit.Timer(timer=timefunc)
1848 timer = timeit.Timer(timer=timefunc)
1849 # this code has tight coupling to the inner workings of timeit.Timer,
1849 # this code has tight coupling to the inner workings of timeit.Timer,
1850 # but is there a better way to achieve that the code stmt has access
1850 # but is there a better way to achieve that the code stmt has access
1851 # to the shell namespace?
1851 # to the shell namespace?
1852
1852
1853 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1853 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1854 'setup': "pass"}
1854 'setup': "pass"}
1855 # Track compilation time so it can be reported if too long
1855 # Track compilation time so it can be reported if too long
1856 # Minimum time above which compilation time will be reported
1856 # Minimum time above which compilation time will be reported
1857 tc_min = 0.1
1857 tc_min = 0.1
1858
1858
1859 t0 = clock()
1859 t0 = clock()
1860 code = compile(src, "<magic-timeit>", "exec")
1860 code = compile(src, "<magic-timeit>", "exec")
1861 tc = clock()-t0
1861 tc = clock()-t0
1862
1862
1863 ns = {}
1863 ns = {}
1864 exec code in self.shell.user_ns, ns
1864 exec code in self.shell.user_ns, ns
1865 timer.inner = ns["inner"]
1865 timer.inner = ns["inner"]
1866
1866
1867 if number == 0:
1867 if number == 0:
1868 # determine number so that 0.2 <= total time < 2.0
1868 # determine number so that 0.2 <= total time < 2.0
1869 number = 1
1869 number = 1
1870 for i in range(1, 10):
1870 for i in range(1, 10):
1871 if timer.timeit(number) >= 0.2:
1871 if timer.timeit(number) >= 0.2:
1872 break
1872 break
1873 number *= 10
1873 number *= 10
1874
1874
1875 best = min(timer.repeat(repeat, number)) / number
1875 best = min(timer.repeat(repeat, number)) / number
1876
1876
1877 if best > 0.0:
1877 if best > 0.0:
1878 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1878 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1879 else:
1879 else:
1880 order = 3
1880 order = 3
1881 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1881 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1882 precision,
1882 precision,
1883 best * scaling[order],
1883 best * scaling[order],
1884 units[order])
1884 units[order])
1885 if tc > tc_min:
1885 if tc > tc_min:
1886 print "Compiler time: %.2f s" % tc
1886 print "Compiler time: %.2f s" % tc
1887
1887
1888 @testdec.skip_doctest
1888 @testdec.skip_doctest
1889 def magic_time(self,parameter_s = ''):
1889 def magic_time(self,parameter_s = ''):
1890 """Time execution of a Python statement or expression.
1890 """Time execution of a Python statement or expression.
1891
1891
1892 The CPU and wall clock times are printed, and the value of the
1892 The CPU and wall clock times are printed, and the value of the
1893 expression (if any) is returned. Note that under Win32, system time
1893 expression (if any) is returned. Note that under Win32, system time
1894 is always reported as 0, since it can not be measured.
1894 is always reported as 0, since it can not be measured.
1895
1895
1896 This function provides very basic timing functionality. In Python
1896 This function provides very basic timing functionality. In Python
1897 2.3, the timeit module offers more control and sophistication, so this
1897 2.3, the timeit module offers more control and sophistication, so this
1898 could be rewritten to use it (patches welcome).
1898 could be rewritten to use it (patches welcome).
1899
1899
1900 Some examples:
1900 Some examples:
1901
1901
1902 In [1]: time 2**128
1902 In [1]: time 2**128
1903 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1903 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1904 Wall time: 0.00
1904 Wall time: 0.00
1905 Out[1]: 340282366920938463463374607431768211456L
1905 Out[1]: 340282366920938463463374607431768211456L
1906
1906
1907 In [2]: n = 1000000
1907 In [2]: n = 1000000
1908
1908
1909 In [3]: time sum(range(n))
1909 In [3]: time sum(range(n))
1910 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1910 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1911 Wall time: 1.37
1911 Wall time: 1.37
1912 Out[3]: 499999500000L
1912 Out[3]: 499999500000L
1913
1913
1914 In [4]: time print 'hello world'
1914 In [4]: time print 'hello world'
1915 hello world
1915 hello world
1916 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1916 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1917 Wall time: 0.00
1917 Wall time: 0.00
1918
1918
1919 Note that the time needed by Python to compile the given expression
1919 Note that the time needed by Python to compile the given expression
1920 will be reported if it is more than 0.1s. In this example, the
1920 will be reported if it is more than 0.1s. In this example, the
1921 actual exponentiation is done by Python at compilation time, so while
1921 actual exponentiation is done by Python at compilation time, so while
1922 the expression can take a noticeable amount of time to compute, that
1922 the expression can take a noticeable amount of time to compute, that
1923 time is purely due to the compilation:
1923 time is purely due to the compilation:
1924
1924
1925 In [5]: time 3**9999;
1925 In [5]: time 3**9999;
1926 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1926 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1927 Wall time: 0.00 s
1927 Wall time: 0.00 s
1928
1928
1929 In [6]: time 3**999999;
1929 In [6]: time 3**999999;
1930 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1930 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1931 Wall time: 0.00 s
1931 Wall time: 0.00 s
1932 Compiler : 0.78 s
1932 Compiler : 0.78 s
1933 """
1933 """
1934
1934
1935 # fail immediately if the given expression can't be compiled
1935 # fail immediately if the given expression can't be compiled
1936
1936
1937 expr = self.shell.prefilter(parameter_s,False)
1937 expr = self.shell.prefilter(parameter_s,False)
1938
1938
1939 # Minimum time above which compilation time will be reported
1939 # Minimum time above which compilation time will be reported
1940 tc_min = 0.1
1940 tc_min = 0.1
1941
1941
1942 try:
1942 try:
1943 mode = 'eval'
1943 mode = 'eval'
1944 t0 = clock()
1944 t0 = clock()
1945 code = compile(expr,'<timed eval>',mode)
1945 code = compile(expr,'<timed eval>',mode)
1946 tc = clock()-t0
1946 tc = clock()-t0
1947 except SyntaxError:
1947 except SyntaxError:
1948 mode = 'exec'
1948 mode = 'exec'
1949 t0 = clock()
1949 t0 = clock()
1950 code = compile(expr,'<timed exec>',mode)
1950 code = compile(expr,'<timed exec>',mode)
1951 tc = clock()-t0
1951 tc = clock()-t0
1952 # skew measurement as little as possible
1952 # skew measurement as little as possible
1953 glob = self.shell.user_ns
1953 glob = self.shell.user_ns
1954 clk = clock2
1954 clk = clock2
1955 wtime = time.time
1955 wtime = time.time
1956 # time execution
1956 # time execution
1957 wall_st = wtime()
1957 wall_st = wtime()
1958 if mode=='eval':
1958 if mode=='eval':
1959 st = clk()
1959 st = clk()
1960 out = eval(code,glob)
1960 out = eval(code,glob)
1961 end = clk()
1961 end = clk()
1962 else:
1962 else:
1963 st = clk()
1963 st = clk()
1964 exec code in glob
1964 exec code in glob
1965 end = clk()
1965 end = clk()
1966 out = None
1966 out = None
1967 wall_end = wtime()
1967 wall_end = wtime()
1968 # Compute actual times and report
1968 # Compute actual times and report
1969 wall_time = wall_end-wall_st
1969 wall_time = wall_end-wall_st
1970 cpu_user = end[0]-st[0]
1970 cpu_user = end[0]-st[0]
1971 cpu_sys = end[1]-st[1]
1971 cpu_sys = end[1]-st[1]
1972 cpu_tot = cpu_user+cpu_sys
1972 cpu_tot = cpu_user+cpu_sys
1973 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1973 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1974 (cpu_user,cpu_sys,cpu_tot)
1974 (cpu_user,cpu_sys,cpu_tot)
1975 print "Wall time: %.2f s" % wall_time
1975 print "Wall time: %.2f s" % wall_time
1976 if tc > tc_min:
1976 if tc > tc_min:
1977 print "Compiler : %.2f s" % tc
1977 print "Compiler : %.2f s" % tc
1978 return out
1978 return out
1979
1979
1980 @testdec.skip_doctest
1980 @testdec.skip_doctest
1981 def magic_macro(self,parameter_s = ''):
1981 def magic_macro(self,parameter_s = ''):
1982 """Define a set of input lines as a macro for future re-execution.
1982 """Define a set of input lines as a macro for future re-execution.
1983
1983
1984 Usage:\\
1984 Usage:\\
1985 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1985 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1986
1986
1987 Options:
1987 Options:
1988
1988
1989 -r: use 'raw' input. By default, the 'processed' history is used,
1989 -r: use 'raw' input. By default, the 'processed' history is used,
1990 so that magics are loaded in their transformed version to valid
1990 so that magics are loaded in their transformed version to valid
1991 Python. If this option is given, the raw input as typed as the
1991 Python. If this option is given, the raw input as typed as the
1992 command line is used instead.
1992 command line is used instead.
1993
1993
1994 This will define a global variable called `name` which is a string
1994 This will define a global variable called `name` which is a string
1995 made of joining the slices and lines you specify (n1,n2,... numbers
1995 made of joining the slices and lines you specify (n1,n2,... numbers
1996 above) from your input history into a single string. This variable
1996 above) from your input history into a single string. This variable
1997 acts like an automatic function which re-executes those lines as if
1997 acts like an automatic function which re-executes those lines as if
1998 you had typed them. You just type 'name' at the prompt and the code
1998 you had typed them. You just type 'name' at the prompt and the code
1999 executes.
1999 executes.
2000
2000
2001 The notation for indicating number ranges is: n1-n2 means 'use line
2001 The notation for indicating number ranges is: n1-n2 means 'use line
2002 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
2002 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
2003 using the lines numbered 5,6 and 7.
2003 using the lines numbered 5,6 and 7.
2004
2004
2005 Note: as a 'hidden' feature, you can also use traditional python slice
2005 Note: as a 'hidden' feature, you can also use traditional python slice
2006 notation, where N:M means numbers N through M-1.
2006 notation, where N:M means numbers N through M-1.
2007
2007
2008 For example, if your history contains (%hist prints it):
2008 For example, if your history contains (%hist prints it):
2009
2009
2010 44: x=1
2010 44: x=1
2011 45: y=3
2011 45: y=3
2012 46: z=x+y
2012 46: z=x+y
2013 47: print x
2013 47: print x
2014 48: a=5
2014 48: a=5
2015 49: print 'x',x,'y',y
2015 49: print 'x',x,'y',y
2016
2016
2017 you can create a macro with lines 44 through 47 (included) and line 49
2017 you can create a macro with lines 44 through 47 (included) and line 49
2018 called my_macro with:
2018 called my_macro with:
2019
2019
2020 In [55]: %macro my_macro 44-47 49
2020 In [55]: %macro my_macro 44-47 49
2021
2021
2022 Now, typing `my_macro` (without quotes) will re-execute all this code
2022 Now, typing `my_macro` (without quotes) will re-execute all this code
2023 in one pass.
2023 in one pass.
2024
2024
2025 You don't need to give the line-numbers in order, and any given line
2025 You don't need to give the line-numbers in order, and any given line
2026 number can appear multiple times. You can assemble macros with any
2026 number can appear multiple times. You can assemble macros with any
2027 lines from your input history in any order.
2027 lines from your input history in any order.
2028
2028
2029 The macro is a simple object which holds its value in an attribute,
2029 The macro is a simple object which holds its value in an attribute,
2030 but IPython's display system checks for macros and executes them as
2030 but IPython's display system checks for macros and executes them as
2031 code instead of printing them when you type their name.
2031 code instead of printing them when you type their name.
2032
2032
2033 You can view a macro's contents by explicitly printing it with:
2033 You can view a macro's contents by explicitly printing it with:
2034
2034
2035 'print macro_name'.
2035 'print macro_name'.
2036
2036
2037 For one-off cases which DON'T contain magic function calls in them you
2037 For one-off cases which DON'T contain magic function calls in them you
2038 can obtain similar results by explicitly executing slices from your
2038 can obtain similar results by explicitly executing slices from your
2039 input history with:
2039 input history with:
2040
2040
2041 In [60]: exec In[44:48]+In[49]"""
2041 In [60]: exec In[44:48]+In[49]"""
2042
2042
2043 opts,args = self.parse_options(parameter_s,'r',mode='list')
2043 opts,args = self.parse_options(parameter_s,'r',mode='list')
2044 if not args:
2044 if not args:
2045 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2045 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2046 macs.sort()
2046 macs.sort()
2047 return macs
2047 return macs
2048 if len(args) == 1:
2048 if len(args) == 1:
2049 raise UsageError(
2049 raise UsageError(
2050 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2050 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2051 name,ranges = args[0], args[1:]
2051 name,ranges = args[0], args[1:]
2052
2052
2053 #print 'rng',ranges # dbg
2053 #print 'rng',ranges # dbg
2054 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2054 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2055 macro = Macro(lines)
2055 macro = Macro(lines)
2056 self.shell.define_macro(name, macro)
2056 self.shell.define_macro(name, macro)
2057 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2057 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2058 print 'Macro contents:'
2058 print 'Macro contents:'
2059 print macro,
2059 print macro,
2060
2060
2061 def magic_save(self,parameter_s = ''):
2061 def magic_save(self,parameter_s = ''):
2062 """Save a set of lines to a given filename.
2062 """Save a set of lines to a given filename.
2063
2063
2064 Usage:\\
2064 Usage:\\
2065 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2065 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2066
2066
2067 Options:
2067 Options:
2068
2068
2069 -r: use 'raw' input. By default, the 'processed' history is used,
2069 -r: use 'raw' input. By default, the 'processed' history is used,
2070 so that magics are loaded in their transformed version to valid
2070 so that magics are loaded in their transformed version to valid
2071 Python. If this option is given, the raw input as typed as the
2071 Python. If this option is given, the raw input as typed as the
2072 command line is used instead.
2072 command line is used instead.
2073
2073
2074 This function uses the same syntax as %macro for line extraction, but
2074 This function uses the same syntax as %macro for line extraction, but
2075 instead of creating a macro it saves the resulting string to the
2075 instead of creating a macro it saves the resulting string to the
2076 filename you specify.
2076 filename you specify.
2077
2077
2078 It adds a '.py' extension to the file if you don't do so yourself, and
2078 It adds a '.py' extension to the file if you don't do so yourself, and
2079 it asks for confirmation before overwriting existing files."""
2079 it asks for confirmation before overwriting existing files."""
2080
2080
2081 opts,args = self.parse_options(parameter_s,'r',mode='list')
2081 opts,args = self.parse_options(parameter_s,'r',mode='list')
2082 fname,ranges = args[0], args[1:]
2082 fname,ranges = args[0], args[1:]
2083 if not fname.endswith('.py'):
2083 if not fname.endswith('.py'):
2084 fname += '.py'
2084 fname += '.py'
2085 if os.path.isfile(fname):
2085 if os.path.isfile(fname):
2086 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2086 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2087 if ans.lower() not in ['y','yes']:
2087 if ans.lower() not in ['y','yes']:
2088 print 'Operation cancelled.'
2088 print 'Operation cancelled.'
2089 return
2089 return
2090 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2090 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2091 f = file(fname,'w')
2091 f = file(fname,'w')
2092 f.write(cmds)
2092 f.write(cmds)
2093 f.close()
2093 f.close()
2094 print 'The following commands were written to file `%s`:' % fname
2094 print 'The following commands were written to file `%s`:' % fname
2095 print cmds
2095 print cmds
2096
2096
2097 def _edit_macro(self,mname,macro):
2097 def _edit_macro(self,mname,macro):
2098 """open an editor with the macro data in a file"""
2098 """open an editor with the macro data in a file"""
2099 filename = self.shell.mktempfile(macro.value)
2099 filename = self.shell.mktempfile(macro.value)
2100 self.shell.hooks.editor(filename)
2100 self.shell.hooks.editor(filename)
2101
2101
2102 # and make a new macro object, to replace the old one
2102 # and make a new macro object, to replace the old one
2103 mfile = open(filename)
2103 mfile = open(filename)
2104 mvalue = mfile.read()
2104 mvalue = mfile.read()
2105 mfile.close()
2105 mfile.close()
2106 self.shell.user_ns[mname] = Macro(mvalue)
2106 self.shell.user_ns[mname] = Macro(mvalue)
2107
2107
2108 def magic_ed(self,parameter_s=''):
2108 def magic_ed(self,parameter_s=''):
2109 """Alias to %edit."""
2109 """Alias to %edit."""
2110 return self.magic_edit(parameter_s)
2110 return self.magic_edit(parameter_s)
2111
2111
2112 @testdec.skip_doctest
2112 @testdec.skip_doctest
2113 def magic_edit(self,parameter_s='',last_call=['','']):
2113 def magic_edit(self,parameter_s='',last_call=['','']):
2114 """Bring up an editor and execute the resulting code.
2114 """Bring up an editor and execute the resulting code.
2115
2115
2116 Usage:
2116 Usage:
2117 %edit [options] [args]
2117 %edit [options] [args]
2118
2118
2119 %edit runs IPython's editor hook. The default version of this hook is
2119 %edit runs IPython's editor hook. The default version of this hook is
2120 set to call the __IPYTHON__.rc.editor command. This is read from your
2120 set to call the __IPYTHON__.rc.editor command. This is read from your
2121 environment variable $EDITOR. If this isn't found, it will default to
2121 environment variable $EDITOR. If this isn't found, it will default to
2122 vi under Linux/Unix and to notepad under Windows. See the end of this
2122 vi under Linux/Unix and to notepad under Windows. See the end of this
2123 docstring for how to change the editor hook.
2123 docstring for how to change the editor hook.
2124
2124
2125 You can also set the value of this editor via the command line option
2125 You can also set the value of this editor via the command line option
2126 '-editor' or in your ipythonrc file. This is useful if you wish to use
2126 '-editor' or in your ipythonrc file. This is useful if you wish to use
2127 specifically for IPython an editor different from your typical default
2127 specifically for IPython an editor different from your typical default
2128 (and for Windows users who typically don't set environment variables).
2128 (and for Windows users who typically don't set environment variables).
2129
2129
2130 This command allows you to conveniently edit multi-line code right in
2130 This command allows you to conveniently edit multi-line code right in
2131 your IPython session.
2131 your IPython session.
2132
2132
2133 If called without arguments, %edit opens up an empty editor with a
2133 If called without arguments, %edit opens up an empty editor with a
2134 temporary file and will execute the contents of this file when you
2134 temporary file and will execute the contents of this file when you
2135 close it (don't forget to save it!).
2135 close it (don't forget to save it!).
2136
2136
2137
2137
2138 Options:
2138 Options:
2139
2139
2140 -n <number>: open the editor at a specified line number. By default,
2140 -n <number>: open the editor at a specified line number. By default,
2141 the IPython editor hook uses the unix syntax 'editor +N filename', but
2141 the IPython editor hook uses the unix syntax 'editor +N filename', but
2142 you can configure this by providing your own modified hook if your
2142 you can configure this by providing your own modified hook if your
2143 favorite editor supports line-number specifications with a different
2143 favorite editor supports line-number specifications with a different
2144 syntax.
2144 syntax.
2145
2145
2146 -p: this will call the editor with the same data as the previous time
2146 -p: this will call the editor with the same data as the previous time
2147 it was used, regardless of how long ago (in your current session) it
2147 it was used, regardless of how long ago (in your current session) it
2148 was.
2148 was.
2149
2149
2150 -r: use 'raw' input. This option only applies to input taken from the
2150 -r: use 'raw' input. This option only applies to input taken from the
2151 user's history. By default, the 'processed' history is used, so that
2151 user's history. By default, the 'processed' history is used, so that
2152 magics are loaded in their transformed version to valid Python. If
2152 magics are loaded in their transformed version to valid Python. If
2153 this option is given, the raw input as typed as the command line is
2153 this option is given, the raw input as typed as the command line is
2154 used instead. When you exit the editor, it will be executed by
2154 used instead. When you exit the editor, it will be executed by
2155 IPython's own processor.
2155 IPython's own processor.
2156
2156
2157 -x: do not execute the edited code immediately upon exit. This is
2157 -x: do not execute the edited code immediately upon exit. This is
2158 mainly useful if you are editing programs which need to be called with
2158 mainly useful if you are editing programs which need to be called with
2159 command line arguments, which you can then do using %run.
2159 command line arguments, which you can then do using %run.
2160
2160
2161
2161
2162 Arguments:
2162 Arguments:
2163
2163
2164 If arguments are given, the following possibilites exist:
2164 If arguments are given, the following possibilites exist:
2165
2165
2166 - The arguments are numbers or pairs of colon-separated numbers (like
2166 - The arguments are numbers or pairs of colon-separated numbers (like
2167 1 4:8 9). These are interpreted as lines of previous input to be
2167 1 4:8 9). These are interpreted as lines of previous input to be
2168 loaded into the editor. The syntax is the same of the %macro command.
2168 loaded into the editor. The syntax is the same of the %macro command.
2169
2169
2170 - If the argument doesn't start with a number, it is evaluated as a
2170 - If the argument doesn't start with a number, it is evaluated as a
2171 variable and its contents loaded into the editor. You can thus edit
2171 variable and its contents loaded into the editor. You can thus edit
2172 any string which contains python code (including the result of
2172 any string which contains python code (including the result of
2173 previous edits).
2173 previous edits).
2174
2174
2175 - If the argument is the name of an object (other than a string),
2175 - If the argument is the name of an object (other than a string),
2176 IPython will try to locate the file where it was defined and open the
2176 IPython will try to locate the file where it was defined and open the
2177 editor at the point where it is defined. You can use `%edit function`
2177 editor at the point where it is defined. You can use `%edit function`
2178 to load an editor exactly at the point where 'function' is defined,
2178 to load an editor exactly at the point where 'function' is defined,
2179 edit it and have the file be executed automatically.
2179 edit it and have the file be executed automatically.
2180
2180
2181 If the object is a macro (see %macro for details), this opens up your
2181 If the object is a macro (see %macro for details), this opens up your
2182 specified editor with a temporary file containing the macro's data.
2182 specified editor with a temporary file containing the macro's data.
2183 Upon exit, the macro is reloaded with the contents of the file.
2183 Upon exit, the macro is reloaded with the contents of the file.
2184
2184
2185 Note: opening at an exact line is only supported under Unix, and some
2185 Note: opening at an exact line is only supported under Unix, and some
2186 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2186 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2187 '+NUMBER' parameter necessary for this feature. Good editors like
2187 '+NUMBER' parameter necessary for this feature. Good editors like
2188 (X)Emacs, vi, jed, pico and joe all do.
2188 (X)Emacs, vi, jed, pico and joe all do.
2189
2189
2190 - If the argument is not found as a variable, IPython will look for a
2190 - If the argument is not found as a variable, IPython will look for a
2191 file with that name (adding .py if necessary) and load it into the
2191 file with that name (adding .py if necessary) and load it into the
2192 editor. It will execute its contents with execfile() when you exit,
2192 editor. It will execute its contents with execfile() when you exit,
2193 loading any code in the file into your interactive namespace.
2193 loading any code in the file into your interactive namespace.
2194
2194
2195 After executing your code, %edit will return as output the code you
2195 After executing your code, %edit will return as output the code you
2196 typed in the editor (except when it was an existing file). This way
2196 typed in the editor (except when it was an existing file). This way
2197 you can reload the code in further invocations of %edit as a variable,
2197 you can reload the code in further invocations of %edit as a variable,
2198 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2198 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2199 the output.
2199 the output.
2200
2200
2201 Note that %edit is also available through the alias %ed.
2201 Note that %edit is also available through the alias %ed.
2202
2202
2203 This is an example of creating a simple function inside the editor and
2203 This is an example of creating a simple function inside the editor and
2204 then modifying it. First, start up the editor:
2204 then modifying it. First, start up the editor:
2205
2205
2206 In [1]: ed
2206 In [1]: ed
2207 Editing... done. Executing edited code...
2207 Editing... done. Executing edited code...
2208 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2208 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2209
2209
2210 We can then call the function foo():
2210 We can then call the function foo():
2211
2211
2212 In [2]: foo()
2212 In [2]: foo()
2213 foo() was defined in an editing session
2213 foo() was defined in an editing session
2214
2214
2215 Now we edit foo. IPython automatically loads the editor with the
2215 Now we edit foo. IPython automatically loads the editor with the
2216 (temporary) file where foo() was previously defined:
2216 (temporary) file where foo() was previously defined:
2217
2217
2218 In [3]: ed foo
2218 In [3]: ed foo
2219 Editing... done. Executing edited code...
2219 Editing... done. Executing edited code...
2220
2220
2221 And if we call foo() again we get the modified version:
2221 And if we call foo() again we get the modified version:
2222
2222
2223 In [4]: foo()
2223 In [4]: foo()
2224 foo() has now been changed!
2224 foo() has now been changed!
2225
2225
2226 Here is an example of how to edit a code snippet successive
2226 Here is an example of how to edit a code snippet successive
2227 times. First we call the editor:
2227 times. First we call the editor:
2228
2228
2229 In [5]: ed
2229 In [5]: ed
2230 Editing... done. Executing edited code...
2230 Editing... done. Executing edited code...
2231 hello
2231 hello
2232 Out[5]: "print 'hello'n"
2232 Out[5]: "print 'hello'n"
2233
2233
2234 Now we call it again with the previous output (stored in _):
2234 Now we call it again with the previous output (stored in _):
2235
2235
2236 In [6]: ed _
2236 In [6]: ed _
2237 Editing... done. Executing edited code...
2237 Editing... done. Executing edited code...
2238 hello world
2238 hello world
2239 Out[6]: "print 'hello world'n"
2239 Out[6]: "print 'hello world'n"
2240
2240
2241 Now we call it with the output #8 (stored in _8, also as Out[8]):
2241 Now we call it with the output #8 (stored in _8, also as Out[8]):
2242
2242
2243 In [7]: ed _8
2243 In [7]: ed _8
2244 Editing... done. Executing edited code...
2244 Editing... done. Executing edited code...
2245 hello again
2245 hello again
2246 Out[7]: "print 'hello again'n"
2246 Out[7]: "print 'hello again'n"
2247
2247
2248
2248
2249 Changing the default editor hook:
2249 Changing the default editor hook:
2250
2250
2251 If you wish to write your own editor hook, you can put it in a
2251 If you wish to write your own editor hook, you can put it in a
2252 configuration file which you load at startup time. The default hook
2252 configuration file which you load at startup time. The default hook
2253 is defined in the IPython.core.hooks module, and you can use that as a
2253 is defined in the IPython.core.hooks module, and you can use that as a
2254 starting example for further modifications. That file also has
2254 starting example for further modifications. That file also has
2255 general instructions on how to set a new hook for use once you've
2255 general instructions on how to set a new hook for use once you've
2256 defined it."""
2256 defined it."""
2257
2257
2258 # FIXME: This function has become a convoluted mess. It needs a
2258 # FIXME: This function has become a convoluted mess. It needs a
2259 # ground-up rewrite with clean, simple logic.
2259 # ground-up rewrite with clean, simple logic.
2260
2260
2261 def make_filename(arg):
2261 def make_filename(arg):
2262 "Make a filename from the given args"
2262 "Make a filename from the given args"
2263 try:
2263 try:
2264 filename = get_py_filename(arg)
2264 filename = get_py_filename(arg)
2265 except IOError:
2265 except IOError:
2266 if args.endswith('.py'):
2266 if args.endswith('.py'):
2267 filename = arg
2267 filename = arg
2268 else:
2268 else:
2269 filename = None
2269 filename = None
2270 return filename
2270 return filename
2271
2271
2272 # custom exceptions
2272 # custom exceptions
2273 class DataIsObject(Exception): pass
2273 class DataIsObject(Exception): pass
2274
2274
2275 opts,args = self.parse_options(parameter_s,'prxn:')
2275 opts,args = self.parse_options(parameter_s,'prxn:')
2276 # Set a few locals from the options for convenience:
2276 # Set a few locals from the options for convenience:
2277 opts_p = opts.has_key('p')
2277 opts_p = opts.has_key('p')
2278 opts_r = opts.has_key('r')
2278 opts_r = opts.has_key('r')
2279
2279
2280 # Default line number value
2280 # Default line number value
2281 lineno = opts.get('n',None)
2281 lineno = opts.get('n',None)
2282
2282
2283 if opts_p:
2283 if opts_p:
2284 args = '_%s' % last_call[0]
2284 args = '_%s' % last_call[0]
2285 if not self.shell.user_ns.has_key(args):
2285 if not self.shell.user_ns.has_key(args):
2286 args = last_call[1]
2286 args = last_call[1]
2287
2287
2288 # use last_call to remember the state of the previous call, but don't
2288 # use last_call to remember the state of the previous call, but don't
2289 # let it be clobbered by successive '-p' calls.
2289 # let it be clobbered by successive '-p' calls.
2290 try:
2290 try:
2291 last_call[0] = self.shell.outputcache.prompt_count
2291 last_call[0] = self.shell.outputcache.prompt_count
2292 if not opts_p:
2292 if not opts_p:
2293 last_call[1] = parameter_s
2293 last_call[1] = parameter_s
2294 except:
2294 except:
2295 pass
2295 pass
2296
2296
2297 # by default this is done with temp files, except when the given
2297 # by default this is done with temp files, except when the given
2298 # arg is a filename
2298 # arg is a filename
2299 use_temp = 1
2299 use_temp = 1
2300
2300
2301 if re.match(r'\d',args):
2301 if re.match(r'\d',args):
2302 # Mode where user specifies ranges of lines, like in %macro.
2302 # Mode where user specifies ranges of lines, like in %macro.
2303 # This means that you can't edit files whose names begin with
2303 # This means that you can't edit files whose names begin with
2304 # numbers this way. Tough.
2304 # numbers this way. Tough.
2305 ranges = args.split()
2305 ranges = args.split()
2306 data = ''.join(self.extract_input_slices(ranges,opts_r))
2306 data = ''.join(self.extract_input_slices(ranges,opts_r))
2307 elif args.endswith('.py'):
2307 elif args.endswith('.py'):
2308 filename = make_filename(args)
2308 filename = make_filename(args)
2309 data = ''
2309 data = ''
2310 use_temp = 0
2310 use_temp = 0
2311 elif args:
2311 elif args:
2312 try:
2312 try:
2313 # Load the parameter given as a variable. If not a string,
2313 # Load the parameter given as a variable. If not a string,
2314 # process it as an object instead (below)
2314 # process it as an object instead (below)
2315
2315
2316 #print '*** args',args,'type',type(args) # dbg
2316 #print '*** args',args,'type',type(args) # dbg
2317 data = eval(args,self.shell.user_ns)
2317 data = eval(args,self.shell.user_ns)
2318 if not type(data) in StringTypes:
2318 if not type(data) in StringTypes:
2319 raise DataIsObject
2319 raise DataIsObject
2320
2320
2321 except (NameError,SyntaxError):
2321 except (NameError,SyntaxError):
2322 # given argument is not a variable, try as a filename
2322 # given argument is not a variable, try as a filename
2323 filename = make_filename(args)
2323 filename = make_filename(args)
2324 if filename is None:
2324 if filename is None:
2325 warn("Argument given (%s) can't be found as a variable "
2325 warn("Argument given (%s) can't be found as a variable "
2326 "or as a filename." % args)
2326 "or as a filename." % args)
2327 return
2327 return
2328
2328
2329 data = ''
2329 data = ''
2330 use_temp = 0
2330 use_temp = 0
2331 except DataIsObject:
2331 except DataIsObject:
2332
2332
2333 # macros have a special edit function
2333 # macros have a special edit function
2334 if isinstance(data,Macro):
2334 if isinstance(data,Macro):
2335 self._edit_macro(args,data)
2335 self._edit_macro(args,data)
2336 return
2336 return
2337
2337
2338 # For objects, try to edit the file where they are defined
2338 # For objects, try to edit the file where they are defined
2339 try:
2339 try:
2340 filename = inspect.getabsfile(data)
2340 filename = inspect.getabsfile(data)
2341 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2341 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2342 # class created by %edit? Try to find source
2342 # class created by %edit? Try to find source
2343 # by looking for method definitions instead, the
2343 # by looking for method definitions instead, the
2344 # __module__ in those classes is FakeModule.
2344 # __module__ in those classes is FakeModule.
2345 attrs = [getattr(data, aname) for aname in dir(data)]
2345 attrs = [getattr(data, aname) for aname in dir(data)]
2346 for attr in attrs:
2346 for attr in attrs:
2347 if not inspect.ismethod(attr):
2347 if not inspect.ismethod(attr):
2348 continue
2348 continue
2349 filename = inspect.getabsfile(attr)
2349 filename = inspect.getabsfile(attr)
2350 if filename and 'fakemodule' not in filename.lower():
2350 if filename and 'fakemodule' not in filename.lower():
2351 # change the attribute to be the edit target instead
2351 # change the attribute to be the edit target instead
2352 data = attr
2352 data = attr
2353 break
2353 break
2354
2354
2355 datafile = 1
2355 datafile = 1
2356 except TypeError:
2356 except TypeError:
2357 filename = make_filename(args)
2357 filename = make_filename(args)
2358 datafile = 1
2358 datafile = 1
2359 warn('Could not find file where `%s` is defined.\n'
2359 warn('Could not find file where `%s` is defined.\n'
2360 'Opening a file named `%s`' % (args,filename))
2360 'Opening a file named `%s`' % (args,filename))
2361 # Now, make sure we can actually read the source (if it was in
2361 # Now, make sure we can actually read the source (if it was in
2362 # a temp file it's gone by now).
2362 # a temp file it's gone by now).
2363 if datafile:
2363 if datafile:
2364 try:
2364 try:
2365 if lineno is None:
2365 if lineno is None:
2366 lineno = inspect.getsourcelines(data)[1]
2366 lineno = inspect.getsourcelines(data)[1]
2367 except IOError:
2367 except IOError:
2368 filename = make_filename(args)
2368 filename = make_filename(args)
2369 if filename is None:
2369 if filename is None:
2370 warn('The file `%s` where `%s` was defined cannot '
2370 warn('The file `%s` where `%s` was defined cannot '
2371 'be read.' % (filename,data))
2371 'be read.' % (filename,data))
2372 return
2372 return
2373 use_temp = 0
2373 use_temp = 0
2374 else:
2374 else:
2375 data = ''
2375 data = ''
2376
2376
2377 if use_temp:
2377 if use_temp:
2378 filename = self.shell.mktempfile(data)
2378 filename = self.shell.mktempfile(data)
2379 print 'IPython will make a temporary file named:',filename
2379 print 'IPython will make a temporary file named:',filename
2380
2380
2381 # do actual editing here
2381 # do actual editing here
2382 print 'Editing...',
2382 print 'Editing...',
2383 sys.stdout.flush()
2383 sys.stdout.flush()
2384 try:
2384 try:
2385 self.shell.hooks.editor(filename,lineno)
2385 self.shell.hooks.editor(filename,lineno)
2386 except TryNext:
2386 except TryNext:
2387 warn('Could not open editor')
2387 warn('Could not open editor')
2388 return
2388 return
2389
2389
2390 # XXX TODO: should this be generalized for all string vars?
2390 # XXX TODO: should this be generalized for all string vars?
2391 # For now, this is special-cased to blocks created by cpaste
2391 # For now, this is special-cased to blocks created by cpaste
2392 if args.strip() == 'pasted_block':
2392 if args.strip() == 'pasted_block':
2393 self.shell.user_ns['pasted_block'] = file_read(filename)
2393 self.shell.user_ns['pasted_block'] = file_read(filename)
2394
2394
2395 if opts.has_key('x'): # -x prevents actual execution
2395 if opts.has_key('x'): # -x prevents actual execution
2396 print
2396 print
2397 else:
2397 else:
2398 print 'done. Executing edited code...'
2398 print 'done. Executing edited code...'
2399 if opts_r:
2399 if opts_r:
2400 self.shell.runlines(file_read(filename))
2400 self.shell.runlines(file_read(filename))
2401 else:
2401 else:
2402 self.shell.safe_execfile(filename,self.shell.user_ns,
2402 self.shell.safe_execfile(filename,self.shell.user_ns,
2403 self.shell.user_ns)
2403 self.shell.user_ns)
2404
2404
2405
2405
2406 if use_temp:
2406 if use_temp:
2407 try:
2407 try:
2408 return open(filename).read()
2408 return open(filename).read()
2409 except IOError,msg:
2409 except IOError,msg:
2410 if msg.filename == filename:
2410 if msg.filename == filename:
2411 warn('File not found. Did you forget to save?')
2411 warn('File not found. Did you forget to save?')
2412 return
2412 return
2413 else:
2413 else:
2414 self.shell.showtraceback()
2414 self.shell.showtraceback()
2415
2415
2416 def magic_xmode(self,parameter_s = ''):
2416 def magic_xmode(self,parameter_s = ''):
2417 """Switch modes for the exception handlers.
2417 """Switch modes for the exception handlers.
2418
2418
2419 Valid modes: Plain, Context and Verbose.
2419 Valid modes: Plain, Context and Verbose.
2420
2420
2421 If called without arguments, acts as a toggle."""
2421 If called without arguments, acts as a toggle."""
2422
2422
2423 def xmode_switch_err(name):
2423 def xmode_switch_err(name):
2424 warn('Error changing %s exception modes.\n%s' %
2424 warn('Error changing %s exception modes.\n%s' %
2425 (name,sys.exc_info()[1]))
2425 (name,sys.exc_info()[1]))
2426
2426
2427 shell = self.shell
2427 shell = self.shell
2428 new_mode = parameter_s.strip().capitalize()
2428 new_mode = parameter_s.strip().capitalize()
2429 try:
2429 try:
2430 shell.InteractiveTB.set_mode(mode=new_mode)
2430 shell.InteractiveTB.set_mode(mode=new_mode)
2431 print 'Exception reporting mode:',shell.InteractiveTB.mode
2431 print 'Exception reporting mode:',shell.InteractiveTB.mode
2432 except:
2432 except:
2433 xmode_switch_err('user')
2433 xmode_switch_err('user')
2434
2434
2435 # threaded shells use a special handler in sys.excepthook
2435 # threaded shells use a special handler in sys.excepthook
2436 if shell.isthreaded:
2436 if shell.isthreaded:
2437 try:
2437 try:
2438 shell.sys_excepthook.set_mode(mode=new_mode)
2438 shell.sys_excepthook.set_mode(mode=new_mode)
2439 except:
2439 except:
2440 xmode_switch_err('threaded')
2440 xmode_switch_err('threaded')
2441
2441
2442 def magic_colors(self,parameter_s = ''):
2442 def magic_colors(self,parameter_s = ''):
2443 """Switch color scheme for prompts, info system and exception handlers.
2443 """Switch color scheme for prompts, info system and exception handlers.
2444
2444
2445 Currently implemented schemes: NoColor, Linux, LightBG.
2445 Currently implemented schemes: NoColor, Linux, LightBG.
2446
2446
2447 Color scheme names are not case-sensitive."""
2447 Color scheme names are not case-sensitive."""
2448
2448
2449 def color_switch_err(name):
2449 def color_switch_err(name):
2450 warn('Error changing %s color schemes.\n%s' %
2450 warn('Error changing %s color schemes.\n%s' %
2451 (name,sys.exc_info()[1]))
2451 (name,sys.exc_info()[1]))
2452
2452
2453
2453
2454 new_scheme = parameter_s.strip()
2454 new_scheme = parameter_s.strip()
2455 if not new_scheme:
2455 if not new_scheme:
2456 raise UsageError(
2456 raise UsageError(
2457 "%colors: you must specify a color scheme. See '%colors?'")
2457 "%colors: you must specify a color scheme. See '%colors?'")
2458 return
2458 return
2459 # local shortcut
2459 # local shortcut
2460 shell = self.shell
2460 shell = self.shell
2461
2461
2462 import IPython.utils.rlineimpl as readline
2462 import IPython.utils.rlineimpl as readline
2463
2463
2464 if not readline.have_readline and sys.platform == "win32":
2464 if not readline.have_readline and sys.platform == "win32":
2465 msg = """\
2465 msg = """\
2466 Proper color support under MS Windows requires the pyreadline library.
2466 Proper color support under MS Windows requires the pyreadline library.
2467 You can find it at:
2467 You can find it at:
2468 http://ipython.scipy.org/moin/PyReadline/Intro
2468 http://ipython.scipy.org/moin/PyReadline/Intro
2469 Gary's readline needs the ctypes module, from:
2469 Gary's readline needs the ctypes module, from:
2470 http://starship.python.net/crew/theller/ctypes
2470 http://starship.python.net/crew/theller/ctypes
2471 (Note that ctypes is already part of Python versions 2.5 and newer).
2471 (Note that ctypes is already part of Python versions 2.5 and newer).
2472
2472
2473 Defaulting color scheme to 'NoColor'"""
2473 Defaulting color scheme to 'NoColor'"""
2474 new_scheme = 'NoColor'
2474 new_scheme = 'NoColor'
2475 warn(msg)
2475 warn(msg)
2476
2476
2477 # readline option is 0
2477 # readline option is 0
2478 if not shell.has_readline:
2478 if not shell.has_readline:
2479 new_scheme = 'NoColor'
2479 new_scheme = 'NoColor'
2480
2480
2481 # Set prompt colors
2481 # Set prompt colors
2482 try:
2482 try:
2483 shell.outputcache.set_colors(new_scheme)
2483 shell.outputcache.set_colors(new_scheme)
2484 except:
2484 except:
2485 color_switch_err('prompt')
2485 color_switch_err('prompt')
2486 else:
2486 else:
2487 shell.colors = \
2487 shell.colors = \
2488 shell.outputcache.color_table.active_scheme_name
2488 shell.outputcache.color_table.active_scheme_name
2489 # Set exception colors
2489 # Set exception colors
2490 try:
2490 try:
2491 shell.InteractiveTB.set_colors(scheme = new_scheme)
2491 shell.InteractiveTB.set_colors(scheme = new_scheme)
2492 shell.SyntaxTB.set_colors(scheme = new_scheme)
2492 shell.SyntaxTB.set_colors(scheme = new_scheme)
2493 except:
2493 except:
2494 color_switch_err('exception')
2494 color_switch_err('exception')
2495
2495
2496 # threaded shells use a verbose traceback in sys.excepthook
2496 # threaded shells use a verbose traceback in sys.excepthook
2497 if shell.isthreaded:
2497 if shell.isthreaded:
2498 try:
2498 try:
2499 shell.sys_excepthook.set_colors(scheme=new_scheme)
2499 shell.sys_excepthook.set_colors(scheme=new_scheme)
2500 except:
2500 except:
2501 color_switch_err('system exception handler')
2501 color_switch_err('system exception handler')
2502
2502
2503 # Set info (for 'object?') colors
2503 # Set info (for 'object?') colors
2504 if shell.color_info:
2504 if shell.color_info:
2505 try:
2505 try:
2506 shell.inspector.set_active_scheme(new_scheme)
2506 shell.inspector.set_active_scheme(new_scheme)
2507 except:
2507 except:
2508 color_switch_err('object inspector')
2508 color_switch_err('object inspector')
2509 else:
2509 else:
2510 shell.inspector.set_active_scheme('NoColor')
2510 shell.inspector.set_active_scheme('NoColor')
2511
2511
2512 def magic_color_info(self,parameter_s = ''):
2512 def magic_color_info(self,parameter_s = ''):
2513 """Toggle color_info.
2513 """Toggle color_info.
2514
2514
2515 The color_info configuration parameter controls whether colors are
2515 The color_info configuration parameter controls whether colors are
2516 used for displaying object details (by things like %psource, %pfile or
2516 used for displaying object details (by things like %psource, %pfile or
2517 the '?' system). This function toggles this value with each call.
2517 the '?' system). This function toggles this value with each call.
2518
2518
2519 Note that unless you have a fairly recent pager (less works better
2519 Note that unless you have a fairly recent pager (less works better
2520 than more) in your system, using colored object information displays
2520 than more) in your system, using colored object information displays
2521 will not work properly. Test it and see."""
2521 will not work properly. Test it and see."""
2522
2522
2523 self.shell.color_info = not self.shell.color_info
2523 self.shell.color_info = not self.shell.color_info
2524 self.magic_colors(self.shell.colors)
2524 self.magic_colors(self.shell.colors)
2525 print 'Object introspection functions have now coloring:',
2525 print 'Object introspection functions have now coloring:',
2526 print ['OFF','ON'][int(self.shell.color_info)]
2526 print ['OFF','ON'][int(self.shell.color_info)]
2527
2527
2528 def magic_Pprint(self, parameter_s=''):
2528 def magic_Pprint(self, parameter_s=''):
2529 """Toggle pretty printing on/off."""
2529 """Toggle pretty printing on/off."""
2530
2530
2531 self.shell.pprint = 1 - self.shell.pprint
2531 self.shell.pprint = 1 - self.shell.pprint
2532 print 'Pretty printing has been turned', \
2532 print 'Pretty printing has been turned', \
2533 ['OFF','ON'][self.shell.pprint]
2533 ['OFF','ON'][self.shell.pprint]
2534
2534
2535 def magic_Exit(self, parameter_s=''):
2535 def magic_Exit(self, parameter_s=''):
2536 """Exit IPython without confirmation."""
2536 """Exit IPython without confirmation."""
2537
2537
2538 self.shell.ask_exit()
2538 self.shell.ask_exit()
2539
2539
2540 #......................................................................
2540 #......................................................................
2541 # Functions to implement unix shell-type things
2541 # Functions to implement unix shell-type things
2542
2542
2543 @testdec.skip_doctest
2543 @testdec.skip_doctest
2544 def magic_alias(self, parameter_s = ''):
2544 def magic_alias(self, parameter_s = ''):
2545 """Define an alias for a system command.
2545 """Define an alias for a system command.
2546
2546
2547 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2547 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2548
2548
2549 Then, typing 'alias_name params' will execute the system command 'cmd
2549 Then, typing 'alias_name params' will execute the system command 'cmd
2550 params' (from your underlying operating system).
2550 params' (from your underlying operating system).
2551
2551
2552 Aliases have lower precedence than magic functions and Python normal
2552 Aliases have lower precedence than magic functions and Python normal
2553 variables, so if 'foo' is both a Python variable and an alias, the
2553 variables, so if 'foo' is both a Python variable and an alias, the
2554 alias can not be executed until 'del foo' removes the Python variable.
2554 alias can not be executed until 'del foo' removes the Python variable.
2555
2555
2556 You can use the %l specifier in an alias definition to represent the
2556 You can use the %l specifier in an alias definition to represent the
2557 whole line when the alias is called. For example:
2557 whole line when the alias is called. For example:
2558
2558
2559 In [2]: alias all echo "Input in brackets: <%l>"
2559 In [2]: alias all echo "Input in brackets: <%l>"
2560 In [3]: all hello world
2560 In [3]: all hello world
2561 Input in brackets: <hello world>
2561 Input in brackets: <hello world>
2562
2562
2563 You can also define aliases with parameters using %s specifiers (one
2563 You can also define aliases with parameters using %s specifiers (one
2564 per parameter):
2564 per parameter):
2565
2565
2566 In [1]: alias parts echo first %s second %s
2566 In [1]: alias parts echo first %s second %s
2567 In [2]: %parts A B
2567 In [2]: %parts A B
2568 first A second B
2568 first A second B
2569 In [3]: %parts A
2569 In [3]: %parts A
2570 Incorrect number of arguments: 2 expected.
2570 Incorrect number of arguments: 2 expected.
2571 parts is an alias to: 'echo first %s second %s'
2571 parts is an alias to: 'echo first %s second %s'
2572
2572
2573 Note that %l and %s are mutually exclusive. You can only use one or
2573 Note that %l and %s are mutually exclusive. You can only use one or
2574 the other in your aliases.
2574 the other in your aliases.
2575
2575
2576 Aliases expand Python variables just like system calls using ! or !!
2576 Aliases expand Python variables just like system calls using ! or !!
2577 do: all expressions prefixed with '$' get expanded. For details of
2577 do: all expressions prefixed with '$' get expanded. For details of
2578 the semantic rules, see PEP-215:
2578 the semantic rules, see PEP-215:
2579 http://www.python.org/peps/pep-0215.html. This is the library used by
2579 http://www.python.org/peps/pep-0215.html. This is the library used by
2580 IPython for variable expansion. If you want to access a true shell
2580 IPython for variable expansion. If you want to access a true shell
2581 variable, an extra $ is necessary to prevent its expansion by IPython:
2581 variable, an extra $ is necessary to prevent its expansion by IPython:
2582
2582
2583 In [6]: alias show echo
2583 In [6]: alias show echo
2584 In [7]: PATH='A Python string'
2584 In [7]: PATH='A Python string'
2585 In [8]: show $PATH
2585 In [8]: show $PATH
2586 A Python string
2586 A Python string
2587 In [9]: show $$PATH
2587 In [9]: show $$PATH
2588 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2588 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2589
2589
2590 You can use the alias facility to acess all of $PATH. See the %rehash
2590 You can use the alias facility to acess all of $PATH. See the %rehash
2591 and %rehashx functions, which automatically create aliases for the
2591 and %rehashx functions, which automatically create aliases for the
2592 contents of your $PATH.
2592 contents of your $PATH.
2593
2593
2594 If called with no parameters, %alias prints the current alias table."""
2594 If called with no parameters, %alias prints the current alias table."""
2595
2595
2596 par = parameter_s.strip()
2596 par = parameter_s.strip()
2597 if not par:
2597 if not par:
2598 stored = self.db.get('stored_aliases', {} )
2598 stored = self.db.get('stored_aliases', {} )
2599 aliases = sorted(self.shell.alias_manager.aliases)
2599 aliases = sorted(self.shell.alias_manager.aliases)
2600 # for k, v in stored:
2600 # for k, v in stored:
2601 # atab.append(k, v[0])
2601 # atab.append(k, v[0])
2602
2602
2603 print "Total number of aliases:", len(aliases)
2603 print "Total number of aliases:", len(aliases)
2604 return aliases
2604 return aliases
2605
2605
2606 # Now try to define a new one
2606 # Now try to define a new one
2607 try:
2607 try:
2608 alias,cmd = par.split(None, 1)
2608 alias,cmd = par.split(None, 1)
2609 except:
2609 except:
2610 print oinspect.getdoc(self.magic_alias)
2610 print oinspect.getdoc(self.magic_alias)
2611 else:
2611 else:
2612 self.shell.alias_manager.soft_define_alias(alias, cmd)
2612 self.shell.alias_manager.soft_define_alias(alias, cmd)
2613 # end magic_alias
2613 # end magic_alias
2614
2614
2615 def magic_unalias(self, parameter_s = ''):
2615 def magic_unalias(self, parameter_s = ''):
2616 """Remove an alias"""
2616 """Remove an alias"""
2617
2617
2618 aname = parameter_s.strip()
2618 aname = parameter_s.strip()
2619 self.shell.alias_manager.undefine_alias(aname)
2619 self.shell.alias_manager.undefine_alias(aname)
2620 stored = self.db.get('stored_aliases', {} )
2620 stored = self.db.get('stored_aliases', {} )
2621 if aname in stored:
2621 if aname in stored:
2622 print "Removing %stored alias",aname
2622 print "Removing %stored alias",aname
2623 del stored[aname]
2623 del stored[aname]
2624 self.db['stored_aliases'] = stored
2624 self.db['stored_aliases'] = stored
2625
2625
2626
2626
2627 def magic_rehashx(self, parameter_s = ''):
2627 def magic_rehashx(self, parameter_s = ''):
2628 """Update the alias table with all executable files in $PATH.
2628 """Update the alias table with all executable files in $PATH.
2629
2629
2630 This version explicitly checks that every entry in $PATH is a file
2630 This version explicitly checks that every entry in $PATH is a file
2631 with execute access (os.X_OK), so it is much slower than %rehash.
2631 with execute access (os.X_OK), so it is much slower than %rehash.
2632
2632
2633 Under Windows, it checks executability as a match agains a
2633 Under Windows, it checks executability as a match agains a
2634 '|'-separated string of extensions, stored in the IPython config
2634 '|'-separated string of extensions, stored in the IPython config
2635 variable win_exec_ext. This defaults to 'exe|com|bat'.
2635 variable win_exec_ext. This defaults to 'exe|com|bat'.
2636
2636
2637 This function also resets the root module cache of module completer,
2637 This function also resets the root module cache of module completer,
2638 used on slow filesystems.
2638 used on slow filesystems.
2639 """
2639 """
2640 from IPython.core.alias import InvalidAliasError
2640 from IPython.core.alias import InvalidAliasError
2641
2641
2642 # for the benefit of module completer in ipy_completers.py
2642 # for the benefit of module completer in ipy_completers.py
2643 del self.db['rootmodules']
2643 del self.db['rootmodules']
2644
2644
2645 path = [os.path.abspath(os.path.expanduser(p)) for p in
2645 path = [os.path.abspath(os.path.expanduser(p)) for p in
2646 os.environ.get('PATH','').split(os.pathsep)]
2646 os.environ.get('PATH','').split(os.pathsep)]
2647 path = filter(os.path.isdir,path)
2647 path = filter(os.path.isdir,path)
2648
2648
2649 syscmdlist = []
2649 syscmdlist = []
2650 # Now define isexec in a cross platform manner.
2650 # Now define isexec in a cross platform manner.
2651 if os.name == 'posix':
2651 if os.name == 'posix':
2652 isexec = lambda fname:os.path.isfile(fname) and \
2652 isexec = lambda fname:os.path.isfile(fname) and \
2653 os.access(fname,os.X_OK)
2653 os.access(fname,os.X_OK)
2654 else:
2654 else:
2655 try:
2655 try:
2656 winext = os.environ['pathext'].replace(';','|').replace('.','')
2656 winext = os.environ['pathext'].replace(';','|').replace('.','')
2657 except KeyError:
2657 except KeyError:
2658 winext = 'exe|com|bat|py'
2658 winext = 'exe|com|bat|py'
2659 if 'py' not in winext:
2659 if 'py' not in winext:
2660 winext += '|py'
2660 winext += '|py'
2661 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2661 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2662 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2662 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2663 savedir = os.getcwd()
2663 savedir = os.getcwd()
2664
2664
2665 # Now walk the paths looking for executables to alias.
2665 # Now walk the paths looking for executables to alias.
2666 try:
2666 try:
2667 # write the whole loop for posix/Windows so we don't have an if in
2667 # write the whole loop for posix/Windows so we don't have an if in
2668 # the innermost part
2668 # the innermost part
2669 if os.name == 'posix':
2669 if os.name == 'posix':
2670 for pdir in path:
2670 for pdir in path:
2671 os.chdir(pdir)
2671 os.chdir(pdir)
2672 for ff in os.listdir(pdir):
2672 for ff in os.listdir(pdir):
2673 if isexec(ff):
2673 if isexec(ff):
2674 try:
2674 try:
2675 # Removes dots from the name since ipython
2675 # Removes dots from the name since ipython
2676 # will assume names with dots to be python.
2676 # will assume names with dots to be python.
2677 self.shell.alias_manager.define_alias(
2677 self.shell.alias_manager.define_alias(
2678 ff.replace('.',''), ff)
2678 ff.replace('.',''), ff)
2679 except InvalidAliasError:
2679 except InvalidAliasError:
2680 pass
2680 pass
2681 else:
2681 else:
2682 syscmdlist.append(ff)
2682 syscmdlist.append(ff)
2683 else:
2683 else:
2684 for pdir in path:
2684 for pdir in path:
2685 os.chdir(pdir)
2685 os.chdir(pdir)
2686 for ff in os.listdir(pdir):
2686 for ff in os.listdir(pdir):
2687 base, ext = os.path.splitext(ff)
2687 base, ext = os.path.splitext(ff)
2688 if isexec(ff) and base.lower() not in self.shell.no_alias:
2688 if isexec(ff) and base.lower() not in self.shell.no_alias:
2689 if ext.lower() == '.exe':
2689 if ext.lower() == '.exe':
2690 ff = base
2690 ff = base
2691 try:
2691 try:
2692 # Removes dots from the name since ipython
2692 # Removes dots from the name since ipython
2693 # will assume names with dots to be python.
2693 # will assume names with dots to be python.
2694 self.shell.alias_manager.define_alias(
2694 self.shell.alias_manager.define_alias(
2695 base.lower().replace('.',''), ff)
2695 base.lower().replace('.',''), ff)
2696 except InvalidAliasError:
2696 except InvalidAliasError:
2697 pass
2697 pass
2698 syscmdlist.append(ff)
2698 syscmdlist.append(ff)
2699 db = self.db
2699 db = self.db
2700 db['syscmdlist'] = syscmdlist
2700 db['syscmdlist'] = syscmdlist
2701 finally:
2701 finally:
2702 os.chdir(savedir)
2702 os.chdir(savedir)
2703
2703
2704 def magic_pwd(self, parameter_s = ''):
2704 def magic_pwd(self, parameter_s = ''):
2705 """Return the current working directory path."""
2705 """Return the current working directory path."""
2706 return os.getcwd()
2706 return os.getcwd()
2707
2707
2708 def magic_cd(self, parameter_s=''):
2708 def magic_cd(self, parameter_s=''):
2709 """Change the current working directory.
2709 """Change the current working directory.
2710
2710
2711 This command automatically maintains an internal list of directories
2711 This command automatically maintains an internal list of directories
2712 you visit during your IPython session, in the variable _dh. The
2712 you visit during your IPython session, in the variable _dh. The
2713 command %dhist shows this history nicely formatted. You can also
2713 command %dhist shows this history nicely formatted. You can also
2714 do 'cd -<tab>' to see directory history conveniently.
2714 do 'cd -<tab>' to see directory history conveniently.
2715
2715
2716 Usage:
2716 Usage:
2717
2717
2718 cd 'dir': changes to directory 'dir'.
2718 cd 'dir': changes to directory 'dir'.
2719
2719
2720 cd -: changes to the last visited directory.
2720 cd -: changes to the last visited directory.
2721
2721
2722 cd -<n>: changes to the n-th directory in the directory history.
2722 cd -<n>: changes to the n-th directory in the directory history.
2723
2723
2724 cd --foo: change to directory that matches 'foo' in history
2724 cd --foo: change to directory that matches 'foo' in history
2725
2725
2726 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2726 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2727 (note: cd <bookmark_name> is enough if there is no
2727 (note: cd <bookmark_name> is enough if there is no
2728 directory <bookmark_name>, but a bookmark with the name exists.)
2728 directory <bookmark_name>, but a bookmark with the name exists.)
2729 'cd -b <tab>' allows you to tab-complete bookmark names.
2729 'cd -b <tab>' allows you to tab-complete bookmark names.
2730
2730
2731 Options:
2731 Options:
2732
2732
2733 -q: quiet. Do not print the working directory after the cd command is
2733 -q: quiet. Do not print the working directory after the cd command is
2734 executed. By default IPython's cd command does print this directory,
2734 executed. By default IPython's cd command does print this directory,
2735 since the default prompts do not display path information.
2735 since the default prompts do not display path information.
2736
2736
2737 Note that !cd doesn't work for this purpose because the shell where
2737 Note that !cd doesn't work for this purpose because the shell where
2738 !command runs is immediately discarded after executing 'command'."""
2738 !command runs is immediately discarded after executing 'command'."""
2739
2739
2740 parameter_s = parameter_s.strip()
2740 parameter_s = parameter_s.strip()
2741 #bkms = self.shell.persist.get("bookmarks",{})
2741 #bkms = self.shell.persist.get("bookmarks",{})
2742
2742
2743 oldcwd = os.getcwd()
2743 oldcwd = os.getcwd()
2744 numcd = re.match(r'(-)(\d+)$',parameter_s)
2744 numcd = re.match(r'(-)(\d+)$',parameter_s)
2745 # jump in directory history by number
2745 # jump in directory history by number
2746 if numcd:
2746 if numcd:
2747 nn = int(numcd.group(2))
2747 nn = int(numcd.group(2))
2748 try:
2748 try:
2749 ps = self.shell.user_ns['_dh'][nn]
2749 ps = self.shell.user_ns['_dh'][nn]
2750 except IndexError:
2750 except IndexError:
2751 print 'The requested directory does not exist in history.'
2751 print 'The requested directory does not exist in history.'
2752 return
2752 return
2753 else:
2753 else:
2754 opts = {}
2754 opts = {}
2755 elif parameter_s.startswith('--'):
2755 elif parameter_s.startswith('--'):
2756 ps = None
2756 ps = None
2757 fallback = None
2757 fallback = None
2758 pat = parameter_s[2:]
2758 pat = parameter_s[2:]
2759 dh = self.shell.user_ns['_dh']
2759 dh = self.shell.user_ns['_dh']
2760 # first search only by basename (last component)
2760 # first search only by basename (last component)
2761 for ent in reversed(dh):
2761 for ent in reversed(dh):
2762 if pat in os.path.basename(ent) and os.path.isdir(ent):
2762 if pat in os.path.basename(ent) and os.path.isdir(ent):
2763 ps = ent
2763 ps = ent
2764 break
2764 break
2765
2765
2766 if fallback is None and pat in ent and os.path.isdir(ent):
2766 if fallback is None and pat in ent and os.path.isdir(ent):
2767 fallback = ent
2767 fallback = ent
2768
2768
2769 # if we have no last part match, pick the first full path match
2769 # if we have no last part match, pick the first full path match
2770 if ps is None:
2770 if ps is None:
2771 ps = fallback
2771 ps = fallback
2772
2772
2773 if ps is None:
2773 if ps is None:
2774 print "No matching entry in directory history"
2774 print "No matching entry in directory history"
2775 return
2775 return
2776 else:
2776 else:
2777 opts = {}
2777 opts = {}
2778
2778
2779
2779
2780 else:
2780 else:
2781 #turn all non-space-escaping backslashes to slashes,
2781 #turn all non-space-escaping backslashes to slashes,
2782 # for c:\windows\directory\names\
2782 # for c:\windows\directory\names\
2783 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2783 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2784 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2784 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2785 # jump to previous
2785 # jump to previous
2786 if ps == '-':
2786 if ps == '-':
2787 try:
2787 try:
2788 ps = self.shell.user_ns['_dh'][-2]
2788 ps = self.shell.user_ns['_dh'][-2]
2789 except IndexError:
2789 except IndexError:
2790 raise UsageError('%cd -: No previous directory to change to.')
2790 raise UsageError('%cd -: No previous directory to change to.')
2791 # jump to bookmark if needed
2791 # jump to bookmark if needed
2792 else:
2792 else:
2793 if not os.path.isdir(ps) or opts.has_key('b'):
2793 if not os.path.isdir(ps) or opts.has_key('b'):
2794 bkms = self.db.get('bookmarks', {})
2794 bkms = self.db.get('bookmarks', {})
2795
2795
2796 if bkms.has_key(ps):
2796 if bkms.has_key(ps):
2797 target = bkms[ps]
2797 target = bkms[ps]
2798 print '(bookmark:%s) -> %s' % (ps,target)
2798 print '(bookmark:%s) -> %s' % (ps,target)
2799 ps = target
2799 ps = target
2800 else:
2800 else:
2801 if opts.has_key('b'):
2801 if opts.has_key('b'):
2802 raise UsageError("Bookmark '%s' not found. "
2802 raise UsageError("Bookmark '%s' not found. "
2803 "Use '%%bookmark -l' to see your bookmarks." % ps)
2803 "Use '%%bookmark -l' to see your bookmarks." % ps)
2804
2804
2805 # at this point ps should point to the target dir
2805 # at this point ps should point to the target dir
2806 if ps:
2806 if ps:
2807 try:
2807 try:
2808 os.chdir(os.path.expanduser(ps))
2808 os.chdir(os.path.expanduser(ps))
2809 if self.shell.term_title:
2809 if self.shell.term_title:
2810 platutils.set_term_title('IPython: ' + abbrev_cwd())
2810 platutils.set_term_title('IPython: ' + abbrev_cwd())
2811 except OSError:
2811 except OSError:
2812 print sys.exc_info()[1]
2812 print sys.exc_info()[1]
2813 else:
2813 else:
2814 cwd = os.getcwd()
2814 cwd = os.getcwd()
2815 dhist = self.shell.user_ns['_dh']
2815 dhist = self.shell.user_ns['_dh']
2816 if oldcwd != cwd:
2816 if oldcwd != cwd:
2817 dhist.append(cwd)
2817 dhist.append(cwd)
2818 self.db['dhist'] = compress_dhist(dhist)[-100:]
2818 self.db['dhist'] = compress_dhist(dhist)[-100:]
2819
2819
2820 else:
2820 else:
2821 os.chdir(self.shell.home_dir)
2821 os.chdir(self.shell.home_dir)
2822 if self.shell.term_title:
2822 if self.shell.term_title:
2823 platutils.set_term_title('IPython: ' + '~')
2823 platutils.set_term_title('IPython: ' + '~')
2824 cwd = os.getcwd()
2824 cwd = os.getcwd()
2825 dhist = self.shell.user_ns['_dh']
2825 dhist = self.shell.user_ns['_dh']
2826
2826
2827 if oldcwd != cwd:
2827 if oldcwd != cwd:
2828 dhist.append(cwd)
2828 dhist.append(cwd)
2829 self.db['dhist'] = compress_dhist(dhist)[-100:]
2829 self.db['dhist'] = compress_dhist(dhist)[-100:]
2830 if not 'q' in opts and self.shell.user_ns['_dh']:
2830 if not 'q' in opts and self.shell.user_ns['_dh']:
2831 print self.shell.user_ns['_dh'][-1]
2831 print self.shell.user_ns['_dh'][-1]
2832
2832
2833
2833
2834 def magic_env(self, parameter_s=''):
2834 def magic_env(self, parameter_s=''):
2835 """List environment variables."""
2835 """List environment variables."""
2836
2836
2837 return os.environ.data
2837 return os.environ.data
2838
2838
2839 def magic_pushd(self, parameter_s=''):
2839 def magic_pushd(self, parameter_s=''):
2840 """Place the current dir on stack and change directory.
2840 """Place the current dir on stack and change directory.
2841
2841
2842 Usage:\\
2842 Usage:\\
2843 %pushd ['dirname']
2843 %pushd ['dirname']
2844 """
2844 """
2845
2845
2846 dir_s = self.shell.dir_stack
2846 dir_s = self.shell.dir_stack
2847 tgt = os.path.expanduser(parameter_s)
2847 tgt = os.path.expanduser(parameter_s)
2848 cwd = os.getcwd().replace(self.home_dir,'~')
2848 cwd = os.getcwd().replace(self.home_dir,'~')
2849 if tgt:
2849 if tgt:
2850 self.magic_cd(parameter_s)
2850 self.magic_cd(parameter_s)
2851 dir_s.insert(0,cwd)
2851 dir_s.insert(0,cwd)
2852 return self.magic_dirs()
2852 return self.magic_dirs()
2853
2853
2854 def magic_popd(self, parameter_s=''):
2854 def magic_popd(self, parameter_s=''):
2855 """Change to directory popped off the top of the stack.
2855 """Change to directory popped off the top of the stack.
2856 """
2856 """
2857 if not self.shell.dir_stack:
2857 if not self.shell.dir_stack:
2858 raise UsageError("%popd on empty stack")
2858 raise UsageError("%popd on empty stack")
2859 top = self.shell.dir_stack.pop(0)
2859 top = self.shell.dir_stack.pop(0)
2860 self.magic_cd(top)
2860 self.magic_cd(top)
2861 print "popd ->",top
2861 print "popd ->",top
2862
2862
2863 def magic_dirs(self, parameter_s=''):
2863 def magic_dirs(self, parameter_s=''):
2864 """Return the current directory stack."""
2864 """Return the current directory stack."""
2865
2865
2866 return self.shell.dir_stack
2866 return self.shell.dir_stack
2867
2867
2868 def magic_dhist(self, parameter_s=''):
2868 def magic_dhist(self, parameter_s=''):
2869 """Print your history of visited directories.
2869 """Print your history of visited directories.
2870
2870
2871 %dhist -> print full history\\
2871 %dhist -> print full history\\
2872 %dhist n -> print last n entries only\\
2872 %dhist n -> print last n entries only\\
2873 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2873 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2874
2874
2875 This history is automatically maintained by the %cd command, and
2875 This history is automatically maintained by the %cd command, and
2876 always available as the global list variable _dh. You can use %cd -<n>
2876 always available as the global list variable _dh. You can use %cd -<n>
2877 to go to directory number <n>.
2877 to go to directory number <n>.
2878
2878
2879 Note that most of time, you should view directory history by entering
2879 Note that most of time, you should view directory history by entering
2880 cd -<TAB>.
2880 cd -<TAB>.
2881
2881
2882 """
2882 """
2883
2883
2884 dh = self.shell.user_ns['_dh']
2884 dh = self.shell.user_ns['_dh']
2885 if parameter_s:
2885 if parameter_s:
2886 try:
2886 try:
2887 args = map(int,parameter_s.split())
2887 args = map(int,parameter_s.split())
2888 except:
2888 except:
2889 self.arg_err(Magic.magic_dhist)
2889 self.arg_err(Magic.magic_dhist)
2890 return
2890 return
2891 if len(args) == 1:
2891 if len(args) == 1:
2892 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2892 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2893 elif len(args) == 2:
2893 elif len(args) == 2:
2894 ini,fin = args
2894 ini,fin = args
2895 else:
2895 else:
2896 self.arg_err(Magic.magic_dhist)
2896 self.arg_err(Magic.magic_dhist)
2897 return
2897 return
2898 else:
2898 else:
2899 ini,fin = 0,len(dh)
2899 ini,fin = 0,len(dh)
2900 nlprint(dh,
2900 nlprint(dh,
2901 header = 'Directory history (kept in _dh)',
2901 header = 'Directory history (kept in _dh)',
2902 start=ini,stop=fin)
2902 start=ini,stop=fin)
2903
2903
2904 @testdec.skip_doctest
2904 @testdec.skip_doctest
2905 def magic_sc(self, parameter_s=''):
2905 def magic_sc(self, parameter_s=''):
2906 """Shell capture - execute a shell command and capture its output.
2906 """Shell capture - execute a shell command and capture its output.
2907
2907
2908 DEPRECATED. Suboptimal, retained for backwards compatibility.
2908 DEPRECATED. Suboptimal, retained for backwards compatibility.
2909
2909
2910 You should use the form 'var = !command' instead. Example:
2910 You should use the form 'var = !command' instead. Example:
2911
2911
2912 "%sc -l myfiles = ls ~" should now be written as
2912 "%sc -l myfiles = ls ~" should now be written as
2913
2913
2914 "myfiles = !ls ~"
2914 "myfiles = !ls ~"
2915
2915
2916 myfiles.s, myfiles.l and myfiles.n still apply as documented
2916 myfiles.s, myfiles.l and myfiles.n still apply as documented
2917 below.
2917 below.
2918
2918
2919 --
2919 --
2920 %sc [options] varname=command
2920 %sc [options] varname=command
2921
2921
2922 IPython will run the given command using commands.getoutput(), and
2922 IPython will run the given command using commands.getoutput(), and
2923 will then update the user's interactive namespace with a variable
2923 will then update the user's interactive namespace with a variable
2924 called varname, containing the value of the call. Your command can
2924 called varname, containing the value of the call. Your command can
2925 contain shell wildcards, pipes, etc.
2925 contain shell wildcards, pipes, etc.
2926
2926
2927 The '=' sign in the syntax is mandatory, and the variable name you
2927 The '=' sign in the syntax is mandatory, and the variable name you
2928 supply must follow Python's standard conventions for valid names.
2928 supply must follow Python's standard conventions for valid names.
2929
2929
2930 (A special format without variable name exists for internal use)
2930 (A special format without variable name exists for internal use)
2931
2931
2932 Options:
2932 Options:
2933
2933
2934 -l: list output. Split the output on newlines into a list before
2934 -l: list output. Split the output on newlines into a list before
2935 assigning it to the given variable. By default the output is stored
2935 assigning it to the given variable. By default the output is stored
2936 as a single string.
2936 as a single string.
2937
2937
2938 -v: verbose. Print the contents of the variable.
2938 -v: verbose. Print the contents of the variable.
2939
2939
2940 In most cases you should not need to split as a list, because the
2940 In most cases you should not need to split as a list, because the
2941 returned value is a special type of string which can automatically
2941 returned value is a special type of string which can automatically
2942 provide its contents either as a list (split on newlines) or as a
2942 provide its contents either as a list (split on newlines) or as a
2943 space-separated string. These are convenient, respectively, either
2943 space-separated string. These are convenient, respectively, either
2944 for sequential processing or to be passed to a shell command.
2944 for sequential processing or to be passed to a shell command.
2945
2945
2946 For example:
2946 For example:
2947
2947
2948 # all-random
2948 # all-random
2949
2949
2950 # Capture into variable a
2950 # Capture into variable a
2951 In [1]: sc a=ls *py
2951 In [1]: sc a=ls *py
2952
2952
2953 # a is a string with embedded newlines
2953 # a is a string with embedded newlines
2954 In [2]: a
2954 In [2]: a
2955 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2955 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2956
2956
2957 # which can be seen as a list:
2957 # which can be seen as a list:
2958 In [3]: a.l
2958 In [3]: a.l
2959 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2959 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2960
2960
2961 # or as a whitespace-separated string:
2961 # or as a whitespace-separated string:
2962 In [4]: a.s
2962 In [4]: a.s
2963 Out[4]: 'setup.py win32_manual_post_install.py'
2963 Out[4]: 'setup.py win32_manual_post_install.py'
2964
2964
2965 # a.s is useful to pass as a single command line:
2965 # a.s is useful to pass as a single command line:
2966 In [5]: !wc -l $a.s
2966 In [5]: !wc -l $a.s
2967 146 setup.py
2967 146 setup.py
2968 130 win32_manual_post_install.py
2968 130 win32_manual_post_install.py
2969 276 total
2969 276 total
2970
2970
2971 # while the list form is useful to loop over:
2971 # while the list form is useful to loop over:
2972 In [6]: for f in a.l:
2972 In [6]: for f in a.l:
2973 ...: !wc -l $f
2973 ...: !wc -l $f
2974 ...:
2974 ...:
2975 146 setup.py
2975 146 setup.py
2976 130 win32_manual_post_install.py
2976 130 win32_manual_post_install.py
2977
2977
2978 Similiarly, the lists returned by the -l option are also special, in
2978 Similiarly, the lists returned by the -l option are also special, in
2979 the sense that you can equally invoke the .s attribute on them to
2979 the sense that you can equally invoke the .s attribute on them to
2980 automatically get a whitespace-separated string from their contents:
2980 automatically get a whitespace-separated string from their contents:
2981
2981
2982 In [7]: sc -l b=ls *py
2982 In [7]: sc -l b=ls *py
2983
2983
2984 In [8]: b
2984 In [8]: b
2985 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2985 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2986
2986
2987 In [9]: b.s
2987 In [9]: b.s
2988 Out[9]: 'setup.py win32_manual_post_install.py'
2988 Out[9]: 'setup.py win32_manual_post_install.py'
2989
2989
2990 In summary, both the lists and strings used for ouptut capture have
2990 In summary, both the lists and strings used for ouptut capture have
2991 the following special attributes:
2991 the following special attributes:
2992
2992
2993 .l (or .list) : value as list.
2993 .l (or .list) : value as list.
2994 .n (or .nlstr): value as newline-separated string.
2994 .n (or .nlstr): value as newline-separated string.
2995 .s (or .spstr): value as space-separated string.
2995 .s (or .spstr): value as space-separated string.
2996 """
2996 """
2997
2997
2998 opts,args = self.parse_options(parameter_s,'lv')
2998 opts,args = self.parse_options(parameter_s,'lv')
2999 # Try to get a variable name and command to run
2999 # Try to get a variable name and command to run
3000 try:
3000 try:
3001 # the variable name must be obtained from the parse_options
3001 # the variable name must be obtained from the parse_options
3002 # output, which uses shlex.split to strip options out.
3002 # output, which uses shlex.split to strip options out.
3003 var,_ = args.split('=',1)
3003 var,_ = args.split('=',1)
3004 var = var.strip()
3004 var = var.strip()
3005 # But the the command has to be extracted from the original input
3005 # But the the command has to be extracted from the original input
3006 # parameter_s, not on what parse_options returns, to avoid the
3006 # parameter_s, not on what parse_options returns, to avoid the
3007 # quote stripping which shlex.split performs on it.
3007 # quote stripping which shlex.split performs on it.
3008 _,cmd = parameter_s.split('=',1)
3008 _,cmd = parameter_s.split('=',1)
3009 except ValueError:
3009 except ValueError:
3010 var,cmd = '',''
3010 var,cmd = '',''
3011 # If all looks ok, proceed
3011 # If all looks ok, proceed
3012 out,err = self.shell.getoutputerror(cmd)
3012 out,err = self.shell.getoutputerror(cmd)
3013 if err:
3013 if err:
3014 print >> Term.cerr,err
3014 print >> Term.cerr,err
3015 if opts.has_key('l'):
3015 if opts.has_key('l'):
3016 out = SList(out.split('\n'))
3016 out = SList(out.split('\n'))
3017 else:
3017 else:
3018 out = LSString(out)
3018 out = LSString(out)
3019 if opts.has_key('v'):
3019 if opts.has_key('v'):
3020 print '%s ==\n%s' % (var,pformat(out))
3020 print '%s ==\n%s' % (var,pformat(out))
3021 if var:
3021 if var:
3022 self.shell.user_ns.update({var:out})
3022 self.shell.user_ns.update({var:out})
3023 else:
3023 else:
3024 return out
3024 return out
3025
3025
3026 def magic_sx(self, parameter_s=''):
3026 def magic_sx(self, parameter_s=''):
3027 """Shell execute - run a shell command and capture its output.
3027 """Shell execute - run a shell command and capture its output.
3028
3028
3029 %sx command
3029 %sx command
3030
3030
3031 IPython will run the given command using commands.getoutput(), and
3031 IPython will run the given command using commands.getoutput(), and
3032 return the result formatted as a list (split on '\\n'). Since the
3032 return the result formatted as a list (split on '\\n'). Since the
3033 output is _returned_, it will be stored in ipython's regular output
3033 output is _returned_, it will be stored in ipython's regular output
3034 cache Out[N] and in the '_N' automatic variables.
3034 cache Out[N] and in the '_N' automatic variables.
3035
3035
3036 Notes:
3036 Notes:
3037
3037
3038 1) If an input line begins with '!!', then %sx is automatically
3038 1) If an input line begins with '!!', then %sx is automatically
3039 invoked. That is, while:
3039 invoked. That is, while:
3040 !ls
3040 !ls
3041 causes ipython to simply issue system('ls'), typing
3041 causes ipython to simply issue system('ls'), typing
3042 !!ls
3042 !!ls
3043 is a shorthand equivalent to:
3043 is a shorthand equivalent to:
3044 %sx ls
3044 %sx ls
3045
3045
3046 2) %sx differs from %sc in that %sx automatically splits into a list,
3046 2) %sx differs from %sc in that %sx automatically splits into a list,
3047 like '%sc -l'. The reason for this is to make it as easy as possible
3047 like '%sc -l'. The reason for this is to make it as easy as possible
3048 to process line-oriented shell output via further python commands.
3048 to process line-oriented shell output via further python commands.
3049 %sc is meant to provide much finer control, but requires more
3049 %sc is meant to provide much finer control, but requires more
3050 typing.
3050 typing.
3051
3051
3052 3) Just like %sc -l, this is a list with special attributes:
3052 3) Just like %sc -l, this is a list with special attributes:
3053
3053
3054 .l (or .list) : value as list.
3054 .l (or .list) : value as list.
3055 .n (or .nlstr): value as newline-separated string.
3055 .n (or .nlstr): value as newline-separated string.
3056 .s (or .spstr): value as whitespace-separated string.
3056 .s (or .spstr): value as whitespace-separated string.
3057
3057
3058 This is very useful when trying to use such lists as arguments to
3058 This is very useful when trying to use such lists as arguments to
3059 system commands."""
3059 system commands."""
3060
3060
3061 if parameter_s:
3061 if parameter_s:
3062 out,err = self.shell.getoutputerror(parameter_s)
3062 out,err = self.shell.getoutputerror(parameter_s)
3063 if err:
3063 if err:
3064 print >> Term.cerr,err
3064 print >> Term.cerr,err
3065 return SList(out.split('\n'))
3065 return SList(out.split('\n'))
3066
3066
3067 def magic_bg(self, parameter_s=''):
3067 def magic_bg(self, parameter_s=''):
3068 """Run a job in the background, in a separate thread.
3068 """Run a job in the background, in a separate thread.
3069
3069
3070 For example,
3070 For example,
3071
3071
3072 %bg myfunc(x,y,z=1)
3072 %bg myfunc(x,y,z=1)
3073
3073
3074 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3074 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3075 execution starts, a message will be printed indicating the job
3075 execution starts, a message will be printed indicating the job
3076 number. If your job number is 5, you can use
3076 number. If your job number is 5, you can use
3077
3077
3078 myvar = jobs.result(5) or myvar = jobs[5].result
3078 myvar = jobs.result(5) or myvar = jobs[5].result
3079
3079
3080 to assign this result to variable 'myvar'.
3080 to assign this result to variable 'myvar'.
3081
3081
3082 IPython has a job manager, accessible via the 'jobs' object. You can
3082 IPython has a job manager, accessible via the 'jobs' object. You can
3083 type jobs? to get more information about it, and use jobs.<TAB> to see
3083 type jobs? to get more information about it, and use jobs.<TAB> to see
3084 its attributes. All attributes not starting with an underscore are
3084 its attributes. All attributes not starting with an underscore are
3085 meant for public use.
3085 meant for public use.
3086
3086
3087 In particular, look at the jobs.new() method, which is used to create
3087 In particular, look at the jobs.new() method, which is used to create
3088 new jobs. This magic %bg function is just a convenience wrapper
3088 new jobs. This magic %bg function is just a convenience wrapper
3089 around jobs.new(), for expression-based jobs. If you want to create a
3089 around jobs.new(), for expression-based jobs. If you want to create a
3090 new job with an explicit function object and arguments, you must call
3090 new job with an explicit function object and arguments, you must call
3091 jobs.new() directly.
3091 jobs.new() directly.
3092
3092
3093 The jobs.new docstring also describes in detail several important
3093 The jobs.new docstring also describes in detail several important
3094 caveats associated with a thread-based model for background job
3094 caveats associated with a thread-based model for background job
3095 execution. Type jobs.new? for details.
3095 execution. Type jobs.new? for details.
3096
3096
3097 You can check the status of all jobs with jobs.status().
3097 You can check the status of all jobs with jobs.status().
3098
3098
3099 The jobs variable is set by IPython into the Python builtin namespace.
3099 The jobs variable is set by IPython into the Python builtin namespace.
3100 If you ever declare a variable named 'jobs', you will shadow this
3100 If you ever declare a variable named 'jobs', you will shadow this
3101 name. You can either delete your global jobs variable to regain
3101 name. You can either delete your global jobs variable to regain
3102 access to the job manager, or make a new name and assign it manually
3102 access to the job manager, or make a new name and assign it manually
3103 to the manager (stored in IPython's namespace). For example, to
3103 to the manager (stored in IPython's namespace). For example, to
3104 assign the job manager to the Jobs name, use:
3104 assign the job manager to the Jobs name, use:
3105
3105
3106 Jobs = __builtins__.jobs"""
3106 Jobs = __builtins__.jobs"""
3107
3107
3108 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3108 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3109
3109
3110 def magic_r(self, parameter_s=''):
3110 def magic_r(self, parameter_s=''):
3111 """Repeat previous input.
3111 """Repeat previous input.
3112
3112
3113 Note: Consider using the more powerfull %rep instead!
3113 Note: Consider using the more powerfull %rep instead!
3114
3114
3115 If given an argument, repeats the previous command which starts with
3115 If given an argument, repeats the previous command which starts with
3116 the same string, otherwise it just repeats the previous input.
3116 the same string, otherwise it just repeats the previous input.
3117
3117
3118 Shell escaped commands (with ! as first character) are not recognized
3118 Shell escaped commands (with ! as first character) are not recognized
3119 by this system, only pure python code and magic commands.
3119 by this system, only pure python code and magic commands.
3120 """
3120 """
3121
3121
3122 start = parameter_s.strip()
3122 start = parameter_s.strip()
3123 esc_magic = ESC_MAGIC
3123 esc_magic = ESC_MAGIC
3124 # Identify magic commands even if automagic is on (which means
3124 # Identify magic commands even if automagic is on (which means
3125 # the in-memory version is different from that typed by the user).
3125 # the in-memory version is different from that typed by the user).
3126 if self.shell.automagic:
3126 if self.shell.automagic:
3127 start_magic = esc_magic+start
3127 start_magic = esc_magic+start
3128 else:
3128 else:
3129 start_magic = start
3129 start_magic = start
3130 # Look through the input history in reverse
3130 # Look through the input history in reverse
3131 for n in range(len(self.shell.input_hist)-2,0,-1):
3131 for n in range(len(self.shell.input_hist)-2,0,-1):
3132 input = self.shell.input_hist[n]
3132 input = self.shell.input_hist[n]
3133 # skip plain 'r' lines so we don't recurse to infinity
3133 # skip plain 'r' lines so we don't recurse to infinity
3134 if input != '_ip.magic("r")\n' and \
3134 if input != '_ip.magic("r")\n' and \
3135 (input.startswith(start) or input.startswith(start_magic)):
3135 (input.startswith(start) or input.startswith(start_magic)):
3136 #print 'match',`input` # dbg
3136 #print 'match',`input` # dbg
3137 print 'Executing:',input,
3137 print 'Executing:',input,
3138 self.shell.runlines(input)
3138 self.shell.runlines(input)
3139 return
3139 return
3140 print 'No previous input matching `%s` found.' % start
3140 print 'No previous input matching `%s` found.' % start
3141
3141
3142
3142
3143 def magic_bookmark(self, parameter_s=''):
3143 def magic_bookmark(self, parameter_s=''):
3144 """Manage IPython's bookmark system.
3144 """Manage IPython's bookmark system.
3145
3145
3146 %bookmark <name> - set bookmark to current dir
3146 %bookmark <name> - set bookmark to current dir
3147 %bookmark <name> <dir> - set bookmark to <dir>
3147 %bookmark <name> <dir> - set bookmark to <dir>
3148 %bookmark -l - list all bookmarks
3148 %bookmark -l - list all bookmarks
3149 %bookmark -d <name> - remove bookmark
3149 %bookmark -d <name> - remove bookmark
3150 %bookmark -r - remove all bookmarks
3150 %bookmark -r - remove all bookmarks
3151
3151
3152 You can later on access a bookmarked folder with:
3152 You can later on access a bookmarked folder with:
3153 %cd -b <name>
3153 %cd -b <name>
3154 or simply '%cd <name>' if there is no directory called <name> AND
3154 or simply '%cd <name>' if there is no directory called <name> AND
3155 there is such a bookmark defined.
3155 there is such a bookmark defined.
3156
3156
3157 Your bookmarks persist through IPython sessions, but they are
3157 Your bookmarks persist through IPython sessions, but they are
3158 associated with each profile."""
3158 associated with each profile."""
3159
3159
3160 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3160 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3161 if len(args) > 2:
3161 if len(args) > 2:
3162 raise UsageError("%bookmark: too many arguments")
3162 raise UsageError("%bookmark: too many arguments")
3163
3163
3164 bkms = self.db.get('bookmarks',{})
3164 bkms = self.db.get('bookmarks',{})
3165
3165
3166 if opts.has_key('d'):
3166 if opts.has_key('d'):
3167 try:
3167 try:
3168 todel = args[0]
3168 todel = args[0]
3169 except IndexError:
3169 except IndexError:
3170 raise UsageError(
3170 raise UsageError(
3171 "%bookmark -d: must provide a bookmark to delete")
3171 "%bookmark -d: must provide a bookmark to delete")
3172 else:
3172 else:
3173 try:
3173 try:
3174 del bkms[todel]
3174 del bkms[todel]
3175 except KeyError:
3175 except KeyError:
3176 raise UsageError(
3176 raise UsageError(
3177 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3177 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3178
3178
3179 elif opts.has_key('r'):
3179 elif opts.has_key('r'):
3180 bkms = {}
3180 bkms = {}
3181 elif opts.has_key('l'):
3181 elif opts.has_key('l'):
3182 bks = bkms.keys()
3182 bks = bkms.keys()
3183 bks.sort()
3183 bks.sort()
3184 if bks:
3184 if bks:
3185 size = max(map(len,bks))
3185 size = max(map(len,bks))
3186 else:
3186 else:
3187 size = 0
3187 size = 0
3188 fmt = '%-'+str(size)+'s -> %s'
3188 fmt = '%-'+str(size)+'s -> %s'
3189 print 'Current bookmarks:'
3189 print 'Current bookmarks:'
3190 for bk in bks:
3190 for bk in bks:
3191 print fmt % (bk,bkms[bk])
3191 print fmt % (bk,bkms[bk])
3192 else:
3192 else:
3193 if not args:
3193 if not args:
3194 raise UsageError("%bookmark: You must specify the bookmark name")
3194 raise UsageError("%bookmark: You must specify the bookmark name")
3195 elif len(args)==1:
3195 elif len(args)==1:
3196 bkms[args[0]] = os.getcwd()
3196 bkms[args[0]] = os.getcwd()
3197 elif len(args)==2:
3197 elif len(args)==2:
3198 bkms[args[0]] = args[1]
3198 bkms[args[0]] = args[1]
3199 self.db['bookmarks'] = bkms
3199 self.db['bookmarks'] = bkms
3200
3200
3201 def magic_pycat(self, parameter_s=''):
3201 def magic_pycat(self, parameter_s=''):
3202 """Show a syntax-highlighted file through a pager.
3202 """Show a syntax-highlighted file through a pager.
3203
3203
3204 This magic is similar to the cat utility, but it will assume the file
3204 This magic is similar to the cat utility, but it will assume the file
3205 to be Python source and will show it with syntax highlighting. """
3205 to be Python source and will show it with syntax highlighting. """
3206
3206
3207 try:
3207 try:
3208 filename = get_py_filename(parameter_s)
3208 filename = get_py_filename(parameter_s)
3209 cont = file_read(filename)
3209 cont = file_read(filename)
3210 except IOError:
3210 except IOError:
3211 try:
3211 try:
3212 cont = eval(parameter_s,self.user_ns)
3212 cont = eval(parameter_s,self.user_ns)
3213 except NameError:
3213 except NameError:
3214 cont = None
3214 cont = None
3215 if cont is None:
3215 if cont is None:
3216 print "Error: no such file or variable"
3216 print "Error: no such file or variable"
3217 return
3217 return
3218
3218
3219 page(self.shell.pycolorize(cont),
3219 page(self.shell.pycolorize(cont),
3220 screen_lines=self.shell.usable_screen_length)
3220 screen_lines=self.shell.usable_screen_length)
3221
3221
3222 def _rerun_pasted(self):
3222 def _rerun_pasted(self):
3223 """ Rerun a previously pasted command.
3223 """ Rerun a previously pasted command.
3224 """
3224 """
3225 b = self.user_ns.get('pasted_block', None)
3225 b = self.user_ns.get('pasted_block', None)
3226 if b is None:
3226 if b is None:
3227 raise UsageError('No previous pasted block available')
3227 raise UsageError('No previous pasted block available')
3228 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3228 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3229 exec b in self.user_ns
3229 exec b in self.user_ns
3230
3230
3231 def _get_pasted_lines(self, sentinel):
3231 def _get_pasted_lines(self, sentinel):
3232 """ Yield pasted lines until the user enters the given sentinel value.
3232 """ Yield pasted lines until the user enters the given sentinel value.
3233 """
3233 """
3234 from IPython.core import iplib
3234 from IPython.core import iplib
3235 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3235 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3236 while True:
3236 while True:
3237 l = iplib.raw_input_original(':')
3237 l = iplib.raw_input_original(':')
3238 if l == sentinel:
3238 if l == sentinel:
3239 return
3239 return
3240 else:
3240 else:
3241 yield l
3241 yield l
3242
3242
3243 def _strip_pasted_lines_for_code(self, raw_lines):
3243 def _strip_pasted_lines_for_code(self, raw_lines):
3244 """ Strip non-code parts of a sequence of lines to return a block of
3244 """ Strip non-code parts of a sequence of lines to return a block of
3245 code.
3245 code.
3246 """
3246 """
3247 # Regular expressions that declare text we strip from the input:
3247 # Regular expressions that declare text we strip from the input:
3248 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3248 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3249 r'^\s*(\s?>)+', # Python input prompt
3249 r'^\s*(\s?>)+', # Python input prompt
3250 r'^\s*\.{3,}', # Continuation prompts
3250 r'^\s*\.{3,}', # Continuation prompts
3251 r'^\++',
3251 r'^\++',
3252 ]
3252 ]
3253
3253
3254 strip_from_start = map(re.compile,strip_re)
3254 strip_from_start = map(re.compile,strip_re)
3255
3255
3256 lines = []
3256 lines = []
3257 for l in raw_lines:
3257 for l in raw_lines:
3258 for pat in strip_from_start:
3258 for pat in strip_from_start:
3259 l = pat.sub('',l)
3259 l = pat.sub('',l)
3260 lines.append(l)
3260 lines.append(l)
3261
3261
3262 block = "\n".join(lines) + '\n'
3262 block = "\n".join(lines) + '\n'
3263 #print "block:\n",block
3263 #print "block:\n",block
3264 return block
3264 return block
3265
3265
3266 def _execute_block(self, block, par):
3266 def _execute_block(self, block, par):
3267 """ Execute a block, or store it in a variable, per the user's request.
3267 """ Execute a block, or store it in a variable, per the user's request.
3268 """
3268 """
3269 if not par:
3269 if not par:
3270 b = textwrap.dedent(block)
3270 b = textwrap.dedent(block)
3271 self.user_ns['pasted_block'] = b
3271 self.user_ns['pasted_block'] = b
3272 exec b in self.user_ns
3272 exec b in self.user_ns
3273 else:
3273 else:
3274 self.user_ns[par] = SList(block.splitlines())
3274 self.user_ns[par] = SList(block.splitlines())
3275 print "Block assigned to '%s'" % par
3275 print "Block assigned to '%s'" % par
3276
3276
3277 def magic_cpaste(self, parameter_s=''):
3277 def magic_cpaste(self, parameter_s=''):
3278 """Allows you to paste & execute a pre-formatted code block from clipboard.
3278 """Allows you to paste & execute a pre-formatted code block from clipboard.
3279
3279
3280 You must terminate the block with '--' (two minus-signs) alone on the
3280 You must terminate the block with '--' (two minus-signs) alone on the
3281 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3281 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3282 is the new sentinel for this operation)
3282 is the new sentinel for this operation)
3283
3283
3284 The block is dedented prior to execution to enable execution of method
3284 The block is dedented prior to execution to enable execution of method
3285 definitions. '>' and '+' characters at the beginning of a line are
3285 definitions. '>' and '+' characters at the beginning of a line are
3286 ignored, to allow pasting directly from e-mails, diff files and
3286 ignored, to allow pasting directly from e-mails, diff files and
3287 doctests (the '...' continuation prompt is also stripped). The
3287 doctests (the '...' continuation prompt is also stripped). The
3288 executed block is also assigned to variable named 'pasted_block' for
3288 executed block is also assigned to variable named 'pasted_block' for
3289 later editing with '%edit pasted_block'.
3289 later editing with '%edit pasted_block'.
3290
3290
3291 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3291 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3292 This assigns the pasted block to variable 'foo' as string, without
3292 This assigns the pasted block to variable 'foo' as string, without
3293 dedenting or executing it (preceding >>> and + is still stripped)
3293 dedenting or executing it (preceding >>> and + is still stripped)
3294
3294
3295 '%cpaste -r' re-executes the block previously entered by cpaste.
3295 '%cpaste -r' re-executes the block previously entered by cpaste.
3296
3296
3297 Do not be alarmed by garbled output on Windows (it's a readline bug).
3297 Do not be alarmed by garbled output on Windows (it's a readline bug).
3298 Just press enter and type -- (and press enter again) and the block
3298 Just press enter and type -- (and press enter again) and the block
3299 will be what was just pasted.
3299 will be what was just pasted.
3300
3300
3301 IPython statements (magics, shell escapes) are not supported (yet).
3301 IPython statements (magics, shell escapes) are not supported (yet).
3302
3302
3303 See also
3303 See also
3304 --------
3304 --------
3305 paste: automatically pull code from clipboard.
3305 paste: automatically pull code from clipboard.
3306 """
3306 """
3307
3307
3308 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3308 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3309 par = args.strip()
3309 par = args.strip()
3310 if opts.has_key('r'):
3310 if opts.has_key('r'):
3311 self._rerun_pasted()
3311 self._rerun_pasted()
3312 return
3312 return
3313
3313
3314 sentinel = opts.get('s','--')
3314 sentinel = opts.get('s','--')
3315
3315
3316 block = self._strip_pasted_lines_for_code(
3316 block = self._strip_pasted_lines_for_code(
3317 self._get_pasted_lines(sentinel))
3317 self._get_pasted_lines(sentinel))
3318
3318
3319 self._execute_block(block, par)
3319 self._execute_block(block, par)
3320
3320
3321 def magic_paste(self, parameter_s=''):
3321 def magic_paste(self, parameter_s=''):
3322 """Allows you to paste & execute a pre-formatted code block from clipboard.
3322 """Allows you to paste & execute a pre-formatted code block from clipboard.
3323
3323
3324 The text is pulled directly from the clipboard without user
3324 The text is pulled directly from the clipboard without user
3325 intervention and printed back on the screen before execution (unless
3325 intervention and printed back on the screen before execution (unless
3326 the -q flag is given to force quiet mode).
3326 the -q flag is given to force quiet mode).
3327
3327
3328 The block is dedented prior to execution to enable execution of method
3328 The block is dedented prior to execution to enable execution of method
3329 definitions. '>' and '+' characters at the beginning of a line are
3329 definitions. '>' and '+' characters at the beginning of a line are
3330 ignored, to allow pasting directly from e-mails, diff files and
3330 ignored, to allow pasting directly from e-mails, diff files and
3331 doctests (the '...' continuation prompt is also stripped). The
3331 doctests (the '...' continuation prompt is also stripped). The
3332 executed block is also assigned to variable named 'pasted_block' for
3332 executed block is also assigned to variable named 'pasted_block' for
3333 later editing with '%edit pasted_block'.
3333 later editing with '%edit pasted_block'.
3334
3334
3335 You can also pass a variable name as an argument, e.g. '%paste foo'.
3335 You can also pass a variable name as an argument, e.g. '%paste foo'.
3336 This assigns the pasted block to variable 'foo' as string, without
3336 This assigns the pasted block to variable 'foo' as string, without
3337 dedenting or executing it (preceding >>> and + is still stripped)
3337 dedenting or executing it (preceding >>> and + is still stripped)
3338
3338
3339 Options
3339 Options
3340 -------
3340 -------
3341
3341
3342 -r: re-executes the block previously entered by cpaste.
3342 -r: re-executes the block previously entered by cpaste.
3343
3343
3344 -q: quiet mode: do not echo the pasted text back to the terminal.
3344 -q: quiet mode: do not echo the pasted text back to the terminal.
3345
3345
3346 IPython statements (magics, shell escapes) are not supported (yet).
3346 IPython statements (magics, shell escapes) are not supported (yet).
3347
3347
3348 See also
3348 See also
3349 --------
3349 --------
3350 cpaste: manually paste code into terminal until you mark its end.
3350 cpaste: manually paste code into terminal until you mark its end.
3351 """
3351 """
3352 opts,args = self.parse_options(parameter_s,'rq',mode='string')
3352 opts,args = self.parse_options(parameter_s,'rq',mode='string')
3353 par = args.strip()
3353 par = args.strip()
3354 if opts.has_key('r'):
3354 if opts.has_key('r'):
3355 self._rerun_pasted()
3355 self._rerun_pasted()
3356 return
3356 return
3357
3357
3358 text = self.shell.hooks.clipboard_get()
3358 text = self.shell.hooks.clipboard_get()
3359 block = self._strip_pasted_lines_for_code(text.splitlines())
3359 block = self._strip_pasted_lines_for_code(text.splitlines())
3360
3360
3361 # By default, echo back to terminal unless quiet mode is requested
3361 # By default, echo back to terminal unless quiet mode is requested
3362 if not opts.has_key('q'):
3362 if not opts.has_key('q'):
3363 write = self.shell.write
3363 write = self.shell.write
3364 write(self.shell.pycolorize(block))
3364 write(self.shell.pycolorize(block))
3365 if not block.endswith('\n'):
3365 if not block.endswith('\n'):
3366 write('\n')
3366 write('\n')
3367 write("## -- End pasted text --\n")
3367 write("## -- End pasted text --\n")
3368
3368
3369 self._execute_block(block, par)
3369 self._execute_block(block, par)
3370
3370
3371 def magic_quickref(self,arg):
3371 def magic_quickref(self,arg):
3372 """ Show a quick reference sheet """
3372 """ Show a quick reference sheet """
3373 import IPython.core.usage
3373 import IPython.core.usage
3374 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3374 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3375
3375
3376 page(qr)
3376 page(qr)
3377
3377
3378 def magic_doctest_mode(self,parameter_s=''):
3378 def magic_doctest_mode(self,parameter_s=''):
3379 """Toggle doctest mode on and off.
3379 """Toggle doctest mode on and off.
3380
3380
3381 This mode allows you to toggle the prompt behavior between normal
3381 This mode allows you to toggle the prompt behavior between normal
3382 IPython prompts and ones that are as similar to the default IPython
3382 IPython prompts and ones that are as similar to the default IPython
3383 interpreter as possible.
3383 interpreter as possible.
3384
3384
3385 It also supports the pasting of code snippets that have leading '>>>'
3385 It also supports the pasting of code snippets that have leading '>>>'
3386 and '...' prompts in them. This means that you can paste doctests from
3386 and '...' prompts in them. This means that you can paste doctests from
3387 files or docstrings (even if they have leading whitespace), and the
3387 files or docstrings (even if they have leading whitespace), and the
3388 code will execute correctly. You can then use '%history -tn' to see
3388 code will execute correctly. You can then use '%history -tn' to see
3389 the translated history without line numbers; this will give you the
3389 the translated history without line numbers; this will give you the
3390 input after removal of all the leading prompts and whitespace, which
3390 input after removal of all the leading prompts and whitespace, which
3391 can be pasted back into an editor.
3391 can be pasted back into an editor.
3392
3392
3393 With these features, you can switch into this mode easily whenever you
3393 With these features, you can switch into this mode easily whenever you
3394 need to do testing and changes to doctests, without having to leave
3394 need to do testing and changes to doctests, without having to leave
3395 your existing IPython session.
3395 your existing IPython session.
3396 """
3396 """
3397
3397
3398 # XXX - Fix this to have cleaner activate/deactivate calls.
3398 # XXX - Fix this to have cleaner activate/deactivate calls.
3399 from IPython.extensions import InterpreterPasteInput as ipaste
3399 from IPython.extensions import InterpreterPasteInput as ipaste
3400 from IPython.utils.ipstruct import Struct
3400 from IPython.utils.ipstruct import Struct
3401
3401
3402 # Shorthands
3402 # Shorthands
3403 shell = self.shell
3403 shell = self.shell
3404 oc = shell.outputcache
3404 oc = shell.outputcache
3405 meta = shell.meta
3405 meta = shell.meta
3406 # dstore is a data store kept in the instance metadata bag to track any
3406 # dstore is a data store kept in the instance metadata bag to track any
3407 # changes we make, so we can undo them later.
3407 # changes we make, so we can undo them later.
3408 dstore = meta.setdefault('doctest_mode',Struct())
3408 dstore = meta.setdefault('doctest_mode',Struct())
3409 save_dstore = dstore.setdefault
3409 save_dstore = dstore.setdefault
3410
3410
3411 # save a few values we'll need to recover later
3411 # save a few values we'll need to recover later
3412 mode = save_dstore('mode',False)
3412 mode = save_dstore('mode',False)
3413 save_dstore('rc_pprint',shell.pprint)
3413 save_dstore('rc_pprint',shell.pprint)
3414 save_dstore('xmode',shell.InteractiveTB.mode)
3414 save_dstore('xmode',shell.InteractiveTB.mode)
3415 save_dstore('rc_separate_out',shell.separate_out)
3415 save_dstore('rc_separate_out',shell.separate_out)
3416 save_dstore('rc_separate_out2',shell.separate_out2)
3416 save_dstore('rc_separate_out2',shell.separate_out2)
3417 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3417 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3418 save_dstore('rc_separate_in',shell.separate_in)
3418 save_dstore('rc_separate_in',shell.separate_in)
3419
3419
3420 if mode == False:
3420 if mode == False:
3421 # turn on
3421 # turn on
3422 ipaste.activate_prefilter()
3422 ipaste.activate_prefilter()
3423
3423
3424 oc.prompt1.p_template = '>>> '
3424 oc.prompt1.p_template = '>>> '
3425 oc.prompt2.p_template = '... '
3425 oc.prompt2.p_template = '... '
3426 oc.prompt_out.p_template = ''
3426 oc.prompt_out.p_template = ''
3427
3427
3428 # Prompt separators like plain python
3428 # Prompt separators like plain python
3429 oc.input_sep = oc.prompt1.sep = ''
3429 oc.input_sep = oc.prompt1.sep = ''
3430 oc.output_sep = ''
3430 oc.output_sep = ''
3431 oc.output_sep2 = ''
3431 oc.output_sep2 = ''
3432
3432
3433 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3433 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3434 oc.prompt_out.pad_left = False
3434 oc.prompt_out.pad_left = False
3435
3435
3436 shell.pprint = False
3436 shell.pprint = False
3437
3437
3438 shell.magic_xmode('Plain')
3438 shell.magic_xmode('Plain')
3439
3439
3440 else:
3440 else:
3441 # turn off
3441 # turn off
3442 ipaste.deactivate_prefilter()
3442 ipaste.deactivate_prefilter()
3443
3443
3444 oc.prompt1.p_template = shell.prompt_in1
3444 oc.prompt1.p_template = shell.prompt_in1
3445 oc.prompt2.p_template = shell.prompt_in2
3445 oc.prompt2.p_template = shell.prompt_in2
3446 oc.prompt_out.p_template = shell.prompt_out
3446 oc.prompt_out.p_template = shell.prompt_out
3447
3447
3448 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3448 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3449
3449
3450 oc.output_sep = dstore.rc_separate_out
3450 oc.output_sep = dstore.rc_separate_out
3451 oc.output_sep2 = dstore.rc_separate_out2
3451 oc.output_sep2 = dstore.rc_separate_out2
3452
3452
3453 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3453 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3454 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3454 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3455
3455
3456 rc.pprint = dstore.rc_pprint
3456 rc.pprint = dstore.rc_pprint
3457
3457
3458 shell.magic_xmode(dstore.xmode)
3458 shell.magic_xmode(dstore.xmode)
3459
3459
3460 # Store new mode and inform
3460 # Store new mode and inform
3461 dstore.mode = bool(1-int(mode))
3461 dstore.mode = bool(1-int(mode))
3462 print 'Doctest mode is:',
3462 print 'Doctest mode is:',
3463 print ['OFF','ON'][dstore.mode]
3463 print ['OFF','ON'][dstore.mode]
3464
3464
3465 def magic_gui(self, parameter_s=''):
3465 def magic_gui(self, parameter_s=''):
3466 """Enable or disable IPython GUI event loop integration.
3466 """Enable or disable IPython GUI event loop integration.
3467
3467
3468 %gui [-a] [GUINAME]
3468 %gui [-a] [GUINAME]
3469
3469
3470 This magic replaces IPython's threaded shells that were activated
3470 This magic replaces IPython's threaded shells that were activated
3471 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3471 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3472 can now be enabled, disabled and swtiched at runtime and keyboard
3472 can now be enabled, disabled and swtiched at runtime and keyboard
3473 interrupts should work without any problems. The following toolkits
3473 interrupts should work without any problems. The following toolkits
3474 are supported: wxPython, PyQt4, PyGTK, and Tk::
3474 are supported: wxPython, PyQt4, PyGTK, and Tk::
3475
3475
3476 %gui wx # enable wxPython event loop integration
3476 %gui wx # enable wxPython event loop integration
3477 %gui qt4|qt # enable PyQt4 event loop integration
3477 %gui qt4|qt # enable PyQt4 event loop integration
3478 %gui gtk # enable PyGTK event loop integration
3478 %gui gtk # enable PyGTK event loop integration
3479 %gui tk # enable Tk event loop integration
3479 %gui tk # enable Tk event loop integration
3480 %gui # disable all event loop integration
3480 %gui # disable all event loop integration
3481
3481
3482 WARNING: after any of these has been called you can simply create
3482 WARNING: after any of these has been called you can simply create
3483 an application object, but DO NOT start the event loop yourself, as
3483 an application object, but DO NOT start the event loop yourself, as
3484 we have already handled that.
3484 we have already handled that.
3485
3485
3486 If you want us to create an appropriate application object add the
3486 If you want us to create an appropriate application object add the
3487 "-a" flag to your command::
3487 "-a" flag to your command::
3488
3488
3489 %gui -a wx
3489 %gui -a wx
3490
3490
3491 This is highly recommended for most users.
3491 This is highly recommended for most users.
3492 """
3492 """
3493 opts, arg = self.parse_options(parameter_s,'a')
3493 opts, arg = self.parse_options(parameter_s,'a')
3494 if arg=='': arg = None
3494 if arg=='': arg = None
3495 return enable_gui(arg, 'a' in opts)
3495 return enable_gui(arg, 'a' in opts)
3496
3496
3497 def magic_load_ext(self, module_str):
3497 def magic_load_ext(self, module_str):
3498 """Load an IPython extension by its module name."""
3498 """Load an IPython extension by its module name."""
3499 self.load_extension(module_str)
3499 return self.load_extension(module_str)
3500
3500
3501 def magic_unload_ext(self, module_str):
3501 def magic_unload_ext(self, module_str):
3502 """Unload an IPython extension by its module name."""
3502 """Unload an IPython extension by its module name."""
3503 self.unload_extension(module_str)
3503 self.unload_extension(module_str)
3504
3504
3505 def magic_reload_ext(self, module_str):
3505 def magic_reload_ext(self, module_str):
3506 """Reload an IPython extension by its module name."""
3506 """Reload an IPython extension by its module name."""
3507 self.reload_extension(module_str)
3507 self.reload_extension(module_str)
3508
3508
3509 @testdec.skip_doctest
3509 @testdec.skip_doctest
3510 def magic_install_profiles(self, s):
3510 def magic_install_profiles(self, s):
3511 """Install the default IPython profiles into the .ipython dir.
3511 """Install the default IPython profiles into the .ipython dir.
3512
3512
3513 If the default profiles have already been installed, they will not
3513 If the default profiles have already been installed, they will not
3514 be overwritten. You can force overwriting them by using the ``-o``
3514 be overwritten. You can force overwriting them by using the ``-o``
3515 option::
3515 option::
3516
3516
3517 In [1]: %install_profiles -o
3517 In [1]: %install_profiles -o
3518 """
3518 """
3519 if '-o' in s:
3519 if '-o' in s:
3520 overwrite = True
3520 overwrite = True
3521 else:
3521 else:
3522 overwrite = False
3522 overwrite = False
3523 from IPython.config import profile
3523 from IPython.config import profile
3524 profile_dir = os.path.split(profile.__file__)[0]
3524 profile_dir = os.path.split(profile.__file__)[0]
3525 ipython_dir = self.ipython_dir
3525 ipython_dir = self.ipython_dir
3526 files = os.listdir(profile_dir)
3526 files = os.listdir(profile_dir)
3527
3527
3528 to_install = []
3528 to_install = []
3529 for f in files:
3529 for f in files:
3530 if f.startswith('ipython_config'):
3530 if f.startswith('ipython_config'):
3531 src = os.path.join(profile_dir, f)
3531 src = os.path.join(profile_dir, f)
3532 dst = os.path.join(ipython_dir, f)
3532 dst = os.path.join(ipython_dir, f)
3533 if (not os.path.isfile(dst)) or overwrite:
3533 if (not os.path.isfile(dst)) or overwrite:
3534 to_install.append((f, src, dst))
3534 to_install.append((f, src, dst))
3535 if len(to_install)>0:
3535 if len(to_install)>0:
3536 print "Installing profiles to: ", ipython_dir
3536 print "Installing profiles to: ", ipython_dir
3537 for (f, src, dst) in to_install:
3537 for (f, src, dst) in to_install:
3538 shutil.copy(src, dst)
3538 shutil.copy(src, dst)
3539 print " %s" % f
3539 print " %s" % f
3540
3540
3541 def magic_install_default_config(self, s):
3541 def magic_install_default_config(self, s):
3542 """Install IPython's default config file into the .ipython dir.
3542 """Install IPython's default config file into the .ipython dir.
3543
3543
3544 If the default config file (:file:`ipython_config.py`) is already
3544 If the default config file (:file:`ipython_config.py`) is already
3545 installed, it will not be overwritten. You can force overwriting
3545 installed, it will not be overwritten. You can force overwriting
3546 by using the ``-o`` option::
3546 by using the ``-o`` option::
3547
3547
3548 In [1]: %install_default_config
3548 In [1]: %install_default_config
3549 """
3549 """
3550 if '-o' in s:
3550 if '-o' in s:
3551 overwrite = True
3551 overwrite = True
3552 else:
3552 else:
3553 overwrite = False
3553 overwrite = False
3554 from IPython.config import default
3554 from IPython.config import default
3555 config_dir = os.path.split(default.__file__)[0]
3555 config_dir = os.path.split(default.__file__)[0]
3556 ipython_dir = self.ipython_dir
3556 ipython_dir = self.ipython_dir
3557 default_config_file_name = 'ipython_config.py'
3557 default_config_file_name = 'ipython_config.py'
3558 src = os.path.join(config_dir, default_config_file_name)
3558 src = os.path.join(config_dir, default_config_file_name)
3559 dst = os.path.join(ipython_dir, default_config_file_name)
3559 dst = os.path.join(ipython_dir, default_config_file_name)
3560 if (not os.path.isfile(dst)) or overwrite:
3560 if (not os.path.isfile(dst)) or overwrite:
3561 shutil.copy(src, dst)
3561 shutil.copy(src, dst)
3562 print "Installing default config file: %s" % dst
3562 print "Installing default config file: %s" % dst
3563
3563
3564 # Pylab support: simple wrappers that activate pylab, load gui input
3564 # Pylab support: simple wrappers that activate pylab, load gui input
3565 # handling and modify slightly %run
3565 # handling and modify slightly %run
3566
3566
3567 @testdec.skip_doctest
3567 @testdec.skip_doctest
3568 def _pylab_magic_run(self, parameter_s=''):
3568 def _pylab_magic_run(self, parameter_s=''):
3569 Magic.magic_run(self, parameter_s,
3569 Magic.magic_run(self, parameter_s,
3570 runner=mpl_runner(self.shell.safe_execfile))
3570 runner=mpl_runner(self.shell.safe_execfile))
3571
3571
3572 _pylab_magic_run.__doc__ = magic_run.__doc__
3572 _pylab_magic_run.__doc__ = magic_run.__doc__
3573
3573
3574 @testdec.skip_doctest
3574 @testdec.skip_doctest
3575 def magic_pylab(self, s):
3575 def magic_pylab(self, s):
3576 """Load numpy and matplotlib to work interactively.
3576 """Load numpy and matplotlib to work interactively.
3577
3577
3578 %pylab [GUINAME]
3578 %pylab [GUINAME]
3579
3579
3580 This function lets you activate pylab (matplotlib, numpy and
3580 This function lets you activate pylab (matplotlib, numpy and
3581 interactive support) at any point during an IPython session.
3581 interactive support) at any point during an IPython session.
3582
3582
3583 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3583 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3584 pylab and mlab, as well as all names from numpy and pylab.
3584 pylab and mlab, as well as all names from numpy and pylab.
3585
3585
3586 Parameters
3586 Parameters
3587 ----------
3587 ----------
3588 guiname : optional
3588 guiname : optional
3589 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk' or
3589 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk' or
3590 'tk'). If given, the corresponding Matplotlib backend is used,
3590 'tk'). If given, the corresponding Matplotlib backend is used,
3591 otherwise matplotlib's default (which you can override in your
3591 otherwise matplotlib's default (which you can override in your
3592 matplotlib config file) is used.
3592 matplotlib config file) is used.
3593
3593
3594 Examples
3594 Examples
3595 --------
3595 --------
3596 In this case, where the MPL default is TkAgg:
3596 In this case, where the MPL default is TkAgg:
3597 In [2]: %pylab
3597 In [2]: %pylab
3598
3598
3599 Welcome to pylab, a matplotlib-based Python environment.
3599 Welcome to pylab, a matplotlib-based Python environment.
3600 Backend in use: TkAgg
3600 Backend in use: TkAgg
3601 For more information, type 'help(pylab)'.
3601 For more information, type 'help(pylab)'.
3602
3602
3603 But you can explicitly request a different backend:
3603 But you can explicitly request a different backend:
3604 In [3]: %pylab qt
3604 In [3]: %pylab qt
3605
3605
3606 Welcome to pylab, a matplotlib-based Python environment.
3606 Welcome to pylab, a matplotlib-based Python environment.
3607 Backend in use: Qt4Agg
3607 Backend in use: Qt4Agg
3608 For more information, type 'help(pylab)'.
3608 For more information, type 'help(pylab)'.
3609 """
3609 """
3610 self.shell.enable_pylab(s)
3610 self.shell.enable_pylab(s)
3611
3611
3612 # end Magic
3612 # end Magic
@@ -1,29 +1,30 b''
1 """Simple script to be run *twice*, to check reference counting bugs.
1 """Simple script to be run *twice*, to check reference counting bugs.
2
2
3 See test_run for details."""
3 See test_run for details."""
4
4
5 import sys
5 import sys
6
6
7 # We want to ensure that while objects remain available for immediate access,
7 # We want to ensure that while objects remain available for immediate access,
8 # objects from *previous* runs of the same script get collected, to avoid
8 # objects from *previous* runs of the same script get collected, to avoid
9 # accumulating massive amounts of old references.
9 # accumulating massive amounts of old references.
10 class C(object):
10 class C(object):
11 def __init__(self,name):
11 def __init__(self,name):
12 self.name = name
12 self.name = name
13
13
14 def __del__(self):
14 def __del__(self):
15 print 'tclass.py: deleting object:',self.name
15 print 'tclass.py: deleting object:',self.name
16
16
17
17
18 try:
18 try:
19 name = sys.argv[1]
19 name = sys.argv[1]
20 except IndexError:
20 except IndexError:
21 pass
21 pass
22 else:
22 else:
23 if name.startswith('C'):
23 if name.startswith('C'):
24 c = C(name)
24 c = C(name)
25
25
26 #print >> sys.stderr, "ARGV:", sys.argv # dbg
26 #print >> sys.stderr, "ARGV:", sys.argv # dbg
27 # This print statement is NOT debugging, we're making the check on a completely
27
28 # separate process so we verify by capturing stdout.
28 # This next print statement is NOT debugging, we're making the check on a
29 # completely separate process so we verify by capturing stdout:
29 print 'ARGV 1-:', sys.argv[1:]
30 print 'ARGV 1-:', sys.argv[1:]
@@ -1,185 +1,168 b''
1 """Tests for code execution (%run and related), which is particularly tricky.
1 """Tests for code execution (%run and related), which is particularly tricky.
2
2
3 Because of how %run manages namespaces, and the fact that we are trying here to
3 Because of how %run manages namespaces, and the fact that we are trying here to
4 verify subtle object deletion and reference counting issues, the %run tests
4 verify subtle object deletion and reference counting issues, the %run tests
5 will be kept in this separate file. This makes it easier to aggregate in one
5 will be kept in this separate file. This makes it easier to aggregate in one
6 place the tricks needed to handle it; most other magics are much easier to test
6 place the tricks needed to handle it; most other magics are much easier to test
7 and we do so in a common test_magic file.
7 and we do so in a common test_magic file.
8 """
8 """
9 from __future__ import absolute_import
9 from __future__ import absolute_import
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 # stdlib
15 # stdlib
16 import os
16 import os
17 import sys
17 import sys
18 import tempfile
18 import tempfile
19
19
20 # third-party
20 # third-party
21 import nose.tools as nt
21 import nose.tools as nt
22
22
23 # our own
23 # our own
24 from IPython.utils.platutils import find_cmd
24 from IPython.utils.platutils import find_cmd
25 from IPython.utils import genutils
25 from IPython.utils import genutils
26 from IPython.testing import decorators as dec
26 from IPython.testing import decorators as dec
27 from IPython.testing import tools as tt
27 from IPython.testing import tools as tt
28
28
29 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
30 # Test functions begin
30 # Test functions begin
31 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
32
32
33 def doctest_refbug():
33 def doctest_refbug():
34 """Very nasty problem with references held by multiple runs of a script.
34 """Very nasty problem with references held by multiple runs of a script.
35 See: https://bugs.launchpad.net/ipython/+bug/269966
35 See: https://bugs.launchpad.net/ipython/+bug/269966
36
36
37 In [1]: _ip.clear_main_mod_cache()
37 In [1]: _ip.clear_main_mod_cache()
38 # random
38 # random
39
39
40 In [2]: %run refbug
40 In [2]: %run refbug
41
41
42 In [3]: call_f()
42 In [3]: call_f()
43 lowercased: hello
43 lowercased: hello
44
44
45 In [4]: %run refbug
45 In [4]: %run refbug
46
46
47 In [5]: call_f()
47 In [5]: call_f()
48 lowercased: hello
48 lowercased: hello
49 lowercased: hello
49 lowercased: hello
50 """
50 """
51
51
52
52
53 def doctest_run_builtins():
53 def doctest_run_builtins():
54 r"""Check that %run doesn't damage __builtins__.
54 r"""Check that %run doesn't damage __builtins__.
55
55
56 In [1]: import tempfile
56 In [1]: import tempfile
57
57
58 In [2]: bid1 = id(__builtins__)
58 In [2]: bid1 = id(__builtins__)
59
59
60 In [3]: fname = tempfile.mkstemp('.py')[1]
60 In [3]: fname = tempfile.mkstemp('.py')[1]
61
61
62 In [3]: f = open(fname,'w')
62 In [3]: f = open(fname,'w')
63
63
64 In [4]: f.write('pass\n')
64 In [4]: f.write('pass\n')
65
65
66 In [5]: f.flush()
66 In [5]: f.flush()
67
67
68 In [6]: t1 = type(__builtins__)
68 In [6]: t1 = type(__builtins__)
69
69
70 In [7]: %run "$fname"
70 In [7]: %run "$fname"
71
71
72 In [7]: f.close()
72 In [7]: f.close()
73
73
74 In [8]: bid2 = id(__builtins__)
74 In [8]: bid2 = id(__builtins__)
75
75
76 In [9]: t2 = type(__builtins__)
76 In [9]: t2 = type(__builtins__)
77
77
78 In [10]: t1 == t2
78 In [10]: t1 == t2
79 Out[10]: True
79 Out[10]: True
80
80
81 In [10]: bid1 == bid2
81 In [10]: bid1 == bid2
82 Out[10]: True
82 Out[10]: True
83
83
84 In [12]: try:
84 In [12]: try:
85 ....: os.unlink(fname)
85 ....: os.unlink(fname)
86 ....: except:
86 ....: except:
87 ....: pass
87 ....: pass
88 ....:
88 ....:
89 """
89 """
90
90
91 # For some tests, it will be handy to organize them in a class with a common
91 # For some tests, it will be handy to organize them in a class with a common
92 # setup that makes a temp file
92 # setup that makes a temp file
93
93
94 class TempFileMixin(object):
94 class TestMagicRunPass(tt.TempFileMixin):
95 def mktmp(self, src, ext='.py'):
96 """Make a valid python temp file."""
97 fname, f = tt.temp_pyfile(src, ext)
98 self.tmpfile = f
99 self.fname = fname
100
101 def teardown(self):
102 self.tmpfile.close()
103 try:
104 os.unlink(self.fname)
105 except:
106 # On Windows, even though we close the file, we still can't delete
107 # it. I have no clue why
108 pass
109
110
111 class TestMagicRunPass(TempFileMixin):
112
95
113 def setup(self):
96 def setup(self):
114 """Make a valid python temp file."""
97 """Make a valid python temp file."""
115 self.mktmp('pass\n')
98 self.mktmp('pass\n')
116
99
117 def run_tmpfile(self):
100 def run_tmpfile(self):
118 _ip = get_ipython()
101 _ip = get_ipython()
119 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
102 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
120 # See below and ticket https://bugs.launchpad.net/bugs/366353
103 # See below and ticket https://bugs.launchpad.net/bugs/366353
121 _ip.magic('run "%s"' % self.fname)
104 _ip.magic('run "%s"' % self.fname)
122
105
123 def test_builtins_id(self):
106 def test_builtins_id(self):
124 """Check that %run doesn't damage __builtins__ """
107 """Check that %run doesn't damage __builtins__ """
125 _ip = get_ipython()
108 _ip = get_ipython()
126 # Test that the id of __builtins__ is not modified by %run
109 # Test that the id of __builtins__ is not modified by %run
127 bid1 = id(_ip.user_ns['__builtins__'])
110 bid1 = id(_ip.user_ns['__builtins__'])
128 self.run_tmpfile()
111 self.run_tmpfile()
129 bid2 = id(_ip.user_ns['__builtins__'])
112 bid2 = id(_ip.user_ns['__builtins__'])
130 tt.assert_equals(bid1, bid2)
113 tt.assert_equals(bid1, bid2)
131
114
132 def test_builtins_type(self):
115 def test_builtins_type(self):
133 """Check that the type of __builtins__ doesn't change with %run.
116 """Check that the type of __builtins__ doesn't change with %run.
134
117
135 However, the above could pass if __builtins__ was already modified to
118 However, the above could pass if __builtins__ was already modified to
136 be a dict (it should be a module) by a previous use of %run. So we
119 be a dict (it should be a module) by a previous use of %run. So we
137 also check explicitly that it really is a module:
120 also check explicitly that it really is a module:
138 """
121 """
139 _ip = get_ipython()
122 _ip = get_ipython()
140 self.run_tmpfile()
123 self.run_tmpfile()
141 tt.assert_equals(type(_ip.user_ns['__builtins__']),type(sys))
124 tt.assert_equals(type(_ip.user_ns['__builtins__']),type(sys))
142
125
143 def test_prompts(self):
126 def test_prompts(self):
144 """Test that prompts correctly generate after %run"""
127 """Test that prompts correctly generate after %run"""
145 self.run_tmpfile()
128 self.run_tmpfile()
146 _ip = get_ipython()
129 _ip = get_ipython()
147 p2 = str(_ip.outputcache.prompt2).strip()
130 p2 = str(_ip.outputcache.prompt2).strip()
148 nt.assert_equals(p2[:3], '...')
131 nt.assert_equals(p2[:3], '...')
149
132
150
133
151 class TestMagicRunSimple(TempFileMixin):
134 class TestMagicRunSimple(tt.TempFileMixin):
152
135
153 def test_simpledef(self):
136 def test_simpledef(self):
154 """Test that simple class definitions work."""
137 """Test that simple class definitions work."""
155 src = ("class foo: pass\n"
138 src = ("class foo: pass\n"
156 "def f(): return foo()")
139 "def f(): return foo()")
157 self.mktmp(src)
140 self.mktmp(src)
158 _ip.magic('run "%s"' % self.fname)
141 _ip.magic('run "%s"' % self.fname)
159 _ip.runlines('t = isinstance(f(), foo)')
142 _ip.runlines('t = isinstance(f(), foo)')
160 nt.assert_true(_ip.user_ns['t'])
143 nt.assert_true(_ip.user_ns['t'])
161
144
162 def test_obj_del(self):
145 def test_obj_del(self):
163 """Test that object's __del__ methods are called on exit."""
146 """Test that object's __del__ methods are called on exit."""
164
147
165 # This test is known to fail on win32.
148 # This test is known to fail on win32.
166 # See ticket https://bugs.launchpad.net/bugs/366334
149 # See ticket https://bugs.launchpad.net/bugs/366334
167 src = ("class A(object):\n"
150 src = ("class A(object):\n"
168 " def __del__(self):\n"
151 " def __del__(self):\n"
169 " print 'object A deleted'\n"
152 " print 'object A deleted'\n"
170 "a = A()\n")
153 "a = A()\n")
171 self.mktmp(src)
154 self.mktmp(src)
172 tt.ipexec_validate(self.fname, 'object A deleted')
155 tt.ipexec_validate(self.fname, 'object A deleted')
173
156
174 def test_tclass(self):
157 def test_tclass(self):
175 mydir = os.path.dirname(__file__)
158 mydir = os.path.dirname(__file__)
176 tc = os.path.join(mydir, 'tclass')
159 tc = os.path.join(mydir, 'tclass')
177 src = ("%%run '%s' C-first\n"
160 src = ("%%run '%s' C-first\n"
178 "%%run '%s' C-second\n") % (tc, tc)
161 "%%run '%s' C-second\n") % (tc, tc)
179 self.mktmp(src, '.ipy')
162 self.mktmp(src, '.ipy')
180 out = """\
163 out = """\
181 ARGV 1-: ['C-first']
164 ARGV 1-: ['C-first']
182 ARGV 1-: ['C-second']
165 ARGV 1-: ['C-second']
183 tclass.py: deleting object: C-first
166 tclass.py: deleting object: C-first
184 """
167 """
185 tt.ipexec_validate(self.fname, out)
168 tt.ipexec_validate(self.fname, out)
@@ -1,205 +1,209 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 """Magic command interface for interactive parallel work."""
4 """Magic command interface for interactive parallel work."""
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2008-2009 The IPython Development Team
7 # Copyright (C) 2008-2009 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 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import new
17 import new
18
18
19 from IPython.core.component import Component
19 from IPython.core.component import Component
20 from IPython.utils.traitlets import Bool, Any
20 from IPython.utils.traitlets import Bool, Any
21 from IPython.utils.autoattr import auto_attr
21 from IPython.utils.autoattr import auto_attr
22 from IPython.testing import decorators as testdec
22
23
23 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
24 # Definitions of magic functions for use with IPython
25 # Definitions of magic functions for use with IPython
25 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
26
27
27
28
28 NO_ACTIVE_MULTIENGINE_CLIENT = """
29 NO_ACTIVE_MULTIENGINE_CLIENT = """
29 Use activate() on a MultiEngineClient object to activate it for magics.
30 Use activate() on a MultiEngineClient object to activate it for magics.
30 """
31 """
31
32
32
33
33 class ParalleMagicComponent(Component):
34 class ParalleMagicComponent(Component):
34 """A component to manage the %result, %px and %autopx magics."""
35 """A component to manage the %result, %px and %autopx magics."""
35
36
36 active_multiengine_client = Any()
37 active_multiengine_client = Any()
37 verbose = Bool(False, config=True)
38 verbose = Bool(False, config=True)
38
39
39 def __init__(self, parent, name=None, config=None):
40 def __init__(self, parent, name=None, config=None):
40 super(ParalleMagicComponent, self).__init__(parent, name=name, config=config)
41 super(ParalleMagicComponent, self).__init__(parent, name=name, config=config)
41 self._define_magics()
42 self._define_magics()
42 # A flag showing if autopx is activated or not
43 # A flag showing if autopx is activated or not
43 self.autopx = False
44 self.autopx = False
44
45
45 # Access other components like this rather than by a regular attribute.
46 # Access other components like this rather than by a regular attribute.
46 # This won't lookup the InteractiveShell object until it is used and
47 # This won't lookup the InteractiveShell object until it is used and
47 # then it is cached. This is both efficient and couples this class
48 # then it is cached. This is both efficient and couples this class
48 # more loosely to InteractiveShell.
49 # more loosely to InteractiveShell.
49 @auto_attr
50 @auto_attr
50 def shell(self):
51 def shell(self):
51 return Component.get_instances(
52 return Component.get_instances(
52 root=self.root,
53 root=self.root,
53 klass='IPython.core.iplib.InteractiveShell')[0]
54 klass='IPython.core.iplib.InteractiveShell')[0]
54
55
55 def _define_magics(self):
56 def _define_magics(self):
56 """Define the magic functions."""
57 """Define the magic functions."""
57 self.shell.define_magic('result', self.magic_result)
58 self.shell.define_magic('result', self.magic_result)
58 self.shell.define_magic('px', self.magic_px)
59 self.shell.define_magic('px', self.magic_px)
59 self.shell.define_magic('autopx', self.magic_autopx)
60 self.shell.define_magic('autopx', self.magic_autopx)
60
61
62 @testdec.skip_doctest
61 def magic_result(self, ipself, parameter_s=''):
63 def magic_result(self, ipself, parameter_s=''):
62 """Print the result of command i on all engines..
64 """Print the result of command i on all engines..
63
65
64 To use this a :class:`MultiEngineClient` instance must be created
66 To use this a :class:`MultiEngineClient` instance must be created
65 and then activated by calling its :meth:`activate` method.
67 and then activated by calling its :meth:`activate` method.
66
68
67 Then you can do the following::
69 Then you can do the following::
68
70
69 In [23]: %result
71 In [23]: %result
70 Out[23]:
72 Out[23]:
71 <Results List>
73 <Results List>
72 [0] In [6]: a = 10
74 [0] In [6]: a = 10
73 [1] In [6]: a = 10
75 [1] In [6]: a = 10
74
76
75 In [22]: %result 6
77 In [22]: %result 6
76 Out[22]:
78 Out[22]:
77 <Results List>
79 <Results List>
78 [0] In [6]: a = 10
80 [0] In [6]: a = 10
79 [1] In [6]: a = 10
81 [1] In [6]: a = 10
80 """
82 """
81 if self.active_multiengine_client is None:
83 if self.active_multiengine_client is None:
82 print NO_ACTIVE_MULTIENGINE_CLIENT
84 print NO_ACTIVE_MULTIENGINE_CLIENT
83 return
85 return
84
86
85 try:
87 try:
86 index = int(parameter_s)
88 index = int(parameter_s)
87 except:
89 except:
88 index = None
90 index = None
89 result = self.active_multiengine_client.get_result(index)
91 result = self.active_multiengine_client.get_result(index)
90 return result
92 return result
91
93
94 @testdec.skip_doctest
92 def magic_px(self, ipself, parameter_s=''):
95 def magic_px(self, ipself, parameter_s=''):
93 """Executes the given python command in parallel.
96 """Executes the given python command in parallel.
94
97
95 To use this a :class:`MultiEngineClient` instance must be created
98 To use this a :class:`MultiEngineClient` instance must be created
96 and then activated by calling its :meth:`activate` method.
99 and then activated by calling its :meth:`activate` method.
97
100
98 Then you can do the following::
101 Then you can do the following::
99
102
100 In [24]: %px a = 5
103 In [24]: %px a = 5
101 Parallel execution on engines: all
104 Parallel execution on engines: all
102 Out[24]:
105 Out[24]:
103 <Results List>
106 <Results List>
104 [0] In [7]: a = 5
107 [0] In [7]: a = 5
105 [1] In [7]: a = 5
108 [1] In [7]: a = 5
106 """
109 """
107
110
108 if self.active_multiengine_client is None:
111 if self.active_multiengine_client is None:
109 print NO_ACTIVE_MULTIENGINE_CLIENT
112 print NO_ACTIVE_MULTIENGINE_CLIENT
110 return
113 return
111 print "Parallel execution on engines: %s" % self.active_multiengine_client.targets
114 print "Parallel execution on engines: %s" % self.active_multiengine_client.targets
112 result = self.active_multiengine_client.execute(parameter_s)
115 result = self.active_multiengine_client.execute(parameter_s)
113 return result
116 return result
114
117
118 @testdec.skip_doctest
115 def magic_autopx(self, ipself, parameter_s=''):
119 def magic_autopx(self, ipself, parameter_s=''):
116 """Toggles auto parallel mode.
120 """Toggles auto parallel mode.
117
121
118 To use this a :class:`MultiEngineClient` instance must be created
122 To use this a :class:`MultiEngineClient` instance must be created
119 and then activated by calling its :meth:`activate` method. Once this
123 and then activated by calling its :meth:`activate` method. Once this
120 is called, all commands typed at the command line are send to
124 is called, all commands typed at the command line are send to
121 the engines to be executed in parallel. To control which engine
125 the engines to be executed in parallel. To control which engine
122 are used, set the ``targets`` attributed of the multiengine client
126 are used, set the ``targets`` attributed of the multiengine client
123 before entering ``%autopx`` mode.
127 before entering ``%autopx`` mode.
124
128
125 Then you can do the following::
129 Then you can do the following::
126
130
127 In [25]: %autopx
131 In [25]: %autopx
128 %autopx to enabled
132 %autopx to enabled
129
133
130 In [26]: a = 10
134 In [26]: a = 10
131 <Results List>
135 <Results List>
132 [0] In [8]: a = 10
136 [0] In [8]: a = 10
133 [1] In [8]: a = 10
137 [1] In [8]: a = 10
134
138
135
139
136 In [27]: %autopx
140 In [27]: %autopx
137 %autopx disabled
141 %autopx disabled
138 """
142 """
139 if self.autopx:
143 if self.autopx:
140 self._disable_autopx()
144 self._disable_autopx()
141 else:
145 else:
142 self._enable_autopx()
146 self._enable_autopx()
143
147
144 def _enable_autopx(self):
148 def _enable_autopx(self):
145 """Enable %autopx mode by saving the original runsource and installing
149 """Enable %autopx mode by saving the original runsource and installing
146 pxrunsource.
150 pxrunsource.
147 """
151 """
148 if self.active_multiengine_client is None:
152 if self.active_multiengine_client is None:
149 print NO_ACTIVE_MULTIENGINE_CLIENT
153 print NO_ACTIVE_MULTIENGINE_CLIENT
150 return
154 return
151
155
152 self._original_runsource = self.shell.runsource
156 self._original_runsource = self.shell.runsource
153 self.shell.runsource = new.instancemethod(
157 self.shell.runsource = new.instancemethod(
154 self.pxrunsource, self.shell, self.shell.__class__
158 self.pxrunsource, self.shell, self.shell.__class__
155 )
159 )
156 self.autopx = True
160 self.autopx = True
157 print "%autopx enabled"
161 print "%autopx enabled"
158
162
159 def _disable_autopx(self):
163 def _disable_autopx(self):
160 """Disable %autopx by restoring the original InteractiveShell.runsource."""
164 """Disable %autopx by restoring the original InteractiveShell.runsource."""
161 if self.autopx:
165 if self.autopx:
162 self.shell.runsource = self._original_runsource
166 self.shell.runsource = self._original_runsource
163 self.autopx = False
167 self.autopx = False
164 print "%autopx disabled"
168 print "%autopx disabled"
165
169
166 def pxrunsource(self, ipself, source, filename="<input>", symbol="single"):
170 def pxrunsource(self, ipself, source, filename="<input>", symbol="single"):
167 """A parallel replacement for InteractiveShell.runsource."""
171 """A parallel replacement for InteractiveShell.runsource."""
168
172
169 try:
173 try:
170 code = ipself.compile(source, filename, symbol)
174 code = ipself.compile(source, filename, symbol)
171 except (OverflowError, SyntaxError, ValueError):
175 except (OverflowError, SyntaxError, ValueError):
172 # Case 1
176 # Case 1
173 ipself.showsyntaxerror(filename)
177 ipself.showsyntaxerror(filename)
174 return None
178 return None
175
179
176 if code is None:
180 if code is None:
177 # Case 2
181 # Case 2
178 return True
182 return True
179
183
180 # Case 3
184 # Case 3
181 # Because autopx is enabled, we now call executeAll or disable autopx if
185 # Because autopx is enabled, we now call executeAll or disable autopx if
182 # %autopx or autopx has been called
186 # %autopx or autopx has been called
183 if 'get_ipython().magic("%autopx' in source or 'get_ipython().magic("autopx' in source:
187 if 'get_ipython().magic("%autopx' in source or 'get_ipython().magic("autopx' in source:
184 self._disable_autopx()
188 self._disable_autopx()
185 return False
189 return False
186 else:
190 else:
187 try:
191 try:
188 result = self.active_multiengine_client.execute(source)
192 result = self.active_multiengine_client.execute(source)
189 except:
193 except:
190 ipself.showtraceback()
194 ipself.showtraceback()
191 else:
195 else:
192 print result.__repr__()
196 print result.__repr__()
193 return False
197 return False
194
198
195
199
196 _loaded = False
200 _loaded = False
197
201
198
202
199 def load_ipython_extension(ip):
203 def load_ipython_extension(ip):
200 """Load the extension in IPython."""
204 """Load the extension in IPython."""
201 global _loaded
205 global _loaded
202 if not _loaded:
206 if not _loaded:
203 prd = ParalleMagicComponent(ip, name='parallel_magic')
207 prd = ParalleMagicComponent(ip, name='parallel_magic')
204 _loaded = True
208 _loaded = True
205
209
@@ -1,222 +1,167 b''
1 """Use pretty.py for configurable pretty-printing.
1 """Use pretty.py for configurable pretty-printing.
2
2
3 To enable this extension in your configuration
3 To enable this extension in your configuration
4 file, add the following to :file:`ipython_config.py`::
4 file, add the following to :file:`ipython_config.py`::
5
5
6 c.Global.extensions = ['IPython.extensions.pretty']
6 c.Global.extensions = ['IPython.extensions.pretty']
7 def dict_pprinter(obj, p, cycle):
7 def dict_pprinter(obj, p, cycle):
8 return p.text("<dict>")
8 return p.text("<dict>")
9 c.PrettyResultDisplay.verbose = True
9 c.PrettyResultDisplay.verbose = True
10 c.PrettyResultDisplay.defaults_for_type = [
10 c.PrettyResultDisplay.defaults_for_type = [
11 (dict, dict_pprinter)
11 (dict, dict_pprinter)
12 ]
12 ]
13 c.PrettyResultDisplay.defaults_for_type_by_name = [
13 c.PrettyResultDisplay.defaults_for_type_by_name = [
14 ('numpy', 'dtype', 'IPython.extensions.pretty.dtype_pprinter')
14 ('numpy', 'dtype', 'IPython.extensions.pretty.dtype_pprinter')
15 ]
15 ]
16
16
17 This extension can also be loaded by using the ``%load_ext`` magic::
17 This extension can also be loaded by using the ``%load_ext`` magic::
18
18
19 %load_ext IPython.extensions.pretty
19 %load_ext IPython.extensions.pretty
20
20
21 If this extension is enabled, you can always add additional pretty printers
21 If this extension is enabled, you can always add additional pretty printers
22 by doing::
22 by doing::
23
23
24 ip = get_ipython()
24 ip = get_ipython()
25 prd = ip.get_component('pretty_result_display')
25 prd = ip.get_component('pretty_result_display')
26 import numpy
26 import numpy
27 from IPython.extensions.pretty import dtype_pprinter
27 from IPython.extensions.pretty import dtype_pprinter
28 prd.for_type(numpy.dtype, dtype_pprinter)
28 prd.for_type(numpy.dtype, dtype_pprinter)
29
29
30 # If you don't want to have numpy imported until it needs to be:
30 # If you don't want to have numpy imported until it needs to be:
31 prd.for_type_by_name('numpy', 'dtype', dtype_pprinter)
31 prd.for_type_by_name('numpy', 'dtype', dtype_pprinter)
32 """
32 """
33
33
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35 # Imports
35 # Imports
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37
37
38 from IPython.core.error import TryNext
38 from IPython.core.error import TryNext
39 from IPython.external import pretty
39 from IPython.external import pretty
40 from IPython.core.component import Component
40 from IPython.core.component import Component
41 from IPython.utils.traitlets import Bool, List
41 from IPython.utils.traitlets import Bool, List
42 from IPython.utils.genutils import Term
42 from IPython.utils.genutils import Term
43 from IPython.utils.autoattr import auto_attr
43 from IPython.utils.autoattr import auto_attr
44 from IPython.utils.importstring import import_item
44 from IPython.utils.importstring import import_item
45
45
46 #-----------------------------------------------------------------------------
46 #-----------------------------------------------------------------------------
47 # Code
47 # Code
48 #-----------------------------------------------------------------------------
48 #-----------------------------------------------------------------------------
49
49
50
50
51 _loaded = False
51 _loaded = False
52
52
53
53
54 class PrettyResultDisplay(Component):
54 class PrettyResultDisplay(Component):
55 """A component for pretty printing on steroids."""
55 """A component for pretty printing on steroids."""
56
56
57 verbose = Bool(False, config=True)
57 verbose = Bool(False, config=True)
58
58
59 # A list of (type, func_name), like
59 # A list of (type, func_name), like
60 # [(dict, 'my_dict_printer')]
60 # [(dict, 'my_dict_printer')]
61 # The final argument can also be a callable
61 # The final argument can also be a callable
62 defaults_for_type = List(default_value=[], config=True)
62 defaults_for_type = List(default_value=[], config=True)
63
63
64 # A list of (module_name, type_name, func_name), like
64 # A list of (module_name, type_name, func_name), like
65 # [('numpy', 'dtype', 'IPython.extensions.pretty.dtype_pprinter')]
65 # [('numpy', 'dtype', 'IPython.extensions.pretty.dtype_pprinter')]
66 # The final argument can also be a callable
66 # The final argument can also be a callable
67 defaults_for_type_by_name = List(default_value=[], config=True)
67 defaults_for_type_by_name = List(default_value=[], config=True)
68
68
69 def __init__(self, parent, name=None, config=None):
69 def __init__(self, parent, name=None, config=None):
70 super(PrettyResultDisplay, self).__init__(parent, name=name, config=config)
70 super(PrettyResultDisplay, self).__init__(parent, name=name, config=config)
71 self._setup_defaults()
71 self._setup_defaults()
72
72
73 def _setup_defaults(self):
73 def _setup_defaults(self):
74 """Initialize the default pretty printers."""
74 """Initialize the default pretty printers."""
75 for typ, func_name in self.defaults_for_type:
75 for typ, func_name in self.defaults_for_type:
76 func = self._resolve_func_name(func_name)
76 func = self._resolve_func_name(func_name)
77 self.for_type(typ, func)
77 self.for_type(typ, func)
78 for type_module, type_name, func_name in self.defaults_for_type_by_name:
78 for type_module, type_name, func_name in self.defaults_for_type_by_name:
79 func = self._resolve_func_name(func_name)
79 func = self._resolve_func_name(func_name)
80 self.for_type_by_name(type_module, type_name, func)
80 self.for_type_by_name(type_module, type_name, func)
81
81
82 def _resolve_func_name(self, func_name):
82 def _resolve_func_name(self, func_name):
83 if callable(func_name):
83 if callable(func_name):
84 return func_name
84 return func_name
85 elif isinstance(func_name, basestring):
85 elif isinstance(func_name, basestring):
86 return import_item(func_name)
86 return import_item(func_name)
87 else:
87 else:
88 raise TypeError('func_name must be a str or callable, got: %r' % func_name)
88 raise TypeError('func_name must be a str or callable, got: %r' % func_name)
89
89
90 # Access other components like this rather than by a regular attribute.
90 # Access other components like this rather than by a regular attribute.
91 # This won't lookup the InteractiveShell object until it is used and
91 # This won't lookup the InteractiveShell object until it is used and
92 # then it is cached. This is both efficient and couples this class
92 # then it is cached. This is both efficient and couples this class
93 # more loosely to InteractiveShell.
93 # more loosely to InteractiveShell.
94 @auto_attr
94 @auto_attr
95 def shell(self):
95 def shell(self):
96 return Component.get_instances(
96 return Component.get_instances(
97 root=self.root,
97 root=self.root,
98 klass='IPython.core.iplib.InteractiveShell')[0]
98 klass='IPython.core.iplib.InteractiveShell')[0]
99
99
100 def __call__(self, otherself, arg):
100 def __call__(self, otherself, arg):
101 """Uber-pretty-printing display hook.
101 """Uber-pretty-printing display hook.
102
102
103 Called for displaying the result to the user.
103 Called for displaying the result to the user.
104 """
104 """
105
105
106 if self.shell.pprint:
106 if self.shell.pprint:
107 out = pretty.pretty(arg, verbose=self.verbose)
107 out = pretty.pretty(arg, verbose=self.verbose)
108 if '\n' in out:
108 if '\n' in out:
109 # So that multi-line strings line up with the left column of
109 # So that multi-line strings line up with the left column of
110 # the screen, instead of having the output prompt mess up
110 # the screen, instead of having the output prompt mess up
111 # their first line.
111 # their first line.
112 Term.cout.write('\n')
112 Term.cout.write('\n')
113 print >>Term.cout, out
113 print >>Term.cout, out
114 else:
114 else:
115 raise TryNext
115 raise TryNext
116
116
117 def for_type(self, typ, func):
117 def for_type(self, typ, func):
118 """Add a pretty printer for a type."""
118 """Add a pretty printer for a type."""
119 return pretty.for_type(typ, func)
119 return pretty.for_type(typ, func)
120
120
121 def for_type_by_name(self, type_module, type_name, func):
121 def for_type_by_name(self, type_module, type_name, func):
122 """Add a pretty printer for a type by its name and module name."""
122 """Add a pretty printer for a type by its name and module name."""
123 return pretty.for_type_by_name(type_module, type_name, func)
123 return pretty.for_type_by_name(type_module, type_name, func)
124
124
125
125
126 #-----------------------------------------------------------------------------
126 #-----------------------------------------------------------------------------
127 # Initialization code for the extension
127 # Initialization code for the extension
128 #-----------------------------------------------------------------------------
128 #-----------------------------------------------------------------------------
129
129
130
130
131 def load_ipython_extension(ip):
131 def load_ipython_extension(ip=None):
132 """Load the extension in IPython as a hook."""
132 """Load the extension in IPython as a hook."""
133 if ip is None: ip = get_ipython()
133 global _loaded
134 global _loaded
134 if not _loaded:
135 if not _loaded:
135 prd = PrettyResultDisplay(ip, name='pretty_result_display')
136 prd = PrettyResultDisplay(ip, name='pretty_result_display')
136 ip.set_hook('result_display', prd, priority=99)
137 ip.set_hook('result_display', prd, priority=99)
137 _loaded = True
138 _loaded = True
139 return prd
138
140
139 def unload_ipython_extension(ip):
141 def unload_ipython_extension(ip):
140 """Unload the extension."""
142 """Unload the extension."""
141 # The hook system does not have a way to remove a hook so this is a pass
143 # The hook system does not have a way to remove a hook so this is a pass
142 pass
144 pass
143
145
144
146
145 #-----------------------------------------------------------------------------
147 #-----------------------------------------------------------------------------
146 # Example pretty printers
148 # Example pretty printers
147 #-----------------------------------------------------------------------------
149 #-----------------------------------------------------------------------------
148
150
149
151
150 def dtype_pprinter(obj, p, cycle):
152 def dtype_pprinter(obj, p, cycle):
151 """ A pretty-printer for numpy dtype objects.
153 """ A pretty-printer for numpy dtype objects.
152 """
154 """
153 if cycle:
155 if cycle:
154 return p.text('dtype(...)')
156 return p.text('dtype(...)')
155 if hasattr(obj, 'fields'):
157 if hasattr(obj, 'fields'):
156 if obj.fields is None:
158 if obj.fields is None:
157 p.text(repr(obj))
159 p.text(repr(obj))
158 else:
160 else:
159 p.begin_group(7, 'dtype([')
161 p.begin_group(7, 'dtype([')
160 for i, field in enumerate(obj.descr):
162 for i, field in enumerate(obj.descr):
161 if i > 0:
163 if i > 0:
162 p.text(',')
164 p.text(',')
163 p.breakable()
165 p.breakable()
164 p.pretty(field)
166 p.pretty(field)
165 p.end_group(7, '])')
167 p.end_group(7, '])')
166
167
168 #-----------------------------------------------------------------------------
169 # Tests
170 #-----------------------------------------------------------------------------
171
172
173 def test_pretty():
174 """
175 In [1]: from IPython.extensions import ipy_pretty
176
177 In [2]: ipy_pretty.activate()
178
179 In [3]: class A(object):
180 ...: def __repr__(self):
181 ...: return 'A()'
182 ...:
183 ...:
184
185 In [4]: a = A()
186
187 In [5]: a
188 Out[5]: A()
189
190 In [6]: def a_pretty_printer(obj, p, cycle):
191 ...: p.text('<A>')
192 ...:
193 ...:
194
195 In [7]: ipy_pretty.for_type(A, a_pretty_printer)
196
197 In [8]: a
198 Out[8]: <A>
199
200 In [9]: class B(object):
201 ...: def __repr__(self):
202 ...: return 'B()'
203 ...:
204 ...:
205
206 In [10]: B.__module__, B.__name__
207 Out[10]: ('__main__', 'B')
208
209 In [11]: def b_pretty_printer(obj, p, cycle):
210 ....: p.text('<B>')
211 ....:
212 ....:
213
214 In [12]: ipy_pretty.for_type_by_name('__main__', 'B', b_pretty_printer)
215
216 In [13]: b = B()
217
218 In [14]: b
219 Out[14]: <B>
220 """
221 assert False, "This should only be doctested, not run."
222
@@ -1,56 +1,97 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3 """
3 """
4 Simple tests for :mod:`IPython.extensions.pretty`.
4 Simple tests for :mod:`IPython.extensions.pretty`.
5 """
5 """
6
6
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8 # Copyright (C) 2008-2009 The IPython Development Team
8 # Copyright (C) 2008-2009 The IPython Development Team
9 #
9 #
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 import sys
19 from unittest import TestCase
18 from unittest import TestCase
20
19
21 from IPython.core.component import Component, masquerade_as
20 from IPython.core.component import Component, masquerade_as
22 from IPython.core.iplib import InteractiveShell
21 from IPython.core.iplib import InteractiveShell
23 from IPython.extensions import pretty as pretty_ext
22 from IPython.extensions import pretty as pretty_ext
24 from IPython.external import pretty
23 from IPython.external import pretty
25
24 from IPython.testing import tools as tt
26 from IPython.utils.traitlets import Bool
25 from IPython.utils.traitlets import Bool
27
26
28 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
29 # Tests
28 # Tests
30 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
31
30
32
31
33 class InteractiveShellStub(Component):
32 class InteractiveShellStub(Component):
34 pprint = Bool(True)
33 pprint = Bool(True)
35
34
36 class A(object):
35 class A(object):
37 pass
36 pass
38
37
39 def a_pprinter(o, p, c):
38 def a_pprinter(o, p, c):
40 return p.text("<A>")
39 return p.text("<A>")
41
40
42 class TestPrettyResultDisplay(TestCase):
41 class TestPrettyResultDisplay(TestCase):
43
42
44 def setUp(self):
43 def setUp(self):
45 self.ip = InteractiveShellStub(None)
44 self.ip = InteractiveShellStub(None)
46 # This allows our stub to be retrieved instead of the real InteractiveShell
45 # This allows our stub to be retrieved instead of the real
46 # InteractiveShell
47 masquerade_as(self.ip, InteractiveShell)
47 masquerade_as(self.ip, InteractiveShell)
48 self.prd = pretty_ext.PrettyResultDisplay(self.ip, name='pretty_result_display')
48 self.prd = pretty_ext.PrettyResultDisplay(self.ip,
49 name='pretty_result_display')
49
50
50 def test_for_type(self):
51 def test_for_type(self):
51 self.prd.for_type(A, a_pprinter)
52 self.prd.for_type(A, a_pprinter)
52 a = A()
53 a = A()
53 result = pretty.pretty(a)
54 result = pretty.pretty(a)
54 self.assertEquals(result, "<A>")
55 self.assertEquals(result, "<A>")
55
56
57 ipy_src = """
58 class A(object):
59 def __repr__(self):
60 return 'A()'
61
62 class B(object):
63 def __repr__(self):
64 return 'B()'
65
66 a = A()
67 b = B()
68
69 def a_pretty_printer(obj, p, cycle):
70 p.text('<A>')
71
72 def b_pretty_printer(obj, p, cycle):
73 p.text('<B>')
74
75
76 a
77 b
78
79 ip = get_ipython()
80 prd = ip.load_extension('pretty')
81 prd.for_type(A, a_pretty_printer)
82 prd.for_type_by_name(B.__module__, B.__name__, b_pretty_printer)
83
84 a
85 b
86 """
87 ipy_out = """
88 A()
89 B()
90 <A>
91 <B>
92 """
56
93
94 class TestPrettyInteractively(tt.TempFileMixin):
95 def test_printers(self):
96 self.mktmp(ipy_src, '.ipy')
97 tt.ipexec_validate(self.fname, ipy_out)
@@ -1,221 +1,256 b''
1 """Generic testing tools that do NOT depend on Twisted.
1 """Generic testing tools that do NOT depend on Twisted.
2
2
3 In particular, this module exposes a set of top-level assert* functions that
3 In particular, this module exposes a set of top-level assert* functions that
4 can be used in place of nose.tools.assert* in method generators (the ones in
4 can be used in place of nose.tools.assert* in method generators (the ones in
5 nose can not, at least as of nose 0.10.4).
5 nose can not, at least as of nose 0.10.4).
6
6
7 Note: our testing package contains testing.util, which does depend on Twisted
7 Note: our testing package contains testing.util, which does depend on Twisted
8 and provides utilities for tests that manage Deferreds. All testing support
8 and provides utilities for tests that manage Deferreds. All testing support
9 tools that only depend on nose, IPython or the standard library should go here
9 tools that only depend on nose, IPython or the standard library should go here
10 instead.
10 instead.
11
11
12
12
13 Authors
13 Authors
14 -------
14 -------
15 - Fernando Perez <Fernando.Perez@berkeley.edu>
15 - Fernando Perez <Fernando.Perez@berkeley.edu>
16 """
16 """
17
17
18 #*****************************************************************************
18 #*****************************************************************************
19 # Copyright (C) 2009 The IPython Development Team
19 # Copyright (C) 2009 The IPython Development Team
20 #
20 #
21 # Distributed under the terms of the BSD License. The full license is in
21 # Distributed under the terms of the BSD License. The full license is in
22 # the file COPYING, distributed as part of this software.
22 # the file COPYING, distributed as part of this software.
23 #*****************************************************************************
23 #*****************************************************************************
24
24
25 #-----------------------------------------------------------------------------
25 #-----------------------------------------------------------------------------
26 # Required modules and packages
26 # Required modules and packages
27 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
28
28
29 import os
29 import os
30 import re
30 import re
31 import sys
31 import sys
32 import tempfile
32 import tempfile
33
33
34 import nose.tools as nt
34 import nose.tools as nt
35
35
36 from IPython.utils import genutils, platutils
36 from IPython.utils import genutils, platutils
37
37
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39 # Globals
39 # Globals
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41
41
42 # Make a bunch of nose.tools assert wrappers that can be used in test
42 # Make a bunch of nose.tools assert wrappers that can be used in test
43 # generators. This will expose an assert* function for each one in nose.tools.
43 # generators. This will expose an assert* function for each one in nose.tools.
44
44
45 _tpl = """
45 _tpl = """
46 def %(name)s(*a,**kw):
46 def %(name)s(*a,**kw):
47 return nt.%(name)s(*a,**kw)
47 return nt.%(name)s(*a,**kw)
48 """
48 """
49
49
50 for _x in [a for a in dir(nt) if a.startswith('assert')]:
50 for _x in [a for a in dir(nt) if a.startswith('assert')]:
51 exec _tpl % dict(name=_x)
51 exec _tpl % dict(name=_x)
52
52
53 #-----------------------------------------------------------------------------
53 #-----------------------------------------------------------------------------
54 # Functions and classes
54 # Functions and classes
55 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
56
56
57
57
58 def full_path(startPath,files):
58 def full_path(startPath,files):
59 """Make full paths for all the listed files, based on startPath.
59 """Make full paths for all the listed files, based on startPath.
60
60
61 Only the base part of startPath is kept, since this routine is typically
61 Only the base part of startPath is kept, since this routine is typically
62 used with a script's __file__ variable as startPath. The base of startPath
62 used with a script's __file__ variable as startPath. The base of startPath
63 is then prepended to all the listed files, forming the output list.
63 is then prepended to all the listed files, forming the output list.
64
64
65 Parameters
65 Parameters
66 ----------
66 ----------
67 startPath : string
67 startPath : string
68 Initial path to use as the base for the results. This path is split
68 Initial path to use as the base for the results. This path is split
69 using os.path.split() and only its first component is kept.
69 using os.path.split() and only its first component is kept.
70
70
71 files : string or list
71 files : string or list
72 One or more files.
72 One or more files.
73
73
74 Examples
74 Examples
75 --------
75 --------
76
76
77 >>> full_path('/foo/bar.py',['a.txt','b.txt'])
77 >>> full_path('/foo/bar.py',['a.txt','b.txt'])
78 ['/foo/a.txt', '/foo/b.txt']
78 ['/foo/a.txt', '/foo/b.txt']
79
79
80 >>> full_path('/foo',['a.txt','b.txt'])
80 >>> full_path('/foo',['a.txt','b.txt'])
81 ['/a.txt', '/b.txt']
81 ['/a.txt', '/b.txt']
82
82
83 If a single file is given, the output is still a list:
83 If a single file is given, the output is still a list:
84 >>> full_path('/foo','a.txt')
84 >>> full_path('/foo','a.txt')
85 ['/a.txt']
85 ['/a.txt']
86 """
86 """
87
87
88 files = genutils.list_strings(files)
88 files = genutils.list_strings(files)
89 base = os.path.split(startPath)[0]
89 base = os.path.split(startPath)[0]
90 return [ os.path.join(base,f) for f in files ]
90 return [ os.path.join(base,f) for f in files ]
91
91
92
92
93 def parse_test_output(txt):
93 def parse_test_output(txt):
94 """Parse the output of a test run and return errors, failures.
94 """Parse the output of a test run and return errors, failures.
95
95
96 Parameters
96 Parameters
97 ----------
97 ----------
98 txt : str
98 txt : str
99 Text output of a test run, assumed to contain a line of one of the
99 Text output of a test run, assumed to contain a line of one of the
100 following forms::
100 following forms::
101 'FAILED (errors=1)'
101 'FAILED (errors=1)'
102 'FAILED (failures=1)'
102 'FAILED (failures=1)'
103 'FAILED (errors=1, failures=1)'
103 'FAILED (errors=1, failures=1)'
104
104
105 Returns
105 Returns
106 -------
106 -------
107 nerr, nfail: number of errors and failures.
107 nerr, nfail: number of errors and failures.
108 """
108 """
109
109
110 err_m = re.search(r'^FAILED \(errors=(\d+)\)', txt, re.MULTILINE)
110 err_m = re.search(r'^FAILED \(errors=(\d+)\)', txt, re.MULTILINE)
111 if err_m:
111 if err_m:
112 nerr = int(err_m.group(1))
112 nerr = int(err_m.group(1))
113 nfail = 0
113 nfail = 0
114 return nerr, nfail
114 return nerr, nfail
115
115
116 fail_m = re.search(r'^FAILED \(failures=(\d+)\)', txt, re.MULTILINE)
116 fail_m = re.search(r'^FAILED \(failures=(\d+)\)', txt, re.MULTILINE)
117 if fail_m:
117 if fail_m:
118 nerr = 0
118 nerr = 0
119 nfail = int(fail_m.group(1))
119 nfail = int(fail_m.group(1))
120 return nerr, nfail
120 return nerr, nfail
121
121
122 both_m = re.search(r'^FAILED \(errors=(\d+), failures=(\d+)\)', txt,
122 both_m = re.search(r'^FAILED \(errors=(\d+), failures=(\d+)\)', txt,
123 re.MULTILINE)
123 re.MULTILINE)
124 if both_m:
124 if both_m:
125 nerr = int(both_m.group(1))
125 nerr = int(both_m.group(1))
126 nfail = int(both_m.group(2))
126 nfail = int(both_m.group(2))
127 return nerr, nfail
127 return nerr, nfail
128
128
129 # If the input didn't match any of these forms, assume no error/failures
129 # If the input didn't match any of these forms, assume no error/failures
130 return 0, 0
130 return 0, 0
131
131
132
132
133 # So nose doesn't think this is a test
133 # So nose doesn't think this is a test
134 parse_test_output.__test__ = False
134 parse_test_output.__test__ = False
135
135
136
136
137 def temp_pyfile(src, ext='.py'):
137 def temp_pyfile(src, ext='.py'):
138 """Make a temporary python file, return filename and filehandle.
138 """Make a temporary python file, return filename and filehandle.
139
139
140 Parameters
140 Parameters
141 ----------
141 ----------
142 src : string or list of strings (no need for ending newlines if list)
142 src : string or list of strings (no need for ending newlines if list)
143 Source code to be written to the file.
143 Source code to be written to the file.
144
144
145 ext : optional, string
145 ext : optional, string
146 Extension for the generated file.
146 Extension for the generated file.
147
147
148 Returns
148 Returns
149 -------
149 -------
150 (filename, open filehandle)
150 (filename, open filehandle)
151 It is the caller's responsibility to close the open file and unlink it.
151 It is the caller's responsibility to close the open file and unlink it.
152 """
152 """
153 fname = tempfile.mkstemp(ext)[1]
153 fname = tempfile.mkstemp(ext)[1]
154 f = open(fname,'w')
154 f = open(fname,'w')
155 f.write(src)
155 f.write(src)
156 f.flush()
156 f.flush()
157 return fname, f
157 return fname, f
158
158
159
159
160 def default_argv():
160 def default_argv():
161 """Return a valid default argv for creating testing instances of ipython"""
161 """Return a valid default argv for creating testing instances of ipython"""
162
162
163 # Get the install directory for the user configuration and tell ipython to
163 # Get the install directory for the user configuration and tell ipython to
164 # use the default profile from there.
164 # use the default profile from there.
165 from IPython.config import default
165 from IPython.config import default
166 ipcdir = os.path.dirname(default.__file__)
166 ipcdir = os.path.dirname(default.__file__)
167 ipconf = os.path.join(ipcdir,'ipython_config.py')
167 ipconf = os.path.join(ipcdir,'ipython_config.py')
168 #print 'conf:',ipconf # dbg
169 return ['--colors=NoColor', '--no-term-title','--no-banner',
168 return ['--colors=NoColor', '--no-term-title','--no-banner',
170 '--config-file=%s' % ipconf, '--autocall=0', '--quick']
169 '--config-file=%s' % ipconf, '--autocall=0',
170 '--prompt-out=""']
171
171
172
172
173 def ipexec(fname):
173 def ipexec(fname, options=None):
174 """Utility to call 'ipython filename'.
174 """Utility to call 'ipython filename'.
175
175
176 Starts IPython witha minimal and safe configuration to make startup as fast
176 Starts IPython witha minimal and safe configuration to make startup as fast
177 as possible.
177 as possible.
178
178
179 Note that this starts IPython in a subprocess!
179 Note that this starts IPython in a subprocess!
180
180
181 Parameters
181 Parameters
182 ----------
182 ----------
183 fname : str
183 fname : str
184 Name of file to be executed (should have .py or .ipy extension).
184 Name of file to be executed (should have .py or .ipy extension).
185
185
186 options : optional, list
187 Extra command-line flags to be passed to IPython.
188
186 Returns
189 Returns
187 -------
190 -------
188 (stdout, stderr) of ipython subprocess.
191 (stdout, stderr) of ipython subprocess.
189 """
192 """
193 if options is None: options = []
194 cmdargs = ' '.join(default_argv() + options)
195
190 _ip = get_ipython()
196 _ip = get_ipython()
191 test_dir = os.path.dirname(__file__)
197 test_dir = os.path.dirname(__file__)
192 full_fname = os.path.join(test_dir, fname)
198 full_fname = os.path.join(test_dir, fname)
193 ipython_cmd = platutils.find_cmd('ipython')
199 ipython_cmd = platutils.find_cmd('ipython')
194 cmdargs = ' '.join(default_argv())
200 full_cmd = '%s %s %s' % (ipython_cmd, cmdargs, full_fname)
195 return genutils.getoutputerror('%s %s' % (ipython_cmd, full_fname))
201 return genutils.getoutputerror(full_cmd)
196
202
197
203
198 def ipexec_validate(fname, expected_out, expected_err=None):
204 def ipexec_validate(fname, expected_out, expected_err=None,
205 options=None):
199 """Utility to call 'ipython filename' and validate output/error.
206 """Utility to call 'ipython filename' and validate output/error.
200
207
201 This function raises an AssertionError if the validation fails.
208 This function raises an AssertionError if the validation fails.
202
209
203 Note that this starts IPython in a subprocess!
210 Note that this starts IPython in a subprocess!
204
211
205 Parameters
212 Parameters
206 ----------
213 ----------
207 fname : str
214 fname : str
208 Name of the file to be executed (should have .py or .ipy extension).
215 Name of the file to be executed (should have .py or .ipy extension).
209
216
210 expected_out : str
217 expected_out : str
211 Expected stdout of the process.
218 Expected stdout of the process.
212
219
220 expected_err : optional, str
221 Expected stderr of the process.
222
223 options : optional, list
224 Extra command-line flags to be passed to IPython.
225
213 Returns
226 Returns
214 -------
227 -------
215 None
228 None
216 """
229 """
217
230
218 out, err = ipexec(fname)
231 out, err = ipexec(fname)
219 nt.assert_equals(out.strip(), expected_out.strip())
232 nt.assert_equals(out.strip(), expected_out.strip())
220 if expected_err:
233 if expected_err:
221 nt.assert_equals(err.strip(), expected_err.strip())
234 nt.assert_equals(err.strip(), expected_err.strip())
235
236
237 class TempFileMixin(object):
238 """Utility class to create temporary Python/IPython files.
239
240 Meant as a mixin class for test cases."""
241
242 def mktmp(self, src, ext='.py'):
243 """Make a valid python temp file."""
244 fname, f = temp_pyfile(src, ext)
245 self.tmpfile = f
246 self.fname = fname
247
248 def teardown(self):
249 self.tmpfile.close()
250 try:
251 os.unlink(self.fname)
252 except:
253 # On Windows, even though we close the file, we still can't delete
254 # it. I have no clue why
255 pass
256
@@ -1,35 +0,0 b''
1 """Test code for https://bugs.launchpad.net/ipython/+bug/239054
2
3 WARNING: this script exits IPython! It MUST be run in a subprocess.
4
5 When you run the following script from CPython it prints:
6 __init__ is here
7 __del__ is here
8
9 and creates the __del__.txt file
10
11 When you run it from IPython it prints:
12 __init__ is here
13
14 When you exit() or Exit from IPython neothing is printed and no file is created
15 (the file thing is to make sure __del__ is really never called and not that
16 just the output is eaten).
17
18 Note that if you call %reset in IPython then everything is Ok.
19
20 IPython should do the equivalent of %reset and release all the references it
21 holds before exit. This behavior is important when working with binding objects
22 that rely on __del__. If the current behavior has some use case then I suggest
23 to add a configuration option to IPython to control it.
24 """
25 import sys
26
27 class A(object):
28 def __del__(self):
29 print 'obj_del.py: object A deleted'
30
31 a = A()
32
33 # Now, we force an exit, the caller will check that the del printout was given
34 _ip = get_ipython()
35 _ip.ask_exit()
General Comments 0
You need to be logged in to leave comments. Login now