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