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