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