##// END OF EJS Templates
- Improvements to demo classes and some magic fixes.
fperez -
Show More

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

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