##// END OF EJS Templates
- fix missing __file__ for scripts run via %run....
fperez -
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,286 +1,296 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Pdb debugger class.
3 Pdb debugger class.
4
4
5 Modified from the standard pdb.Pdb class to avoid including readline, so that
5 Modified from the standard pdb.Pdb class to avoid including readline, so that
6 the command line completion of other programs which include this isn't
6 the command line completion of other programs which include this isn't
7 damaged.
7 damaged.
8
8
9 In the future, this class will be expanded with improvements over the standard
9 In the future, this class will be expanded with improvements over the standard
10 pdb.
10 pdb.
11
11
12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
13 changes. Licensing should therefore be under the standard Python terms. For
13 changes. Licensing should therefore be under the standard Python terms. For
14 details on the PSF (Python Software Foundation) standard license, see:
14 details on the PSF (Python Software Foundation) standard license, see:
15
15
16 http://www.python.org/2.2.3/license.html
16 http://www.python.org/2.2.3/license.html
17
17
18 $Id: Debugger.py 994 2006-01-08 08:29:44Z fperez $"""
18 $Id: Debugger.py 1029 2006-01-18 07:33:38Z fperez $"""
19
19
20 #*****************************************************************************
20 #*****************************************************************************
21 #
21 #
22 # Since this file is essentially a modified copy of the pdb module which is
22 # Since this file is essentially a modified copy of the pdb module which is
23 # part of the standard Python distribution, I assume that the proper procedure
23 # part of the standard Python distribution, I assume that the proper procedure
24 # is to maintain its copyright as belonging to the Python Software Foundation
24 # is to maintain its copyright as belonging to the Python Software Foundation
25 # (in addition to my own, for all new code).
25 # (in addition to my own, for all new code).
26 #
26 #
27 # Copyright (C) 2001 Python Software Foundation, www.python.org
27 # Copyright (C) 2001 Python Software Foundation, www.python.org
28 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
28 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
29 #
29 #
30 # Distributed under the terms of the BSD License. The full license is in
30 # Distributed under the terms of the BSD License. The full license is in
31 # the file COPYING, distributed as part of this software.
31 # the file COPYING, distributed as part of this software.
32 #
32 #
33 #*****************************************************************************
33 #*****************************************************************************
34
34
35
35
36 from IPython import Release
36 from IPython import Release
37 __author__ = '%s <%s>' % Release.authors['Fernando']
37 __author__ = '%s <%s>' % Release.authors['Fernando']
38 __license__ = 'Python'
38 __license__ = 'Python'
39
39
40 import bdb
40 import bdb
41 import cmd
41 import cmd
42 import linecache
42 import linecache
43 import os
43 import os
44 import pdb
44 import pdb
45 import sys
45 import sys
46
46
47 from IPython import PyColorize, ColorANSI
47 from IPython import PyColorize, ColorANSI
48 from IPython.genutils import Term
48 from IPython.genutils import Term
49 from IPython.excolors import ExceptionColors
49 from IPython.excolors import ExceptionColors
50
50
51 def _file_lines(fname):
51 def _file_lines(fname):
52 """Return the contents of a named file as a list of lines.
52 """Return the contents of a named file as a list of lines.
53
53
54 This function never raises an IOError exception: if the file can't be
54 This function never raises an IOError exception: if the file can't be
55 read, it simply returns an empty list."""
55 read, it simply returns an empty list."""
56
56
57 try:
57 try:
58 outfile = open(fname)
58 outfile = open(fname)
59 except IOError:
59 except IOError:
60 return []
60 return []
61 else:
61 else:
62 out = outfile.readlines()
62 out = outfile.readlines()
63 outfile.close()
63 outfile.close()
64 return out
64 return out
65
65
66
66
67 class Pdb(pdb.Pdb):
67 class Pdb(pdb.Pdb):
68 """Modified Pdb class, does not load readline."""
68 """Modified Pdb class, does not load readline."""
69
70 # Ugly hack: we can't call the parent constructor, because it binds
71 # readline and breaks tab-completion. This means we have to COPY the
72 # constructor here, and that requires tracking various python versions.
73
69 def __init__(self,color_scheme='NoColor'):
74 def __init__(self,color_scheme='NoColor'):
70 bdb.Bdb.__init__(self)
75 bdb.Bdb.__init__(self)
71 cmd.Cmd.__init__(self,completekey=None) # don't load readline
76 cmd.Cmd.__init__(self,completekey=None) # don't load readline
72 self.prompt = 'ipdb> ' # The default prompt is '(Pdb)'
77 self.prompt = 'ipdb> ' # The default prompt is '(Pdb)'
73 self.aliases = {}
78 self.aliases = {}
74
79
80 # These two lines are part of the py2.4 constructor, let's put them
81 # unconditionally here as they won't cause any problems in 2.3.
82 self.mainpyfile = ''
83 self._wait_for_mainpyfile = 0
84
75 # Read $HOME/.pdbrc and ./.pdbrc
85 # Read $HOME/.pdbrc and ./.pdbrc
76 try:
86 try:
77 self.rcLines = _file_lines(os.path.join(os.environ['HOME'],
87 self.rcLines = _file_lines(os.path.join(os.environ['HOME'],
78 ".pdbrc"))
88 ".pdbrc"))
79 except KeyError:
89 except KeyError:
80 self.rcLines = []
90 self.rcLines = []
81 self.rcLines.extend(_file_lines(".pdbrc"))
91 self.rcLines.extend(_file_lines(".pdbrc"))
82
92
83 # Create color table: we copy the default one from the traceback
93 # Create color table: we copy the default one from the traceback
84 # module and add a few attributes needed for debugging
94 # module and add a few attributes needed for debugging
85 self.color_scheme_table = ExceptionColors.copy()
95 self.color_scheme_table = ExceptionColors.copy()
86
96
87 # shorthands
97 # shorthands
88 C = ColorANSI.TermColors
98 C = ColorANSI.TermColors
89 cst = self.color_scheme_table
99 cst = self.color_scheme_table
90
100
91 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
101 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
92 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
102 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
93
103
94 cst['Linux'].colors.breakpoint_enabled = C.LightRed
104 cst['Linux'].colors.breakpoint_enabled = C.LightRed
95 cst['Linux'].colors.breakpoint_disabled = C.Red
105 cst['Linux'].colors.breakpoint_disabled = C.Red
96
106
97 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
107 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
98 cst['LightBG'].colors.breakpoint_disabled = C.Red
108 cst['LightBG'].colors.breakpoint_disabled = C.Red
99
109
100 self.set_colors(color_scheme)
110 self.set_colors(color_scheme)
101
111
102 def set_colors(self, scheme):
112 def set_colors(self, scheme):
103 """Shorthand access to the color table scheme selector method."""
113 """Shorthand access to the color table scheme selector method."""
104 self.color_scheme_table.set_active_scheme(scheme)
114 self.color_scheme_table.set_active_scheme(scheme)
105
115
106
116
107 def interaction(self, frame, traceback):
117 def interaction(self, frame, traceback):
108 __IPYTHON__.set_completer_frame(frame)
118 __IPYTHON__.set_completer_frame(frame)
109 pdb.Pdb.interaction(self, frame, traceback)
119 pdb.Pdb.interaction(self, frame, traceback)
110
120
111
121
112 def do_up(self, arg):
122 def do_up(self, arg):
113 pdb.Pdb.do_up(self, arg)
123 pdb.Pdb.do_up(self, arg)
114 __IPYTHON__.set_completer_frame(self.curframe)
124 __IPYTHON__.set_completer_frame(self.curframe)
115 do_u = do_up
125 do_u = do_up
116
126
117
127
118 def do_down(self, arg):
128 def do_down(self, arg):
119 pdb.Pdb.do_down(self, arg)
129 pdb.Pdb.do_down(self, arg)
120 __IPYTHON__.set_completer_frame(self.curframe)
130 __IPYTHON__.set_completer_frame(self.curframe)
121 do_d = do_down
131 do_d = do_down
122
132
123
133
124 def postloop(self):
134 def postloop(self):
125 __IPYTHON__.set_completer_frame(None)
135 __IPYTHON__.set_completer_frame(None)
126
136
127
137
128 def print_stack_trace(self):
138 def print_stack_trace(self):
129 try:
139 try:
130 for frame_lineno in self.stack:
140 for frame_lineno in self.stack:
131 self.print_stack_entry(frame_lineno, context = 5)
141 self.print_stack_entry(frame_lineno, context = 5)
132 except KeyboardInterrupt:
142 except KeyboardInterrupt:
133 pass
143 pass
134
144
135
145
136 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
146 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
137 context = 3):
147 context = 3):
138 frame, lineno = frame_lineno
148 frame, lineno = frame_lineno
139 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
149 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
140
150
141
151
142 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
152 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
143 import linecache, repr
153 import linecache, repr
144
154
145 ret = ""
155 ret = ""
146
156
147 Colors = self.color_scheme_table.active_colors
157 Colors = self.color_scheme_table.active_colors
148 ColorsNormal = Colors.Normal
158 ColorsNormal = Colors.Normal
149 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
159 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
150 tpl_call = 'in %s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
160 tpl_call = 'in %s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
151 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
161 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
152 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
162 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
153 ColorsNormal)
163 ColorsNormal)
154
164
155 frame, lineno = frame_lineno
165 frame, lineno = frame_lineno
156
166
157 return_value = ''
167 return_value = ''
158 if '__return__' in frame.f_locals:
168 if '__return__' in frame.f_locals:
159 rv = frame.f_locals['__return__']
169 rv = frame.f_locals['__return__']
160 #return_value += '->'
170 #return_value += '->'
161 return_value += repr.repr(rv) + '\n'
171 return_value += repr.repr(rv) + '\n'
162 ret += return_value
172 ret += return_value
163
173
164 #s = filename + '(' + `lineno` + ')'
174 #s = filename + '(' + `lineno` + ')'
165 filename = self.canonic(frame.f_code.co_filename)
175 filename = self.canonic(frame.f_code.co_filename)
166 link = tpl_link % filename
176 link = tpl_link % filename
167
177
168 if frame.f_code.co_name:
178 if frame.f_code.co_name:
169 func = frame.f_code.co_name
179 func = frame.f_code.co_name
170 else:
180 else:
171 func = "<lambda>"
181 func = "<lambda>"
172
182
173 call = ''
183 call = ''
174 if func != '?':
184 if func != '?':
175 if '__args__' in frame.f_locals:
185 if '__args__' in frame.f_locals:
176 args = repr.repr(frame.f_locals['__args__'])
186 args = repr.repr(frame.f_locals['__args__'])
177 else:
187 else:
178 args = '()'
188 args = '()'
179 call = tpl_call % (func, args)
189 call = tpl_call % (func, args)
180
190
181 level = '%s %s\n' % (link, call)
191 level = '%s %s\n' % (link, call)
182 ret += level
192 ret += level
183
193
184 start = lineno - 1 - context//2
194 start = lineno - 1 - context//2
185 lines = linecache.getlines(filename)
195 lines = linecache.getlines(filename)
186 start = max(start, 0)
196 start = max(start, 0)
187 start = min(start, len(lines) - context)
197 start = min(start, len(lines) - context)
188 lines = lines[start : start + context]
198 lines = lines[start : start + context]
189
199
190 for i in range(len(lines)):
200 for i in range(len(lines)):
191 line = lines[i]
201 line = lines[i]
192 if start + 1 + i == lineno:
202 if start + 1 + i == lineno:
193 ret += self.__format_line(tpl_line_em, filename, start + 1 + i, line, arrow = True)
203 ret += self.__format_line(tpl_line_em, filename, start + 1 + i, line, arrow = True)
194 else:
204 else:
195 ret += self.__format_line(tpl_line, filename, start + 1 + i, line, arrow = False)
205 ret += self.__format_line(tpl_line, filename, start + 1 + i, line, arrow = False)
196
206
197 return ret
207 return ret
198
208
199
209
200 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
210 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
201 bp_mark = ""
211 bp_mark = ""
202 bp_mark_color = ""
212 bp_mark_color = ""
203
213
204 bp = None
214 bp = None
205 if lineno in self.get_file_breaks(filename):
215 if lineno in self.get_file_breaks(filename):
206 bps = self.get_breaks(filename, lineno)
216 bps = self.get_breaks(filename, lineno)
207 bp = bps[-1]
217 bp = bps[-1]
208
218
209 if bp:
219 if bp:
210 Colors = self.color_scheme_table.active_colors
220 Colors = self.color_scheme_table.active_colors
211 bp_mark = str(bp.number)
221 bp_mark = str(bp.number)
212 bp_mark_color = Colors.breakpoint_enabled
222 bp_mark_color = Colors.breakpoint_enabled
213 if not bp.enabled:
223 if not bp.enabled:
214 bp_mark_color = Colors.breakpoint_disabled
224 bp_mark_color = Colors.breakpoint_disabled
215
225
216 numbers_width = 7
226 numbers_width = 7
217 if arrow:
227 if arrow:
218 # This is the line with the error
228 # This is the line with the error
219 pad = numbers_width - len(str(lineno)) - len(bp_mark)
229 pad = numbers_width - len(str(lineno)) - len(bp_mark)
220 if pad >= 3:
230 if pad >= 3:
221 marker = '-'*(pad-3) + '-> '
231 marker = '-'*(pad-3) + '-> '
222 elif pad == 2:
232 elif pad == 2:
223 marker = '> '
233 marker = '> '
224 elif pad == 1:
234 elif pad == 1:
225 marker = '>'
235 marker = '>'
226 else:
236 else:
227 marker = ''
237 marker = ''
228 num = '%s%s' % (marker, str(lineno))
238 num = '%s%s' % (marker, str(lineno))
229 line = tpl_line % (bp_mark_color + bp_mark, num, line)
239 line = tpl_line % (bp_mark_color + bp_mark, num, line)
230 else:
240 else:
231 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
241 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
232 line = tpl_line % (bp_mark_color + bp_mark, num, line)
242 line = tpl_line % (bp_mark_color + bp_mark, num, line)
233
243
234 return line
244 return line
235
245
236
246
237 def do_list(self, arg):
247 def do_list(self, arg):
238 self.lastcmd = 'list'
248 self.lastcmd = 'list'
239 last = None
249 last = None
240 if arg:
250 if arg:
241 try:
251 try:
242 x = eval(arg, {}, {})
252 x = eval(arg, {}, {})
243 if type(x) == type(()):
253 if type(x) == type(()):
244 first, last = x
254 first, last = x
245 first = int(first)
255 first = int(first)
246 last = int(last)
256 last = int(last)
247 if last < first:
257 if last < first:
248 # Assume it's a count
258 # Assume it's a count
249 last = first + last
259 last = first + last
250 else:
260 else:
251 first = max(1, int(x) - 5)
261 first = max(1, int(x) - 5)
252 except:
262 except:
253 print '*** Error in argument:', `arg`
263 print '*** Error in argument:', `arg`
254 return
264 return
255 elif self.lineno is None:
265 elif self.lineno is None:
256 first = max(1, self.curframe.f_lineno - 5)
266 first = max(1, self.curframe.f_lineno - 5)
257 else:
267 else:
258 first = self.lineno + 1
268 first = self.lineno + 1
259 if last is None:
269 if last is None:
260 last = first + 10
270 last = first + 10
261 filename = self.curframe.f_code.co_filename
271 filename = self.curframe.f_code.co_filename
262 try:
272 try:
263 Colors = self.color_scheme_table.active_colors
273 Colors = self.color_scheme_table.active_colors
264 ColorsNormal = Colors.Normal
274 ColorsNormal = Colors.Normal
265 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
275 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
266 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
276 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
267 src = []
277 src = []
268 for lineno in range(first, last+1):
278 for lineno in range(first, last+1):
269 line = linecache.getline(filename, lineno)
279 line = linecache.getline(filename, lineno)
270 if not line:
280 if not line:
271 break
281 break
272
282
273 if lineno == self.curframe.f_lineno:
283 if lineno == self.curframe.f_lineno:
274 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
284 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
275 else:
285 else:
276 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
286 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
277
287
278 src.append(line)
288 src.append(line)
279 self.lineno = lineno
289 self.lineno = lineno
280
290
281 print >>Term.cout, ''.join(src)
291 print >>Term.cout, ''.join(src)
282
292
283 except KeyboardInterrupt:
293 except KeyboardInterrupt:
284 pass
294 pass
285
295
286 do_l = do_list
296 do_l = do_list
@@ -1,2750 +1,2754 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3
3
4 $Id: Magic.py 1023 2006-01-16 19:11:21Z vivainio $"""
4 $Id: Magic.py 1029 2006-01-18 07:33:38Z fperez $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
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 # Modules and globals
15 # Modules and globals
16
16
17 from IPython import Release
17 from IPython import Release
18 __author__ = '%s <%s>\n%s <%s>' % \
18 __author__ = '%s <%s>\n%s <%s>' % \
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
20 __license__ = Release.license
20 __license__ = Release.license
21
21
22 # Python standard modules
22 # Python standard modules
23 import __builtin__
23 import __builtin__
24 import bdb
24 import bdb
25 import inspect
25 import inspect
26 import os
26 import os
27 import pdb
27 import pdb
28 import pydoc
28 import pydoc
29 import sys
29 import sys
30 import re
30 import re
31 import tempfile
31 import tempfile
32 import time
32 import time
33 import cPickle as pickle
33 import cPickle as pickle
34 from cStringIO import StringIO
34 from cStringIO import StringIO
35 from getopt import getopt
35 from getopt import getopt
36 from pprint import pprint, pformat
36 from pprint import pprint, pformat
37
37
38 # profile isn't bundled by default in Debian for license reasons
38 # profile isn't bundled by default in Debian for license reasons
39 try:
39 try:
40 import profile,pstats
40 import profile,pstats
41 except ImportError:
41 except ImportError:
42 profile = pstats = None
42 profile = pstats = None
43
43
44 # Homebrewed
44 # Homebrewed
45 from IPython import Debugger, OInspect, wildcard
45 from IPython import Debugger, OInspect, wildcard
46 from IPython.FakeModule import FakeModule
46 from IPython.FakeModule import FakeModule
47 from IPython.Itpl import Itpl, itpl, printpl,itplns
47 from IPython.Itpl import Itpl, itpl, printpl,itplns
48 from IPython.PyColorize import Parser
48 from IPython.PyColorize import Parser
49 from IPython.ipstruct import Struct
49 from IPython.ipstruct import Struct
50 from IPython.macro import Macro
50 from IPython.macro import Macro
51 from IPython.genutils import *
51 from IPython.genutils import *
52 from IPython import platutils
52 from IPython import platutils
53 #***************************************************************************
53 #***************************************************************************
54 # Utility functions
54 # Utility functions
55 def on_off(tag):
55 def on_off(tag):
56 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
56 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
57 return ['OFF','ON'][tag]
57 return ['OFF','ON'][tag]
58
58
59 class Bunch: pass
59 class Bunch: pass
60
60
61 #***************************************************************************
61 #***************************************************************************
62 # Main class implementing Magic functionality
62 # Main class implementing Magic functionality
63 class Magic:
63 class Magic:
64 """Magic functions for InteractiveShell.
64 """Magic functions for InteractiveShell.
65
65
66 Shell functions which can be reached as %function_name. All magic
66 Shell functions which can be reached as %function_name. All magic
67 functions should accept a string, which they can parse for their own
67 functions should accept a string, which they can parse for their own
68 needs. This can make some functions easier to type, eg `%cd ../`
68 needs. This can make some functions easier to type, eg `%cd ../`
69 vs. `%cd("../")`
69 vs. `%cd("../")`
70
70
71 ALL definitions MUST begin with the prefix magic_. The user won't need it
71 ALL definitions MUST begin with the prefix magic_. The user won't need it
72 at the command line, but it is is needed in the definition. """
72 at the command line, but it is is needed in the definition. """
73
73
74 # class globals
74 # class globals
75 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
75 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
76 'Automagic is ON, % prefix NOT needed for magic functions.']
76 'Automagic is ON, % prefix NOT needed for magic functions.']
77
77
78 #......................................................................
78 #......................................................................
79 # some utility functions
79 # some utility functions
80
80
81 def __init__(self,shell):
81 def __init__(self,shell):
82
82
83 self.options_table = {}
83 self.options_table = {}
84 if profile is None:
84 if profile is None:
85 self.magic_prun = self.profile_missing_notice
85 self.magic_prun = self.profile_missing_notice
86 self.shell = shell
86 self.shell = shell
87
87
88 # namespace for holding state we may need
88 # namespace for holding state we may need
89 self._magic_state = Bunch()
89 self._magic_state = Bunch()
90
90
91 def profile_missing_notice(self, *args, **kwargs):
91 def profile_missing_notice(self, *args, **kwargs):
92 error("""\
92 error("""\
93 The profile module could not be found. If you are a Debian user,
93 The profile module could not be found. If you are a Debian user,
94 it has been removed from the standard Debian package because of its non-free
94 it has been removed from the standard Debian package because of its non-free
95 license. To use profiling, please install"python2.3-profiler" from non-free.""")
95 license. To use profiling, please install"python2.3-profiler" from non-free.""")
96
96
97 def default_option(self,fn,optstr):
97 def default_option(self,fn,optstr):
98 """Make an entry in the options_table for fn, with value optstr"""
98 """Make an entry in the options_table for fn, with value optstr"""
99
99
100 if fn not in self.lsmagic():
100 if fn not in self.lsmagic():
101 error("%s is not a magic function" % fn)
101 error("%s is not a magic function" % fn)
102 self.options_table[fn] = optstr
102 self.options_table[fn] = optstr
103
103
104 def lsmagic(self):
104 def lsmagic(self):
105 """Return a list of currently available magic functions.
105 """Return a list of currently available magic functions.
106
106
107 Gives a list of the bare names after mangling (['ls','cd', ...], not
107 Gives a list of the bare names after mangling (['ls','cd', ...], not
108 ['magic_ls','magic_cd',...]"""
108 ['magic_ls','magic_cd',...]"""
109
109
110 # FIXME. This needs a cleanup, in the way the magics list is built.
110 # FIXME. This needs a cleanup, in the way the magics list is built.
111
111
112 # magics in class definition
112 # magics in class definition
113 class_magic = lambda fn: fn.startswith('magic_') and \
113 class_magic = lambda fn: fn.startswith('magic_') and \
114 callable(Magic.__dict__[fn])
114 callable(Magic.__dict__[fn])
115 # in instance namespace (run-time user additions)
115 # in instance namespace (run-time user additions)
116 inst_magic = lambda fn: fn.startswith('magic_') and \
116 inst_magic = lambda fn: fn.startswith('magic_') and \
117 callable(self.__dict__[fn])
117 callable(self.__dict__[fn])
118 # and bound magics by user (so they can access self):
118 # and bound magics by user (so they can access self):
119 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
119 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
120 callable(self.__class__.__dict__[fn])
120 callable(self.__class__.__dict__[fn])
121 magics = filter(class_magic,Magic.__dict__.keys()) + \
121 magics = filter(class_magic,Magic.__dict__.keys()) + \
122 filter(inst_magic,self.__dict__.keys()) + \
122 filter(inst_magic,self.__dict__.keys()) + \
123 filter(inst_bound_magic,self.__class__.__dict__.keys())
123 filter(inst_bound_magic,self.__class__.__dict__.keys())
124 out = []
124 out = []
125 for fn in magics:
125 for fn in magics:
126 out.append(fn.replace('magic_','',1))
126 out.append(fn.replace('magic_','',1))
127 out.sort()
127 out.sort()
128 return out
128 return out
129
129
130 def extract_input_slices(self,slices):
130 def extract_input_slices(self,slices):
131 """Return as a string a set of input history slices.
131 """Return as a string a set of input history slices.
132
132
133 The set of slices is given as a list of strings (like ['1','4:8','9'],
133 The set of slices is given as a list of strings (like ['1','4:8','9'],
134 since this function is for use by magic functions which get their
134 since this function is for use by magic functions which get their
135 arguments as strings.
135 arguments as strings.
136
136
137 Note that slices can be called with two notations:
137 Note that slices can be called with two notations:
138
138
139 N:M -> standard python form, means including items N...(M-1).
139 N:M -> standard python form, means including items N...(M-1).
140
140
141 N-M -> include items N..M (closed endpoint)."""
141 N-M -> include items N..M (closed endpoint)."""
142
142
143 cmds = []
143 cmds = []
144 for chunk in slices:
144 for chunk in slices:
145 if ':' in chunk:
145 if ':' in chunk:
146 ini,fin = map(int,chunk.split(':'))
146 ini,fin = map(int,chunk.split(':'))
147 elif '-' in chunk:
147 elif '-' in chunk:
148 ini,fin = map(int,chunk.split('-'))
148 ini,fin = map(int,chunk.split('-'))
149 fin += 1
149 fin += 1
150 else:
150 else:
151 ini = int(chunk)
151 ini = int(chunk)
152 fin = ini+1
152 fin = ini+1
153 cmds.append(self.shell.input_hist[ini:fin])
153 cmds.append(self.shell.input_hist[ini:fin])
154 return cmds
154 return cmds
155
155
156 def _ofind(self,oname):
156 def _ofind(self,oname):
157 """Find an object in the available namespaces.
157 """Find an object in the available namespaces.
158
158
159 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
159 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
160
160
161 Has special code to detect magic functions.
161 Has special code to detect magic functions.
162 """
162 """
163
163
164 oname = oname.strip()
164 oname = oname.strip()
165
165
166 # Namespaces to search in:
166 # Namespaces to search in:
167 user_ns = self.shell.user_ns
167 user_ns = self.shell.user_ns
168 internal_ns = self.shell.internal_ns
168 internal_ns = self.shell.internal_ns
169 builtin_ns = __builtin__.__dict__
169 builtin_ns = __builtin__.__dict__
170 alias_ns = self.shell.alias_table
170 alias_ns = self.shell.alias_table
171
171
172 # Put them in a list. The order is important so that we find things in
172 # Put them in a list. The order is important so that we find things in
173 # the same order that Python finds them.
173 # the same order that Python finds them.
174 namespaces = [ ('Interactive',user_ns),
174 namespaces = [ ('Interactive',user_ns),
175 ('IPython internal',internal_ns),
175 ('IPython internal',internal_ns),
176 ('Python builtin',builtin_ns),
176 ('Python builtin',builtin_ns),
177 ('Alias',alias_ns),
177 ('Alias',alias_ns),
178 ]
178 ]
179
179
180 # initialize results to 'null'
180 # initialize results to 'null'
181 found = 0; obj = None; ospace = None; ds = None;
181 found = 0; obj = None; ospace = None; ds = None;
182 ismagic = 0; isalias = 0
182 ismagic = 0; isalias = 0
183
183
184 # Look for the given name by splitting it in parts. If the head is
184 # Look for the given name by splitting it in parts. If the head is
185 # found, then we look for all the remaining parts as members, and only
185 # found, then we look for all the remaining parts as members, and only
186 # declare success if we can find them all.
186 # declare success if we can find them all.
187 oname_parts = oname.split('.')
187 oname_parts = oname.split('.')
188 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
188 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
189 for nsname,ns in namespaces:
189 for nsname,ns in namespaces:
190 try:
190 try:
191 obj = ns[oname_head]
191 obj = ns[oname_head]
192 except KeyError:
192 except KeyError:
193 continue
193 continue
194 else:
194 else:
195 for part in oname_rest:
195 for part in oname_rest:
196 try:
196 try:
197 obj = getattr(obj,part)
197 obj = getattr(obj,part)
198 except:
198 except:
199 # Blanket except b/c some badly implemented objects
199 # Blanket except b/c some badly implemented objects
200 # allow __getattr__ to raise exceptions other than
200 # allow __getattr__ to raise exceptions other than
201 # AttributeError, which then crashes IPython.
201 # AttributeError, which then crashes IPython.
202 break
202 break
203 else:
203 else:
204 # If we finish the for loop (no break), we got all members
204 # If we finish the for loop (no break), we got all members
205 found = 1
205 found = 1
206 ospace = nsname
206 ospace = nsname
207 if ns == alias_ns:
207 if ns == alias_ns:
208 isalias = 1
208 isalias = 1
209 break # namespace loop
209 break # namespace loop
210
210
211 # Try to see if it's magic
211 # Try to see if it's magic
212 if not found:
212 if not found:
213 if oname.startswith(self.shell.ESC_MAGIC):
213 if oname.startswith(self.shell.ESC_MAGIC):
214 oname = oname[1:]
214 oname = oname[1:]
215 obj = getattr(self,'magic_'+oname,None)
215 obj = getattr(self,'magic_'+oname,None)
216 if obj is not None:
216 if obj is not None:
217 found = 1
217 found = 1
218 ospace = 'IPython internal'
218 ospace = 'IPython internal'
219 ismagic = 1
219 ismagic = 1
220
220
221 # Last try: special-case some literals like '', [], {}, etc:
221 # Last try: special-case some literals like '', [], {}, etc:
222 if not found and oname_head in ["''",'""','[]','{}','()']:
222 if not found and oname_head in ["''",'""','[]','{}','()']:
223 obj = eval(oname_head)
223 obj = eval(oname_head)
224 found = 1
224 found = 1
225 ospace = 'Interactive'
225 ospace = 'Interactive'
226
226
227 return {'found':found, 'obj':obj, 'namespace':ospace,
227 return {'found':found, 'obj':obj, 'namespace':ospace,
228 'ismagic':ismagic, 'isalias':isalias}
228 'ismagic':ismagic, 'isalias':isalias}
229
229
230 def arg_err(self,func):
230 def arg_err(self,func):
231 """Print docstring if incorrect arguments were passed"""
231 """Print docstring if incorrect arguments were passed"""
232 print 'Error in arguments:'
232 print 'Error in arguments:'
233 print OInspect.getdoc(func)
233 print OInspect.getdoc(func)
234
234
235 def format_latex(self,strng):
235 def format_latex(self,strng):
236 """Format a string for latex inclusion."""
236 """Format a string for latex inclusion."""
237
237
238 # Characters that need to be escaped for latex:
238 # Characters that need to be escaped for latex:
239 escape_re = re.compile(r'(%|_|\$|#)',re.MULTILINE)
239 escape_re = re.compile(r'(%|_|\$|#)',re.MULTILINE)
240 # Magic command names as headers:
240 # Magic command names as headers:
241 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
241 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
242 re.MULTILINE)
242 re.MULTILINE)
243 # Magic commands
243 # Magic commands
244 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
244 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
245 re.MULTILINE)
245 re.MULTILINE)
246 # Paragraph continue
246 # Paragraph continue
247 par_re = re.compile(r'\\$',re.MULTILINE)
247 par_re = re.compile(r'\\$',re.MULTILINE)
248
248
249 # The "\n" symbol
249 # The "\n" symbol
250 newline_re = re.compile(r'\\n')
250 newline_re = re.compile(r'\\n')
251
251
252 # Now build the string for output:
252 # Now build the string for output:
253 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
253 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
254 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
254 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
255 strng)
255 strng)
256 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
256 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
257 strng = par_re.sub(r'\\\\',strng)
257 strng = par_re.sub(r'\\\\',strng)
258 strng = escape_re.sub(r'\\\1',strng)
258 strng = escape_re.sub(r'\\\1',strng)
259 strng = newline_re.sub(r'\\textbackslash{}n',strng)
259 strng = newline_re.sub(r'\\textbackslash{}n',strng)
260 return strng
260 return strng
261
261
262 def format_screen(self,strng):
262 def format_screen(self,strng):
263 """Format a string for screen printing.
263 """Format a string for screen printing.
264
264
265 This removes some latex-type format codes."""
265 This removes some latex-type format codes."""
266 # Paragraph continue
266 # Paragraph continue
267 par_re = re.compile(r'\\$',re.MULTILINE)
267 par_re = re.compile(r'\\$',re.MULTILINE)
268 strng = par_re.sub('',strng)
268 strng = par_re.sub('',strng)
269 return strng
269 return strng
270
270
271 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
271 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
272 """Parse options passed to an argument string.
272 """Parse options passed to an argument string.
273
273
274 The interface is similar to that of getopt(), but it returns back a
274 The interface is similar to that of getopt(), but it returns back a
275 Struct with the options as keys and the stripped argument string still
275 Struct with the options as keys and the stripped argument string still
276 as a string.
276 as a string.
277
277
278 arg_str is quoted as a true sys.argv vector by using shlex.split.
278 arg_str is quoted as a true sys.argv vector by using shlex.split.
279 This allows us to easily expand variables, glob files, quote
279 This allows us to easily expand variables, glob files, quote
280 arguments, etc.
280 arguments, etc.
281
281
282 Options:
282 Options:
283 -mode: default 'string'. If given as 'list', the argument string is
283 -mode: default 'string'. If given as 'list', the argument string is
284 returned as a list (split on whitespace) instead of a string.
284 returned as a list (split on whitespace) instead of a string.
285
285
286 -list_all: put all option values in lists. Normally only options
286 -list_all: put all option values in lists. Normally only options
287 appearing more than once are put in a list."""
287 appearing more than once are put in a list."""
288
288
289 # inject default options at the beginning of the input line
289 # inject default options at the beginning of the input line
290 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
290 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
291 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
291 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
292
292
293 mode = kw.get('mode','string')
293 mode = kw.get('mode','string')
294 if mode not in ['string','list']:
294 if mode not in ['string','list']:
295 raise ValueError,'incorrect mode given: %s' % mode
295 raise ValueError,'incorrect mode given: %s' % mode
296 # Get options
296 # Get options
297 list_all = kw.get('list_all',0)
297 list_all = kw.get('list_all',0)
298
298
299 # Check if we have more than one argument to warrant extra processing:
299 # Check if we have more than one argument to warrant extra processing:
300 odict = {} # Dictionary with options
300 odict = {} # Dictionary with options
301 args = arg_str.split()
301 args = arg_str.split()
302 if len(args) >= 1:
302 if len(args) >= 1:
303 # If the list of inputs only has 0 or 1 thing in it, there's no
303 # If the list of inputs only has 0 or 1 thing in it, there's no
304 # need to look for options
304 # need to look for options
305 argv = shlex_split(arg_str)
305 argv = shlex_split(arg_str)
306 # Do regular option processing
306 # Do regular option processing
307 opts,args = getopt(argv,opt_str,*long_opts)
307 opts,args = getopt(argv,opt_str,*long_opts)
308 for o,a in opts:
308 for o,a in opts:
309 if o.startswith('--'):
309 if o.startswith('--'):
310 o = o[2:]
310 o = o[2:]
311 else:
311 else:
312 o = o[1:]
312 o = o[1:]
313 try:
313 try:
314 odict[o].append(a)
314 odict[o].append(a)
315 except AttributeError:
315 except AttributeError:
316 odict[o] = [odict[o],a]
316 odict[o] = [odict[o],a]
317 except KeyError:
317 except KeyError:
318 if list_all:
318 if list_all:
319 odict[o] = [a]
319 odict[o] = [a]
320 else:
320 else:
321 odict[o] = a
321 odict[o] = a
322
322
323 # Prepare opts,args for return
323 # Prepare opts,args for return
324 opts = Struct(odict)
324 opts = Struct(odict)
325 if mode == 'string':
325 if mode == 'string':
326 args = ' '.join(args)
326 args = ' '.join(args)
327
327
328 return opts,args
328 return opts,args
329
329
330 #......................................................................
330 #......................................................................
331 # And now the actual magic functions
331 # And now the actual magic functions
332
332
333 # Functions for IPython shell work (vars,funcs, config, etc)
333 # Functions for IPython shell work (vars,funcs, config, etc)
334 def magic_lsmagic(self, parameter_s = ''):
334 def magic_lsmagic(self, parameter_s = ''):
335 """List currently available magic functions."""
335 """List currently available magic functions."""
336 mesc = self.shell.ESC_MAGIC
336 mesc = self.shell.ESC_MAGIC
337 print 'Available magic functions:\n'+mesc+\
337 print 'Available magic functions:\n'+mesc+\
338 (' '+mesc).join(self.lsmagic())
338 (' '+mesc).join(self.lsmagic())
339 print '\n' + Magic.auto_status[self.shell.rc.automagic]
339 print '\n' + Magic.auto_status[self.shell.rc.automagic]
340 return None
340 return None
341
341
342 def magic_magic(self, parameter_s = ''):
342 def magic_magic(self, parameter_s = ''):
343 """Print information about the magic function system."""
343 """Print information about the magic function system."""
344
344
345 mode = ''
345 mode = ''
346 try:
346 try:
347 if parameter_s.split()[0] == '-latex':
347 if parameter_s.split()[0] == '-latex':
348 mode = 'latex'
348 mode = 'latex'
349 except:
349 except:
350 pass
350 pass
351
351
352 magic_docs = []
352 magic_docs = []
353 for fname in self.lsmagic():
353 for fname in self.lsmagic():
354 mname = 'magic_' + fname
354 mname = 'magic_' + fname
355 for space in (Magic,self,self.__class__):
355 for space in (Magic,self,self.__class__):
356 try:
356 try:
357 fn = space.__dict__[mname]
357 fn = space.__dict__[mname]
358 except KeyError:
358 except KeyError:
359 pass
359 pass
360 else:
360 else:
361 break
361 break
362 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
362 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
363 fname,fn.__doc__))
363 fname,fn.__doc__))
364 magic_docs = ''.join(magic_docs)
364 magic_docs = ''.join(magic_docs)
365
365
366 if mode == 'latex':
366 if mode == 'latex':
367 print self.format_latex(magic_docs)
367 print self.format_latex(magic_docs)
368 return
368 return
369 else:
369 else:
370 magic_docs = self.format_screen(magic_docs)
370 magic_docs = self.format_screen(magic_docs)
371
371
372 outmsg = """
372 outmsg = """
373 IPython's 'magic' functions
373 IPython's 'magic' functions
374 ===========================
374 ===========================
375
375
376 The magic function system provides a series of functions which allow you to
376 The magic function system provides a series of functions which allow you to
377 control the behavior of IPython itself, plus a lot of system-type
377 control the behavior of IPython itself, plus a lot of system-type
378 features. All these functions are prefixed with a % character, but parameters
378 features. All these functions are prefixed with a % character, but parameters
379 are given without parentheses or quotes.
379 are given without parentheses or quotes.
380
380
381 NOTE: If you have 'automagic' enabled (via the command line option or with the
381 NOTE: If you have 'automagic' enabled (via the command line option or with the
382 %automagic function), you don't need to type in the % explicitly. By default,
382 %automagic function), you don't need to type in the % explicitly. By default,
383 IPython ships with automagic on, so you should only rarely need the % escape.
383 IPython ships with automagic on, so you should only rarely need the % escape.
384
384
385 Example: typing '%cd mydir' (without the quotes) changes you working directory
385 Example: typing '%cd mydir' (without the quotes) changes you working directory
386 to 'mydir', if it exists.
386 to 'mydir', if it exists.
387
387
388 You can define your own magic functions to extend the system. See the supplied
388 You can define your own magic functions to extend the system. See the supplied
389 ipythonrc and example-magic.py files for details (in your ipython
389 ipythonrc and example-magic.py files for details (in your ipython
390 configuration directory, typically $HOME/.ipython/).
390 configuration directory, typically $HOME/.ipython/).
391
391
392 You can also define your own aliased names for magic functions. In your
392 You can also define your own aliased names for magic functions. In your
393 ipythonrc file, placing a line like:
393 ipythonrc file, placing a line like:
394
394
395 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
395 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
396
396
397 will define %pf as a new name for %profile.
397 will define %pf as a new name for %profile.
398
398
399 You can also call magics in code using the ipmagic() function, which IPython
399 You can also call magics in code using the ipmagic() function, which IPython
400 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
400 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
401
401
402 For a list of the available magic functions, use %lsmagic. For a description
402 For a list of the available magic functions, use %lsmagic. For a description
403 of any of them, type %magic_name?, e.g. '%cd?'.
403 of any of them, type %magic_name?, e.g. '%cd?'.
404
404
405 Currently the magic system has the following functions:\n"""
405 Currently the magic system has the following functions:\n"""
406
406
407 mesc = self.shell.ESC_MAGIC
407 mesc = self.shell.ESC_MAGIC
408 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
408 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
409 "\n\n%s%s\n\n%s" % (outmsg,
409 "\n\n%s%s\n\n%s" % (outmsg,
410 magic_docs,mesc,mesc,
410 magic_docs,mesc,mesc,
411 (' '+mesc).join(self.lsmagic()),
411 (' '+mesc).join(self.lsmagic()),
412 Magic.auto_status[self.shell.rc.automagic] ) )
412 Magic.auto_status[self.shell.rc.automagic] ) )
413
413
414 page(outmsg,screen_lines=self.shell.rc.screen_length)
414 page(outmsg,screen_lines=self.shell.rc.screen_length)
415
415
416 def magic_automagic(self, parameter_s = ''):
416 def magic_automagic(self, parameter_s = ''):
417 """Make magic functions callable without having to type the initial %.
417 """Make magic functions callable without having to type the initial %.
418
418
419 Toggles on/off (when off, you must call it as %automagic, of
419 Toggles on/off (when off, you must call it as %automagic, of
420 course). Note that magic functions have lowest priority, so if there's
420 course). Note that magic functions have lowest priority, so if there's
421 a variable whose name collides with that of a magic fn, automagic
421 a variable whose name collides with that of a magic fn, automagic
422 won't work for that function (you get the variable instead). However,
422 won't work for that function (you get the variable instead). However,
423 if you delete the variable (del var), the previously shadowed magic
423 if you delete the variable (del var), the previously shadowed magic
424 function becomes visible to automagic again."""
424 function becomes visible to automagic again."""
425
425
426 rc = self.shell.rc
426 rc = self.shell.rc
427 rc.automagic = not rc.automagic
427 rc.automagic = not rc.automagic
428 print '\n' + Magic.auto_status[rc.automagic]
428 print '\n' + Magic.auto_status[rc.automagic]
429
429
430 def magic_autocall(self, parameter_s = ''):
430 def magic_autocall(self, parameter_s = ''):
431 """Make functions callable without having to type parentheses.
431 """Make functions callable without having to type parentheses.
432
432
433 Usage:
433 Usage:
434
434
435 %autocall [mode]
435 %autocall [mode]
436
436
437 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
437 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
438 value is toggled on and off (remembering the previous state)."""
438 value is toggled on and off (remembering the previous state)."""
439
439
440 rc = self.shell.rc
440 rc = self.shell.rc
441
441
442 if parameter_s:
442 if parameter_s:
443 arg = int(parameter_s)
443 arg = int(parameter_s)
444 else:
444 else:
445 arg = 'toggle'
445 arg = 'toggle'
446
446
447 if not arg in (0,1,2,'toggle'):
447 if not arg in (0,1,2,'toggle'):
448 error('Valid modes: (0->Off, 1->Smart, 2->Full')
448 error('Valid modes: (0->Off, 1->Smart, 2->Full')
449 return
449 return
450
450
451 if arg in (0,1,2):
451 if arg in (0,1,2):
452 rc.autocall = arg
452 rc.autocall = arg
453 else: # toggle
453 else: # toggle
454 if rc.autocall:
454 if rc.autocall:
455 self._magic_state.autocall_save = rc.autocall
455 self._magic_state.autocall_save = rc.autocall
456 rc.autocall = 0
456 rc.autocall = 0
457 else:
457 else:
458 try:
458 try:
459 rc.autocall = self._magic_state.autocall_save
459 rc.autocall = self._magic_state.autocall_save
460 except AttributeError:
460 except AttributeError:
461 rc.autocall = self._magic_state.autocall_save = 1
461 rc.autocall = self._magic_state.autocall_save = 1
462
462
463 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
463 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
464
464
465 def magic_autoindent(self, parameter_s = ''):
465 def magic_autoindent(self, parameter_s = ''):
466 """Toggle autoindent on/off (if available)."""
466 """Toggle autoindent on/off (if available)."""
467
467
468 self.shell.set_autoindent()
468 self.shell.set_autoindent()
469 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
469 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
470
470
471 def magic_system_verbose(self, parameter_s = ''):
471 def magic_system_verbose(self, parameter_s = ''):
472 """Toggle verbose printing of system calls on/off."""
472 """Toggle verbose printing of system calls on/off."""
473
473
474 self.shell.rc_set_toggle('system_verbose')
474 self.shell.rc_set_toggle('system_verbose')
475 print "System verbose printing is:",\
475 print "System verbose printing is:",\
476 ['OFF','ON'][self.shell.rc.system_verbose]
476 ['OFF','ON'][self.shell.rc.system_verbose]
477
477
478 def magic_history(self, parameter_s = ''):
478 def magic_history(self, parameter_s = ''):
479 """Print input history (_i<n> variables), with most recent last.
479 """Print input history (_i<n> variables), with most recent last.
480
480
481 %history [-n] -> print at most 40 inputs (some may be multi-line)\\
481 %history [-n] -> print at most 40 inputs (some may be multi-line)\\
482 %history [-n] n -> print at most n inputs\\
482 %history [-n] n -> print at most n inputs\\
483 %history [-n] n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
483 %history [-n] n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
484
484
485 Each input's number <n> is shown, and is accessible as the
485 Each input's number <n> is shown, and is accessible as the
486 automatically generated variable _i<n>. Multi-line statements are
486 automatically generated variable _i<n>. Multi-line statements are
487 printed starting at a new line for easy copy/paste.
487 printed starting at a new line for easy copy/paste.
488
488
489 If option -n is used, input numbers are not printed. This is useful if
489 If option -n is used, input numbers are not printed. This is useful if
490 you want to get a printout of many lines which can be directly pasted
490 you want to get a printout of many lines which can be directly pasted
491 into a text editor.
491 into a text editor.
492
492
493 This feature is only available if numbered prompts are in use."""
493 This feature is only available if numbered prompts are in use."""
494
494
495 shell = self.shell
495 shell = self.shell
496 if not shell.outputcache.do_full_cache:
496 if not shell.outputcache.do_full_cache:
497 print 'This feature is only available if numbered prompts are in use.'
497 print 'This feature is only available if numbered prompts are in use.'
498 return
498 return
499 opts,args = self.parse_options(parameter_s,'n',mode='list')
499 opts,args = self.parse_options(parameter_s,'n',mode='list')
500
500
501 input_hist = shell.input_hist
501 input_hist = shell.input_hist
502 default_length = 40
502 default_length = 40
503 if len(args) == 0:
503 if len(args) == 0:
504 final = len(input_hist)
504 final = len(input_hist)
505 init = max(1,final-default_length)
505 init = max(1,final-default_length)
506 elif len(args) == 1:
506 elif len(args) == 1:
507 final = len(input_hist)
507 final = len(input_hist)
508 init = max(1,final-int(args[0]))
508 init = max(1,final-int(args[0]))
509 elif len(args) == 2:
509 elif len(args) == 2:
510 init,final = map(int,args)
510 init,final = map(int,args)
511 else:
511 else:
512 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
512 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
513 print self.magic_hist.__doc__
513 print self.magic_hist.__doc__
514 return
514 return
515 width = len(str(final))
515 width = len(str(final))
516 line_sep = ['','\n']
516 line_sep = ['','\n']
517 print_nums = not opts.has_key('n')
517 print_nums = not opts.has_key('n')
518 for in_num in range(init,final):
518 for in_num in range(init,final):
519 inline = input_hist[in_num]
519 inline = input_hist[in_num]
520 multiline = int(inline.count('\n') > 1)
520 multiline = int(inline.count('\n') > 1)
521 if print_nums:
521 if print_nums:
522 print '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
522 print '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
523 print inline,
523 print inline,
524
524
525 def magic_hist(self, parameter_s=''):
525 def magic_hist(self, parameter_s=''):
526 """Alternate name for %history."""
526 """Alternate name for %history."""
527 return self.magic_history(parameter_s)
527 return self.magic_history(parameter_s)
528
528
529 def magic_p(self, parameter_s=''):
529 def magic_p(self, parameter_s=''):
530 """Just a short alias for Python's 'print'."""
530 """Just a short alias for Python's 'print'."""
531 exec 'print ' + parameter_s in self.shell.user_ns
531 exec 'print ' + parameter_s in self.shell.user_ns
532
532
533 def magic_r(self, parameter_s=''):
533 def magic_r(self, parameter_s=''):
534 """Repeat previous input.
534 """Repeat previous input.
535
535
536 If given an argument, repeats the previous command which starts with
536 If given an argument, repeats the previous command which starts with
537 the same string, otherwise it just repeats the previous input.
537 the same string, otherwise it just repeats the previous input.
538
538
539 Shell escaped commands (with ! as first character) are not recognized
539 Shell escaped commands (with ! as first character) are not recognized
540 by this system, only pure python code and magic commands.
540 by this system, only pure python code and magic commands.
541 """
541 """
542
542
543 start = parameter_s.strip()
543 start = parameter_s.strip()
544 esc_magic = self.shell.ESC_MAGIC
544 esc_magic = self.shell.ESC_MAGIC
545 # Identify magic commands even if automagic is on (which means
545 # Identify magic commands even if automagic is on (which means
546 # the in-memory version is different from that typed by the user).
546 # the in-memory version is different from that typed by the user).
547 if self.shell.rc.automagic:
547 if self.shell.rc.automagic:
548 start_magic = esc_magic+start
548 start_magic = esc_magic+start
549 else:
549 else:
550 start_magic = start
550 start_magic = start
551 # Look through the input history in reverse
551 # Look through the input history in reverse
552 for n in range(len(self.shell.input_hist)-2,0,-1):
552 for n in range(len(self.shell.input_hist)-2,0,-1):
553 input = self.shell.input_hist[n]
553 input = self.shell.input_hist[n]
554 # skip plain 'r' lines so we don't recurse to infinity
554 # skip plain 'r' lines so we don't recurse to infinity
555 if input != 'ipmagic("r")\n' and \
555 if input != 'ipmagic("r")\n' and \
556 (input.startswith(start) or input.startswith(start_magic)):
556 (input.startswith(start) or input.startswith(start_magic)):
557 #print 'match',`input` # dbg
557 #print 'match',`input` # dbg
558 print 'Executing:',input,
558 print 'Executing:',input,
559 self.shell.runlines(input)
559 self.shell.runlines(input)
560 return
560 return
561 print 'No previous input matching `%s` found.' % start
561 print 'No previous input matching `%s` found.' % start
562
562
563 def magic_page(self, parameter_s=''):
563 def magic_page(self, parameter_s=''):
564 """Pretty print the object and display it through a pager.
564 """Pretty print the object and display it through a pager.
565
565
566 If no parameter is given, use _ (last output)."""
566 If no parameter is given, use _ (last output)."""
567 # After a function contributed by Olivier Aubert, slightly modified.
567 # After a function contributed by Olivier Aubert, slightly modified.
568
568
569 oname = parameter_s and parameter_s or '_'
569 oname = parameter_s and parameter_s or '_'
570 info = self._ofind(oname)
570 info = self._ofind(oname)
571 if info['found']:
571 if info['found']:
572 page(pformat(info['obj']))
572 page(pformat(info['obj']))
573 else:
573 else:
574 print 'Object `%s` not found' % oname
574 print 'Object `%s` not found' % oname
575
575
576 def magic_profile(self, parameter_s=''):
576 def magic_profile(self, parameter_s=''):
577 """Print your currently active IPyhton profile."""
577 """Print your currently active IPyhton profile."""
578 if self.shell.rc.profile:
578 if self.shell.rc.profile:
579 printpl('Current IPython profile: $self.shell.rc.profile.')
579 printpl('Current IPython profile: $self.shell.rc.profile.')
580 else:
580 else:
581 print 'No profile active.'
581 print 'No profile active.'
582
582
583 def _inspect(self,meth,oname,**kw):
583 def _inspect(self,meth,oname,**kw):
584 """Generic interface to the inspector system.
584 """Generic interface to the inspector system.
585
585
586 This function is meant to be called by pdef, pdoc & friends."""
586 This function is meant to be called by pdef, pdoc & friends."""
587
587
588 oname = oname.strip()
588 oname = oname.strip()
589 info = Struct(self._ofind(oname))
589 info = Struct(self._ofind(oname))
590 if info.found:
590 if info.found:
591 pmethod = getattr(self.shell.inspector,meth)
591 pmethod = getattr(self.shell.inspector,meth)
592 formatter = info.ismagic and self.format_screen or None
592 formatter = info.ismagic and self.format_screen or None
593 if meth == 'pdoc':
593 if meth == 'pdoc':
594 pmethod(info.obj,oname,formatter)
594 pmethod(info.obj,oname,formatter)
595 elif meth == 'pinfo':
595 elif meth == 'pinfo':
596 pmethod(info.obj,oname,formatter,info,**kw)
596 pmethod(info.obj,oname,formatter,info,**kw)
597 else:
597 else:
598 pmethod(info.obj,oname)
598 pmethod(info.obj,oname)
599 else:
599 else:
600 print 'Object `%s` not found.' % oname
600 print 'Object `%s` not found.' % oname
601 return 'not found' # so callers can take other action
601 return 'not found' # so callers can take other action
602
602
603 def magic_pdef(self, parameter_s=''):
603 def magic_pdef(self, parameter_s=''):
604 """Print the definition header for any callable object.
604 """Print the definition header for any callable object.
605
605
606 If the object is a class, print the constructor information."""
606 If the object is a class, print the constructor information."""
607 self._inspect('pdef',parameter_s)
607 self._inspect('pdef',parameter_s)
608
608
609 def magic_pdoc(self, parameter_s=''):
609 def magic_pdoc(self, parameter_s=''):
610 """Print the docstring for an object.
610 """Print the docstring for an object.
611
611
612 If the given object is a class, it will print both the class and the
612 If the given object is a class, it will print both the class and the
613 constructor docstrings."""
613 constructor docstrings."""
614 self._inspect('pdoc',parameter_s)
614 self._inspect('pdoc',parameter_s)
615
615
616 def magic_psource(self, parameter_s=''):
616 def magic_psource(self, parameter_s=''):
617 """Print (or run through pager) the source code for an object."""
617 """Print (or run through pager) the source code for an object."""
618 self._inspect('psource',parameter_s)
618 self._inspect('psource',parameter_s)
619
619
620 def magic_pfile(self, parameter_s=''):
620 def magic_pfile(self, parameter_s=''):
621 """Print (or run through pager) the file where an object is defined.
621 """Print (or run through pager) the file where an object is defined.
622
622
623 The file opens at the line where the object definition begins. IPython
623 The file opens at the line where the object definition begins. IPython
624 will honor the environment variable PAGER if set, and otherwise will
624 will honor the environment variable PAGER if set, and otherwise will
625 do its best to print the file in a convenient form.
625 do its best to print the file in a convenient form.
626
626
627 If the given argument is not an object currently defined, IPython will
627 If the given argument is not an object currently defined, IPython will
628 try to interpret it as a filename (automatically adding a .py extension
628 try to interpret it as a filename (automatically adding a .py extension
629 if needed). You can thus use %pfile as a syntax highlighting code
629 if needed). You can thus use %pfile as a syntax highlighting code
630 viewer."""
630 viewer."""
631
631
632 # first interpret argument as an object name
632 # first interpret argument as an object name
633 out = self._inspect('pfile',parameter_s)
633 out = self._inspect('pfile',parameter_s)
634 # if not, try the input as a filename
634 # if not, try the input as a filename
635 if out == 'not found':
635 if out == 'not found':
636 try:
636 try:
637 filename = get_py_filename(parameter_s)
637 filename = get_py_filename(parameter_s)
638 except IOError,msg:
638 except IOError,msg:
639 print msg
639 print msg
640 return
640 return
641 page(self.shell.inspector.format(file(filename).read()))
641 page(self.shell.inspector.format(file(filename).read()))
642
642
643 def magic_pinfo(self, parameter_s=''):
643 def magic_pinfo(self, parameter_s=''):
644 """Provide detailed information about an object.
644 """Provide detailed information about an object.
645
645
646 '%pinfo object' is just a synonym for object? or ?object."""
646 '%pinfo object' is just a synonym for object? or ?object."""
647
647
648 #print 'pinfo par: <%s>' % parameter_s # dbg
648 #print 'pinfo par: <%s>' % parameter_s # dbg
649
649
650 # detail_level: 0 -> obj? , 1 -> obj??
650 # detail_level: 0 -> obj? , 1 -> obj??
651 detail_level = 0
651 detail_level = 0
652 # We need to detect if we got called as 'pinfo pinfo foo', which can
652 # We need to detect if we got called as 'pinfo pinfo foo', which can
653 # happen if the user types 'pinfo foo?' at the cmd line.
653 # happen if the user types 'pinfo foo?' at the cmd line.
654 pinfo,qmark1,oname,qmark2 = \
654 pinfo,qmark1,oname,qmark2 = \
655 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
655 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
656 if pinfo or qmark1 or qmark2:
656 if pinfo or qmark1 or qmark2:
657 detail_level = 1
657 detail_level = 1
658 if "*" in oname:
658 if "*" in oname:
659 self.magic_psearch(oname)
659 self.magic_psearch(oname)
660 else:
660 else:
661 self._inspect('pinfo',oname,detail_level=detail_level)
661 self._inspect('pinfo',oname,detail_level=detail_level)
662
662
663 def magic_psearch(self, parameter_s=''):
663 def magic_psearch(self, parameter_s=''):
664 """Search for object in namespaces by wildcard.
664 """Search for object in namespaces by wildcard.
665
665
666 %psearch [options] PATTERN [OBJECT TYPE]
666 %psearch [options] PATTERN [OBJECT TYPE]
667
667
668 Note: ? can be used as a synonym for %psearch, at the beginning or at
668 Note: ? can be used as a synonym for %psearch, at the beginning or at
669 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
669 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
670 rest of the command line must be unchanged (options come first), so
670 rest of the command line must be unchanged (options come first), so
671 for example the following forms are equivalent
671 for example the following forms are equivalent
672
672
673 %psearch -i a* function
673 %psearch -i a* function
674 -i a* function?
674 -i a* function?
675 ?-i a* function
675 ?-i a* function
676
676
677 Arguments:
677 Arguments:
678
678
679 PATTERN
679 PATTERN
680
680
681 where PATTERN is a string containing * as a wildcard similar to its
681 where PATTERN is a string containing * as a wildcard similar to its
682 use in a shell. The pattern is matched in all namespaces on the
682 use in a shell. The pattern is matched in all namespaces on the
683 search path. By default objects starting with a single _ are not
683 search path. By default objects starting with a single _ are not
684 matched, many IPython generated objects have a single
684 matched, many IPython generated objects have a single
685 underscore. The default is case insensitive matching. Matching is
685 underscore. The default is case insensitive matching. Matching is
686 also done on the attributes of objects and not only on the objects
686 also done on the attributes of objects and not only on the objects
687 in a module.
687 in a module.
688
688
689 [OBJECT TYPE]
689 [OBJECT TYPE]
690
690
691 Is the name of a python type from the types module. The name is
691 Is the name of a python type from the types module. The name is
692 given in lowercase without the ending type, ex. StringType is
692 given in lowercase without the ending type, ex. StringType is
693 written string. By adding a type here only objects matching the
693 written string. By adding a type here only objects matching the
694 given type are matched. Using all here makes the pattern match all
694 given type are matched. Using all here makes the pattern match all
695 types (this is the default).
695 types (this is the default).
696
696
697 Options:
697 Options:
698
698
699 -a: makes the pattern match even objects whose names start with a
699 -a: makes the pattern match even objects whose names start with a
700 single underscore. These names are normally ommitted from the
700 single underscore. These names are normally ommitted from the
701 search.
701 search.
702
702
703 -i/-c: make the pattern case insensitive/sensitive. If neither of
703 -i/-c: make the pattern case insensitive/sensitive. If neither of
704 these options is given, the default is read from your ipythonrc
704 these options is given, the default is read from your ipythonrc
705 file. The option name which sets this value is
705 file. The option name which sets this value is
706 'wildcards_case_sensitive'. If this option is not specified in your
706 'wildcards_case_sensitive'. If this option is not specified in your
707 ipythonrc file, IPython's internal default is to do a case sensitive
707 ipythonrc file, IPython's internal default is to do a case sensitive
708 search.
708 search.
709
709
710 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
710 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
711 specifiy can be searched in any of the following namespaces:
711 specifiy can be searched in any of the following namespaces:
712 'builtin', 'user', 'user_global','internal', 'alias', where
712 'builtin', 'user', 'user_global','internal', 'alias', where
713 'builtin' and 'user' are the search defaults. Note that you should
713 'builtin' and 'user' are the search defaults. Note that you should
714 not use quotes when specifying namespaces.
714 not use quotes when specifying namespaces.
715
715
716 'Builtin' contains the python module builtin, 'user' contains all
716 'Builtin' contains the python module builtin, 'user' contains all
717 user data, 'alias' only contain the shell aliases and no python
717 user data, 'alias' only contain the shell aliases and no python
718 objects, 'internal' contains objects used by IPython. The
718 objects, 'internal' contains objects used by IPython. The
719 'user_global' namespace is only used by embedded IPython instances,
719 'user_global' namespace is only used by embedded IPython instances,
720 and it contains module-level globals. You can add namespaces to the
720 and it contains module-level globals. You can add namespaces to the
721 search with -s or exclude them with -e (these options can be given
721 search with -s or exclude them with -e (these options can be given
722 more than once).
722 more than once).
723
723
724 Examples:
724 Examples:
725
725
726 %psearch a* -> objects beginning with an a
726 %psearch a* -> objects beginning with an a
727 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
727 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
728 %psearch a* function -> all functions beginning with an a
728 %psearch a* function -> all functions beginning with an a
729 %psearch re.e* -> objects beginning with an e in module re
729 %psearch re.e* -> objects beginning with an e in module re
730 %psearch r*.e* -> objects that start with e in modules starting in r
730 %psearch r*.e* -> objects that start with e in modules starting in r
731 %psearch r*.* string -> all strings in modules beginning with r
731 %psearch r*.* string -> all strings in modules beginning with r
732
732
733 Case sensitve search:
733 Case sensitve search:
734
734
735 %psearch -c a* list all object beginning with lower case a
735 %psearch -c a* list all object beginning with lower case a
736
736
737 Show objects beginning with a single _:
737 Show objects beginning with a single _:
738
738
739 %psearch -a _* list objects beginning with a single underscore"""
739 %psearch -a _* list objects beginning with a single underscore"""
740
740
741 # default namespaces to be searched
741 # default namespaces to be searched
742 def_search = ['user','builtin']
742 def_search = ['user','builtin']
743
743
744 # Process options/args
744 # Process options/args
745 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
745 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
746 opt = opts.get
746 opt = opts.get
747 shell = self.shell
747 shell = self.shell
748 psearch = shell.inspector.psearch
748 psearch = shell.inspector.psearch
749
749
750 # select case options
750 # select case options
751 if opts.has_key('i'):
751 if opts.has_key('i'):
752 ignore_case = True
752 ignore_case = True
753 elif opts.has_key('c'):
753 elif opts.has_key('c'):
754 ignore_case = False
754 ignore_case = False
755 else:
755 else:
756 ignore_case = not shell.rc.wildcards_case_sensitive
756 ignore_case = not shell.rc.wildcards_case_sensitive
757
757
758 # Build list of namespaces to search from user options
758 # Build list of namespaces to search from user options
759 def_search.extend(opt('s',[]))
759 def_search.extend(opt('s',[]))
760 ns_exclude = ns_exclude=opt('e',[])
760 ns_exclude = ns_exclude=opt('e',[])
761 ns_search = [nm for nm in def_search if nm not in ns_exclude]
761 ns_search = [nm for nm in def_search if nm not in ns_exclude]
762
762
763 # Call the actual search
763 # Call the actual search
764 try:
764 try:
765 psearch(args,shell.ns_table,ns_search,
765 psearch(args,shell.ns_table,ns_search,
766 show_all=opt('a'),ignore_case=ignore_case)
766 show_all=opt('a'),ignore_case=ignore_case)
767 except:
767 except:
768 shell.showtraceback()
768 shell.showtraceback()
769
769
770 def magic_who_ls(self, parameter_s=''):
770 def magic_who_ls(self, parameter_s=''):
771 """Return a sorted list of all interactive variables.
771 """Return a sorted list of all interactive variables.
772
772
773 If arguments are given, only variables of types matching these
773 If arguments are given, only variables of types matching these
774 arguments are returned."""
774 arguments are returned."""
775
775
776 user_ns = self.shell.user_ns
776 user_ns = self.shell.user_ns
777 internal_ns = self.shell.internal_ns
777 internal_ns = self.shell.internal_ns
778 user_config_ns = self.shell.user_config_ns
778 user_config_ns = self.shell.user_config_ns
779 out = []
779 out = []
780 typelist = parameter_s.split()
780 typelist = parameter_s.split()
781
781
782 for i in user_ns:
782 for i in user_ns:
783 if not (i.startswith('_') or i.startswith('_i')) \
783 if not (i.startswith('_') or i.startswith('_i')) \
784 and not (i in internal_ns or i in user_config_ns):
784 and not (i in internal_ns or i in user_config_ns):
785 if typelist:
785 if typelist:
786 if type(user_ns[i]).__name__ in typelist:
786 if type(user_ns[i]).__name__ in typelist:
787 out.append(i)
787 out.append(i)
788 else:
788 else:
789 out.append(i)
789 out.append(i)
790 out.sort()
790 out.sort()
791 return out
791 return out
792
792
793 def magic_who(self, parameter_s=''):
793 def magic_who(self, parameter_s=''):
794 """Print all interactive variables, with some minimal formatting.
794 """Print all interactive variables, with some minimal formatting.
795
795
796 If any arguments are given, only variables whose type matches one of
796 If any arguments are given, only variables whose type matches one of
797 these are printed. For example:
797 these are printed. For example:
798
798
799 %who function str
799 %who function str
800
800
801 will only list functions and strings, excluding all other types of
801 will only list functions and strings, excluding all other types of
802 variables. To find the proper type names, simply use type(var) at a
802 variables. To find the proper type names, simply use type(var) at a
803 command line to see how python prints type names. For example:
803 command line to see how python prints type names. For example:
804
804
805 In [1]: type('hello')\\
805 In [1]: type('hello')\\
806 Out[1]: <type 'str'>
806 Out[1]: <type 'str'>
807
807
808 indicates that the type name for strings is 'str'.
808 indicates that the type name for strings is 'str'.
809
809
810 %who always excludes executed names loaded through your configuration
810 %who always excludes executed names loaded through your configuration
811 file and things which are internal to IPython.
811 file and things which are internal to IPython.
812
812
813 This is deliberate, as typically you may load many modules and the
813 This is deliberate, as typically you may load many modules and the
814 purpose of %who is to show you only what you've manually defined."""
814 purpose of %who is to show you only what you've manually defined."""
815
815
816 varlist = self.magic_who_ls(parameter_s)
816 varlist = self.magic_who_ls(parameter_s)
817 if not varlist:
817 if not varlist:
818 print 'Interactive namespace is empty.'
818 print 'Interactive namespace is empty.'
819 return
819 return
820
820
821 # if we have variables, move on...
821 # if we have variables, move on...
822
822
823 # stupid flushing problem: when prompts have no separators, stdout is
823 # stupid flushing problem: when prompts have no separators, stdout is
824 # getting lost. I'm starting to think this is a python bug. I'm having
824 # getting lost. I'm starting to think this is a python bug. I'm having
825 # to force a flush with a print because even a sys.stdout.flush
825 # to force a flush with a print because even a sys.stdout.flush
826 # doesn't seem to do anything!
826 # doesn't seem to do anything!
827
827
828 count = 0
828 count = 0
829 for i in varlist:
829 for i in varlist:
830 print i+'\t',
830 print i+'\t',
831 count += 1
831 count += 1
832 if count > 8:
832 if count > 8:
833 count = 0
833 count = 0
834 print
834 print
835 sys.stdout.flush() # FIXME. Why the hell isn't this flushing???
835 sys.stdout.flush() # FIXME. Why the hell isn't this flushing???
836
836
837 print # well, this does force a flush at the expense of an extra \n
837 print # well, this does force a flush at the expense of an extra \n
838
838
839 def magic_whos(self, parameter_s=''):
839 def magic_whos(self, parameter_s=''):
840 """Like %who, but gives some extra information about each variable.
840 """Like %who, but gives some extra information about each variable.
841
841
842 The same type filtering of %who can be applied here.
842 The same type filtering of %who can be applied here.
843
843
844 For all variables, the type is printed. Additionally it prints:
844 For all variables, the type is printed. Additionally it prints:
845
845
846 - For {},[],(): their length.
846 - For {},[],(): their length.
847
847
848 - For Numeric arrays, a summary with shape, number of elements,
848 - For Numeric arrays, a summary with shape, number of elements,
849 typecode and size in memory.
849 typecode and size in memory.
850
850
851 - Everything else: a string representation, snipping their middle if
851 - Everything else: a string representation, snipping their middle if
852 too long."""
852 too long."""
853
853
854 varnames = self.magic_who_ls(parameter_s)
854 varnames = self.magic_who_ls(parameter_s)
855 if not varnames:
855 if not varnames:
856 print 'Interactive namespace is empty.'
856 print 'Interactive namespace is empty.'
857 return
857 return
858
858
859 # if we have variables, move on...
859 # if we have variables, move on...
860
860
861 # for these types, show len() instead of data:
861 # for these types, show len() instead of data:
862 seq_types = [types.DictType,types.ListType,types.TupleType]
862 seq_types = [types.DictType,types.ListType,types.TupleType]
863
863
864 # for Numeric arrays, display summary info
864 # for Numeric arrays, display summary info
865 try:
865 try:
866 import Numeric
866 import Numeric
867 except ImportError:
867 except ImportError:
868 array_type = None
868 array_type = None
869 else:
869 else:
870 array_type = Numeric.ArrayType.__name__
870 array_type = Numeric.ArrayType.__name__
871
871
872 # Find all variable names and types so we can figure out column sizes
872 # Find all variable names and types so we can figure out column sizes
873 get_vars = lambda i: self.shell.user_ns[i]
873 get_vars = lambda i: self.shell.user_ns[i]
874 type_name = lambda v: type(v).__name__
874 type_name = lambda v: type(v).__name__
875 varlist = map(get_vars,varnames)
875 varlist = map(get_vars,varnames)
876
876
877 typelist = []
877 typelist = []
878 for vv in varlist:
878 for vv in varlist:
879 tt = type_name(vv)
879 tt = type_name(vv)
880 if tt=='instance':
880 if tt=='instance':
881 typelist.append(str(vv.__class__))
881 typelist.append(str(vv.__class__))
882 else:
882 else:
883 typelist.append(tt)
883 typelist.append(tt)
884
884
885 # column labels and # of spaces as separator
885 # column labels and # of spaces as separator
886 varlabel = 'Variable'
886 varlabel = 'Variable'
887 typelabel = 'Type'
887 typelabel = 'Type'
888 datalabel = 'Data/Info'
888 datalabel = 'Data/Info'
889 colsep = 3
889 colsep = 3
890 # variable format strings
890 # variable format strings
891 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
891 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
892 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
892 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
893 aformat = "%s: %s elems, type `%s`, %s bytes"
893 aformat = "%s: %s elems, type `%s`, %s bytes"
894 # find the size of the columns to format the output nicely
894 # find the size of the columns to format the output nicely
895 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
895 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
896 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
896 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
897 # table header
897 # table header
898 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
898 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
899 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
899 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
900 # and the table itself
900 # and the table itself
901 kb = 1024
901 kb = 1024
902 Mb = 1048576 # kb**2
902 Mb = 1048576 # kb**2
903 for vname,var,vtype in zip(varnames,varlist,typelist):
903 for vname,var,vtype in zip(varnames,varlist,typelist):
904 print itpl(vformat),
904 print itpl(vformat),
905 if vtype in seq_types:
905 if vtype in seq_types:
906 print len(var)
906 print len(var)
907 elif vtype==array_type:
907 elif vtype==array_type:
908 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
908 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
909 vsize = Numeric.size(var)
909 vsize = Numeric.size(var)
910 vbytes = vsize*var.itemsize()
910 vbytes = vsize*var.itemsize()
911 if vbytes < 100000:
911 if vbytes < 100000:
912 print aformat % (vshape,vsize,var.typecode(),vbytes)
912 print aformat % (vshape,vsize,var.typecode(),vbytes)
913 else:
913 else:
914 print aformat % (vshape,vsize,var.typecode(),vbytes),
914 print aformat % (vshape,vsize,var.typecode(),vbytes),
915 if vbytes < Mb:
915 if vbytes < Mb:
916 print '(%s kb)' % (vbytes/kb,)
916 print '(%s kb)' % (vbytes/kb,)
917 else:
917 else:
918 print '(%s Mb)' % (vbytes/Mb,)
918 print '(%s Mb)' % (vbytes/Mb,)
919 else:
919 else:
920 vstr = str(var).replace('\n','\\n')
920 vstr = str(var).replace('\n','\\n')
921 if len(vstr) < 50:
921 if len(vstr) < 50:
922 print vstr
922 print vstr
923 else:
923 else:
924 printpl(vfmt_short)
924 printpl(vfmt_short)
925
925
926 def magic_reset(self, parameter_s=''):
926 def magic_reset(self, parameter_s=''):
927 """Resets the namespace by removing all names defined by the user.
927 """Resets the namespace by removing all names defined by the user.
928
928
929 Input/Output history are left around in case you need them."""
929 Input/Output history are left around in case you need them."""
930
930
931 ans = raw_input(
931 ans = raw_input(
932 "Once deleted, variables cannot be recovered. Proceed (y/n)? ")
932 "Once deleted, variables cannot be recovered. Proceed (y/n)? ")
933 if not ans.lower() == 'y':
933 if not ans.lower() == 'y':
934 print 'Nothing done.'
934 print 'Nothing done.'
935 return
935 return
936 user_ns = self.shell.user_ns
936 user_ns = self.shell.user_ns
937 for i in self.magic_who_ls():
937 for i in self.magic_who_ls():
938 del(user_ns[i])
938 del(user_ns[i])
939
939
940 def magic_config(self,parameter_s=''):
940 def magic_config(self,parameter_s=''):
941 """Show IPython's internal configuration."""
941 """Show IPython's internal configuration."""
942
942
943 page('Current configuration structure:\n'+
943 page('Current configuration structure:\n'+
944 pformat(self.shell.rc.dict()))
944 pformat(self.shell.rc.dict()))
945
945
946 def magic_logstart(self,parameter_s=''):
946 def magic_logstart(self,parameter_s=''):
947 """Start logging anywhere in a session.
947 """Start logging anywhere in a session.
948
948
949 %logstart [-o|-t] [log_name [log_mode]]
949 %logstart [-o|-t] [log_name [log_mode]]
950
950
951 If no name is given, it defaults to a file named 'ipython_log.py' in your
951 If no name is given, it defaults to a file named 'ipython_log.py' in your
952 current directory, in 'rotate' mode (see below).
952 current directory, in 'rotate' mode (see below).
953
953
954 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
954 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
955 history up to that point and then continues logging.
955 history up to that point and then continues logging.
956
956
957 %logstart takes a second optional parameter: logging mode. This can be one
957 %logstart takes a second optional parameter: logging mode. This can be one
958 of (note that the modes are given unquoted):\\
958 of (note that the modes are given unquoted):\\
959 append: well, that says it.\\
959 append: well, that says it.\\
960 backup: rename (if exists) to name~ and start name.\\
960 backup: rename (if exists) to name~ and start name.\\
961 global: single logfile in your home dir, appended to.\\
961 global: single logfile in your home dir, appended to.\\
962 over : overwrite existing log.\\
962 over : overwrite existing log.\\
963 rotate: create rotating logs name.1~, name.2~, etc.
963 rotate: create rotating logs name.1~, name.2~, etc.
964
964
965 Options:
965 Options:
966
966
967 -o: log also IPython's output. In this mode, all commands which
967 -o: log also IPython's output. In this mode, all commands which
968 generate an Out[NN] prompt are recorded to the logfile, right after
968 generate an Out[NN] prompt are recorded to the logfile, right after
969 their corresponding input line. The output lines are always
969 their corresponding input line. The output lines are always
970 prepended with a '#[Out]# ' marker, so that the log remains valid
970 prepended with a '#[Out]# ' marker, so that the log remains valid
971 Python code.
971 Python code.
972
972
973 Since this marker is always the same, filtering only the output from
973 Since this marker is always the same, filtering only the output from
974 a log is very easy, using for example a simple awk call:
974 a log is very easy, using for example a simple awk call:
975
975
976 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
976 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
977
977
978 -t: put timestamps before each input line logged (these are put in
978 -t: put timestamps before each input line logged (these are put in
979 comments)."""
979 comments)."""
980
980
981 opts,par = self.parse_options(parameter_s,'ot')
981 opts,par = self.parse_options(parameter_s,'ot')
982 log_output = 'o' in opts
982 log_output = 'o' in opts
983 timestamp = 't' in opts
983 timestamp = 't' in opts
984
984
985 rc = self.shell.rc
985 rc = self.shell.rc
986 logger = self.shell.logger
986 logger = self.shell.logger
987
987
988 # if no args are given, the defaults set in the logger constructor by
988 # if no args are given, the defaults set in the logger constructor by
989 # ipytohn remain valid
989 # ipytohn remain valid
990 if par:
990 if par:
991 try:
991 try:
992 logfname,logmode = par.split()
992 logfname,logmode = par.split()
993 except:
993 except:
994 logfname = par
994 logfname = par
995 logmode = 'backup'
995 logmode = 'backup'
996 else:
996 else:
997 logfname = logger.logfname
997 logfname = logger.logfname
998 logmode = logger.logmode
998 logmode = logger.logmode
999 # put logfname into rc struct as if it had been called on the command
999 # put logfname into rc struct as if it had been called on the command
1000 # line, so it ends up saved in the log header Save it in case we need
1000 # line, so it ends up saved in the log header Save it in case we need
1001 # to restore it...
1001 # to restore it...
1002 old_logfile = rc.opts.get('logfile','')
1002 old_logfile = rc.opts.get('logfile','')
1003 if logfname:
1003 if logfname:
1004 logfname = os.path.expanduser(logfname)
1004 logfname = os.path.expanduser(logfname)
1005 rc.opts.logfile = logfname
1005 rc.opts.logfile = logfname
1006 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1006 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1007 try:
1007 try:
1008 started = logger.logstart(logfname,loghead,logmode,
1008 started = logger.logstart(logfname,loghead,logmode,
1009 log_output,timestamp)
1009 log_output,timestamp)
1010 except:
1010 except:
1011 rc.opts.logfile = old_logfile
1011 rc.opts.logfile = old_logfile
1012 warn("Couldn't start log: %s" % sys.exc_info()[1])
1012 warn("Couldn't start log: %s" % sys.exc_info()[1])
1013 else:
1013 else:
1014 # log input history up to this point, optionally interleaving
1014 # log input history up to this point, optionally interleaving
1015 # output if requested
1015 # output if requested
1016
1016
1017 if timestamp:
1017 if timestamp:
1018 # disable timestamping for the previous history, since we've
1018 # disable timestamping for the previous history, since we've
1019 # lost those already (no time machine here).
1019 # lost those already (no time machine here).
1020 logger.timestamp = False
1020 logger.timestamp = False
1021 if log_output:
1021 if log_output:
1022 log_write = logger.log_write
1022 log_write = logger.log_write
1023 input_hist = self.shell.input_hist
1023 input_hist = self.shell.input_hist
1024 output_hist = self.shell.output_hist
1024 output_hist = self.shell.output_hist
1025 for n in range(1,len(input_hist)-1):
1025 for n in range(1,len(input_hist)-1):
1026 log_write(input_hist[n].rstrip())
1026 log_write(input_hist[n].rstrip())
1027 if n in output_hist:
1027 if n in output_hist:
1028 log_write(repr(output_hist[n]),'output')
1028 log_write(repr(output_hist[n]),'output')
1029 else:
1029 else:
1030 logger.log_write(self.shell.input_hist[1:])
1030 logger.log_write(self.shell.input_hist[1:])
1031 if timestamp:
1031 if timestamp:
1032 # re-enable timestamping
1032 # re-enable timestamping
1033 logger.timestamp = True
1033 logger.timestamp = True
1034
1034
1035 print ('Activating auto-logging. '
1035 print ('Activating auto-logging. '
1036 'Current session state plus future input saved.')
1036 'Current session state plus future input saved.')
1037 logger.logstate()
1037 logger.logstate()
1038
1038
1039 def magic_logoff(self,parameter_s=''):
1039 def magic_logoff(self,parameter_s=''):
1040 """Temporarily stop logging.
1040 """Temporarily stop logging.
1041
1041
1042 You must have previously started logging."""
1042 You must have previously started logging."""
1043 self.shell.logger.switch_log(0)
1043 self.shell.logger.switch_log(0)
1044
1044
1045 def magic_logon(self,parameter_s=''):
1045 def magic_logon(self,parameter_s=''):
1046 """Restart logging.
1046 """Restart logging.
1047
1047
1048 This function is for restarting logging which you've temporarily
1048 This function is for restarting logging which you've temporarily
1049 stopped with %logoff. For starting logging for the first time, you
1049 stopped with %logoff. For starting logging for the first time, you
1050 must use the %logstart function, which allows you to specify an
1050 must use the %logstart function, which allows you to specify an
1051 optional log filename."""
1051 optional log filename."""
1052
1052
1053 self.shell.logger.switch_log(1)
1053 self.shell.logger.switch_log(1)
1054
1054
1055 def magic_logstate(self,parameter_s=''):
1055 def magic_logstate(self,parameter_s=''):
1056 """Print the status of the logging system."""
1056 """Print the status of the logging system."""
1057
1057
1058 self.shell.logger.logstate()
1058 self.shell.logger.logstate()
1059
1059
1060 def magic_pdb(self, parameter_s=''):
1060 def magic_pdb(self, parameter_s=''):
1061 """Control the calling of the pdb interactive debugger.
1061 """Control the calling of the pdb interactive debugger.
1062
1062
1063 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1063 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1064 argument it works as a toggle.
1064 argument it works as a toggle.
1065
1065
1066 When an exception is triggered, IPython can optionally call the
1066 When an exception is triggered, IPython can optionally call the
1067 interactive pdb debugger after the traceback printout. %pdb toggles
1067 interactive pdb debugger after the traceback printout. %pdb toggles
1068 this feature on and off."""
1068 this feature on and off."""
1069
1069
1070 par = parameter_s.strip().lower()
1070 par = parameter_s.strip().lower()
1071
1071
1072 if par:
1072 if par:
1073 try:
1073 try:
1074 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1074 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1075 except KeyError:
1075 except KeyError:
1076 print ('Incorrect argument. Use on/1, off/0, '
1076 print ('Incorrect argument. Use on/1, off/0, '
1077 'or nothing for a toggle.')
1077 'or nothing for a toggle.')
1078 return
1078 return
1079 else:
1079 else:
1080 # toggle
1080 # toggle
1081 new_pdb = not self.shell.InteractiveTB.call_pdb
1081 new_pdb = not self.shell.InteractiveTB.call_pdb
1082
1082
1083 # set on the shell
1083 # set on the shell
1084 self.shell.call_pdb = new_pdb
1084 self.shell.call_pdb = new_pdb
1085 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1085 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1086
1086
1087 def magic_prun(self, parameter_s ='',user_mode=1,
1087 def magic_prun(self, parameter_s ='',user_mode=1,
1088 opts=None,arg_lst=None,prog_ns=None):
1088 opts=None,arg_lst=None,prog_ns=None):
1089
1089
1090 """Run a statement through the python code profiler.
1090 """Run a statement through the python code profiler.
1091
1091
1092 Usage:\\
1092 Usage:\\
1093 %prun [options] statement
1093 %prun [options] statement
1094
1094
1095 The given statement (which doesn't require quote marks) is run via the
1095 The given statement (which doesn't require quote marks) is run via the
1096 python profiler in a manner similar to the profile.run() function.
1096 python profiler in a manner similar to the profile.run() function.
1097 Namespaces are internally managed to work correctly; profile.run
1097 Namespaces are internally managed to work correctly; profile.run
1098 cannot be used in IPython because it makes certain assumptions about
1098 cannot be used in IPython because it makes certain assumptions about
1099 namespaces which do not hold under IPython.
1099 namespaces which do not hold under IPython.
1100
1100
1101 Options:
1101 Options:
1102
1102
1103 -l <limit>: you can place restrictions on what or how much of the
1103 -l <limit>: you can place restrictions on what or how much of the
1104 profile gets printed. The limit value can be:
1104 profile gets printed. The limit value can be:
1105
1105
1106 * A string: only information for function names containing this string
1106 * A string: only information for function names containing this string
1107 is printed.
1107 is printed.
1108
1108
1109 * An integer: only these many lines are printed.
1109 * An integer: only these many lines are printed.
1110
1110
1111 * A float (between 0 and 1): this fraction of the report is printed
1111 * A float (between 0 and 1): this fraction of the report is printed
1112 (for example, use a limit of 0.4 to see the topmost 40% only).
1112 (for example, use a limit of 0.4 to see the topmost 40% only).
1113
1113
1114 You can combine several limits with repeated use of the option. For
1114 You can combine several limits with repeated use of the option. For
1115 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1115 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1116 information about class constructors.
1116 information about class constructors.
1117
1117
1118 -r: return the pstats.Stats object generated by the profiling. This
1118 -r: return the pstats.Stats object generated by the profiling. This
1119 object has all the information about the profile in it, and you can
1119 object has all the information about the profile in it, and you can
1120 later use it for further analysis or in other functions.
1120 later use it for further analysis or in other functions.
1121
1121
1122 Since magic functions have a particular form of calling which prevents
1122 Since magic functions have a particular form of calling which prevents
1123 you from writing something like:\\
1123 you from writing something like:\\
1124 In [1]: p = %prun -r print 4 # invalid!\\
1124 In [1]: p = %prun -r print 4 # invalid!\\
1125 you must instead use IPython's automatic variables to assign this:\\
1125 you must instead use IPython's automatic variables to assign this:\\
1126 In [1]: %prun -r print 4 \\
1126 In [1]: %prun -r print 4 \\
1127 Out[1]: <pstats.Stats instance at 0x8222cec>\\
1127 Out[1]: <pstats.Stats instance at 0x8222cec>\\
1128 In [2]: stats = _
1128 In [2]: stats = _
1129
1129
1130 If you really need to assign this value via an explicit function call,
1130 If you really need to assign this value via an explicit function call,
1131 you can always tap directly into the true name of the magic function
1131 you can always tap directly into the true name of the magic function
1132 by using the ipmagic function (which IPython automatically adds to the
1132 by using the ipmagic function (which IPython automatically adds to the
1133 builtins):\\
1133 builtins):\\
1134 In [3]: stats = ipmagic('prun','-r print 4')
1134 In [3]: stats = ipmagic('prun','-r print 4')
1135
1135
1136 You can type ipmagic? for more details on ipmagic.
1136 You can type ipmagic? for more details on ipmagic.
1137
1137
1138 -s <key>: sort profile by given key. You can provide more than one key
1138 -s <key>: sort profile by given key. You can provide more than one key
1139 by using the option several times: '-s key1 -s key2 -s key3...'. The
1139 by using the option several times: '-s key1 -s key2 -s key3...'. The
1140 default sorting key is 'time'.
1140 default sorting key is 'time'.
1141
1141
1142 The following is copied verbatim from the profile documentation
1142 The following is copied verbatim from the profile documentation
1143 referenced below:
1143 referenced below:
1144
1144
1145 When more than one key is provided, additional keys are used as
1145 When more than one key is provided, additional keys are used as
1146 secondary criteria when the there is equality in all keys selected
1146 secondary criteria when the there is equality in all keys selected
1147 before them.
1147 before them.
1148
1148
1149 Abbreviations can be used for any key names, as long as the
1149 Abbreviations can be used for any key names, as long as the
1150 abbreviation is unambiguous. The following are the keys currently
1150 abbreviation is unambiguous. The following are the keys currently
1151 defined:
1151 defined:
1152
1152
1153 Valid Arg Meaning\\
1153 Valid Arg Meaning\\
1154 "calls" call count\\
1154 "calls" call count\\
1155 "cumulative" cumulative time\\
1155 "cumulative" cumulative time\\
1156 "file" file name\\
1156 "file" file name\\
1157 "module" file name\\
1157 "module" file name\\
1158 "pcalls" primitive call count\\
1158 "pcalls" primitive call count\\
1159 "line" line number\\
1159 "line" line number\\
1160 "name" function name\\
1160 "name" function name\\
1161 "nfl" name/file/line\\
1161 "nfl" name/file/line\\
1162 "stdname" standard name\\
1162 "stdname" standard name\\
1163 "time" internal time
1163 "time" internal time
1164
1164
1165 Note that all sorts on statistics are in descending order (placing
1165 Note that all sorts on statistics are in descending order (placing
1166 most time consuming items first), where as name, file, and line number
1166 most time consuming items first), where as name, file, and line number
1167 searches are in ascending order (i.e., alphabetical). The subtle
1167 searches are in ascending order (i.e., alphabetical). The subtle
1168 distinction between "nfl" and "stdname" is that the standard name is a
1168 distinction between "nfl" and "stdname" is that the standard name is a
1169 sort of the name as printed, which means that the embedded line
1169 sort of the name as printed, which means that the embedded line
1170 numbers get compared in an odd way. For example, lines 3, 20, and 40
1170 numbers get compared in an odd way. For example, lines 3, 20, and 40
1171 would (if the file names were the same) appear in the string order
1171 would (if the file names were the same) appear in the string order
1172 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1172 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1173 line numbers. In fact, sort_stats("nfl") is the same as
1173 line numbers. In fact, sort_stats("nfl") is the same as
1174 sort_stats("name", "file", "line").
1174 sort_stats("name", "file", "line").
1175
1175
1176 -T <filename>: save profile results as shown on screen to a text
1176 -T <filename>: save profile results as shown on screen to a text
1177 file. The profile is still shown on screen.
1177 file. The profile is still shown on screen.
1178
1178
1179 -D <filename>: save (via dump_stats) profile statistics to given
1179 -D <filename>: save (via dump_stats) profile statistics to given
1180 filename. This data is in a format understod by the pstats module, and
1180 filename. This data is in a format understod by the pstats module, and
1181 is generated by a call to the dump_stats() method of profile
1181 is generated by a call to the dump_stats() method of profile
1182 objects. The profile is still shown on screen.
1182 objects. The profile is still shown on screen.
1183
1183
1184 If you want to run complete programs under the profiler's control, use
1184 If you want to run complete programs under the profiler's control, use
1185 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1185 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1186 contains profiler specific options as described here.
1186 contains profiler specific options as described here.
1187
1187
1188 You can read the complete documentation for the profile module with:\\
1188 You can read the complete documentation for the profile module with:\\
1189 In [1]: import profile; profile.help() """
1189 In [1]: import profile; profile.help() """
1190
1190
1191 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1191 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1192 # protect user quote marks
1192 # protect user quote marks
1193 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1193 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1194
1194
1195 if user_mode: # regular user call
1195 if user_mode: # regular user call
1196 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1196 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1197 list_all=1)
1197 list_all=1)
1198 namespace = self.shell.user_ns
1198 namespace = self.shell.user_ns
1199 else: # called to run a program by %run -p
1199 else: # called to run a program by %run -p
1200 try:
1200 try:
1201 filename = get_py_filename(arg_lst[0])
1201 filename = get_py_filename(arg_lst[0])
1202 except IOError,msg:
1202 except IOError,msg:
1203 error(msg)
1203 error(msg)
1204 return
1204 return
1205
1205
1206 arg_str = 'execfile(filename,prog_ns)'
1206 arg_str = 'execfile(filename,prog_ns)'
1207 namespace = locals()
1207 namespace = locals()
1208
1208
1209 opts.merge(opts_def)
1209 opts.merge(opts_def)
1210
1210
1211 prof = profile.Profile()
1211 prof = profile.Profile()
1212 try:
1212 try:
1213 prof = prof.runctx(arg_str,namespace,namespace)
1213 prof = prof.runctx(arg_str,namespace,namespace)
1214 sys_exit = ''
1214 sys_exit = ''
1215 except SystemExit:
1215 except SystemExit:
1216 sys_exit = """*** SystemExit exception caught in code being profiled."""
1216 sys_exit = """*** SystemExit exception caught in code being profiled."""
1217
1217
1218 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1218 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1219
1219
1220 lims = opts.l
1220 lims = opts.l
1221 if lims:
1221 if lims:
1222 lims = [] # rebuild lims with ints/floats/strings
1222 lims = [] # rebuild lims with ints/floats/strings
1223 for lim in opts.l:
1223 for lim in opts.l:
1224 try:
1224 try:
1225 lims.append(int(lim))
1225 lims.append(int(lim))
1226 except ValueError:
1226 except ValueError:
1227 try:
1227 try:
1228 lims.append(float(lim))
1228 lims.append(float(lim))
1229 except ValueError:
1229 except ValueError:
1230 lims.append(lim)
1230 lims.append(lim)
1231
1231
1232 # trap output
1232 # trap output
1233 sys_stdout = sys.stdout
1233 sys_stdout = sys.stdout
1234 stdout_trap = StringIO()
1234 stdout_trap = StringIO()
1235 try:
1235 try:
1236 sys.stdout = stdout_trap
1236 sys.stdout = stdout_trap
1237 stats.print_stats(*lims)
1237 stats.print_stats(*lims)
1238 finally:
1238 finally:
1239 sys.stdout = sys_stdout
1239 sys.stdout = sys_stdout
1240 output = stdout_trap.getvalue()
1240 output = stdout_trap.getvalue()
1241 output = output.rstrip()
1241 output = output.rstrip()
1242
1242
1243 page(output,screen_lines=self.shell.rc.screen_length)
1243 page(output,screen_lines=self.shell.rc.screen_length)
1244 print sys_exit,
1244 print sys_exit,
1245
1245
1246 dump_file = opts.D[0]
1246 dump_file = opts.D[0]
1247 text_file = opts.T[0]
1247 text_file = opts.T[0]
1248 if dump_file:
1248 if dump_file:
1249 prof.dump_stats(dump_file)
1249 prof.dump_stats(dump_file)
1250 print '\n*** Profile stats marshalled to file',\
1250 print '\n*** Profile stats marshalled to file',\
1251 `dump_file`+'.',sys_exit
1251 `dump_file`+'.',sys_exit
1252 if text_file:
1252 if text_file:
1253 file(text_file,'w').write(output)
1253 file(text_file,'w').write(output)
1254 print '\n*** Profile printout saved to text file',\
1254 print '\n*** Profile printout saved to text file',\
1255 `text_file`+'.',sys_exit
1255 `text_file`+'.',sys_exit
1256
1256
1257 if opts.has_key('r'):
1257 if opts.has_key('r'):
1258 return stats
1258 return stats
1259 else:
1259 else:
1260 return None
1260 return None
1261
1261
1262 def magic_run(self, parameter_s ='',runner=None):
1262 def magic_run(self, parameter_s ='',runner=None):
1263 """Run the named file inside IPython as a program.
1263 """Run the named file inside IPython as a program.
1264
1264
1265 Usage:\\
1265 Usage:\\
1266 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1266 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1267
1267
1268 Parameters after the filename are passed as command-line arguments to
1268 Parameters after the filename are passed as command-line arguments to
1269 the program (put in sys.argv). Then, control returns to IPython's
1269 the program (put in sys.argv). Then, control returns to IPython's
1270 prompt.
1270 prompt.
1271
1271
1272 This is similar to running at a system prompt:\\
1272 This is similar to running at a system prompt:\\
1273 $ python file args\\
1273 $ python file args\\
1274 but with the advantage of giving you IPython's tracebacks, and of
1274 but with the advantage of giving you IPython's tracebacks, and of
1275 loading all variables into your interactive namespace for further use
1275 loading all variables into your interactive namespace for further use
1276 (unless -p is used, see below).
1276 (unless -p is used, see below).
1277
1277
1278 The file is executed in a namespace initially consisting only of
1278 The file is executed in a namespace initially consisting only of
1279 __name__=='__main__' and sys.argv constructed as indicated. It thus
1279 __name__=='__main__' and sys.argv constructed as indicated. It thus
1280 sees its environment as if it were being run as a stand-alone
1280 sees its environment as if it were being run as a stand-alone
1281 program. But after execution, the IPython interactive namespace gets
1281 program. But after execution, the IPython interactive namespace gets
1282 updated with all variables defined in the program (except for __name__
1282 updated with all variables defined in the program (except for __name__
1283 and sys.argv). This allows for very convenient loading of code for
1283 and sys.argv). This allows for very convenient loading of code for
1284 interactive work, while giving each program a 'clean sheet' to run in.
1284 interactive work, while giving each program a 'clean sheet' to run in.
1285
1285
1286 Options:
1286 Options:
1287
1287
1288 -n: __name__ is NOT set to '__main__', but to the running file's name
1288 -n: __name__ is NOT set to '__main__', but to the running file's name
1289 without extension (as python does under import). This allows running
1289 without extension (as python does under import). This allows running
1290 scripts and reloading the definitions in them without calling code
1290 scripts and reloading the definitions in them without calling code
1291 protected by an ' if __name__ == "__main__" ' clause.
1291 protected by an ' if __name__ == "__main__" ' clause.
1292
1292
1293 -i: run the file in IPython's namespace instead of an empty one. This
1293 -i: run the file in IPython's namespace instead of an empty one. This
1294 is useful if you are experimenting with code written in a text editor
1294 is useful if you are experimenting with code written in a text editor
1295 which depends on variables defined interactively.
1295 which depends on variables defined interactively.
1296
1296
1297 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1297 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1298 being run. This is particularly useful if IPython is being used to
1298 being run. This is particularly useful if IPython is being used to
1299 run unittests, which always exit with a sys.exit() call. In such
1299 run unittests, which always exit with a sys.exit() call. In such
1300 cases you are interested in the output of the test results, not in
1300 cases you are interested in the output of the test results, not in
1301 seeing a traceback of the unittest module.
1301 seeing a traceback of the unittest module.
1302
1302
1303 -t: print timing information at the end of the run. IPython will give
1303 -t: print timing information at the end of the run. IPython will give
1304 you an estimated CPU time consumption for your script, which under
1304 you an estimated CPU time consumption for your script, which under
1305 Unix uses the resource module to avoid the wraparound problems of
1305 Unix uses the resource module to avoid the wraparound problems of
1306 time.clock(). Under Unix, an estimate of time spent on system tasks
1306 time.clock(). Under Unix, an estimate of time spent on system tasks
1307 is also given (for Windows platforms this is reported as 0.0).
1307 is also given (for Windows platforms this is reported as 0.0).
1308
1308
1309 If -t is given, an additional -N<N> option can be given, where <N>
1309 If -t is given, an additional -N<N> option can be given, where <N>
1310 must be an integer indicating how many times you want the script to
1310 must be an integer indicating how many times you want the script to
1311 run. The final timing report will include total and per run results.
1311 run. The final timing report will include total and per run results.
1312
1312
1313 For example (testing the script uniq_stable.py):
1313 For example (testing the script uniq_stable.py):
1314
1314
1315 In [1]: run -t uniq_stable
1315 In [1]: run -t uniq_stable
1316
1316
1317 IPython CPU timings (estimated):\\
1317 IPython CPU timings (estimated):\\
1318 User : 0.19597 s.\\
1318 User : 0.19597 s.\\
1319 System: 0.0 s.\\
1319 System: 0.0 s.\\
1320
1320
1321 In [2]: run -t -N5 uniq_stable
1321 In [2]: run -t -N5 uniq_stable
1322
1322
1323 IPython CPU timings (estimated):\\
1323 IPython CPU timings (estimated):\\
1324 Total runs performed: 5\\
1324 Total runs performed: 5\\
1325 Times : Total Per run\\
1325 Times : Total Per run\\
1326 User : 0.910862 s, 0.1821724 s.\\
1326 User : 0.910862 s, 0.1821724 s.\\
1327 System: 0.0 s, 0.0 s.
1327 System: 0.0 s, 0.0 s.
1328
1328
1329 -d: run your program under the control of pdb, the Python debugger.
1329 -d: run your program under the control of pdb, the Python debugger.
1330 This allows you to execute your program step by step, watch variables,
1330 This allows you to execute your program step by step, watch variables,
1331 etc. Internally, what IPython does is similar to calling:
1331 etc. Internally, what IPython does is similar to calling:
1332
1332
1333 pdb.run('execfile("YOURFILENAME")')
1333 pdb.run('execfile("YOURFILENAME")')
1334
1334
1335 with a breakpoint set on line 1 of your file. You can change the line
1335 with a breakpoint set on line 1 of your file. You can change the line
1336 number for this automatic breakpoint to be <N> by using the -bN option
1336 number for this automatic breakpoint to be <N> by using the -bN option
1337 (where N must be an integer). For example:
1337 (where N must be an integer). For example:
1338
1338
1339 %run -d -b40 myscript
1339 %run -d -b40 myscript
1340
1340
1341 will set the first breakpoint at line 40 in myscript.py. Note that
1341 will set the first breakpoint at line 40 in myscript.py. Note that
1342 the first breakpoint must be set on a line which actually does
1342 the first breakpoint must be set on a line which actually does
1343 something (not a comment or docstring) for it to stop execution.
1343 something (not a comment or docstring) for it to stop execution.
1344
1344
1345 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1345 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1346 first enter 'c' (without qoutes) to start execution up to the first
1346 first enter 'c' (without qoutes) to start execution up to the first
1347 breakpoint.
1347 breakpoint.
1348
1348
1349 Entering 'help' gives information about the use of the debugger. You
1349 Entering 'help' gives information about the use of the debugger. You
1350 can easily see pdb's full documentation with "import pdb;pdb.help()"
1350 can easily see pdb's full documentation with "import pdb;pdb.help()"
1351 at a prompt.
1351 at a prompt.
1352
1352
1353 -p: run program under the control of the Python profiler module (which
1353 -p: run program under the control of the Python profiler module (which
1354 prints a detailed report of execution times, function calls, etc).
1354 prints a detailed report of execution times, function calls, etc).
1355
1355
1356 You can pass other options after -p which affect the behavior of the
1356 You can pass other options after -p which affect the behavior of the
1357 profiler itself. See the docs for %prun for details.
1357 profiler itself. See the docs for %prun for details.
1358
1358
1359 In this mode, the program's variables do NOT propagate back to the
1359 In this mode, the program's variables do NOT propagate back to the
1360 IPython interactive namespace (because they remain in the namespace
1360 IPython interactive namespace (because they remain in the namespace
1361 where the profiler executes them).
1361 where the profiler executes them).
1362
1362
1363 Internally this triggers a call to %prun, see its documentation for
1363 Internally this triggers a call to %prun, see its documentation for
1364 details on the options available specifically for profiling."""
1364 details on the options available specifically for profiling."""
1365
1365
1366 # get arguments and set sys.argv for program to be run.
1366 # get arguments and set sys.argv for program to be run.
1367 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1367 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1368 mode='list',list_all=1)
1368 mode='list',list_all=1)
1369
1369
1370 try:
1370 try:
1371 filename = get_py_filename(arg_lst[0])
1371 filename = get_py_filename(arg_lst[0])
1372 except IndexError:
1372 except IndexError:
1373 warn('you must provide at least a filename.')
1373 warn('you must provide at least a filename.')
1374 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1374 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1375 return
1375 return
1376 except IOError,msg:
1376 except IOError,msg:
1377 error(msg)
1377 error(msg)
1378 return
1378 return
1379
1379
1380 # Control the response to exit() calls made by the script being run
1380 # Control the response to exit() calls made by the script being run
1381 exit_ignore = opts.has_key('e')
1381 exit_ignore = opts.has_key('e')
1382
1382
1383 # Make sure that the running script gets a proper sys.argv as if it
1383 # Make sure that the running script gets a proper sys.argv as if it
1384 # were run from a system shell.
1384 # were run from a system shell.
1385 save_argv = sys.argv # save it for later restoring
1385 save_argv = sys.argv # save it for later restoring
1386 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1386 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1387
1387
1388 if opts.has_key('i'):
1388 if opts.has_key('i'):
1389 prog_ns = self.shell.user_ns
1389 prog_ns = self.shell.user_ns
1390 __name__save = self.shell.user_ns['__name__']
1390 __name__save = self.shell.user_ns['__name__']
1391 prog_ns['__name__'] = '__main__'
1391 prog_ns['__name__'] = '__main__'
1392 else:
1392 else:
1393 if opts.has_key('n'):
1393 if opts.has_key('n'):
1394 name = os.path.splitext(os.path.basename(filename))[0]
1394 name = os.path.splitext(os.path.basename(filename))[0]
1395 else:
1395 else:
1396 name = '__main__'
1396 name = '__main__'
1397 prog_ns = {'__name__':name}
1397 prog_ns = {'__name__':name}
1398
1398
1399 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1400 # set the __file__ global in the script's namespace
1401 prog_ns['__file__'] = filename
1402
1399 # pickle fix. See iplib for an explanation. But we need to make sure
1403 # pickle fix. See iplib for an explanation. But we need to make sure
1400 # that, if we overwrite __main__, we replace it at the end
1404 # that, if we overwrite __main__, we replace it at the end
1401 if prog_ns['__name__'] == '__main__':
1405 if prog_ns['__name__'] == '__main__':
1402 restore_main = sys.modules['__main__']
1406 restore_main = sys.modules['__main__']
1403 else:
1407 else:
1404 restore_main = False
1408 restore_main = False
1405
1409
1406 sys.modules[prog_ns['__name__']] = FakeModule(prog_ns)
1410 sys.modules[prog_ns['__name__']] = FakeModule(prog_ns)
1407
1411
1408 stats = None
1412 stats = None
1409 try:
1413 try:
1410 if opts.has_key('p'):
1414 if opts.has_key('p'):
1411 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1415 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1412 else:
1416 else:
1413 if opts.has_key('d'):
1417 if opts.has_key('d'):
1414 deb = Debugger.Pdb(self.shell.rc.colors)
1418 deb = Debugger.Pdb(self.shell.rc.colors)
1415 # reset Breakpoint state, which is moronically kept
1419 # reset Breakpoint state, which is moronically kept
1416 # in a class
1420 # in a class
1417 bdb.Breakpoint.next = 1
1421 bdb.Breakpoint.next = 1
1418 bdb.Breakpoint.bplist = {}
1422 bdb.Breakpoint.bplist = {}
1419 bdb.Breakpoint.bpbynumber = [None]
1423 bdb.Breakpoint.bpbynumber = [None]
1420 # Set an initial breakpoint to stop execution
1424 # Set an initial breakpoint to stop execution
1421 maxtries = 10
1425 maxtries = 10
1422 bp = int(opts.get('b',[1])[0])
1426 bp = int(opts.get('b',[1])[0])
1423 checkline = deb.checkline(filename,bp)
1427 checkline = deb.checkline(filename,bp)
1424 if not checkline:
1428 if not checkline:
1425 for bp in range(bp+1,bp+maxtries+1):
1429 for bp in range(bp+1,bp+maxtries+1):
1426 if deb.checkline(filename,bp):
1430 if deb.checkline(filename,bp):
1427 break
1431 break
1428 else:
1432 else:
1429 msg = ("\nI failed to find a valid line to set "
1433 msg = ("\nI failed to find a valid line to set "
1430 "a breakpoint\n"
1434 "a breakpoint\n"
1431 "after trying up to line: %s.\n"
1435 "after trying up to line: %s.\n"
1432 "Please set a valid breakpoint manually "
1436 "Please set a valid breakpoint manually "
1433 "with the -b option." % bp)
1437 "with the -b option." % bp)
1434 error(msg)
1438 error(msg)
1435 return
1439 return
1436 # if we find a good linenumber, set the breakpoint
1440 # if we find a good linenumber, set the breakpoint
1437 deb.do_break('%s:%s' % (filename,bp))
1441 deb.do_break('%s:%s' % (filename,bp))
1438 # Start file run
1442 # Start file run
1439 print "NOTE: Enter 'c' at the",
1443 print "NOTE: Enter 'c' at the",
1440 print "ipdb> prompt to start your script."
1444 print "ipdb> prompt to start your script."
1441 try:
1445 try:
1442 deb.run('execfile("%s")' % filename,prog_ns)
1446 deb.run('execfile("%s")' % filename,prog_ns)
1443 except:
1447 except:
1444 etype, value, tb = sys.exc_info()
1448 etype, value, tb = sys.exc_info()
1445 # Skip three frames in the traceback: the %run one,
1449 # Skip three frames in the traceback: the %run one,
1446 # one inside bdb.py, and the command-line typed by the
1450 # one inside bdb.py, and the command-line typed by the
1447 # user (run by exec in pdb itself).
1451 # user (run by exec in pdb itself).
1448 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1452 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1449 else:
1453 else:
1450 if runner is None:
1454 if runner is None:
1451 runner = self.shell.safe_execfile
1455 runner = self.shell.safe_execfile
1452 if opts.has_key('t'):
1456 if opts.has_key('t'):
1453 try:
1457 try:
1454 nruns = int(opts['N'][0])
1458 nruns = int(opts['N'][0])
1455 if nruns < 1:
1459 if nruns < 1:
1456 error('Number of runs must be >=1')
1460 error('Number of runs must be >=1')
1457 return
1461 return
1458 except (KeyError):
1462 except (KeyError):
1459 nruns = 1
1463 nruns = 1
1460 if nruns == 1:
1464 if nruns == 1:
1461 t0 = clock2()
1465 t0 = clock2()
1462 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1466 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1463 t1 = clock2()
1467 t1 = clock2()
1464 t_usr = t1[0]-t0[0]
1468 t_usr = t1[0]-t0[0]
1465 t_sys = t1[1]-t1[1]
1469 t_sys = t1[1]-t1[1]
1466 print "\nIPython CPU timings (estimated):"
1470 print "\nIPython CPU timings (estimated):"
1467 print " User : %10s s." % t_usr
1471 print " User : %10s s." % t_usr
1468 print " System: %10s s." % t_sys
1472 print " System: %10s s." % t_sys
1469 else:
1473 else:
1470 runs = range(nruns)
1474 runs = range(nruns)
1471 t0 = clock2()
1475 t0 = clock2()
1472 for nr in runs:
1476 for nr in runs:
1473 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1477 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1474 t1 = clock2()
1478 t1 = clock2()
1475 t_usr = t1[0]-t0[0]
1479 t_usr = t1[0]-t0[0]
1476 t_sys = t1[1]-t1[1]
1480 t_sys = t1[1]-t1[1]
1477 print "\nIPython CPU timings (estimated):"
1481 print "\nIPython CPU timings (estimated):"
1478 print "Total runs performed:",nruns
1482 print "Total runs performed:",nruns
1479 print " Times : %10s %10s" % ('Total','Per run')
1483 print " Times : %10s %10s" % ('Total','Per run')
1480 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1484 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1481 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1485 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1482
1486
1483 else:
1487 else:
1484 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1488 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1485 if opts.has_key('i'):
1489 if opts.has_key('i'):
1486 self.shell.user_ns['__name__'] = __name__save
1490 self.shell.user_ns['__name__'] = __name__save
1487 else:
1491 else:
1488 # update IPython interactive namespace
1492 # update IPython interactive namespace
1489 del prog_ns['__name__']
1493 del prog_ns['__name__']
1490 self.shell.user_ns.update(prog_ns)
1494 self.shell.user_ns.update(prog_ns)
1491 finally:
1495 finally:
1492 sys.argv = save_argv
1496 sys.argv = save_argv
1493 if restore_main:
1497 if restore_main:
1494 sys.modules['__main__'] = restore_main
1498 sys.modules['__main__'] = restore_main
1495 return stats
1499 return stats
1496
1500
1497 def magic_runlog(self, parameter_s =''):
1501 def magic_runlog(self, parameter_s =''):
1498 """Run files as logs.
1502 """Run files as logs.
1499
1503
1500 Usage:\\
1504 Usage:\\
1501 %runlog file1 file2 ...
1505 %runlog file1 file2 ...
1502
1506
1503 Run the named files (treating them as log files) in sequence inside
1507 Run the named files (treating them as log files) in sequence inside
1504 the interpreter, and return to the prompt. This is much slower than
1508 the interpreter, and return to the prompt. This is much slower than
1505 %run because each line is executed in a try/except block, but it
1509 %run because each line is executed in a try/except block, but it
1506 allows running files with syntax errors in them.
1510 allows running files with syntax errors in them.
1507
1511
1508 Normally IPython will guess when a file is one of its own logfiles, so
1512 Normally IPython will guess when a file is one of its own logfiles, so
1509 you can typically use %run even for logs. This shorthand allows you to
1513 you can typically use %run even for logs. This shorthand allows you to
1510 force any file to be treated as a log file."""
1514 force any file to be treated as a log file."""
1511
1515
1512 for f in parameter_s.split():
1516 for f in parameter_s.split():
1513 self.shell.safe_execfile(f,self.shell.user_ns,
1517 self.shell.safe_execfile(f,self.shell.user_ns,
1514 self.shell.user_ns,islog=1)
1518 self.shell.user_ns,islog=1)
1515
1519
1516 def magic_time(self,parameter_s = ''):
1520 def magic_time(self,parameter_s = ''):
1517 """Time execution of a Python statement or expression.
1521 """Time execution of a Python statement or expression.
1518
1522
1519 The CPU and wall clock times are printed, and the value of the
1523 The CPU and wall clock times are printed, and the value of the
1520 expression (if any) is returned. Note that under Win32, system time
1524 expression (if any) is returned. Note that under Win32, system time
1521 is always reported as 0, since it can not be measured.
1525 is always reported as 0, since it can not be measured.
1522
1526
1523 This function provides very basic timing functionality. In Python
1527 This function provides very basic timing functionality. In Python
1524 2.3, the timeit module offers more control and sophistication, but for
1528 2.3, the timeit module offers more control and sophistication, but for
1525 now IPython supports Python 2.2, so we can not rely on timeit being
1529 now IPython supports Python 2.2, so we can not rely on timeit being
1526 present.
1530 present.
1527
1531
1528 Some examples:
1532 Some examples:
1529
1533
1530 In [1]: time 2**128
1534 In [1]: time 2**128
1531 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1535 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1532 Wall time: 0.00
1536 Wall time: 0.00
1533 Out[1]: 340282366920938463463374607431768211456L
1537 Out[1]: 340282366920938463463374607431768211456L
1534
1538
1535 In [2]: n = 1000000
1539 In [2]: n = 1000000
1536
1540
1537 In [3]: time sum(range(n))
1541 In [3]: time sum(range(n))
1538 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1542 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1539 Wall time: 1.37
1543 Wall time: 1.37
1540 Out[3]: 499999500000L
1544 Out[3]: 499999500000L
1541
1545
1542 In [4]: time print 'hello world'
1546 In [4]: time print 'hello world'
1543 hello world
1547 hello world
1544 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1548 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1545 Wall time: 0.00
1549 Wall time: 0.00
1546 """
1550 """
1547
1551
1548 # fail immediately if the given expression can't be compiled
1552 # fail immediately if the given expression can't be compiled
1549 try:
1553 try:
1550 mode = 'eval'
1554 mode = 'eval'
1551 code = compile(parameter_s,'<timed eval>',mode)
1555 code = compile(parameter_s,'<timed eval>',mode)
1552 except SyntaxError:
1556 except SyntaxError:
1553 mode = 'exec'
1557 mode = 'exec'
1554 code = compile(parameter_s,'<timed exec>',mode)
1558 code = compile(parameter_s,'<timed exec>',mode)
1555 # skew measurement as little as possible
1559 # skew measurement as little as possible
1556 glob = self.shell.user_ns
1560 glob = self.shell.user_ns
1557 clk = clock2
1561 clk = clock2
1558 wtime = time.time
1562 wtime = time.time
1559 # time execution
1563 # time execution
1560 wall_st = wtime()
1564 wall_st = wtime()
1561 if mode=='eval':
1565 if mode=='eval':
1562 st = clk()
1566 st = clk()
1563 out = eval(code,glob)
1567 out = eval(code,glob)
1564 end = clk()
1568 end = clk()
1565 else:
1569 else:
1566 st = clk()
1570 st = clk()
1567 exec code in glob
1571 exec code in glob
1568 end = clk()
1572 end = clk()
1569 out = None
1573 out = None
1570 wall_end = wtime()
1574 wall_end = wtime()
1571 # Compute actual times and report
1575 # Compute actual times and report
1572 wall_time = wall_end-wall_st
1576 wall_time = wall_end-wall_st
1573 cpu_user = end[0]-st[0]
1577 cpu_user = end[0]-st[0]
1574 cpu_sys = end[1]-st[1]
1578 cpu_sys = end[1]-st[1]
1575 cpu_tot = cpu_user+cpu_sys
1579 cpu_tot = cpu_user+cpu_sys
1576 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1580 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1577 (cpu_user,cpu_sys,cpu_tot)
1581 (cpu_user,cpu_sys,cpu_tot)
1578 print "Wall time: %.2f" % wall_time
1582 print "Wall time: %.2f" % wall_time
1579 return out
1583 return out
1580
1584
1581 def magic_macro(self,parameter_s = ''):
1585 def magic_macro(self,parameter_s = ''):
1582 """Define a set of input lines as a macro for future re-execution.
1586 """Define a set of input lines as a macro for future re-execution.
1583
1587
1584 Usage:\\
1588 Usage:\\
1585 %macro name n1-n2 n3-n4 ... n5 .. n6 ...
1589 %macro name n1-n2 n3-n4 ... n5 .. n6 ...
1586
1590
1587 This will define a global variable called `name` which is a string
1591 This will define a global variable called `name` which is a string
1588 made of joining the slices and lines you specify (n1,n2,... numbers
1592 made of joining the slices and lines you specify (n1,n2,... numbers
1589 above) from your input history into a single string. This variable
1593 above) from your input history into a single string. This variable
1590 acts like an automatic function which re-executes those lines as if
1594 acts like an automatic function which re-executes those lines as if
1591 you had typed them. You just type 'name' at the prompt and the code
1595 you had typed them. You just type 'name' at the prompt and the code
1592 executes.
1596 executes.
1593
1597
1594 The notation for indicating number ranges is: n1-n2 means 'use line
1598 The notation for indicating number ranges is: n1-n2 means 'use line
1595 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1599 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1596 using the lines numbered 5,6 and 7.
1600 using the lines numbered 5,6 and 7.
1597
1601
1598 Note: as a 'hidden' feature, you can also use traditional python slice
1602 Note: as a 'hidden' feature, you can also use traditional python slice
1599 notation, where N:M means numbers N through M-1.
1603 notation, where N:M means numbers N through M-1.
1600
1604
1601 For example, if your history contains (%hist prints it):
1605 For example, if your history contains (%hist prints it):
1602
1606
1603 44: x=1\\
1607 44: x=1\\
1604 45: y=3\\
1608 45: y=3\\
1605 46: z=x+y\\
1609 46: z=x+y\\
1606 47: print x\\
1610 47: print x\\
1607 48: a=5\\
1611 48: a=5\\
1608 49: print 'x',x,'y',y\\
1612 49: print 'x',x,'y',y\\
1609
1613
1610 you can create a macro with lines 44 through 47 (included) and line 49
1614 you can create a macro with lines 44 through 47 (included) and line 49
1611 called my_macro with:
1615 called my_macro with:
1612
1616
1613 In [51]: %macro my_macro 44-47 49
1617 In [51]: %macro my_macro 44-47 49
1614
1618
1615 Now, typing `my_macro` (without quotes) will re-execute all this code
1619 Now, typing `my_macro` (without quotes) will re-execute all this code
1616 in one pass.
1620 in one pass.
1617
1621
1618 You don't need to give the line-numbers in order, and any given line
1622 You don't need to give the line-numbers in order, and any given line
1619 number can appear multiple times. You can assemble macros with any
1623 number can appear multiple times. You can assemble macros with any
1620 lines from your input history in any order.
1624 lines from your input history in any order.
1621
1625
1622 The macro is a simple object which holds its value in an attribute,
1626 The macro is a simple object which holds its value in an attribute,
1623 but IPython's display system checks for macros and executes them as
1627 but IPython's display system checks for macros and executes them as
1624 code instead of printing them when you type their name.
1628 code instead of printing them when you type their name.
1625
1629
1626 You can view a macro's contents by explicitly printing it with:
1630 You can view a macro's contents by explicitly printing it with:
1627
1631
1628 'print macro_name'.
1632 'print macro_name'.
1629
1633
1630 For one-off cases which DON'T contain magic function calls in them you
1634 For one-off cases which DON'T contain magic function calls in them you
1631 can obtain similar results by explicitly executing slices from your
1635 can obtain similar results by explicitly executing slices from your
1632 input history with:
1636 input history with:
1633
1637
1634 In [60]: exec In[44:48]+In[49]"""
1638 In [60]: exec In[44:48]+In[49]"""
1635
1639
1636 args = parameter_s.split()
1640 args = parameter_s.split()
1637 name,ranges = args[0], args[1:]
1641 name,ranges = args[0], args[1:]
1638 #print 'rng',ranges # dbg
1642 #print 'rng',ranges # dbg
1639 lines = self.extract_input_slices(ranges)
1643 lines = self.extract_input_slices(ranges)
1640 macro = Macro(lines)
1644 macro = Macro(lines)
1641 self.shell.user_ns.update({name:macro})
1645 self.shell.user_ns.update({name:macro})
1642 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1646 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1643 print 'Macro contents:'
1647 print 'Macro contents:'
1644 print macro,
1648 print macro,
1645
1649
1646 def magic_save(self,parameter_s = ''):
1650 def magic_save(self,parameter_s = ''):
1647 """Save a set of lines to a given filename.
1651 """Save a set of lines to a given filename.
1648
1652
1649 Usage:\\
1653 Usage:\\
1650 %save filename n1-n2 n3-n4 ... n5 .. n6 ...
1654 %save filename n1-n2 n3-n4 ... n5 .. n6 ...
1651
1655
1652 This function uses the same syntax as %macro for line extraction, but
1656 This function uses the same syntax as %macro for line extraction, but
1653 instead of creating a macro it saves the resulting string to the
1657 instead of creating a macro it saves the resulting string to the
1654 filename you specify.
1658 filename you specify.
1655
1659
1656 It adds a '.py' extension to the file if you don't do so yourself, and
1660 It adds a '.py' extension to the file if you don't do so yourself, and
1657 it asks for confirmation before overwriting existing files."""
1661 it asks for confirmation before overwriting existing files."""
1658
1662
1659 args = parameter_s.split()
1663 args = parameter_s.split()
1660 fname,ranges = args[0], args[1:]
1664 fname,ranges = args[0], args[1:]
1661 if not fname.endswith('.py'):
1665 if not fname.endswith('.py'):
1662 fname += '.py'
1666 fname += '.py'
1663 if os.path.isfile(fname):
1667 if os.path.isfile(fname):
1664 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
1668 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
1665 if ans.lower() not in ['y','yes']:
1669 if ans.lower() not in ['y','yes']:
1666 print 'Operation cancelled.'
1670 print 'Operation cancelled.'
1667 return
1671 return
1668 cmds = ''.join(self.extract_input_slices(ranges))
1672 cmds = ''.join(self.extract_input_slices(ranges))
1669 f = file(fname,'w')
1673 f = file(fname,'w')
1670 f.write(cmds)
1674 f.write(cmds)
1671 f.close()
1675 f.close()
1672 print 'The following commands were written to file `%s`:' % fname
1676 print 'The following commands were written to file `%s`:' % fname
1673 print cmds
1677 print cmds
1674
1678
1675 def _edit_macro(self,mname,macro):
1679 def _edit_macro(self,mname,macro):
1676 """open an editor with the macro data in a file"""
1680 """open an editor with the macro data in a file"""
1677 filename = self.shell.mktempfile(macro.value)
1681 filename = self.shell.mktempfile(macro.value)
1678 self.shell.hooks.editor(filename)
1682 self.shell.hooks.editor(filename)
1679
1683
1680 # and make a new macro object, to replace the old one
1684 # and make a new macro object, to replace the old one
1681 mfile = open(filename)
1685 mfile = open(filename)
1682 mvalue = mfile.read()
1686 mvalue = mfile.read()
1683 mfile.close()
1687 mfile.close()
1684 self.shell.user_ns[mname] = Macro(mvalue)
1688 self.shell.user_ns[mname] = Macro(mvalue)
1685
1689
1686 def magic_ed(self,parameter_s=''):
1690 def magic_ed(self,parameter_s=''):
1687 """Alias to %edit."""
1691 """Alias to %edit."""
1688 return self.magic_edit(parameter_s)
1692 return self.magic_edit(parameter_s)
1689
1693
1690 def magic_edit(self,parameter_s='',last_call=['','']):
1694 def magic_edit(self,parameter_s='',last_call=['','']):
1691 """Bring up an editor and execute the resulting code.
1695 """Bring up an editor and execute the resulting code.
1692
1696
1693 Usage:
1697 Usage:
1694 %edit [options] [args]
1698 %edit [options] [args]
1695
1699
1696 %edit runs IPython's editor hook. The default version of this hook is
1700 %edit runs IPython's editor hook. The default version of this hook is
1697 set to call the __IPYTHON__.rc.editor command. This is read from your
1701 set to call the __IPYTHON__.rc.editor command. This is read from your
1698 environment variable $EDITOR. If this isn't found, it will default to
1702 environment variable $EDITOR. If this isn't found, it will default to
1699 vi under Linux/Unix and to notepad under Windows. See the end of this
1703 vi under Linux/Unix and to notepad under Windows. See the end of this
1700 docstring for how to change the editor hook.
1704 docstring for how to change the editor hook.
1701
1705
1702 You can also set the value of this editor via the command line option
1706 You can also set the value of this editor via the command line option
1703 '-editor' or in your ipythonrc file. This is useful if you wish to use
1707 '-editor' or in your ipythonrc file. This is useful if you wish to use
1704 specifically for IPython an editor different from your typical default
1708 specifically for IPython an editor different from your typical default
1705 (and for Windows users who typically don't set environment variables).
1709 (and for Windows users who typically don't set environment variables).
1706
1710
1707 This command allows you to conveniently edit multi-line code right in
1711 This command allows you to conveniently edit multi-line code right in
1708 your IPython session.
1712 your IPython session.
1709
1713
1710 If called without arguments, %edit opens up an empty editor with a
1714 If called without arguments, %edit opens up an empty editor with a
1711 temporary file and will execute the contents of this file when you
1715 temporary file and will execute the contents of this file when you
1712 close it (don't forget to save it!).
1716 close it (don't forget to save it!).
1713
1717
1714
1718
1715 Options:
1719 Options:
1716
1720
1717 -p: this will call the editor with the same data as the previous time
1721 -p: this will call the editor with the same data as the previous time
1718 it was used, regardless of how long ago (in your current session) it
1722 it was used, regardless of how long ago (in your current session) it
1719 was.
1723 was.
1720
1724
1721 -x: do not execute the edited code immediately upon exit. This is
1725 -x: do not execute the edited code immediately upon exit. This is
1722 mainly useful if you are editing programs which need to be called with
1726 mainly useful if you are editing programs which need to be called with
1723 command line arguments, which you can then do using %run.
1727 command line arguments, which you can then do using %run.
1724
1728
1725
1729
1726 Arguments:
1730 Arguments:
1727
1731
1728 If arguments are given, the following possibilites exist:
1732 If arguments are given, the following possibilites exist:
1729
1733
1730 - The arguments are numbers or pairs of colon-separated numbers (like
1734 - The arguments are numbers or pairs of colon-separated numbers (like
1731 1 4:8 9). These are interpreted as lines of previous input to be
1735 1 4:8 9). These are interpreted as lines of previous input to be
1732 loaded into the editor. The syntax is the same of the %macro command.
1736 loaded into the editor. The syntax is the same of the %macro command.
1733
1737
1734 - If the argument doesn't start with a number, it is evaluated as a
1738 - If the argument doesn't start with a number, it is evaluated as a
1735 variable and its contents loaded into the editor. You can thus edit
1739 variable and its contents loaded into the editor. You can thus edit
1736 any string which contains python code (including the result of
1740 any string which contains python code (including the result of
1737 previous edits).
1741 previous edits).
1738
1742
1739 - If the argument is the name of an object (other than a string),
1743 - If the argument is the name of an object (other than a string),
1740 IPython will try to locate the file where it was defined and open the
1744 IPython will try to locate the file where it was defined and open the
1741 editor at the point where it is defined. You can use `%edit function`
1745 editor at the point where it is defined. You can use `%edit function`
1742 to load an editor exactly at the point where 'function' is defined,
1746 to load an editor exactly at the point where 'function' is defined,
1743 edit it and have the file be executed automatically.
1747 edit it and have the file be executed automatically.
1744
1748
1745 If the object is a macro (see %macro for details), this opens up your
1749 If the object is a macro (see %macro for details), this opens up your
1746 specified editor with a temporary file containing the macro's data.
1750 specified editor with a temporary file containing the macro's data.
1747 Upon exit, the macro is reloaded with the contents of the file.
1751 Upon exit, the macro is reloaded with the contents of the file.
1748
1752
1749 Note: opening at an exact line is only supported under Unix, and some
1753 Note: opening at an exact line is only supported under Unix, and some
1750 editors (like kedit and gedit up to Gnome 2.8) do not understand the
1754 editors (like kedit and gedit up to Gnome 2.8) do not understand the
1751 '+NUMBER' parameter necessary for this feature. Good editors like
1755 '+NUMBER' parameter necessary for this feature. Good editors like
1752 (X)Emacs, vi, jed, pico and joe all do.
1756 (X)Emacs, vi, jed, pico and joe all do.
1753
1757
1754 - If the argument is not found as a variable, IPython will look for a
1758 - If the argument is not found as a variable, IPython will look for a
1755 file with that name (adding .py if necessary) and load it into the
1759 file with that name (adding .py if necessary) and load it into the
1756 editor. It will execute its contents with execfile() when you exit,
1760 editor. It will execute its contents with execfile() when you exit,
1757 loading any code in the file into your interactive namespace.
1761 loading any code in the file into your interactive namespace.
1758
1762
1759 After executing your code, %edit will return as output the code you
1763 After executing your code, %edit will return as output the code you
1760 typed in the editor (except when it was an existing file). This way
1764 typed in the editor (except when it was an existing file). This way
1761 you can reload the code in further invocations of %edit as a variable,
1765 you can reload the code in further invocations of %edit as a variable,
1762 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
1766 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
1763 the output.
1767 the output.
1764
1768
1765 Note that %edit is also available through the alias %ed.
1769 Note that %edit is also available through the alias %ed.
1766
1770
1767 This is an example of creating a simple function inside the editor and
1771 This is an example of creating a simple function inside the editor and
1768 then modifying it. First, start up the editor:
1772 then modifying it. First, start up the editor:
1769
1773
1770 In [1]: ed\\
1774 In [1]: ed\\
1771 Editing... done. Executing edited code...\\
1775 Editing... done. Executing edited code...\\
1772 Out[1]: 'def foo():\\n print "foo() was defined in an editing session"\\n'
1776 Out[1]: 'def foo():\\n print "foo() was defined in an editing session"\\n'
1773
1777
1774 We can then call the function foo():
1778 We can then call the function foo():
1775
1779
1776 In [2]: foo()\\
1780 In [2]: foo()\\
1777 foo() was defined in an editing session
1781 foo() was defined in an editing session
1778
1782
1779 Now we edit foo. IPython automatically loads the editor with the
1783 Now we edit foo. IPython automatically loads the editor with the
1780 (temporary) file where foo() was previously defined:
1784 (temporary) file where foo() was previously defined:
1781
1785
1782 In [3]: ed foo\\
1786 In [3]: ed foo\\
1783 Editing... done. Executing edited code...
1787 Editing... done. Executing edited code...
1784
1788
1785 And if we call foo() again we get the modified version:
1789 And if we call foo() again we get the modified version:
1786
1790
1787 In [4]: foo()\\
1791 In [4]: foo()\\
1788 foo() has now been changed!
1792 foo() has now been changed!
1789
1793
1790 Here is an example of how to edit a code snippet successive
1794 Here is an example of how to edit a code snippet successive
1791 times. First we call the editor:
1795 times. First we call the editor:
1792
1796
1793 In [8]: ed\\
1797 In [8]: ed\\
1794 Editing... done. Executing edited code...\\
1798 Editing... done. Executing edited code...\\
1795 hello\\
1799 hello\\
1796 Out[8]: "print 'hello'\\n"
1800 Out[8]: "print 'hello'\\n"
1797
1801
1798 Now we call it again with the previous output (stored in _):
1802 Now we call it again with the previous output (stored in _):
1799
1803
1800 In [9]: ed _\\
1804 In [9]: ed _\\
1801 Editing... done. Executing edited code...\\
1805 Editing... done. Executing edited code...\\
1802 hello world\\
1806 hello world\\
1803 Out[9]: "print 'hello world'\\n"
1807 Out[9]: "print 'hello world'\\n"
1804
1808
1805 Now we call it with the output #8 (stored in _8, also as Out[8]):
1809 Now we call it with the output #8 (stored in _8, also as Out[8]):
1806
1810
1807 In [10]: ed _8\\
1811 In [10]: ed _8\\
1808 Editing... done. Executing edited code...\\
1812 Editing... done. Executing edited code...\\
1809 hello again\\
1813 hello again\\
1810 Out[10]: "print 'hello again'\\n"
1814 Out[10]: "print 'hello again'\\n"
1811
1815
1812
1816
1813 Changing the default editor hook:
1817 Changing the default editor hook:
1814
1818
1815 If you wish to write your own editor hook, you can put it in a
1819 If you wish to write your own editor hook, you can put it in a
1816 configuration file which you load at startup time. The default hook
1820 configuration file which you load at startup time. The default hook
1817 is defined in the IPython.hooks module, and you can use that as a
1821 is defined in the IPython.hooks module, and you can use that as a
1818 starting example for further modifications. That file also has
1822 starting example for further modifications. That file also has
1819 general instructions on how to set a new hook for use once you've
1823 general instructions on how to set a new hook for use once you've
1820 defined it."""
1824 defined it."""
1821
1825
1822 # FIXME: This function has become a convoluted mess. It needs a
1826 # FIXME: This function has become a convoluted mess. It needs a
1823 # ground-up rewrite with clean, simple logic.
1827 # ground-up rewrite with clean, simple logic.
1824
1828
1825 def make_filename(arg):
1829 def make_filename(arg):
1826 "Make a filename from the given args"
1830 "Make a filename from the given args"
1827 try:
1831 try:
1828 filename = get_py_filename(arg)
1832 filename = get_py_filename(arg)
1829 except IOError:
1833 except IOError:
1830 if args.endswith('.py'):
1834 if args.endswith('.py'):
1831 filename = arg
1835 filename = arg
1832 else:
1836 else:
1833 filename = None
1837 filename = None
1834 return filename
1838 return filename
1835
1839
1836 # custom exceptions
1840 # custom exceptions
1837 class DataIsObject(Exception): pass
1841 class DataIsObject(Exception): pass
1838
1842
1839 opts,args = self.parse_options(parameter_s,'px')
1843 opts,args = self.parse_options(parameter_s,'px')
1840
1844
1841 # Default line number value
1845 # Default line number value
1842 lineno = None
1846 lineno = None
1843 if opts.has_key('p'):
1847 if opts.has_key('p'):
1844 args = '_%s' % last_call[0]
1848 args = '_%s' % last_call[0]
1845 if not self.shell.user_ns.has_key(args):
1849 if not self.shell.user_ns.has_key(args):
1846 args = last_call[1]
1850 args = last_call[1]
1847
1851
1848 # use last_call to remember the state of the previous call, but don't
1852 # use last_call to remember the state of the previous call, but don't
1849 # let it be clobbered by successive '-p' calls.
1853 # let it be clobbered by successive '-p' calls.
1850 try:
1854 try:
1851 last_call[0] = self.shell.outputcache.prompt_count
1855 last_call[0] = self.shell.outputcache.prompt_count
1852 if not opts.has_key('p'):
1856 if not opts.has_key('p'):
1853 last_call[1] = parameter_s
1857 last_call[1] = parameter_s
1854 except:
1858 except:
1855 pass
1859 pass
1856
1860
1857 # by default this is done with temp files, except when the given
1861 # by default this is done with temp files, except when the given
1858 # arg is a filename
1862 # arg is a filename
1859 use_temp = 1
1863 use_temp = 1
1860
1864
1861 if re.match(r'\d',args):
1865 if re.match(r'\d',args):
1862 # Mode where user specifies ranges of lines, like in %macro.
1866 # Mode where user specifies ranges of lines, like in %macro.
1863 # This means that you can't edit files whose names begin with
1867 # This means that you can't edit files whose names begin with
1864 # numbers this way. Tough.
1868 # numbers this way. Tough.
1865 ranges = args.split()
1869 ranges = args.split()
1866 data = ''.join(self.extract_input_slices(ranges))
1870 data = ''.join(self.extract_input_slices(ranges))
1867 elif args.endswith('.py'):
1871 elif args.endswith('.py'):
1868 filename = make_filename(args)
1872 filename = make_filename(args)
1869 data = ''
1873 data = ''
1870 use_temp = 0
1874 use_temp = 0
1871 elif args:
1875 elif args:
1872 try:
1876 try:
1873 # Load the parameter given as a variable. If not a string,
1877 # Load the parameter given as a variable. If not a string,
1874 # process it as an object instead (below)
1878 # process it as an object instead (below)
1875
1879
1876 #print '*** args',args,'type',type(args) # dbg
1880 #print '*** args',args,'type',type(args) # dbg
1877 data = eval(args,self.shell.user_ns)
1881 data = eval(args,self.shell.user_ns)
1878 if not type(data) in StringTypes:
1882 if not type(data) in StringTypes:
1879 raise DataIsObject
1883 raise DataIsObject
1880
1884
1881 except (NameError,SyntaxError):
1885 except (NameError,SyntaxError):
1882 # given argument is not a variable, try as a filename
1886 # given argument is not a variable, try as a filename
1883 filename = make_filename(args)
1887 filename = make_filename(args)
1884 if filename is None:
1888 if filename is None:
1885 warn("Argument given (%s) can't be found as a variable "
1889 warn("Argument given (%s) can't be found as a variable "
1886 "or as a filename." % args)
1890 "or as a filename." % args)
1887 return
1891 return
1888
1892
1889 data = ''
1893 data = ''
1890 use_temp = 0
1894 use_temp = 0
1891 except DataIsObject:
1895 except DataIsObject:
1892
1896
1893 # macros have a special edit function
1897 # macros have a special edit function
1894 if isinstance(data,Macro):
1898 if isinstance(data,Macro):
1895 self._edit_macro(args,data)
1899 self._edit_macro(args,data)
1896 return
1900 return
1897
1901
1898 # For objects, try to edit the file where they are defined
1902 # For objects, try to edit the file where they are defined
1899 try:
1903 try:
1900 filename = inspect.getabsfile(data)
1904 filename = inspect.getabsfile(data)
1901 datafile = 1
1905 datafile = 1
1902 except TypeError:
1906 except TypeError:
1903 filename = make_filename(args)
1907 filename = make_filename(args)
1904 datafile = 1
1908 datafile = 1
1905 warn('Could not find file where `%s` is defined.\n'
1909 warn('Could not find file where `%s` is defined.\n'
1906 'Opening a file named `%s`' % (args,filename))
1910 'Opening a file named `%s`' % (args,filename))
1907 # Now, make sure we can actually read the source (if it was in
1911 # Now, make sure we can actually read the source (if it was in
1908 # a temp file it's gone by now).
1912 # a temp file it's gone by now).
1909 if datafile:
1913 if datafile:
1910 try:
1914 try:
1911 lineno = inspect.getsourcelines(data)[1]
1915 lineno = inspect.getsourcelines(data)[1]
1912 except IOError:
1916 except IOError:
1913 filename = make_filename(args)
1917 filename = make_filename(args)
1914 if filename is None:
1918 if filename is None:
1915 warn('The file `%s` where `%s` was defined cannot '
1919 warn('The file `%s` where `%s` was defined cannot '
1916 'be read.' % (filename,data))
1920 'be read.' % (filename,data))
1917 return
1921 return
1918 use_temp = 0
1922 use_temp = 0
1919 else:
1923 else:
1920 data = ''
1924 data = ''
1921
1925
1922 if use_temp:
1926 if use_temp:
1923 filename = self.shell.mktempfile(data)
1927 filename = self.shell.mktempfile(data)
1924 print 'IPython will make a temporary file named:',filename
1928 print 'IPython will make a temporary file named:',filename
1925
1929
1926 # do actual editing here
1930 # do actual editing here
1927 print 'Editing...',
1931 print 'Editing...',
1928 sys.stdout.flush()
1932 sys.stdout.flush()
1929 self.shell.hooks.editor(filename,lineno)
1933 self.shell.hooks.editor(filename,lineno)
1930 if opts.has_key('x'): # -x prevents actual execution
1934 if opts.has_key('x'): # -x prevents actual execution
1931 print
1935 print
1932 else:
1936 else:
1933 print 'done. Executing edited code...'
1937 print 'done. Executing edited code...'
1934 try:
1938 try:
1935 self.shell.safe_execfile(filename,self.shell.user_ns)
1939 self.shell.safe_execfile(filename,self.shell.user_ns)
1936 except IOError,msg:
1940 except IOError,msg:
1937 if msg.filename == filename:
1941 if msg.filename == filename:
1938 warn('File not found. Did you forget to save?')
1942 warn('File not found. Did you forget to save?')
1939 return
1943 return
1940 else:
1944 else:
1941 self.shell.showtraceback()
1945 self.shell.showtraceback()
1942 except:
1946 except:
1943 self.shell.showtraceback()
1947 self.shell.showtraceback()
1944 if use_temp:
1948 if use_temp:
1945 return open(filename).read()
1949 return open(filename).read()
1946
1950
1947 def magic_xmode(self,parameter_s = ''):
1951 def magic_xmode(self,parameter_s = ''):
1948 """Switch modes for the exception handlers.
1952 """Switch modes for the exception handlers.
1949
1953
1950 Valid modes: Plain, Context and Verbose.
1954 Valid modes: Plain, Context and Verbose.
1951
1955
1952 If called without arguments, acts as a toggle."""
1956 If called without arguments, acts as a toggle."""
1953
1957
1954 def xmode_switch_err(name):
1958 def xmode_switch_err(name):
1955 warn('Error changing %s exception modes.\n%s' %
1959 warn('Error changing %s exception modes.\n%s' %
1956 (name,sys.exc_info()[1]))
1960 (name,sys.exc_info()[1]))
1957
1961
1958 shell = self.shell
1962 shell = self.shell
1959 new_mode = parameter_s.strip().capitalize()
1963 new_mode = parameter_s.strip().capitalize()
1960 try:
1964 try:
1961 shell.InteractiveTB.set_mode(mode=new_mode)
1965 shell.InteractiveTB.set_mode(mode=new_mode)
1962 print 'Exception reporting mode:',shell.InteractiveTB.mode
1966 print 'Exception reporting mode:',shell.InteractiveTB.mode
1963 except:
1967 except:
1964 xmode_switch_err('user')
1968 xmode_switch_err('user')
1965
1969
1966 # threaded shells use a special handler in sys.excepthook
1970 # threaded shells use a special handler in sys.excepthook
1967 if shell.isthreaded:
1971 if shell.isthreaded:
1968 try:
1972 try:
1969 shell.sys_excepthook.set_mode(mode=new_mode)
1973 shell.sys_excepthook.set_mode(mode=new_mode)
1970 except:
1974 except:
1971 xmode_switch_err('threaded')
1975 xmode_switch_err('threaded')
1972
1976
1973 def magic_colors(self,parameter_s = ''):
1977 def magic_colors(self,parameter_s = ''):
1974 """Switch color scheme for prompts, info system and exception handlers.
1978 """Switch color scheme for prompts, info system and exception handlers.
1975
1979
1976 Currently implemented schemes: NoColor, Linux, LightBG.
1980 Currently implemented schemes: NoColor, Linux, LightBG.
1977
1981
1978 Color scheme names are not case-sensitive."""
1982 Color scheme names are not case-sensitive."""
1979
1983
1980 def color_switch_err(name):
1984 def color_switch_err(name):
1981 warn('Error changing %s color schemes.\n%s' %
1985 warn('Error changing %s color schemes.\n%s' %
1982 (name,sys.exc_info()[1]))
1986 (name,sys.exc_info()[1]))
1983
1987
1984
1988
1985 new_scheme = parameter_s.strip()
1989 new_scheme = parameter_s.strip()
1986 if not new_scheme:
1990 if not new_scheme:
1987 print 'You must specify a color scheme.'
1991 print 'You must specify a color scheme.'
1988 return
1992 return
1989 # Under Windows, check for Gary Bishop's readline, which is necessary
1993 # Under Windows, check for Gary Bishop's readline, which is necessary
1990 # for ANSI coloring
1994 # for ANSI coloring
1991 if os.name in ['nt','dos']:
1995 if os.name in ['nt','dos']:
1992 try:
1996 try:
1993 import readline
1997 import readline
1994 except ImportError:
1998 except ImportError:
1995 has_readline = 0
1999 has_readline = 0
1996 else:
2000 else:
1997 try:
2001 try:
1998 readline.GetOutputFile()
2002 readline.GetOutputFile()
1999 except AttributeError:
2003 except AttributeError:
2000 has_readline = 0
2004 has_readline = 0
2001 else:
2005 else:
2002 has_readline = 1
2006 has_readline = 1
2003 if not has_readline:
2007 if not has_readline:
2004 msg = """\
2008 msg = """\
2005 Proper color support under MS Windows requires Gary Bishop's readline library.
2009 Proper color support under MS Windows requires Gary Bishop's readline library.
2006 You can find it at:
2010 You can find it at:
2007 http://sourceforge.net/projects/uncpythontools
2011 http://sourceforge.net/projects/uncpythontools
2008 Gary's readline needs the ctypes module, from:
2012 Gary's readline needs the ctypes module, from:
2009 http://starship.python.net/crew/theller/ctypes
2013 http://starship.python.net/crew/theller/ctypes
2010
2014
2011 Defaulting color scheme to 'NoColor'"""
2015 Defaulting color scheme to 'NoColor'"""
2012 new_scheme = 'NoColor'
2016 new_scheme = 'NoColor'
2013 warn(msg)
2017 warn(msg)
2014 # local shortcut
2018 # local shortcut
2015 shell = self.shell
2019 shell = self.shell
2016
2020
2017 # Set prompt colors
2021 # Set prompt colors
2018 try:
2022 try:
2019 shell.outputcache.set_colors(new_scheme)
2023 shell.outputcache.set_colors(new_scheme)
2020 except:
2024 except:
2021 color_switch_err('prompt')
2025 color_switch_err('prompt')
2022 else:
2026 else:
2023 shell.rc.colors = \
2027 shell.rc.colors = \
2024 shell.outputcache.color_table.active_scheme_name
2028 shell.outputcache.color_table.active_scheme_name
2025 # Set exception colors
2029 # Set exception colors
2026 try:
2030 try:
2027 shell.InteractiveTB.set_colors(scheme = new_scheme)
2031 shell.InteractiveTB.set_colors(scheme = new_scheme)
2028 shell.SyntaxTB.set_colors(scheme = new_scheme)
2032 shell.SyntaxTB.set_colors(scheme = new_scheme)
2029 except:
2033 except:
2030 color_switch_err('exception')
2034 color_switch_err('exception')
2031
2035
2032 # threaded shells use a verbose traceback in sys.excepthook
2036 # threaded shells use a verbose traceback in sys.excepthook
2033 if shell.isthreaded:
2037 if shell.isthreaded:
2034 try:
2038 try:
2035 shell.sys_excepthook.set_colors(scheme=new_scheme)
2039 shell.sys_excepthook.set_colors(scheme=new_scheme)
2036 except:
2040 except:
2037 color_switch_err('system exception handler')
2041 color_switch_err('system exception handler')
2038
2042
2039 # Set info (for 'object?') colors
2043 # Set info (for 'object?') colors
2040 if shell.rc.color_info:
2044 if shell.rc.color_info:
2041 try:
2045 try:
2042 shell.inspector.set_active_scheme(new_scheme)
2046 shell.inspector.set_active_scheme(new_scheme)
2043 except:
2047 except:
2044 color_switch_err('object inspector')
2048 color_switch_err('object inspector')
2045 else:
2049 else:
2046 shell.inspector.set_active_scheme('NoColor')
2050 shell.inspector.set_active_scheme('NoColor')
2047
2051
2048 def magic_color_info(self,parameter_s = ''):
2052 def magic_color_info(self,parameter_s = ''):
2049 """Toggle color_info.
2053 """Toggle color_info.
2050
2054
2051 The color_info configuration parameter controls whether colors are
2055 The color_info configuration parameter controls whether colors are
2052 used for displaying object details (by things like %psource, %pfile or
2056 used for displaying object details (by things like %psource, %pfile or
2053 the '?' system). This function toggles this value with each call.
2057 the '?' system). This function toggles this value with each call.
2054
2058
2055 Note that unless you have a fairly recent pager (less works better
2059 Note that unless you have a fairly recent pager (less works better
2056 than more) in your system, using colored object information displays
2060 than more) in your system, using colored object information displays
2057 will not work properly. Test it and see."""
2061 will not work properly. Test it and see."""
2058
2062
2059 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2063 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2060 self.magic_colors(self.shell.rc.colors)
2064 self.magic_colors(self.shell.rc.colors)
2061 print 'Object introspection functions have now coloring:',
2065 print 'Object introspection functions have now coloring:',
2062 print ['OFF','ON'][self.shell.rc.color_info]
2066 print ['OFF','ON'][self.shell.rc.color_info]
2063
2067
2064 def magic_Pprint(self, parameter_s=''):
2068 def magic_Pprint(self, parameter_s=''):
2065 """Toggle pretty printing on/off."""
2069 """Toggle pretty printing on/off."""
2066
2070
2067 self.shell.outputcache.Pprint = 1 - self.shell.outputcache.Pprint
2071 self.shell.outputcache.Pprint = 1 - self.shell.outputcache.Pprint
2068 print 'Pretty printing has been turned', \
2072 print 'Pretty printing has been turned', \
2069 ['OFF','ON'][self.shell.outputcache.Pprint]
2073 ['OFF','ON'][self.shell.outputcache.Pprint]
2070
2074
2071 def magic_exit(self, parameter_s=''):
2075 def magic_exit(self, parameter_s=''):
2072 """Exit IPython, confirming if configured to do so.
2076 """Exit IPython, confirming if configured to do so.
2073
2077
2074 You can configure whether IPython asks for confirmation upon exit by
2078 You can configure whether IPython asks for confirmation upon exit by
2075 setting the confirm_exit flag in the ipythonrc file."""
2079 setting the confirm_exit flag in the ipythonrc file."""
2076
2080
2077 self.shell.exit()
2081 self.shell.exit()
2078
2082
2079 def magic_quit(self, parameter_s=''):
2083 def magic_quit(self, parameter_s=''):
2080 """Exit IPython, confirming if configured to do so (like %exit)"""
2084 """Exit IPython, confirming if configured to do so (like %exit)"""
2081
2085
2082 self.shell.exit()
2086 self.shell.exit()
2083
2087
2084 def magic_Exit(self, parameter_s=''):
2088 def magic_Exit(self, parameter_s=''):
2085 """Exit IPython without confirmation."""
2089 """Exit IPython without confirmation."""
2086
2090
2087 self.shell.exit_now = True
2091 self.shell.exit_now = True
2088
2092
2089 def magic_Quit(self, parameter_s=''):
2093 def magic_Quit(self, parameter_s=''):
2090 """Exit IPython without confirmation (like %Exit)."""
2094 """Exit IPython without confirmation (like %Exit)."""
2091
2095
2092 self.shell.exit_now = True
2096 self.shell.exit_now = True
2093
2097
2094 #......................................................................
2098 #......................................................................
2095 # Functions to implement unix shell-type things
2099 # Functions to implement unix shell-type things
2096
2100
2097 def magic_alias(self, parameter_s = ''):
2101 def magic_alias(self, parameter_s = ''):
2098 """Define an alias for a system command.
2102 """Define an alias for a system command.
2099
2103
2100 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2104 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2101
2105
2102 Then, typing 'alias_name params' will execute the system command 'cmd
2106 Then, typing 'alias_name params' will execute the system command 'cmd
2103 params' (from your underlying operating system).
2107 params' (from your underlying operating system).
2104
2108
2105 Aliases have lower precedence than magic functions and Python normal
2109 Aliases have lower precedence than magic functions and Python normal
2106 variables, so if 'foo' is both a Python variable and an alias, the
2110 variables, so if 'foo' is both a Python variable and an alias, the
2107 alias can not be executed until 'del foo' removes the Python variable.
2111 alias can not be executed until 'del foo' removes the Python variable.
2108
2112
2109 You can use the %l specifier in an alias definition to represent the
2113 You can use the %l specifier in an alias definition to represent the
2110 whole line when the alias is called. For example:
2114 whole line when the alias is called. For example:
2111
2115
2112 In [2]: alias all echo "Input in brackets: <%l>"\\
2116 In [2]: alias all echo "Input in brackets: <%l>"\\
2113 In [3]: all hello world\\
2117 In [3]: all hello world\\
2114 Input in brackets: <hello world>
2118 Input in brackets: <hello world>
2115
2119
2116 You can also define aliases with parameters using %s specifiers (one
2120 You can also define aliases with parameters using %s specifiers (one
2117 per parameter):
2121 per parameter):
2118
2122
2119 In [1]: alias parts echo first %s second %s\\
2123 In [1]: alias parts echo first %s second %s\\
2120 In [2]: %parts A B\\
2124 In [2]: %parts A B\\
2121 first A second B\\
2125 first A second B\\
2122 In [3]: %parts A\\
2126 In [3]: %parts A\\
2123 Incorrect number of arguments: 2 expected.\\
2127 Incorrect number of arguments: 2 expected.\\
2124 parts is an alias to: 'echo first %s second %s'
2128 parts is an alias to: 'echo first %s second %s'
2125
2129
2126 Note that %l and %s are mutually exclusive. You can only use one or
2130 Note that %l and %s are mutually exclusive. You can only use one or
2127 the other in your aliases.
2131 the other in your aliases.
2128
2132
2129 Aliases expand Python variables just like system calls using ! or !!
2133 Aliases expand Python variables just like system calls using ! or !!
2130 do: all expressions prefixed with '$' get expanded. For details of
2134 do: all expressions prefixed with '$' get expanded. For details of
2131 the semantic rules, see PEP-215:
2135 the semantic rules, see PEP-215:
2132 http://www.python.org/peps/pep-0215.html. This is the library used by
2136 http://www.python.org/peps/pep-0215.html. This is the library used by
2133 IPython for variable expansion. If you want to access a true shell
2137 IPython for variable expansion. If you want to access a true shell
2134 variable, an extra $ is necessary to prevent its expansion by IPython:
2138 variable, an extra $ is necessary to prevent its expansion by IPython:
2135
2139
2136 In [6]: alias show echo\\
2140 In [6]: alias show echo\\
2137 In [7]: PATH='A Python string'\\
2141 In [7]: PATH='A Python string'\\
2138 In [8]: show $PATH\\
2142 In [8]: show $PATH\\
2139 A Python string\\
2143 A Python string\\
2140 In [9]: show $$PATH\\
2144 In [9]: show $$PATH\\
2141 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2145 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2142
2146
2143 You can use the alias facility to acess all of $PATH. See the %rehash
2147 You can use the alias facility to acess all of $PATH. See the %rehash
2144 and %rehashx functions, which automatically create aliases for the
2148 and %rehashx functions, which automatically create aliases for the
2145 contents of your $PATH.
2149 contents of your $PATH.
2146
2150
2147 If called with no parameters, %alias prints the current alias table."""
2151 If called with no parameters, %alias prints the current alias table."""
2148
2152
2149 par = parameter_s.strip()
2153 par = parameter_s.strip()
2150 if not par:
2154 if not par:
2151 if self.shell.rc.automagic:
2155 if self.shell.rc.automagic:
2152 prechar = ''
2156 prechar = ''
2153 else:
2157 else:
2154 prechar = self.shell.ESC_MAGIC
2158 prechar = self.shell.ESC_MAGIC
2155 print 'Alias\t\tSystem Command\n'+'-'*30
2159 print 'Alias\t\tSystem Command\n'+'-'*30
2156 atab = self.shell.alias_table
2160 atab = self.shell.alias_table
2157 aliases = atab.keys()
2161 aliases = atab.keys()
2158 aliases.sort()
2162 aliases.sort()
2159 for alias in aliases:
2163 for alias in aliases:
2160 print prechar+alias+'\t\t'+atab[alias][1]
2164 print prechar+alias+'\t\t'+atab[alias][1]
2161 print '-'*30+'\nTotal number of aliases:',len(aliases)
2165 print '-'*30+'\nTotal number of aliases:',len(aliases)
2162 return
2166 return
2163 try:
2167 try:
2164 alias,cmd = par.split(None,1)
2168 alias,cmd = par.split(None,1)
2165 except:
2169 except:
2166 print OInspect.getdoc(self.magic_alias)
2170 print OInspect.getdoc(self.magic_alias)
2167 else:
2171 else:
2168 nargs = cmd.count('%s')
2172 nargs = cmd.count('%s')
2169 if nargs>0 and cmd.find('%l')>=0:
2173 if nargs>0 and cmd.find('%l')>=0:
2170 error('The %s and %l specifiers are mutually exclusive '
2174 error('The %s and %l specifiers are mutually exclusive '
2171 'in alias definitions.')
2175 'in alias definitions.')
2172 else: # all looks OK
2176 else: # all looks OK
2173 self.shell.alias_table[alias] = (nargs,cmd)
2177 self.shell.alias_table[alias] = (nargs,cmd)
2174 self.shell.alias_table_validate(verbose=1)
2178 self.shell.alias_table_validate(verbose=1)
2175 # end magic_alias
2179 # end magic_alias
2176
2180
2177 def magic_unalias(self, parameter_s = ''):
2181 def magic_unalias(self, parameter_s = ''):
2178 """Remove an alias"""
2182 """Remove an alias"""
2179
2183
2180 aname = parameter_s.strip()
2184 aname = parameter_s.strip()
2181 if aname in self.shell.alias_table:
2185 if aname in self.shell.alias_table:
2182 del self.shell.alias_table[aname]
2186 del self.shell.alias_table[aname]
2183
2187
2184 def magic_rehash(self, parameter_s = ''):
2188 def magic_rehash(self, parameter_s = ''):
2185 """Update the alias table with all entries in $PATH.
2189 """Update the alias table with all entries in $PATH.
2186
2190
2187 This version does no checks on execute permissions or whether the
2191 This version does no checks on execute permissions or whether the
2188 contents of $PATH are truly files (instead of directories or something
2192 contents of $PATH are truly files (instead of directories or something
2189 else). For such a safer (but slower) version, use %rehashx."""
2193 else). For such a safer (but slower) version, use %rehashx."""
2190
2194
2191 # This function (and rehashx) manipulate the alias_table directly
2195 # This function (and rehashx) manipulate the alias_table directly
2192 # rather than calling magic_alias, for speed reasons. A rehash on a
2196 # rather than calling magic_alias, for speed reasons. A rehash on a
2193 # typical Linux box involves several thousand entries, so efficiency
2197 # typical Linux box involves several thousand entries, so efficiency
2194 # here is a top concern.
2198 # here is a top concern.
2195
2199
2196 path = filter(os.path.isdir,os.environ['PATH'].split(os.pathsep))
2200 path = filter(os.path.isdir,os.environ['PATH'].split(os.pathsep))
2197 alias_table = self.shell.alias_table
2201 alias_table = self.shell.alias_table
2198 for pdir in path:
2202 for pdir in path:
2199 for ff in os.listdir(pdir):
2203 for ff in os.listdir(pdir):
2200 # each entry in the alias table must be (N,name), where
2204 # each entry in the alias table must be (N,name), where
2201 # N is the number of positional arguments of the alias.
2205 # N is the number of positional arguments of the alias.
2202 alias_table[ff] = (0,ff)
2206 alias_table[ff] = (0,ff)
2203 # Make sure the alias table doesn't contain keywords or builtins
2207 # Make sure the alias table doesn't contain keywords or builtins
2204 self.shell.alias_table_validate()
2208 self.shell.alias_table_validate()
2205 # Call again init_auto_alias() so we get 'rm -i' and other modified
2209 # Call again init_auto_alias() so we get 'rm -i' and other modified
2206 # aliases since %rehash will probably clobber them
2210 # aliases since %rehash will probably clobber them
2207 self.shell.init_auto_alias()
2211 self.shell.init_auto_alias()
2208
2212
2209 def magic_rehashx(self, parameter_s = ''):
2213 def magic_rehashx(self, parameter_s = ''):
2210 """Update the alias table with all executable files in $PATH.
2214 """Update the alias table with all executable files in $PATH.
2211
2215
2212 This version explicitly checks that every entry in $PATH is a file
2216 This version explicitly checks that every entry in $PATH is a file
2213 with execute access (os.X_OK), so it is much slower than %rehash.
2217 with execute access (os.X_OK), so it is much slower than %rehash.
2214
2218
2215 Under Windows, it checks executability as a match agains a
2219 Under Windows, it checks executability as a match agains a
2216 '|'-separated string of extensions, stored in the IPython config
2220 '|'-separated string of extensions, stored in the IPython config
2217 variable win_exec_ext. This defaults to 'exe|com|bat'. """
2221 variable win_exec_ext. This defaults to 'exe|com|bat'. """
2218
2222
2219 path = filter(os.path.isdir,os.environ['PATH'].split(os.pathsep))
2223 path = filter(os.path.isdir,os.environ['PATH'].split(os.pathsep))
2220 alias_table = self.shell.alias_table
2224 alias_table = self.shell.alias_table
2221
2225
2222 if os.name == 'posix':
2226 if os.name == 'posix':
2223 isexec = lambda fname:os.path.isfile(fname) and \
2227 isexec = lambda fname:os.path.isfile(fname) and \
2224 os.access(fname,os.X_OK)
2228 os.access(fname,os.X_OK)
2225 else:
2229 else:
2226
2230
2227 try:
2231 try:
2228 winext = os.environ['pathext'].replace(';','|').replace('.','')
2232 winext = os.environ['pathext'].replace(';','|').replace('.','')
2229 except KeyError:
2233 except KeyError:
2230 winext = 'exe|com|bat'
2234 winext = 'exe|com|bat'
2231
2235
2232 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2236 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2233 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2237 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2234 savedir = os.getcwd()
2238 savedir = os.getcwd()
2235 try:
2239 try:
2236 # write the whole loop for posix/Windows so we don't have an if in
2240 # write the whole loop for posix/Windows so we don't have an if in
2237 # the innermost part
2241 # the innermost part
2238 if os.name == 'posix':
2242 if os.name == 'posix':
2239 for pdir in path:
2243 for pdir in path:
2240 os.chdir(pdir)
2244 os.chdir(pdir)
2241 for ff in os.listdir(pdir):
2245 for ff in os.listdir(pdir):
2242 if isexec(ff):
2246 if isexec(ff):
2243 # each entry in the alias table must be (N,name),
2247 # each entry in the alias table must be (N,name),
2244 # where N is the number of positional arguments of the
2248 # where N is the number of positional arguments of the
2245 # alias.
2249 # alias.
2246 alias_table[ff] = (0,ff)
2250 alias_table[ff] = (0,ff)
2247 else:
2251 else:
2248 for pdir in path:
2252 for pdir in path:
2249 os.chdir(pdir)
2253 os.chdir(pdir)
2250 for ff in os.listdir(pdir):
2254 for ff in os.listdir(pdir):
2251 if isexec(ff):
2255 if isexec(ff):
2252 alias_table[execre.sub(r'\1',ff)] = (0,ff)
2256 alias_table[execre.sub(r'\1',ff)] = (0,ff)
2253 # Make sure the alias table doesn't contain keywords or builtins
2257 # Make sure the alias table doesn't contain keywords or builtins
2254 self.shell.alias_table_validate()
2258 self.shell.alias_table_validate()
2255 # Call again init_auto_alias() so we get 'rm -i' and other
2259 # Call again init_auto_alias() so we get 'rm -i' and other
2256 # modified aliases since %rehashx will probably clobber them
2260 # modified aliases since %rehashx will probably clobber them
2257 self.shell.init_auto_alias()
2261 self.shell.init_auto_alias()
2258 finally:
2262 finally:
2259 os.chdir(savedir)
2263 os.chdir(savedir)
2260
2264
2261 def magic_pwd(self, parameter_s = ''):
2265 def magic_pwd(self, parameter_s = ''):
2262 """Return the current working directory path."""
2266 """Return the current working directory path."""
2263 return os.getcwd()
2267 return os.getcwd()
2264
2268
2265 def magic_cd(self, parameter_s=''):
2269 def magic_cd(self, parameter_s=''):
2266 """Change the current working directory.
2270 """Change the current working directory.
2267
2271
2268 This command automatically maintains an internal list of directories
2272 This command automatically maintains an internal list of directories
2269 you visit during your IPython session, in the variable _dh. The
2273 you visit during your IPython session, in the variable _dh. The
2270 command %dhist shows this history nicely formatted.
2274 command %dhist shows this history nicely formatted.
2271
2275
2272 Usage:
2276 Usage:
2273
2277
2274 cd 'dir': changes to directory 'dir'.
2278 cd 'dir': changes to directory 'dir'.
2275
2279
2276 cd -: changes to the last visited directory.
2280 cd -: changes to the last visited directory.
2277
2281
2278 cd -<n>: changes to the n-th directory in the directory history.
2282 cd -<n>: changes to the n-th directory in the directory history.
2279
2283
2280 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2284 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2281 (note: cd <bookmark_name> is enough if there is no
2285 (note: cd <bookmark_name> is enough if there is no
2282 directory <bookmark_name>, but a bookmark with the name exists.)
2286 directory <bookmark_name>, but a bookmark with the name exists.)
2283
2287
2284 Options:
2288 Options:
2285
2289
2286 -q: quiet. Do not print the working directory after the cd command is
2290 -q: quiet. Do not print the working directory after the cd command is
2287 executed. By default IPython's cd command does print this directory,
2291 executed. By default IPython's cd command does print this directory,
2288 since the default prompts do not display path information.
2292 since the default prompts do not display path information.
2289
2293
2290 Note that !cd doesn't work for this purpose because the shell where
2294 Note that !cd doesn't work for this purpose because the shell where
2291 !command runs is immediately discarded after executing 'command'."""
2295 !command runs is immediately discarded after executing 'command'."""
2292
2296
2293 parameter_s = parameter_s.strip()
2297 parameter_s = parameter_s.strip()
2294 bkms = self.shell.persist.get("bookmarks",{})
2298 bkms = self.shell.persist.get("bookmarks",{})
2295
2299
2296 numcd = re.match(r'(-)(\d+)$',parameter_s)
2300 numcd = re.match(r'(-)(\d+)$',parameter_s)
2297 # jump in directory history by number
2301 # jump in directory history by number
2298 if numcd:
2302 if numcd:
2299 nn = int(numcd.group(2))
2303 nn = int(numcd.group(2))
2300 try:
2304 try:
2301 ps = self.shell.user_ns['_dh'][nn]
2305 ps = self.shell.user_ns['_dh'][nn]
2302 except IndexError:
2306 except IndexError:
2303 print 'The requested directory does not exist in history.'
2307 print 'The requested directory does not exist in history.'
2304 return
2308 return
2305 else:
2309 else:
2306 opts = {}
2310 opts = {}
2307 else:
2311 else:
2308 #turn all non-space-escaping backslashes to slashes,
2312 #turn all non-space-escaping backslashes to slashes,
2309 # for c:\windows\directory\names\
2313 # for c:\windows\directory\names\
2310 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2314 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2311 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2315 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2312 # jump to previous
2316 # jump to previous
2313 if ps == '-':
2317 if ps == '-':
2314 try:
2318 try:
2315 ps = self.shell.user_ns['_dh'][-2]
2319 ps = self.shell.user_ns['_dh'][-2]
2316 except IndexError:
2320 except IndexError:
2317 print 'No previous directory to change to.'
2321 print 'No previous directory to change to.'
2318 return
2322 return
2319 # jump to bookmark
2323 # jump to bookmark
2320 elif opts.has_key('b') or (bkms.has_key(ps) and not os.path.isdir(ps)):
2324 elif opts.has_key('b') or (bkms.has_key(ps) and not os.path.isdir(ps)):
2321 if bkms.has_key(ps):
2325 if bkms.has_key(ps):
2322 target = bkms[ps]
2326 target = bkms[ps]
2323 print '(bookmark:%s) -> %s' % (ps,target)
2327 print '(bookmark:%s) -> %s' % (ps,target)
2324 ps = target
2328 ps = target
2325 else:
2329 else:
2326 if bkms:
2330 if bkms:
2327 error("Bookmark '%s' not found. "
2331 error("Bookmark '%s' not found. "
2328 "Use '%%bookmark -l' to see your bookmarks." % ps)
2332 "Use '%%bookmark -l' to see your bookmarks." % ps)
2329 else:
2333 else:
2330 print "Bookmarks not set - use %bookmark <bookmarkname>"
2334 print "Bookmarks not set - use %bookmark <bookmarkname>"
2331 return
2335 return
2332
2336
2333 # at this point ps should point to the target dir
2337 # at this point ps should point to the target dir
2334 if ps:
2338 if ps:
2335 try:
2339 try:
2336 os.chdir(os.path.expanduser(ps))
2340 os.chdir(os.path.expanduser(ps))
2337 ttitle = ("IPy:" + (
2341 ttitle = ("IPy:" + (
2338 os.getcwd() == '/' and '/' or os.path.basename(os.getcwd())))
2342 os.getcwd() == '/' and '/' or os.path.basename(os.getcwd())))
2339 platutils.set_term_title(ttitle)
2343 platutils.set_term_title(ttitle)
2340 except OSError:
2344 except OSError:
2341 print sys.exc_info()[1]
2345 print sys.exc_info()[1]
2342 else:
2346 else:
2343 self.shell.user_ns['_dh'].append(os.getcwd())
2347 self.shell.user_ns['_dh'].append(os.getcwd())
2344 else:
2348 else:
2345 os.chdir(self.shell.home_dir)
2349 os.chdir(self.shell.home_dir)
2346 platutils.set_term_title("IPy:~")
2350 platutils.set_term_title("IPy:~")
2347 self.shell.user_ns['_dh'].append(os.getcwd())
2351 self.shell.user_ns['_dh'].append(os.getcwd())
2348 if not 'q' in opts:
2352 if not 'q' in opts:
2349 print self.shell.user_ns['_dh'][-1]
2353 print self.shell.user_ns['_dh'][-1]
2350
2354
2351 def magic_dhist(self, parameter_s=''):
2355 def magic_dhist(self, parameter_s=''):
2352 """Print your history of visited directories.
2356 """Print your history of visited directories.
2353
2357
2354 %dhist -> print full history\\
2358 %dhist -> print full history\\
2355 %dhist n -> print last n entries only\\
2359 %dhist n -> print last n entries only\\
2356 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2360 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2357
2361
2358 This history is automatically maintained by the %cd command, and
2362 This history is automatically maintained by the %cd command, and
2359 always available as the global list variable _dh. You can use %cd -<n>
2363 always available as the global list variable _dh. You can use %cd -<n>
2360 to go to directory number <n>."""
2364 to go to directory number <n>."""
2361
2365
2362 dh = self.shell.user_ns['_dh']
2366 dh = self.shell.user_ns['_dh']
2363 if parameter_s:
2367 if parameter_s:
2364 try:
2368 try:
2365 args = map(int,parameter_s.split())
2369 args = map(int,parameter_s.split())
2366 except:
2370 except:
2367 self.arg_err(Magic.magic_dhist)
2371 self.arg_err(Magic.magic_dhist)
2368 return
2372 return
2369 if len(args) == 1:
2373 if len(args) == 1:
2370 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2374 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2371 elif len(args) == 2:
2375 elif len(args) == 2:
2372 ini,fin = args
2376 ini,fin = args
2373 else:
2377 else:
2374 self.arg_err(Magic.magic_dhist)
2378 self.arg_err(Magic.magic_dhist)
2375 return
2379 return
2376 else:
2380 else:
2377 ini,fin = 0,len(dh)
2381 ini,fin = 0,len(dh)
2378 nlprint(dh,
2382 nlprint(dh,
2379 header = 'Directory history (kept in _dh)',
2383 header = 'Directory history (kept in _dh)',
2380 start=ini,stop=fin)
2384 start=ini,stop=fin)
2381
2385
2382 def magic_env(self, parameter_s=''):
2386 def magic_env(self, parameter_s=''):
2383 """List environment variables."""
2387 """List environment variables."""
2384
2388
2385 return os.environ.data
2389 return os.environ.data
2386
2390
2387 def magic_pushd(self, parameter_s=''):
2391 def magic_pushd(self, parameter_s=''):
2388 """Place the current dir on stack and change directory.
2392 """Place the current dir on stack and change directory.
2389
2393
2390 Usage:\\
2394 Usage:\\
2391 %pushd ['dirname']
2395 %pushd ['dirname']
2392
2396
2393 %pushd with no arguments does a %pushd to your home directory.
2397 %pushd with no arguments does a %pushd to your home directory.
2394 """
2398 """
2395 if parameter_s == '': parameter_s = '~'
2399 if parameter_s == '': parameter_s = '~'
2396 dir_s = self.shell.dir_stack
2400 dir_s = self.shell.dir_stack
2397 if len(dir_s)>0 and os.path.expanduser(parameter_s) != \
2401 if len(dir_s)>0 and os.path.expanduser(parameter_s) != \
2398 os.path.expanduser(self.shell.dir_stack[0]):
2402 os.path.expanduser(self.shell.dir_stack[0]):
2399 try:
2403 try:
2400 self.magic_cd(parameter_s)
2404 self.magic_cd(parameter_s)
2401 dir_s.insert(0,os.getcwd().replace(self.home_dir,'~'))
2405 dir_s.insert(0,os.getcwd().replace(self.home_dir,'~'))
2402 self.magic_dirs()
2406 self.magic_dirs()
2403 except:
2407 except:
2404 print 'Invalid directory'
2408 print 'Invalid directory'
2405 else:
2409 else:
2406 print 'You are already there!'
2410 print 'You are already there!'
2407
2411
2408 def magic_popd(self, parameter_s=''):
2412 def magic_popd(self, parameter_s=''):
2409 """Change to directory popped off the top of the stack.
2413 """Change to directory popped off the top of the stack.
2410 """
2414 """
2411 if len (self.shell.dir_stack) > 1:
2415 if len (self.shell.dir_stack) > 1:
2412 self.shell.dir_stack.pop(0)
2416 self.shell.dir_stack.pop(0)
2413 self.magic_cd(self.shell.dir_stack[0])
2417 self.magic_cd(self.shell.dir_stack[0])
2414 print self.shell.dir_stack[0]
2418 print self.shell.dir_stack[0]
2415 else:
2419 else:
2416 print "You can't remove the starting directory from the stack:",\
2420 print "You can't remove the starting directory from the stack:",\
2417 self.shell.dir_stack
2421 self.shell.dir_stack
2418
2422
2419 def magic_dirs(self, parameter_s=''):
2423 def magic_dirs(self, parameter_s=''):
2420 """Return the current directory stack."""
2424 """Return the current directory stack."""
2421
2425
2422 return self.shell.dir_stack[:]
2426 return self.shell.dir_stack[:]
2423
2427
2424 def magic_sc(self, parameter_s=''):
2428 def magic_sc(self, parameter_s=''):
2425 """Shell capture - execute a shell command and capture its output.
2429 """Shell capture - execute a shell command and capture its output.
2426
2430
2427 %sc [options] varname=command
2431 %sc [options] varname=command
2428
2432
2429 IPython will run the given command using commands.getoutput(), and
2433 IPython will run the given command using commands.getoutput(), and
2430 will then update the user's interactive namespace with a variable
2434 will then update the user's interactive namespace with a variable
2431 called varname, containing the value of the call. Your command can
2435 called varname, containing the value of the call. Your command can
2432 contain shell wildcards, pipes, etc.
2436 contain shell wildcards, pipes, etc.
2433
2437
2434 The '=' sign in the syntax is mandatory, and the variable name you
2438 The '=' sign in the syntax is mandatory, and the variable name you
2435 supply must follow Python's standard conventions for valid names.
2439 supply must follow Python's standard conventions for valid names.
2436
2440
2437 Options:
2441 Options:
2438
2442
2439 -l: list output. Split the output on newlines into a list before
2443 -l: list output. Split the output on newlines into a list before
2440 assigning it to the given variable. By default the output is stored
2444 assigning it to the given variable. By default the output is stored
2441 as a single string.
2445 as a single string.
2442
2446
2443 -v: verbose. Print the contents of the variable.
2447 -v: verbose. Print the contents of the variable.
2444
2448
2445 In most cases you should not need to split as a list, because the
2449 In most cases you should not need to split as a list, because the
2446 returned value is a special type of string which can automatically
2450 returned value is a special type of string which can automatically
2447 provide its contents either as a list (split on newlines) or as a
2451 provide its contents either as a list (split on newlines) or as a
2448 space-separated string. These are convenient, respectively, either
2452 space-separated string. These are convenient, respectively, either
2449 for sequential processing or to be passed to a shell command.
2453 for sequential processing or to be passed to a shell command.
2450
2454
2451 For example:
2455 For example:
2452
2456
2453 # Capture into variable a
2457 # Capture into variable a
2454 In [9]: sc a=ls *py
2458 In [9]: sc a=ls *py
2455
2459
2456 # a is a string with embedded newlines
2460 # a is a string with embedded newlines
2457 In [10]: a
2461 In [10]: a
2458 Out[10]: 'setup.py\nwin32_manual_post_install.py'
2462 Out[10]: 'setup.py\nwin32_manual_post_install.py'
2459
2463
2460 # which can be seen as a list:
2464 # which can be seen as a list:
2461 In [11]: a.l
2465 In [11]: a.l
2462 Out[11]: ['setup.py', 'win32_manual_post_install.py']
2466 Out[11]: ['setup.py', 'win32_manual_post_install.py']
2463
2467
2464 # or as a whitespace-separated string:
2468 # or as a whitespace-separated string:
2465 In [12]: a.s
2469 In [12]: a.s
2466 Out[12]: 'setup.py win32_manual_post_install.py'
2470 Out[12]: 'setup.py win32_manual_post_install.py'
2467
2471
2468 # a.s is useful to pass as a single command line:
2472 # a.s is useful to pass as a single command line:
2469 In [13]: !wc -l $a.s
2473 In [13]: !wc -l $a.s
2470 146 setup.py
2474 146 setup.py
2471 130 win32_manual_post_install.py
2475 130 win32_manual_post_install.py
2472 276 total
2476 276 total
2473
2477
2474 # while the list form is useful to loop over:
2478 # while the list form is useful to loop over:
2475 In [14]: for f in a.l:
2479 In [14]: for f in a.l:
2476 ....: !wc -l $f
2480 ....: !wc -l $f
2477 ....:
2481 ....:
2478 146 setup.py
2482 146 setup.py
2479 130 win32_manual_post_install.py
2483 130 win32_manual_post_install.py
2480
2484
2481 Similiarly, the lists returned by the -l option are also special, in
2485 Similiarly, the lists returned by the -l option are also special, in
2482 the sense that you can equally invoke the .s attribute on them to
2486 the sense that you can equally invoke the .s attribute on them to
2483 automatically get a whitespace-separated string from their contents:
2487 automatically get a whitespace-separated string from their contents:
2484
2488
2485 In [1]: sc -l b=ls *py
2489 In [1]: sc -l b=ls *py
2486
2490
2487 In [2]: b
2491 In [2]: b
2488 Out[2]: ['setup.py', 'win32_manual_post_install.py']
2492 Out[2]: ['setup.py', 'win32_manual_post_install.py']
2489
2493
2490 In [3]: b.s
2494 In [3]: b.s
2491 Out[3]: 'setup.py win32_manual_post_install.py'
2495 Out[3]: 'setup.py win32_manual_post_install.py'
2492
2496
2493 In summary, both the lists and strings used for ouptut capture have
2497 In summary, both the lists and strings used for ouptut capture have
2494 the following special attributes:
2498 the following special attributes:
2495
2499
2496 .l (or .list) : value as list.
2500 .l (or .list) : value as list.
2497 .n (or .nlstr): value as newline-separated string.
2501 .n (or .nlstr): value as newline-separated string.
2498 .s (or .spstr): value as space-separated string.
2502 .s (or .spstr): value as space-separated string.
2499 """
2503 """
2500
2504
2501 opts,args = self.parse_options(parameter_s,'lv')
2505 opts,args = self.parse_options(parameter_s,'lv')
2502 # Try to get a variable name and command to run
2506 # Try to get a variable name and command to run
2503 try:
2507 try:
2504 # the variable name must be obtained from the parse_options
2508 # the variable name must be obtained from the parse_options
2505 # output, which uses shlex.split to strip options out.
2509 # output, which uses shlex.split to strip options out.
2506 var,_ = args.split('=',1)
2510 var,_ = args.split('=',1)
2507 var = var.strip()
2511 var = var.strip()
2508 # But the the command has to be extracted from the original input
2512 # But the the command has to be extracted from the original input
2509 # parameter_s, not on what parse_options returns, to avoid the
2513 # parameter_s, not on what parse_options returns, to avoid the
2510 # quote stripping which shlex.split performs on it.
2514 # quote stripping which shlex.split performs on it.
2511 _,cmd = parameter_s.split('=',1)
2515 _,cmd = parameter_s.split('=',1)
2512 except ValueError:
2516 except ValueError:
2513 var,cmd = '',''
2517 var,cmd = '',''
2514 if not var:
2518 if not var:
2515 error('you must specify a variable to assign the command to.')
2519 error('you must specify a variable to assign the command to.')
2516 return
2520 return
2517 # If all looks ok, proceed
2521 # If all looks ok, proceed
2518 out,err = self.shell.getoutputerror(cmd)
2522 out,err = self.shell.getoutputerror(cmd)
2519 if err:
2523 if err:
2520 print >> Term.cerr,err
2524 print >> Term.cerr,err
2521 if opts.has_key('l'):
2525 if opts.has_key('l'):
2522 out = SList(out.split('\n'))
2526 out = SList(out.split('\n'))
2523 else:
2527 else:
2524 out = LSString(out)
2528 out = LSString(out)
2525 if opts.has_key('v'):
2529 if opts.has_key('v'):
2526 print '%s ==\n%s' % (var,pformat(out))
2530 print '%s ==\n%s' % (var,pformat(out))
2527 self.shell.user_ns.update({var:out})
2531 self.shell.user_ns.update({var:out})
2528
2532
2529 def magic_sx(self, parameter_s=''):
2533 def magic_sx(self, parameter_s=''):
2530 """Shell execute - run a shell command and capture its output.
2534 """Shell execute - run a shell command and capture its output.
2531
2535
2532 %sx command
2536 %sx command
2533
2537
2534 IPython will run the given command using commands.getoutput(), and
2538 IPython will run the given command using commands.getoutput(), and
2535 return the result formatted as a list (split on '\\n'). Since the
2539 return the result formatted as a list (split on '\\n'). Since the
2536 output is _returned_, it will be stored in ipython's regular output
2540 output is _returned_, it will be stored in ipython's regular output
2537 cache Out[N] and in the '_N' automatic variables.
2541 cache Out[N] and in the '_N' automatic variables.
2538
2542
2539 Notes:
2543 Notes:
2540
2544
2541 1) If an input line begins with '!!', then %sx is automatically
2545 1) If an input line begins with '!!', then %sx is automatically
2542 invoked. That is, while:
2546 invoked. That is, while:
2543 !ls
2547 !ls
2544 causes ipython to simply issue system('ls'), typing
2548 causes ipython to simply issue system('ls'), typing
2545 !!ls
2549 !!ls
2546 is a shorthand equivalent to:
2550 is a shorthand equivalent to:
2547 %sx ls
2551 %sx ls
2548
2552
2549 2) %sx differs from %sc in that %sx automatically splits into a list,
2553 2) %sx differs from %sc in that %sx automatically splits into a list,
2550 like '%sc -l'. The reason for this is to make it as easy as possible
2554 like '%sc -l'. The reason for this is to make it as easy as possible
2551 to process line-oriented shell output via further python commands.
2555 to process line-oriented shell output via further python commands.
2552 %sc is meant to provide much finer control, but requires more
2556 %sc is meant to provide much finer control, but requires more
2553 typing.
2557 typing.
2554
2558
2555 3) Just like %sc -l, this is a list with special attributes:
2559 3) Just like %sc -l, this is a list with special attributes:
2556
2560
2557 .l (or .list) : value as list.
2561 .l (or .list) : value as list.
2558 .n (or .nlstr): value as newline-separated string.
2562 .n (or .nlstr): value as newline-separated string.
2559 .s (or .spstr): value as whitespace-separated string.
2563 .s (or .spstr): value as whitespace-separated string.
2560
2564
2561 This is very useful when trying to use such lists as arguments to
2565 This is very useful when trying to use such lists as arguments to
2562 system commands."""
2566 system commands."""
2563
2567
2564 if parameter_s:
2568 if parameter_s:
2565 out,err = self.shell.getoutputerror(parameter_s)
2569 out,err = self.shell.getoutputerror(parameter_s)
2566 if err:
2570 if err:
2567 print >> Term.cerr,err
2571 print >> Term.cerr,err
2568 return SList(out.split('\n'))
2572 return SList(out.split('\n'))
2569
2573
2570 def magic_bg(self, parameter_s=''):
2574 def magic_bg(self, parameter_s=''):
2571 """Run a job in the background, in a separate thread.
2575 """Run a job in the background, in a separate thread.
2572
2576
2573 For example,
2577 For example,
2574
2578
2575 %bg myfunc(x,y,z=1)
2579 %bg myfunc(x,y,z=1)
2576
2580
2577 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
2581 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
2578 execution starts, a message will be printed indicating the job
2582 execution starts, a message will be printed indicating the job
2579 number. If your job number is 5, you can use
2583 number. If your job number is 5, you can use
2580
2584
2581 myvar = jobs.result(5) or myvar = jobs[5].result
2585 myvar = jobs.result(5) or myvar = jobs[5].result
2582
2586
2583 to assign this result to variable 'myvar'.
2587 to assign this result to variable 'myvar'.
2584
2588
2585 IPython has a job manager, accessible via the 'jobs' object. You can
2589 IPython has a job manager, accessible via the 'jobs' object. You can
2586 type jobs? to get more information about it, and use jobs.<TAB> to see
2590 type jobs? to get more information about it, and use jobs.<TAB> to see
2587 its attributes. All attributes not starting with an underscore are
2591 its attributes. All attributes not starting with an underscore are
2588 meant for public use.
2592 meant for public use.
2589
2593
2590 In particular, look at the jobs.new() method, which is used to create
2594 In particular, look at the jobs.new() method, which is used to create
2591 new jobs. This magic %bg function is just a convenience wrapper
2595 new jobs. This magic %bg function is just a convenience wrapper
2592 around jobs.new(), for expression-based jobs. If you want to create a
2596 around jobs.new(), for expression-based jobs. If you want to create a
2593 new job with an explicit function object and arguments, you must call
2597 new job with an explicit function object and arguments, you must call
2594 jobs.new() directly.
2598 jobs.new() directly.
2595
2599
2596 The jobs.new docstring also describes in detail several important
2600 The jobs.new docstring also describes in detail several important
2597 caveats associated with a thread-based model for background job
2601 caveats associated with a thread-based model for background job
2598 execution. Type jobs.new? for details.
2602 execution. Type jobs.new? for details.
2599
2603
2600 You can check the status of all jobs with jobs.status().
2604 You can check the status of all jobs with jobs.status().
2601
2605
2602 The jobs variable is set by IPython into the Python builtin namespace.
2606 The jobs variable is set by IPython into the Python builtin namespace.
2603 If you ever declare a variable named 'jobs', you will shadow this
2607 If you ever declare a variable named 'jobs', you will shadow this
2604 name. You can either delete your global jobs variable to regain
2608 name. You can either delete your global jobs variable to regain
2605 access to the job manager, or make a new name and assign it manually
2609 access to the job manager, or make a new name and assign it manually
2606 to the manager (stored in IPython's namespace). For example, to
2610 to the manager (stored in IPython's namespace). For example, to
2607 assign the job manager to the Jobs name, use:
2611 assign the job manager to the Jobs name, use:
2608
2612
2609 Jobs = __builtins__.jobs"""
2613 Jobs = __builtins__.jobs"""
2610
2614
2611 self.shell.jobs.new(parameter_s,self.shell.user_ns)
2615 self.shell.jobs.new(parameter_s,self.shell.user_ns)
2612
2616
2613 def magic_store(self, parameter_s=''):
2617 def magic_store(self, parameter_s=''):
2614 """Lightweight persistence for python variables.
2618 """Lightweight persistence for python variables.
2615
2619
2616 Example:
2620 Example:
2617
2621
2618 ville@badger[~]|1> A = ['hello',10,'world']\\
2622 ville@badger[~]|1> A = ['hello',10,'world']\\
2619 ville@badger[~]|2> %store A\\
2623 ville@badger[~]|2> %store A\\
2620 ville@badger[~]|3> Exit
2624 ville@badger[~]|3> Exit
2621
2625
2622 (IPython session is closed and started again...)
2626 (IPython session is closed and started again...)
2623
2627
2624 ville@badger:~$ ipython -p pysh\\
2628 ville@badger:~$ ipython -p pysh\\
2625 ville@badger[~]|1> print A
2629 ville@badger[~]|1> print A
2626
2630
2627 ['hello', 10, 'world']
2631 ['hello', 10, 'world']
2628
2632
2629 Usage:
2633 Usage:
2630
2634
2631 %store - Show list of all variables and their current values\\
2635 %store - Show list of all variables and their current values\\
2632 %store <var> - Store the *current* value of the variable to disk\\
2636 %store <var> - Store the *current* value of the variable to disk\\
2633 %store -d <var> - Remove the variable and its value from storage\\
2637 %store -d <var> - Remove the variable and its value from storage\\
2634 %store -r - Remove all variables from storage
2638 %store -r - Remove all variables from storage
2635
2639
2636 It should be noted that if you change the value of a variable, you
2640 It should be noted that if you change the value of a variable, you
2637 need to %store it again if you want to persist the new value.
2641 need to %store it again if you want to persist the new value.
2638
2642
2639 Note also that the variables will need to be pickleable; most basic
2643 Note also that the variables will need to be pickleable; most basic
2640 python types can be safely %stored.
2644 python types can be safely %stored.
2641 """
2645 """
2642
2646
2643 opts,args = self.parse_options(parameter_s,'dr',mode='list')
2647 opts,args = self.parse_options(parameter_s,'dr',mode='list')
2644 # delete
2648 # delete
2645 if opts.has_key('d'):
2649 if opts.has_key('d'):
2646 try:
2650 try:
2647 todel = args[0]
2651 todel = args[0]
2648 except IndexError:
2652 except IndexError:
2649 error('You must provide the variable to forget')
2653 error('You must provide the variable to forget')
2650 else:
2654 else:
2651 try:
2655 try:
2652 del self.shell.persist['S:' + todel]
2656 del self.shell.persist['S:' + todel]
2653 except:
2657 except:
2654 error("Can't delete variable '%s'" % todel)
2658 error("Can't delete variable '%s'" % todel)
2655 # reset
2659 # reset
2656 elif opts.has_key('r'):
2660 elif opts.has_key('r'):
2657 for k in self.shell.persist.keys():
2661 for k in self.shell.persist.keys():
2658 if k.startswith('S:'):
2662 if k.startswith('S:'):
2659 del self.shell.persist[k]
2663 del self.shell.persist[k]
2660
2664
2661 # run without arguments -> list variables & values
2665 # run without arguments -> list variables & values
2662 elif not args:
2666 elif not args:
2663 vars = [v[2:] for v in self.shell.persist.keys()
2667 vars = [v[2:] for v in self.shell.persist.keys()
2664 if v.startswith('S:')]
2668 if v.startswith('S:')]
2665 vars.sort()
2669 vars.sort()
2666 if vars:
2670 if vars:
2667 size = max(map(len,vars))
2671 size = max(map(len,vars))
2668 else:
2672 else:
2669 size = 0
2673 size = 0
2670
2674
2671 print 'Stored variables and their in-memory values:'
2675 print 'Stored variables and their in-memory values:'
2672 fmt = '%-'+str(size)+'s -> %s'
2676 fmt = '%-'+str(size)+'s -> %s'
2673 get = self.shell.user_ns.get
2677 get = self.shell.user_ns.get
2674 for var in vars:
2678 for var in vars:
2675 # print 30 first characters from every var
2679 # print 30 first characters from every var
2676 print fmt % (var,repr(get(var,'<unavailable>'))[:50])
2680 print fmt % (var,repr(get(var,'<unavailable>'))[:50])
2677
2681
2678 # default action - store the variable
2682 # default action - store the variable
2679 else:
2683 else:
2680 pickled = pickle.dumps(self.shell.user_ns[args[0] ])
2684 pickled = pickle.dumps(self.shell.user_ns[args[0] ])
2681 self.shell.persist[ 'S:' + args[0] ] = pickled
2685 self.shell.persist[ 'S:' + args[0] ] = pickled
2682 print "Stored '%s' (%d bytes)" % (args[0], len(pickled))
2686 print "Stored '%s' (%d bytes)" % (args[0], len(pickled))
2683
2687
2684 def magic_bookmark(self, parameter_s=''):
2688 def magic_bookmark(self, parameter_s=''):
2685 """Manage IPython's bookmark system.
2689 """Manage IPython's bookmark system.
2686
2690
2687 %bookmark <name> - set bookmark to current dir
2691 %bookmark <name> - set bookmark to current dir
2688 %bookmark <name> <dir> - set bookmark to <dir>
2692 %bookmark <name> <dir> - set bookmark to <dir>
2689 %bookmark -l - list all bookmarks
2693 %bookmark -l - list all bookmarks
2690 %bookmark -d <name> - remove bookmark
2694 %bookmark -d <name> - remove bookmark
2691 %bookmark -r - remove all bookmarks
2695 %bookmark -r - remove all bookmarks
2692
2696
2693 You can later on access a bookmarked folder with:
2697 You can later on access a bookmarked folder with:
2694 %cd -b <name>
2698 %cd -b <name>
2695 or simply '%cd <name>' if there is no directory called <name> AND
2699 or simply '%cd <name>' if there is no directory called <name> AND
2696 there is such a bookmark defined.
2700 there is such a bookmark defined.
2697
2701
2698 Your bookmarks persist through IPython sessions, but they are
2702 Your bookmarks persist through IPython sessions, but they are
2699 associated with each profile."""
2703 associated with each profile."""
2700
2704
2701 opts,args = self.parse_options(parameter_s,'drl',mode='list')
2705 opts,args = self.parse_options(parameter_s,'drl',mode='list')
2702 if len(args) > 2:
2706 if len(args) > 2:
2703 error('You can only give at most two arguments')
2707 error('You can only give at most two arguments')
2704 return
2708 return
2705
2709
2706 bkms = self.shell.persist.get('bookmarks',{})
2710 bkms = self.shell.persist.get('bookmarks',{})
2707
2711
2708 if opts.has_key('d'):
2712 if opts.has_key('d'):
2709 try:
2713 try:
2710 todel = args[0]
2714 todel = args[0]
2711 except IndexError:
2715 except IndexError:
2712 error('You must provide a bookmark to delete')
2716 error('You must provide a bookmark to delete')
2713 else:
2717 else:
2714 try:
2718 try:
2715 del bkms[todel]
2719 del bkms[todel]
2716 except:
2720 except:
2717 error("Can't delete bookmark '%s'" % todel)
2721 error("Can't delete bookmark '%s'" % todel)
2718 elif opts.has_key('r'):
2722 elif opts.has_key('r'):
2719 bkms = {}
2723 bkms = {}
2720 elif opts.has_key('l'):
2724 elif opts.has_key('l'):
2721 bks = bkms.keys()
2725 bks = bkms.keys()
2722 bks.sort()
2726 bks.sort()
2723 if bks:
2727 if bks:
2724 size = max(map(len,bks))
2728 size = max(map(len,bks))
2725 else:
2729 else:
2726 size = 0
2730 size = 0
2727 fmt = '%-'+str(size)+'s -> %s'
2731 fmt = '%-'+str(size)+'s -> %s'
2728 print 'Current bookmarks:'
2732 print 'Current bookmarks:'
2729 for bk in bks:
2733 for bk in bks:
2730 print fmt % (bk,bkms[bk])
2734 print fmt % (bk,bkms[bk])
2731 else:
2735 else:
2732 if not args:
2736 if not args:
2733 error("You must specify the bookmark name")
2737 error("You must specify the bookmark name")
2734 elif len(args)==1:
2738 elif len(args)==1:
2735 bkms[args[0]] = os.getcwd()
2739 bkms[args[0]] = os.getcwd()
2736 elif len(args)==2:
2740 elif len(args)==2:
2737 bkms[args[0]] = args[1]
2741 bkms[args[0]] = args[1]
2738 self.shell.persist['bookmarks'] = bkms
2742 self.shell.persist['bookmarks'] = bkms
2739
2743
2740 def magic_pycat(self, parameter_s=''):
2744 def magic_pycat(self, parameter_s=''):
2741 """Show a syntax-highlighted file through a pager.
2745 """Show a syntax-highlighted file through a pager.
2742
2746
2743 This magic is similar to the cat utility, but it will assume the file
2747 This magic is similar to the cat utility, but it will assume the file
2744 to be Python source and will show it with syntax highlighting. """
2748 to be Python source and will show it with syntax highlighting. """
2745
2749
2746 filename = get_py_filename(parameter_s)
2750 filename = get_py_filename(parameter_s)
2747 page(self.shell.pycolorize(file_read(filename)),
2751 page(self.shell.pycolorize(file_read(filename)),
2748 screen_lines=self.shell.rc.screen_length)
2752 screen_lines=self.shell.rc.screen_length)
2749
2753
2750 # end Magic
2754 # end Magic
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now