##// END OF EJS Templates
General work on inputhook and the docs....
Brian Granger -
Show More
@@ -1,3585 +1,3587 b''
1 1 # -*- coding: 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-2006 Fernando Perez <fperez@colorado.edu>
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #*****************************************************************************
12 12
13 13 #****************************************************************************
14 14 # Modules and globals
15 15
16 16 # Python standard modules
17 17 import __builtin__
18 18 import bdb
19 19 import inspect
20 20 import os
21 21 import pdb
22 22 import pydoc
23 23 import sys
24 24 import re
25 25 import tempfile
26 26 import time
27 27 import cPickle as pickle
28 28 import textwrap
29 29 from cStringIO import StringIO
30 30 from getopt import getopt,GetoptError
31 31 from pprint import pprint, pformat
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 # Homebrewed
45 45 import IPython
46 46 from IPython.utils import wildcard
47 47 from IPython.core import debugger, oinspect
48 48 from IPython.core.fakemodule import FakeModule
49 49 from IPython.external.Itpl import Itpl, itpl, printpl,itplns
50 50 from IPython.utils.PyColorize import Parser
51 51 from IPython.utils.ipstruct import Struct
52 52 from IPython.core.macro import Macro
53 53 from IPython.utils.genutils import *
54 54 from IPython.utils import platutils
55 55 import IPython.utils.generics
56 56 from IPython.core import ipapi
57 57 from IPython.core.ipapi import UsageError
58 58 from IPython.testing import decorators as testdec
59 59
60 60 #***************************************************************************
61 61 # Utility functions
62 62 def on_off(tag):
63 63 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
64 64 return ['OFF','ON'][tag]
65 65
66 66 class Bunch: pass
67 67
68 68 def compress_dhist(dh):
69 69 head, tail = dh[:-10], dh[-10:]
70 70
71 71 newhead = []
72 72 done = set()
73 73 for h in head:
74 74 if h in done:
75 75 continue
76 76 newhead.append(h)
77 77 done.add(h)
78 78
79 79 return newhead + tail
80 80
81 81
82 82 #***************************************************************************
83 83 # Main class implementing Magic functionality
84 84 class Magic:
85 85 """Magic functions for InteractiveShell.
86 86
87 87 Shell functions which can be reached as %function_name. All magic
88 88 functions should accept a string, which they can parse for their own
89 89 needs. This can make some functions easier to type, eg `%cd ../`
90 90 vs. `%cd("../")`
91 91
92 92 ALL definitions MUST begin with the prefix magic_. The user won't need it
93 93 at the command line, but it is is needed in the definition. """
94 94
95 95 # class globals
96 96 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
97 97 'Automagic is ON, % prefix NOT needed for magic functions.']
98 98
99 99 #......................................................................
100 100 # some utility functions
101 101
102 102 def __init__(self,shell):
103 103
104 104 self.options_table = {}
105 105 if profile is None:
106 106 self.magic_prun = self.profile_missing_notice
107 107 self.shell = shell
108 108
109 109 # namespace for holding state we may need
110 110 self._magic_state = Bunch()
111 111
112 112 def profile_missing_notice(self, *args, **kwargs):
113 113 error("""\
114 114 The profile module could not be found. It has been removed from the standard
115 115 python packages because of its non-free license. To use profiling, install the
116 116 python-profiler package from non-free.""")
117 117
118 118 def default_option(self,fn,optstr):
119 119 """Make an entry in the options_table for fn, with value optstr"""
120 120
121 121 if fn not in self.lsmagic():
122 122 error("%s is not a magic function" % fn)
123 123 self.options_table[fn] = optstr
124 124
125 125 def lsmagic(self):
126 126 """Return a list of currently available magic functions.
127 127
128 128 Gives a list of the bare names after mangling (['ls','cd', ...], not
129 129 ['magic_ls','magic_cd',...]"""
130 130
131 131 # FIXME. This needs a cleanup, in the way the magics list is built.
132 132
133 133 # magics in class definition
134 134 class_magic = lambda fn: fn.startswith('magic_') and \
135 135 callable(Magic.__dict__[fn])
136 136 # in instance namespace (run-time user additions)
137 137 inst_magic = lambda fn: fn.startswith('magic_') and \
138 138 callable(self.__dict__[fn])
139 139 # and bound magics by user (so they can access self):
140 140 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
141 141 callable(self.__class__.__dict__[fn])
142 142 magics = filter(class_magic,Magic.__dict__.keys()) + \
143 143 filter(inst_magic,self.__dict__.keys()) + \
144 144 filter(inst_bound_magic,self.__class__.__dict__.keys())
145 145 out = []
146 146 for fn in set(magics):
147 147 out.append(fn.replace('magic_','',1))
148 148 out.sort()
149 149 return out
150 150
151 151 def extract_input_slices(self,slices,raw=False):
152 152 """Return as a string a set of input history slices.
153 153
154 154 Inputs:
155 155
156 156 - slices: the set of slices is given as a list of strings (like
157 157 ['1','4:8','9'], since this function is for use by magic functions
158 158 which get their arguments as strings.
159 159
160 160 Optional inputs:
161 161
162 162 - raw(False): by default, the processed input is used. If this is
163 163 true, the raw input history is used instead.
164 164
165 165 Note that slices can be called with two notations:
166 166
167 167 N:M -> standard python form, means including items N...(M-1).
168 168
169 169 N-M -> include items N..M (closed endpoint)."""
170 170
171 171 if raw:
172 172 hist = self.shell.input_hist_raw
173 173 else:
174 174 hist = self.shell.input_hist
175 175
176 176 cmds = []
177 177 for chunk in slices:
178 178 if ':' in chunk:
179 179 ini,fin = map(int,chunk.split(':'))
180 180 elif '-' in chunk:
181 181 ini,fin = map(int,chunk.split('-'))
182 182 fin += 1
183 183 else:
184 184 ini = int(chunk)
185 185 fin = ini+1
186 186 cmds.append(hist[ini:fin])
187 187 return cmds
188 188
189 189 def _ofind(self, oname, namespaces=None):
190 190 """Find an object in the available namespaces.
191 191
192 192 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
193 193
194 194 Has special code to detect magic functions.
195 195 """
196 196
197 197 oname = oname.strip()
198 198
199 199 alias_ns = None
200 200 if namespaces is None:
201 201 # Namespaces to search in:
202 202 # Put them in a list. The order is important so that we
203 203 # find things in the same order that Python finds them.
204 204 namespaces = [ ('Interactive', self.shell.user_ns),
205 205 ('IPython internal', self.shell.internal_ns),
206 206 ('Python builtin', __builtin__.__dict__),
207 207 ('Alias', self.shell.alias_table),
208 208 ]
209 209 alias_ns = self.shell.alias_table
210 210
211 211 # initialize results to 'null'
212 212 found = 0; obj = None; ospace = None; ds = None;
213 213 ismagic = 0; isalias = 0; parent = None
214 214
215 215 # Look for the given name by splitting it in parts. If the head is
216 216 # found, then we look for all the remaining parts as members, and only
217 217 # declare success if we can find them all.
218 218 oname_parts = oname.split('.')
219 219 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
220 220 for nsname,ns in namespaces:
221 221 try:
222 222 obj = ns[oname_head]
223 223 except KeyError:
224 224 continue
225 225 else:
226 226 #print 'oname_rest:', oname_rest # dbg
227 227 for part in oname_rest:
228 228 try:
229 229 parent = obj
230 230 obj = getattr(obj,part)
231 231 except:
232 232 # Blanket except b/c some badly implemented objects
233 233 # allow __getattr__ to raise exceptions other than
234 234 # AttributeError, which then crashes IPython.
235 235 break
236 236 else:
237 237 # If we finish the for loop (no break), we got all members
238 238 found = 1
239 239 ospace = nsname
240 240 if ns == alias_ns:
241 241 isalias = 1
242 242 break # namespace loop
243 243
244 244 # Try to see if it's magic
245 245 if not found:
246 246 if oname.startswith(self.shell.ESC_MAGIC):
247 247 oname = oname[1:]
248 248 obj = getattr(self,'magic_'+oname,None)
249 249 if obj is not None:
250 250 found = 1
251 251 ospace = 'IPython internal'
252 252 ismagic = 1
253 253
254 254 # Last try: special-case some literals like '', [], {}, etc:
255 255 if not found and oname_head in ["''",'""','[]','{}','()']:
256 256 obj = eval(oname_head)
257 257 found = 1
258 258 ospace = 'Interactive'
259 259
260 260 return {'found':found, 'obj':obj, 'namespace':ospace,
261 261 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
262 262
263 263 def arg_err(self,func):
264 264 """Print docstring if incorrect arguments were passed"""
265 265 print 'Error in arguments:'
266 266 print OInspect.getdoc(func)
267 267
268 268 def format_latex(self,strng):
269 269 """Format a string for latex inclusion."""
270 270
271 271 # Characters that need to be escaped for latex:
272 272 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
273 273 # Magic command names as headers:
274 274 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
275 275 re.MULTILINE)
276 276 # Magic commands
277 277 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
278 278 re.MULTILINE)
279 279 # Paragraph continue
280 280 par_re = re.compile(r'\\$',re.MULTILINE)
281 281
282 282 # The "\n" symbol
283 283 newline_re = re.compile(r'\\n')
284 284
285 285 # Now build the string for output:
286 286 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
287 287 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
288 288 strng)
289 289 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
290 290 strng = par_re.sub(r'\\\\',strng)
291 291 strng = escape_re.sub(r'\\\1',strng)
292 292 strng = newline_re.sub(r'\\textbackslash{}n',strng)
293 293 return strng
294 294
295 295 def format_screen(self,strng):
296 296 """Format a string for screen printing.
297 297
298 298 This removes some latex-type format codes."""
299 299 # Paragraph continue
300 300 par_re = re.compile(r'\\$',re.MULTILINE)
301 301 strng = par_re.sub('',strng)
302 302 return strng
303 303
304 304 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
305 305 """Parse options passed to an argument string.
306 306
307 307 The interface is similar to that of getopt(), but it returns back a
308 308 Struct with the options as keys and the stripped argument string still
309 309 as a string.
310 310
311 311 arg_str is quoted as a true sys.argv vector by using shlex.split.
312 312 This allows us to easily expand variables, glob files, quote
313 313 arguments, etc.
314 314
315 315 Options:
316 316 -mode: default 'string'. If given as 'list', the argument string is
317 317 returned as a list (split on whitespace) instead of a string.
318 318
319 319 -list_all: put all option values in lists. Normally only options
320 320 appearing more than once are put in a list.
321 321
322 322 -posix (True): whether to split the input line in POSIX mode or not,
323 323 as per the conventions outlined in the shlex module from the
324 324 standard library."""
325 325
326 326 # inject default options at the beginning of the input line
327 327 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
328 328 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
329 329
330 330 mode = kw.get('mode','string')
331 331 if mode not in ['string','list']:
332 332 raise ValueError,'incorrect mode given: %s' % mode
333 333 # Get options
334 334 list_all = kw.get('list_all',0)
335 335 posix = kw.get('posix',True)
336 336
337 337 # Check if we have more than one argument to warrant extra processing:
338 338 odict = {} # Dictionary with options
339 339 args = arg_str.split()
340 340 if len(args) >= 1:
341 341 # If the list of inputs only has 0 or 1 thing in it, there's no
342 342 # need to look for options
343 343 argv = arg_split(arg_str,posix)
344 344 # Do regular option processing
345 345 try:
346 346 opts,args = getopt(argv,opt_str,*long_opts)
347 347 except GetoptError,e:
348 348 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
349 349 " ".join(long_opts)))
350 350 for o,a in opts:
351 351 if o.startswith('--'):
352 352 o = o[2:]
353 353 else:
354 354 o = o[1:]
355 355 try:
356 356 odict[o].append(a)
357 357 except AttributeError:
358 358 odict[o] = [odict[o],a]
359 359 except KeyError:
360 360 if list_all:
361 361 odict[o] = [a]
362 362 else:
363 363 odict[o] = a
364 364
365 365 # Prepare opts,args for return
366 366 opts = Struct(odict)
367 367 if mode == 'string':
368 368 args = ' '.join(args)
369 369
370 370 return opts,args
371 371
372 372 #......................................................................
373 373 # And now the actual magic functions
374 374
375 375 # Functions for IPython shell work (vars,funcs, config, etc)
376 376 def magic_lsmagic(self, parameter_s = ''):
377 377 """List currently available magic functions."""
378 378 mesc = self.shell.ESC_MAGIC
379 379 print 'Available magic functions:\n'+mesc+\
380 380 (' '+mesc).join(self.lsmagic())
381 381 print '\n' + Magic.auto_status[self.shell.rc.automagic]
382 382 return None
383 383
384 384 def magic_magic(self, parameter_s = ''):
385 385 """Print information about the magic function system.
386 386
387 387 Supported formats: -latex, -brief, -rest
388 388 """
389 389
390 390 mode = ''
391 391 try:
392 392 if parameter_s.split()[0] == '-latex':
393 393 mode = 'latex'
394 394 if parameter_s.split()[0] == '-brief':
395 395 mode = 'brief'
396 396 if parameter_s.split()[0] == '-rest':
397 397 mode = 'rest'
398 398 rest_docs = []
399 399 except:
400 400 pass
401 401
402 402 magic_docs = []
403 403 for fname in self.lsmagic():
404 404 mname = 'magic_' + fname
405 405 for space in (Magic,self,self.__class__):
406 406 try:
407 407 fn = space.__dict__[mname]
408 408 except KeyError:
409 409 pass
410 410 else:
411 411 break
412 412 if mode == 'brief':
413 413 # only first line
414 414 if fn.__doc__:
415 415 fndoc = fn.__doc__.split('\n',1)[0]
416 416 else:
417 417 fndoc = 'No documentation'
418 418 else:
419 419 if fn.__doc__:
420 420 fndoc = fn.__doc__.rstrip()
421 421 else:
422 422 fndoc = 'No documentation'
423 423
424 424
425 425 if mode == 'rest':
426 426 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(self.shell.ESC_MAGIC,
427 427 fname,fndoc))
428 428
429 429 else:
430 430 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
431 431 fname,fndoc))
432 432
433 433 magic_docs = ''.join(magic_docs)
434 434
435 435 if mode == 'rest':
436 436 return "".join(rest_docs)
437 437
438 438 if mode == 'latex':
439 439 print self.format_latex(magic_docs)
440 440 return
441 441 else:
442 442 magic_docs = self.format_screen(magic_docs)
443 443 if mode == 'brief':
444 444 return magic_docs
445 445
446 446 outmsg = """
447 447 IPython's 'magic' functions
448 448 ===========================
449 449
450 450 The magic function system provides a series of functions which allow you to
451 451 control the behavior of IPython itself, plus a lot of system-type
452 452 features. All these functions are prefixed with a % character, but parameters
453 453 are given without parentheses or quotes.
454 454
455 455 NOTE: If you have 'automagic' enabled (via the command line option or with the
456 456 %automagic function), you don't need to type in the % explicitly. By default,
457 457 IPython ships with automagic on, so you should only rarely need the % escape.
458 458
459 459 Example: typing '%cd mydir' (without the quotes) changes you working directory
460 460 to 'mydir', if it exists.
461 461
462 462 You can define your own magic functions to extend the system. See the supplied
463 463 ipythonrc and example-magic.py files for details (in your ipython
464 464 configuration directory, typically $HOME/.ipython/).
465 465
466 466 You can also define your own aliased names for magic functions. In your
467 467 ipythonrc file, placing a line like:
468 468
469 469 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
470 470
471 471 will define %pf as a new name for %profile.
472 472
473 473 You can also call magics in code using the ipmagic() function, which IPython
474 474 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
475 475
476 476 For a list of the available magic functions, use %lsmagic. For a description
477 477 of any of them, type %magic_name?, e.g. '%cd?'.
478 478
479 479 Currently the magic system has the following functions:\n"""
480 480
481 481 mesc = self.shell.ESC_MAGIC
482 482 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
483 483 "\n\n%s%s\n\n%s" % (outmsg,
484 484 magic_docs,mesc,mesc,
485 485 (' '+mesc).join(self.lsmagic()),
486 486 Magic.auto_status[self.shell.rc.automagic] ) )
487 487
488 488 page(outmsg,screen_lines=self.shell.rc.screen_length)
489 489
490 490
491 491 def magic_autoindent(self, parameter_s = ''):
492 492 """Toggle autoindent on/off (if available)."""
493 493
494 494 self.shell.set_autoindent()
495 495 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
496 496
497 497
498 498 def magic_automagic(self, parameter_s = ''):
499 499 """Make magic functions callable without having to type the initial %.
500 500
501 501 Without argumentsl toggles on/off (when off, you must call it as
502 502 %automagic, of course). With arguments it sets the value, and you can
503 503 use any of (case insensitive):
504 504
505 505 - on,1,True: to activate
506 506
507 507 - off,0,False: to deactivate.
508 508
509 509 Note that magic functions have lowest priority, so if there's a
510 510 variable whose name collides with that of a magic fn, automagic won't
511 511 work for that function (you get the variable instead). However, if you
512 512 delete the variable (del var), the previously shadowed magic function
513 513 becomes visible to automagic again."""
514 514
515 515 rc = self.shell.rc
516 516 arg = parameter_s.lower()
517 517 if parameter_s in ('on','1','true'):
518 518 rc.automagic = True
519 519 elif parameter_s in ('off','0','false'):
520 520 rc.automagic = False
521 521 else:
522 522 rc.automagic = not rc.automagic
523 523 print '\n' + Magic.auto_status[rc.automagic]
524 524
525 525 @testdec.skip_doctest
526 526 def magic_autocall(self, parameter_s = ''):
527 527 """Make functions callable without having to type parentheses.
528 528
529 529 Usage:
530 530
531 531 %autocall [mode]
532 532
533 533 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
534 534 value is toggled on and off (remembering the previous state).
535 535
536 536 In more detail, these values mean:
537 537
538 538 0 -> fully disabled
539 539
540 540 1 -> active, but do not apply if there are no arguments on the line.
541 541
542 542 In this mode, you get:
543 543
544 544 In [1]: callable
545 545 Out[1]: <built-in function callable>
546 546
547 547 In [2]: callable 'hello'
548 548 ------> callable('hello')
549 549 Out[2]: False
550 550
551 551 2 -> Active always. Even if no arguments are present, the callable
552 552 object is called:
553 553
554 554 In [2]: float
555 555 ------> float()
556 556 Out[2]: 0.0
557 557
558 558 Note that even with autocall off, you can still use '/' at the start of
559 559 a line to treat the first argument on the command line as a function
560 560 and add parentheses to it:
561 561
562 562 In [8]: /str 43
563 563 ------> str(43)
564 564 Out[8]: '43'
565 565
566 566 # all-random (note for auto-testing)
567 567 """
568 568
569 569 rc = self.shell.rc
570 570
571 571 if parameter_s:
572 572 arg = int(parameter_s)
573 573 else:
574 574 arg = 'toggle'
575 575
576 576 if not arg in (0,1,2,'toggle'):
577 577 error('Valid modes: (0->Off, 1->Smart, 2->Full')
578 578 return
579 579
580 580 if arg in (0,1,2):
581 581 rc.autocall = arg
582 582 else: # toggle
583 583 if rc.autocall:
584 584 self._magic_state.autocall_save = rc.autocall
585 585 rc.autocall = 0
586 586 else:
587 587 try:
588 588 rc.autocall = self._magic_state.autocall_save
589 589 except AttributeError:
590 590 rc.autocall = self._magic_state.autocall_save = 1
591 591
592 592 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
593 593
594 594 def magic_system_verbose(self, parameter_s = ''):
595 595 """Set verbose printing of system calls.
596 596
597 597 If called without an argument, act as a toggle"""
598 598
599 599 if parameter_s:
600 600 val = bool(eval(parameter_s))
601 601 else:
602 602 val = None
603 603
604 604 self.shell.rc_set_toggle('system_verbose',val)
605 605 print "System verbose printing is:",\
606 606 ['OFF','ON'][self.shell.rc.system_verbose]
607 607
608 608
609 609 def magic_page(self, parameter_s=''):
610 610 """Pretty print the object and display it through a pager.
611 611
612 612 %page [options] OBJECT
613 613
614 614 If no object is given, use _ (last output).
615 615
616 616 Options:
617 617
618 618 -r: page str(object), don't pretty-print it."""
619 619
620 620 # After a function contributed by Olivier Aubert, slightly modified.
621 621
622 622 # Process options/args
623 623 opts,args = self.parse_options(parameter_s,'r')
624 624 raw = 'r' in opts
625 625
626 626 oname = args and args or '_'
627 627 info = self._ofind(oname)
628 628 if info['found']:
629 629 txt = (raw and str or pformat)( info['obj'] )
630 630 page(txt)
631 631 else:
632 632 print 'Object `%s` not found' % oname
633 633
634 634 def magic_profile(self, parameter_s=''):
635 635 """Print your currently active IPyhton profile."""
636 636 if self.shell.rc.profile:
637 637 printpl('Current IPython profile: $self.shell.rc.profile.')
638 638 else:
639 639 print 'No profile active.'
640 640
641 641 def magic_pinfo(self, parameter_s='', namespaces=None):
642 642 """Provide detailed information about an object.
643 643
644 644 '%pinfo object' is just a synonym for object? or ?object."""
645 645
646 646 #print 'pinfo par: <%s>' % parameter_s # dbg
647 647
648 648
649 649 # detail_level: 0 -> obj? , 1 -> obj??
650 650 detail_level = 0
651 651 # We need to detect if we got called as 'pinfo pinfo foo', which can
652 652 # happen if the user types 'pinfo foo?' at the cmd line.
653 653 pinfo,qmark1,oname,qmark2 = \
654 654 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
655 655 if pinfo or qmark1 or qmark2:
656 656 detail_level = 1
657 657 if "*" in oname:
658 658 self.magic_psearch(oname)
659 659 else:
660 660 self._inspect('pinfo', oname, detail_level=detail_level,
661 661 namespaces=namespaces)
662 662
663 663 def magic_pdef(self, parameter_s='', namespaces=None):
664 664 """Print the definition header for any callable object.
665 665
666 666 If the object is a class, print the constructor information."""
667 667 self._inspect('pdef',parameter_s, namespaces)
668 668
669 669 def magic_pdoc(self, parameter_s='', namespaces=None):
670 670 """Print the docstring for an object.
671 671
672 672 If the given object is a class, it will print both the class and the
673 673 constructor docstrings."""
674 674 self._inspect('pdoc',parameter_s, namespaces)
675 675
676 676 def magic_psource(self, parameter_s='', namespaces=None):
677 677 """Print (or run through pager) the source code for an object."""
678 678 self._inspect('psource',parameter_s, namespaces)
679 679
680 680 def magic_pfile(self, parameter_s=''):
681 681 """Print (or run through pager) the file where an object is defined.
682 682
683 683 The file opens at the line where the object definition begins. IPython
684 684 will honor the environment variable PAGER if set, and otherwise will
685 685 do its best to print the file in a convenient form.
686 686
687 687 If the given argument is not an object currently defined, IPython will
688 688 try to interpret it as a filename (automatically adding a .py extension
689 689 if needed). You can thus use %pfile as a syntax highlighting code
690 690 viewer."""
691 691
692 692 # first interpret argument as an object name
693 693 out = self._inspect('pfile',parameter_s)
694 694 # if not, try the input as a filename
695 695 if out == 'not found':
696 696 try:
697 697 filename = get_py_filename(parameter_s)
698 698 except IOError,msg:
699 699 print msg
700 700 return
701 701 page(self.shell.inspector.format(file(filename).read()))
702 702
703 703 def _inspect(self,meth,oname,namespaces=None,**kw):
704 704 """Generic interface to the inspector system.
705 705
706 706 This function is meant to be called by pdef, pdoc & friends."""
707 707
708 708 #oname = oname.strip()
709 709 #print '1- oname: <%r>' % oname # dbg
710 710 try:
711 711 oname = oname.strip().encode('ascii')
712 712 #print '2- oname: <%r>' % oname # dbg
713 713 except UnicodeEncodeError:
714 714 print 'Python identifiers can only contain ascii characters.'
715 715 return 'not found'
716 716
717 717 info = Struct(self._ofind(oname, namespaces))
718 718
719 719 if info.found:
720 720 try:
721 721 IPython.utils.generics.inspect_object(info.obj)
722 722 return
723 723 except ipapi.TryNext:
724 724 pass
725 725 # Get the docstring of the class property if it exists.
726 726 path = oname.split('.')
727 727 root = '.'.join(path[:-1])
728 728 if info.parent is not None:
729 729 try:
730 730 target = getattr(info.parent, '__class__')
731 731 # The object belongs to a class instance.
732 732 try:
733 733 target = getattr(target, path[-1])
734 734 # The class defines the object.
735 735 if isinstance(target, property):
736 736 oname = root + '.__class__.' + path[-1]
737 737 info = Struct(self._ofind(oname))
738 738 except AttributeError: pass
739 739 except AttributeError: pass
740 740
741 741 pmethod = getattr(self.shell.inspector,meth)
742 742 formatter = info.ismagic and self.format_screen or None
743 743 if meth == 'pdoc':
744 744 pmethod(info.obj,oname,formatter)
745 745 elif meth == 'pinfo':
746 746 pmethod(info.obj,oname,formatter,info,**kw)
747 747 else:
748 748 pmethod(info.obj,oname)
749 749 else:
750 750 print 'Object `%s` not found.' % oname
751 751 return 'not found' # so callers can take other action
752 752
753 753 def magic_psearch(self, parameter_s=''):
754 754 """Search for object in namespaces by wildcard.
755 755
756 756 %psearch [options] PATTERN [OBJECT TYPE]
757 757
758 758 Note: ? can be used as a synonym for %psearch, at the beginning or at
759 759 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
760 760 rest of the command line must be unchanged (options come first), so
761 761 for example the following forms are equivalent
762 762
763 763 %psearch -i a* function
764 764 -i a* function?
765 765 ?-i a* function
766 766
767 767 Arguments:
768 768
769 769 PATTERN
770 770
771 771 where PATTERN is a string containing * as a wildcard similar to its
772 772 use in a shell. The pattern is matched in all namespaces on the
773 773 search path. By default objects starting with a single _ are not
774 774 matched, many IPython generated objects have a single
775 775 underscore. The default is case insensitive matching. Matching is
776 776 also done on the attributes of objects and not only on the objects
777 777 in a module.
778 778
779 779 [OBJECT TYPE]
780 780
781 781 Is the name of a python type from the types module. The name is
782 782 given in lowercase without the ending type, ex. StringType is
783 783 written string. By adding a type here only objects matching the
784 784 given type are matched. Using all here makes the pattern match all
785 785 types (this is the default).
786 786
787 787 Options:
788 788
789 789 -a: makes the pattern match even objects whose names start with a
790 790 single underscore. These names are normally ommitted from the
791 791 search.
792 792
793 793 -i/-c: make the pattern case insensitive/sensitive. If neither of
794 794 these options is given, the default is read from your ipythonrc
795 795 file. The option name which sets this value is
796 796 'wildcards_case_sensitive'. If this option is not specified in your
797 797 ipythonrc file, IPython's internal default is to do a case sensitive
798 798 search.
799 799
800 800 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
801 801 specifiy can be searched in any of the following namespaces:
802 802 'builtin', 'user', 'user_global','internal', 'alias', where
803 803 'builtin' and 'user' are the search defaults. Note that you should
804 804 not use quotes when specifying namespaces.
805 805
806 806 'Builtin' contains the python module builtin, 'user' contains all
807 807 user data, 'alias' only contain the shell aliases and no python
808 808 objects, 'internal' contains objects used by IPython. The
809 809 'user_global' namespace is only used by embedded IPython instances,
810 810 and it contains module-level globals. You can add namespaces to the
811 811 search with -s or exclude them with -e (these options can be given
812 812 more than once).
813 813
814 814 Examples:
815 815
816 816 %psearch a* -> objects beginning with an a
817 817 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
818 818 %psearch a* function -> all functions beginning with an a
819 819 %psearch re.e* -> objects beginning with an e in module re
820 820 %psearch r*.e* -> objects that start with e in modules starting in r
821 821 %psearch r*.* string -> all strings in modules beginning with r
822 822
823 823 Case sensitve search:
824 824
825 825 %psearch -c a* list all object beginning with lower case a
826 826
827 827 Show objects beginning with a single _:
828 828
829 829 %psearch -a _* list objects beginning with a single underscore"""
830 830 try:
831 831 parameter_s = parameter_s.encode('ascii')
832 832 except UnicodeEncodeError:
833 833 print 'Python identifiers can only contain ascii characters.'
834 834 return
835 835
836 836 # default namespaces to be searched
837 837 def_search = ['user','builtin']
838 838
839 839 # Process options/args
840 840 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
841 841 opt = opts.get
842 842 shell = self.shell
843 843 psearch = shell.inspector.psearch
844 844
845 845 # select case options
846 846 if opts.has_key('i'):
847 847 ignore_case = True
848 848 elif opts.has_key('c'):
849 849 ignore_case = False
850 850 else:
851 851 ignore_case = not shell.rc.wildcards_case_sensitive
852 852
853 853 # Build list of namespaces to search from user options
854 854 def_search.extend(opt('s',[]))
855 855 ns_exclude = ns_exclude=opt('e',[])
856 856 ns_search = [nm for nm in def_search if nm not in ns_exclude]
857 857
858 858 # Call the actual search
859 859 try:
860 860 psearch(args,shell.ns_table,ns_search,
861 861 show_all=opt('a'),ignore_case=ignore_case)
862 862 except:
863 863 shell.showtraceback()
864 864
865 865 def magic_who_ls(self, parameter_s=''):
866 866 """Return a sorted list of all interactive variables.
867 867
868 868 If arguments are given, only variables of types matching these
869 869 arguments are returned."""
870 870
871 871 user_ns = self.shell.user_ns
872 872 internal_ns = self.shell.internal_ns
873 873 user_config_ns = self.shell.user_config_ns
874 874 out = []
875 875 typelist = parameter_s.split()
876 876
877 877 for i in user_ns:
878 878 if not (i.startswith('_') or i.startswith('_i')) \
879 879 and not (i in internal_ns or i in user_config_ns):
880 880 if typelist:
881 881 if type(user_ns[i]).__name__ in typelist:
882 882 out.append(i)
883 883 else:
884 884 out.append(i)
885 885 out.sort()
886 886 return out
887 887
888 888 def magic_who(self, parameter_s=''):
889 889 """Print all interactive variables, with some minimal formatting.
890 890
891 891 If any arguments are given, only variables whose type matches one of
892 892 these are printed. For example:
893 893
894 894 %who function str
895 895
896 896 will only list functions and strings, excluding all other types of
897 897 variables. To find the proper type names, simply use type(var) at a
898 898 command line to see how python prints type names. For example:
899 899
900 900 In [1]: type('hello')\\
901 901 Out[1]: <type 'str'>
902 902
903 903 indicates that the type name for strings is 'str'.
904 904
905 905 %who always excludes executed names loaded through your configuration
906 906 file and things which are internal to IPython.
907 907
908 908 This is deliberate, as typically you may load many modules and the
909 909 purpose of %who is to show you only what you've manually defined."""
910 910
911 911 varlist = self.magic_who_ls(parameter_s)
912 912 if not varlist:
913 913 if parameter_s:
914 914 print 'No variables match your requested type.'
915 915 else:
916 916 print 'Interactive namespace is empty.'
917 917 return
918 918
919 919 # if we have variables, move on...
920 920 count = 0
921 921 for i in varlist:
922 922 print i+'\t',
923 923 count += 1
924 924 if count > 8:
925 925 count = 0
926 926 print
927 927 print
928 928
929 929 def magic_whos(self, parameter_s=''):
930 930 """Like %who, but gives some extra information about each variable.
931 931
932 932 The same type filtering of %who can be applied here.
933 933
934 934 For all variables, the type is printed. Additionally it prints:
935 935
936 936 - For {},[],(): their length.
937 937
938 938 - For numpy and Numeric arrays, a summary with shape, number of
939 939 elements, typecode and size in memory.
940 940
941 941 - Everything else: a string representation, snipping their middle if
942 942 too long."""
943 943
944 944 varnames = self.magic_who_ls(parameter_s)
945 945 if not varnames:
946 946 if parameter_s:
947 947 print 'No variables match your requested type.'
948 948 else:
949 949 print 'Interactive namespace is empty.'
950 950 return
951 951
952 952 # if we have variables, move on...
953 953
954 954 # for these types, show len() instead of data:
955 955 seq_types = [types.DictType,types.ListType,types.TupleType]
956 956
957 957 # for numpy/Numeric arrays, display summary info
958 958 try:
959 959 import numpy
960 960 except ImportError:
961 961 ndarray_type = None
962 962 else:
963 963 ndarray_type = numpy.ndarray.__name__
964 964 try:
965 965 import Numeric
966 966 except ImportError:
967 967 array_type = None
968 968 else:
969 969 array_type = Numeric.ArrayType.__name__
970 970
971 971 # Find all variable names and types so we can figure out column sizes
972 972 def get_vars(i):
973 973 return self.shell.user_ns[i]
974 974
975 975 # some types are well known and can be shorter
976 976 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
977 977 def type_name(v):
978 978 tn = type(v).__name__
979 979 return abbrevs.get(tn,tn)
980 980
981 981 varlist = map(get_vars,varnames)
982 982
983 983 typelist = []
984 984 for vv in varlist:
985 985 tt = type_name(vv)
986 986
987 987 if tt=='instance':
988 988 typelist.append( abbrevs.get(str(vv.__class__),
989 989 str(vv.__class__)))
990 990 else:
991 991 typelist.append(tt)
992 992
993 993 # column labels and # of spaces as separator
994 994 varlabel = 'Variable'
995 995 typelabel = 'Type'
996 996 datalabel = 'Data/Info'
997 997 colsep = 3
998 998 # variable format strings
999 999 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1000 1000 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1001 1001 aformat = "%s: %s elems, type `%s`, %s bytes"
1002 1002 # find the size of the columns to format the output nicely
1003 1003 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1004 1004 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1005 1005 # table header
1006 1006 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1007 1007 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1008 1008 # and the table itself
1009 1009 kb = 1024
1010 1010 Mb = 1048576 # kb**2
1011 1011 for vname,var,vtype in zip(varnames,varlist,typelist):
1012 1012 print itpl(vformat),
1013 1013 if vtype in seq_types:
1014 1014 print len(var)
1015 1015 elif vtype in [array_type,ndarray_type]:
1016 1016 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1017 1017 if vtype==ndarray_type:
1018 1018 # numpy
1019 1019 vsize = var.size
1020 1020 vbytes = vsize*var.itemsize
1021 1021 vdtype = var.dtype
1022 1022 else:
1023 1023 # Numeric
1024 1024 vsize = Numeric.size(var)
1025 1025 vbytes = vsize*var.itemsize()
1026 1026 vdtype = var.typecode()
1027 1027
1028 1028 if vbytes < 100000:
1029 1029 print aformat % (vshape,vsize,vdtype,vbytes)
1030 1030 else:
1031 1031 print aformat % (vshape,vsize,vdtype,vbytes),
1032 1032 if vbytes < Mb:
1033 1033 print '(%s kb)' % (vbytes/kb,)
1034 1034 else:
1035 1035 print '(%s Mb)' % (vbytes/Mb,)
1036 1036 else:
1037 1037 try:
1038 1038 vstr = str(var)
1039 1039 except UnicodeEncodeError:
1040 1040 vstr = unicode(var).encode(sys.getdefaultencoding(),
1041 1041 'backslashreplace')
1042 1042 vstr = vstr.replace('\n','\\n')
1043 1043 if len(vstr) < 50:
1044 1044 print vstr
1045 1045 else:
1046 1046 printpl(vfmt_short)
1047 1047
1048 1048 def magic_reset(self, parameter_s=''):
1049 1049 """Resets the namespace by removing all names defined by the user.
1050 1050
1051 1051 Input/Output history are left around in case you need them.
1052 1052
1053 1053 Parameters
1054 1054 ----------
1055 1055 -y : force reset without asking for confirmation.
1056 1056
1057 1057 Examples
1058 1058 --------
1059 1059 In [6]: a = 1
1060 1060
1061 1061 In [7]: a
1062 1062 Out[7]: 1
1063 1063
1064 1064 In [8]: 'a' in _ip.user_ns
1065 1065 Out[8]: True
1066 1066
1067 1067 In [9]: %reset -f
1068 1068
1069 1069 In [10]: 'a' in _ip.user_ns
1070 1070 Out[10]: False
1071 1071 """
1072 1072
1073 1073 if parameter_s == '-f':
1074 1074 ans = True
1075 1075 else:
1076 1076 ans = self.shell.ask_yes_no(
1077 1077 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1078 1078 if not ans:
1079 1079 print 'Nothing done.'
1080 1080 return
1081 1081 user_ns = self.shell.user_ns
1082 1082 for i in self.magic_who_ls():
1083 1083 del(user_ns[i])
1084 1084
1085 1085 # Also flush the private list of module references kept for script
1086 1086 # execution protection
1087 1087 self.shell.clear_main_mod_cache()
1088 1088
1089 1089 def magic_logstart(self,parameter_s=''):
1090 1090 """Start logging anywhere in a session.
1091 1091
1092 1092 %logstart [-o|-r|-t] [log_name [log_mode]]
1093 1093
1094 1094 If no name is given, it defaults to a file named 'ipython_log.py' in your
1095 1095 current directory, in 'rotate' mode (see below).
1096 1096
1097 1097 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1098 1098 history up to that point and then continues logging.
1099 1099
1100 1100 %logstart takes a second optional parameter: logging mode. This can be one
1101 1101 of (note that the modes are given unquoted):\\
1102 1102 append: well, that says it.\\
1103 1103 backup: rename (if exists) to name~ and start name.\\
1104 1104 global: single logfile in your home dir, appended to.\\
1105 1105 over : overwrite existing log.\\
1106 1106 rotate: create rotating logs name.1~, name.2~, etc.
1107 1107
1108 1108 Options:
1109 1109
1110 1110 -o: log also IPython's output. In this mode, all commands which
1111 1111 generate an Out[NN] prompt are recorded to the logfile, right after
1112 1112 their corresponding input line. The output lines are always
1113 1113 prepended with a '#[Out]# ' marker, so that the log remains valid
1114 1114 Python code.
1115 1115
1116 1116 Since this marker is always the same, filtering only the output from
1117 1117 a log is very easy, using for example a simple awk call:
1118 1118
1119 1119 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1120 1120
1121 1121 -r: log 'raw' input. Normally, IPython's logs contain the processed
1122 1122 input, so that user lines are logged in their final form, converted
1123 1123 into valid Python. For example, %Exit is logged as
1124 1124 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1125 1125 exactly as typed, with no transformations applied.
1126 1126
1127 1127 -t: put timestamps before each input line logged (these are put in
1128 1128 comments)."""
1129 1129
1130 1130 opts,par = self.parse_options(parameter_s,'ort')
1131 1131 log_output = 'o' in opts
1132 1132 log_raw_input = 'r' in opts
1133 1133 timestamp = 't' in opts
1134 1134
1135 1135 rc = self.shell.rc
1136 1136 logger = self.shell.logger
1137 1137
1138 1138 # if no args are given, the defaults set in the logger constructor by
1139 1139 # ipytohn remain valid
1140 1140 if par:
1141 1141 try:
1142 1142 logfname,logmode = par.split()
1143 1143 except:
1144 1144 logfname = par
1145 1145 logmode = 'backup'
1146 1146 else:
1147 1147 logfname = logger.logfname
1148 1148 logmode = logger.logmode
1149 1149 # put logfname into rc struct as if it had been called on the command
1150 1150 # line, so it ends up saved in the log header Save it in case we need
1151 1151 # to restore it...
1152 1152 old_logfile = rc.opts.get('logfile','')
1153 1153 if logfname:
1154 1154 logfname = os.path.expanduser(logfname)
1155 1155 rc.opts.logfile = logfname
1156 1156 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1157 1157 try:
1158 1158 started = logger.logstart(logfname,loghead,logmode,
1159 1159 log_output,timestamp,log_raw_input)
1160 1160 except:
1161 1161 rc.opts.logfile = old_logfile
1162 1162 warn("Couldn't start log: %s" % sys.exc_info()[1])
1163 1163 else:
1164 1164 # log input history up to this point, optionally interleaving
1165 1165 # output if requested
1166 1166
1167 1167 if timestamp:
1168 1168 # disable timestamping for the previous history, since we've
1169 1169 # lost those already (no time machine here).
1170 1170 logger.timestamp = False
1171 1171
1172 1172 if log_raw_input:
1173 1173 input_hist = self.shell.input_hist_raw
1174 1174 else:
1175 1175 input_hist = self.shell.input_hist
1176 1176
1177 1177 if log_output:
1178 1178 log_write = logger.log_write
1179 1179 output_hist = self.shell.output_hist
1180 1180 for n in range(1,len(input_hist)-1):
1181 1181 log_write(input_hist[n].rstrip())
1182 1182 if n in output_hist:
1183 1183 log_write(repr(output_hist[n]),'output')
1184 1184 else:
1185 1185 logger.log_write(input_hist[1:])
1186 1186 if timestamp:
1187 1187 # re-enable timestamping
1188 1188 logger.timestamp = True
1189 1189
1190 1190 print ('Activating auto-logging. '
1191 1191 'Current session state plus future input saved.')
1192 1192 logger.logstate()
1193 1193
1194 1194 def magic_logstop(self,parameter_s=''):
1195 1195 """Fully stop logging and close log file.
1196 1196
1197 1197 In order to start logging again, a new %logstart call needs to be made,
1198 1198 possibly (though not necessarily) with a new filename, mode and other
1199 1199 options."""
1200 1200 self.logger.logstop()
1201 1201
1202 1202 def magic_logoff(self,parameter_s=''):
1203 1203 """Temporarily stop logging.
1204 1204
1205 1205 You must have previously started logging."""
1206 1206 self.shell.logger.switch_log(0)
1207 1207
1208 1208 def magic_logon(self,parameter_s=''):
1209 1209 """Restart logging.
1210 1210
1211 1211 This function is for restarting logging which you've temporarily
1212 1212 stopped with %logoff. For starting logging for the first time, you
1213 1213 must use the %logstart function, which allows you to specify an
1214 1214 optional log filename."""
1215 1215
1216 1216 self.shell.logger.switch_log(1)
1217 1217
1218 1218 def magic_logstate(self,parameter_s=''):
1219 1219 """Print the status of the logging system."""
1220 1220
1221 1221 self.shell.logger.logstate()
1222 1222
1223 1223 def magic_pdb(self, parameter_s=''):
1224 1224 """Control the automatic calling of the pdb interactive debugger.
1225 1225
1226 1226 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1227 1227 argument it works as a toggle.
1228 1228
1229 1229 When an exception is triggered, IPython can optionally call the
1230 1230 interactive pdb debugger after the traceback printout. %pdb toggles
1231 1231 this feature on and off.
1232 1232
1233 1233 The initial state of this feature is set in your ipythonrc
1234 1234 configuration file (the variable is called 'pdb').
1235 1235
1236 1236 If you want to just activate the debugger AFTER an exception has fired,
1237 1237 without having to type '%pdb on' and rerunning your code, you can use
1238 1238 the %debug magic."""
1239 1239
1240 1240 par = parameter_s.strip().lower()
1241 1241
1242 1242 if par:
1243 1243 try:
1244 1244 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1245 1245 except KeyError:
1246 1246 print ('Incorrect argument. Use on/1, off/0, '
1247 1247 'or nothing for a toggle.')
1248 1248 return
1249 1249 else:
1250 1250 # toggle
1251 1251 new_pdb = not self.shell.call_pdb
1252 1252
1253 1253 # set on the shell
1254 1254 self.shell.call_pdb = new_pdb
1255 1255 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1256 1256
1257 1257 def magic_debug(self, parameter_s=''):
1258 1258 """Activate the interactive debugger in post-mortem mode.
1259 1259
1260 1260 If an exception has just occurred, this lets you inspect its stack
1261 1261 frames interactively. Note that this will always work only on the last
1262 1262 traceback that occurred, so you must call this quickly after an
1263 1263 exception that you wish to inspect has fired, because if another one
1264 1264 occurs, it clobbers the previous one.
1265 1265
1266 1266 If you want IPython to automatically do this on every exception, see
1267 1267 the %pdb magic for more details.
1268 1268 """
1269 1269
1270 1270 self.shell.debugger(force=True)
1271 1271
1272 1272 @testdec.skip_doctest
1273 1273 def magic_prun(self, parameter_s ='',user_mode=1,
1274 1274 opts=None,arg_lst=None,prog_ns=None):
1275 1275
1276 1276 """Run a statement through the python code profiler.
1277 1277
1278 1278 Usage:
1279 1279 %prun [options] statement
1280 1280
1281 1281 The given statement (which doesn't require quote marks) is run via the
1282 1282 python profiler in a manner similar to the profile.run() function.
1283 1283 Namespaces are internally managed to work correctly; profile.run
1284 1284 cannot be used in IPython because it makes certain assumptions about
1285 1285 namespaces which do not hold under IPython.
1286 1286
1287 1287 Options:
1288 1288
1289 1289 -l <limit>: you can place restrictions on what or how much of the
1290 1290 profile gets printed. The limit value can be:
1291 1291
1292 1292 * A string: only information for function names containing this string
1293 1293 is printed.
1294 1294
1295 1295 * An integer: only these many lines are printed.
1296 1296
1297 1297 * A float (between 0 and 1): this fraction of the report is printed
1298 1298 (for example, use a limit of 0.4 to see the topmost 40% only).
1299 1299
1300 1300 You can combine several limits with repeated use of the option. For
1301 1301 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1302 1302 information about class constructors.
1303 1303
1304 1304 -r: return the pstats.Stats object generated by the profiling. This
1305 1305 object has all the information about the profile in it, and you can
1306 1306 later use it for further analysis or in other functions.
1307 1307
1308 1308 -s <key>: sort profile by given key. You can provide more than one key
1309 1309 by using the option several times: '-s key1 -s key2 -s key3...'. The
1310 1310 default sorting key is 'time'.
1311 1311
1312 1312 The following is copied verbatim from the profile documentation
1313 1313 referenced below:
1314 1314
1315 1315 When more than one key is provided, additional keys are used as
1316 1316 secondary criteria when the there is equality in all keys selected
1317 1317 before them.
1318 1318
1319 1319 Abbreviations can be used for any key names, as long as the
1320 1320 abbreviation is unambiguous. The following are the keys currently
1321 1321 defined:
1322 1322
1323 1323 Valid Arg Meaning
1324 1324 "calls" call count
1325 1325 "cumulative" cumulative time
1326 1326 "file" file name
1327 1327 "module" file name
1328 1328 "pcalls" primitive call count
1329 1329 "line" line number
1330 1330 "name" function name
1331 1331 "nfl" name/file/line
1332 1332 "stdname" standard name
1333 1333 "time" internal time
1334 1334
1335 1335 Note that all sorts on statistics are in descending order (placing
1336 1336 most time consuming items first), where as name, file, and line number
1337 1337 searches are in ascending order (i.e., alphabetical). The subtle
1338 1338 distinction between "nfl" and "stdname" is that the standard name is a
1339 1339 sort of the name as printed, which means that the embedded line
1340 1340 numbers get compared in an odd way. For example, lines 3, 20, and 40
1341 1341 would (if the file names were the same) appear in the string order
1342 1342 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1343 1343 line numbers. In fact, sort_stats("nfl") is the same as
1344 1344 sort_stats("name", "file", "line").
1345 1345
1346 1346 -T <filename>: save profile results as shown on screen to a text
1347 1347 file. The profile is still shown on screen.
1348 1348
1349 1349 -D <filename>: save (via dump_stats) profile statistics to given
1350 1350 filename. This data is in a format understod by the pstats module, and
1351 1351 is generated by a call to the dump_stats() method of profile
1352 1352 objects. The profile is still shown on screen.
1353 1353
1354 1354 If you want to run complete programs under the profiler's control, use
1355 1355 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1356 1356 contains profiler specific options as described here.
1357 1357
1358 1358 You can read the complete documentation for the profile module with::
1359 1359
1360 1360 In [1]: import profile; profile.help()
1361 1361 """
1362 1362
1363 1363 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1364 1364 # protect user quote marks
1365 1365 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1366 1366
1367 1367 if user_mode: # regular user call
1368 1368 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1369 1369 list_all=1)
1370 1370 namespace = self.shell.user_ns
1371 1371 else: # called to run a program by %run -p
1372 1372 try:
1373 1373 filename = get_py_filename(arg_lst[0])
1374 1374 except IOError,msg:
1375 1375 error(msg)
1376 1376 return
1377 1377
1378 1378 arg_str = 'execfile(filename,prog_ns)'
1379 1379 namespace = locals()
1380 1380
1381 1381 opts.merge(opts_def)
1382 1382
1383 1383 prof = profile.Profile()
1384 1384 try:
1385 1385 prof = prof.runctx(arg_str,namespace,namespace)
1386 1386 sys_exit = ''
1387 1387 except SystemExit:
1388 1388 sys_exit = """*** SystemExit exception caught in code being profiled."""
1389 1389
1390 1390 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1391 1391
1392 1392 lims = opts.l
1393 1393 if lims:
1394 1394 lims = [] # rebuild lims with ints/floats/strings
1395 1395 for lim in opts.l:
1396 1396 try:
1397 1397 lims.append(int(lim))
1398 1398 except ValueError:
1399 1399 try:
1400 1400 lims.append(float(lim))
1401 1401 except ValueError:
1402 1402 lims.append(lim)
1403 1403
1404 1404 # Trap output.
1405 1405 stdout_trap = StringIO()
1406 1406
1407 1407 if hasattr(stats,'stream'):
1408 1408 # In newer versions of python, the stats object has a 'stream'
1409 1409 # attribute to write into.
1410 1410 stats.stream = stdout_trap
1411 1411 stats.print_stats(*lims)
1412 1412 else:
1413 1413 # For older versions, we manually redirect stdout during printing
1414 1414 sys_stdout = sys.stdout
1415 1415 try:
1416 1416 sys.stdout = stdout_trap
1417 1417 stats.print_stats(*lims)
1418 1418 finally:
1419 1419 sys.stdout = sys_stdout
1420 1420
1421 1421 output = stdout_trap.getvalue()
1422 1422 output = output.rstrip()
1423 1423
1424 1424 page(output,screen_lines=self.shell.rc.screen_length)
1425 1425 print sys_exit,
1426 1426
1427 1427 dump_file = opts.D[0]
1428 1428 text_file = opts.T[0]
1429 1429 if dump_file:
1430 1430 prof.dump_stats(dump_file)
1431 1431 print '\n*** Profile stats marshalled to file',\
1432 1432 `dump_file`+'.',sys_exit
1433 1433 if text_file:
1434 1434 pfile = file(text_file,'w')
1435 1435 pfile.write(output)
1436 1436 pfile.close()
1437 1437 print '\n*** Profile printout saved to text file',\
1438 1438 `text_file`+'.',sys_exit
1439 1439
1440 1440 if opts.has_key('r'):
1441 1441 return stats
1442 1442 else:
1443 1443 return None
1444 1444
1445 1445 @testdec.skip_doctest
1446 1446 def magic_run(self, parameter_s ='',runner=None,
1447 1447 file_finder=get_py_filename):
1448 1448 """Run the named file inside IPython as a program.
1449 1449
1450 1450 Usage:\\
1451 1451 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1452 1452
1453 1453 Parameters after the filename are passed as command-line arguments to
1454 1454 the program (put in sys.argv). Then, control returns to IPython's
1455 1455 prompt.
1456 1456
1457 1457 This is similar to running at a system prompt:\\
1458 1458 $ python file args\\
1459 1459 but with the advantage of giving you IPython's tracebacks, and of
1460 1460 loading all variables into your interactive namespace for further use
1461 1461 (unless -p is used, see below).
1462 1462
1463 1463 The file is executed in a namespace initially consisting only of
1464 1464 __name__=='__main__' and sys.argv constructed as indicated. It thus
1465 1465 sees its environment as if it were being run as a stand-alone program
1466 1466 (except for sharing global objects such as previously imported
1467 1467 modules). But after execution, the IPython interactive namespace gets
1468 1468 updated with all variables defined in the program (except for __name__
1469 1469 and sys.argv). This allows for very convenient loading of code for
1470 1470 interactive work, while giving each program a 'clean sheet' to run in.
1471 1471
1472 1472 Options:
1473 1473
1474 1474 -n: __name__ is NOT set to '__main__', but to the running file's name
1475 1475 without extension (as python does under import). This allows running
1476 1476 scripts and reloading the definitions in them without calling code
1477 1477 protected by an ' if __name__ == "__main__" ' clause.
1478 1478
1479 1479 -i: run the file in IPython's namespace instead of an empty one. This
1480 1480 is useful if you are experimenting with code written in a text editor
1481 1481 which depends on variables defined interactively.
1482 1482
1483 1483 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1484 1484 being run. This is particularly useful if IPython is being used to
1485 1485 run unittests, which always exit with a sys.exit() call. In such
1486 1486 cases you are interested in the output of the test results, not in
1487 1487 seeing a traceback of the unittest module.
1488 1488
1489 1489 -t: print timing information at the end of the run. IPython will give
1490 1490 you an estimated CPU time consumption for your script, which under
1491 1491 Unix uses the resource module to avoid the wraparound problems of
1492 1492 time.clock(). Under Unix, an estimate of time spent on system tasks
1493 1493 is also given (for Windows platforms this is reported as 0.0).
1494 1494
1495 1495 If -t is given, an additional -N<N> option can be given, where <N>
1496 1496 must be an integer indicating how many times you want the script to
1497 1497 run. The final timing report will include total and per run results.
1498 1498
1499 1499 For example (testing the script uniq_stable.py):
1500 1500
1501 1501 In [1]: run -t uniq_stable
1502 1502
1503 1503 IPython CPU timings (estimated):\\
1504 1504 User : 0.19597 s.\\
1505 1505 System: 0.0 s.\\
1506 1506
1507 1507 In [2]: run -t -N5 uniq_stable
1508 1508
1509 1509 IPython CPU timings (estimated):\\
1510 1510 Total runs performed: 5\\
1511 1511 Times : Total Per run\\
1512 1512 User : 0.910862 s, 0.1821724 s.\\
1513 1513 System: 0.0 s, 0.0 s.
1514 1514
1515 1515 -d: run your program under the control of pdb, the Python debugger.
1516 1516 This allows you to execute your program step by step, watch variables,
1517 1517 etc. Internally, what IPython does is similar to calling:
1518 1518
1519 1519 pdb.run('execfile("YOURFILENAME")')
1520 1520
1521 1521 with a breakpoint set on line 1 of your file. You can change the line
1522 1522 number for this automatic breakpoint to be <N> by using the -bN option
1523 1523 (where N must be an integer). For example:
1524 1524
1525 1525 %run -d -b40 myscript
1526 1526
1527 1527 will set the first breakpoint at line 40 in myscript.py. Note that
1528 1528 the first breakpoint must be set on a line which actually does
1529 1529 something (not a comment or docstring) for it to stop execution.
1530 1530
1531 1531 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1532 1532 first enter 'c' (without qoutes) to start execution up to the first
1533 1533 breakpoint.
1534 1534
1535 1535 Entering 'help' gives information about the use of the debugger. You
1536 1536 can easily see pdb's full documentation with "import pdb;pdb.help()"
1537 1537 at a prompt.
1538 1538
1539 1539 -p: run program under the control of the Python profiler module (which
1540 1540 prints a detailed report of execution times, function calls, etc).
1541 1541
1542 1542 You can pass other options after -p which affect the behavior of the
1543 1543 profiler itself. See the docs for %prun for details.
1544 1544
1545 1545 In this mode, the program's variables do NOT propagate back to the
1546 1546 IPython interactive namespace (because they remain in the namespace
1547 1547 where the profiler executes them).
1548 1548
1549 1549 Internally this triggers a call to %prun, see its documentation for
1550 1550 details on the options available specifically for profiling.
1551 1551
1552 1552 There is one special usage for which the text above doesn't apply:
1553 1553 if the filename ends with .ipy, the file is run as ipython script,
1554 1554 just as if the commands were written on IPython prompt.
1555 1555 """
1556 1556
1557 1557 # get arguments and set sys.argv for program to be run.
1558 1558 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1559 1559 mode='list',list_all=1)
1560 1560
1561 1561 try:
1562 1562 filename = file_finder(arg_lst[0])
1563 1563 except IndexError:
1564 1564 warn('you must provide at least a filename.')
1565 1565 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1566 1566 return
1567 1567 except IOError,msg:
1568 1568 error(msg)
1569 1569 return
1570 1570
1571 1571 if filename.lower().endswith('.ipy'):
1572 1572 self.api.runlines(open(filename).read())
1573 1573 return
1574 1574
1575 1575 # Control the response to exit() calls made by the script being run
1576 1576 exit_ignore = opts.has_key('e')
1577 1577
1578 1578 # Make sure that the running script gets a proper sys.argv as if it
1579 1579 # were run from a system shell.
1580 1580 save_argv = sys.argv # save it for later restoring
1581 1581 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1582 1582
1583 1583 if opts.has_key('i'):
1584 1584 # Run in user's interactive namespace
1585 1585 prog_ns = self.shell.user_ns
1586 1586 __name__save = self.shell.user_ns['__name__']
1587 1587 prog_ns['__name__'] = '__main__'
1588 1588 main_mod = self.shell.new_main_mod(prog_ns)
1589 1589 else:
1590 1590 # Run in a fresh, empty namespace
1591 1591 if opts.has_key('n'):
1592 1592 name = os.path.splitext(os.path.basename(filename))[0]
1593 1593 else:
1594 1594 name = '__main__'
1595 1595
1596 1596 main_mod = self.shell.new_main_mod()
1597 1597 prog_ns = main_mod.__dict__
1598 1598 prog_ns['__name__'] = name
1599 1599
1600 1600 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1601 1601 # set the __file__ global in the script's namespace
1602 1602 prog_ns['__file__'] = filename
1603 1603
1604 1604 # pickle fix. See iplib for an explanation. But we need to make sure
1605 1605 # that, if we overwrite __main__, we replace it at the end
1606 1606 main_mod_name = prog_ns['__name__']
1607 1607
1608 1608 if main_mod_name == '__main__':
1609 1609 restore_main = sys.modules['__main__']
1610 1610 else:
1611 1611 restore_main = False
1612 1612
1613 1613 # This needs to be undone at the end to prevent holding references to
1614 1614 # every single object ever created.
1615 1615 sys.modules[main_mod_name] = main_mod
1616 1616
1617 1617 stats = None
1618 1618 try:
1619 1619 self.shell.savehist()
1620 1620
1621 1621 if opts.has_key('p'):
1622 1622 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1623 1623 else:
1624 1624 if opts.has_key('d'):
1625 1625 deb = debugger.Pdb(self.shell.rc.colors)
1626 1626 # reset Breakpoint state, which is moronically kept
1627 1627 # in a class
1628 1628 bdb.Breakpoint.next = 1
1629 1629 bdb.Breakpoint.bplist = {}
1630 1630 bdb.Breakpoint.bpbynumber = [None]
1631 1631 # Set an initial breakpoint to stop execution
1632 1632 maxtries = 10
1633 1633 bp = int(opts.get('b',[1])[0])
1634 1634 checkline = deb.checkline(filename,bp)
1635 1635 if not checkline:
1636 1636 for bp in range(bp+1,bp+maxtries+1):
1637 1637 if deb.checkline(filename,bp):
1638 1638 break
1639 1639 else:
1640 1640 msg = ("\nI failed to find a valid line to set "
1641 1641 "a breakpoint\n"
1642 1642 "after trying up to line: %s.\n"
1643 1643 "Please set a valid breakpoint manually "
1644 1644 "with the -b option." % bp)
1645 1645 error(msg)
1646 1646 return
1647 1647 # if we find a good linenumber, set the breakpoint
1648 1648 deb.do_break('%s:%s' % (filename,bp))
1649 1649 # Start file run
1650 1650 print "NOTE: Enter 'c' at the",
1651 1651 print "%s prompt to start your script." % deb.prompt
1652 1652 try:
1653 1653 deb.run('execfile("%s")' % filename,prog_ns)
1654 1654
1655 1655 except:
1656 1656 etype, value, tb = sys.exc_info()
1657 1657 # Skip three frames in the traceback: the %run one,
1658 1658 # one inside bdb.py, and the command-line typed by the
1659 1659 # user (run by exec in pdb itself).
1660 1660 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1661 1661 else:
1662 1662 if runner is None:
1663 1663 runner = self.shell.safe_execfile
1664 1664 if opts.has_key('t'):
1665 1665 # timed execution
1666 1666 try:
1667 1667 nruns = int(opts['N'][0])
1668 1668 if nruns < 1:
1669 1669 error('Number of runs must be >=1')
1670 1670 return
1671 1671 except (KeyError):
1672 1672 nruns = 1
1673 1673 if nruns == 1:
1674 1674 t0 = clock2()
1675 1675 runner(filename,prog_ns,prog_ns,
1676 1676 exit_ignore=exit_ignore)
1677 1677 t1 = clock2()
1678 1678 t_usr = t1[0]-t0[0]
1679 1679 t_sys = t1[1]-t0[1]
1680 1680 print "\nIPython CPU timings (estimated):"
1681 1681 print " User : %10s s." % t_usr
1682 1682 print " System: %10s s." % t_sys
1683 1683 else:
1684 1684 runs = range(nruns)
1685 1685 t0 = clock2()
1686 1686 for nr in runs:
1687 1687 runner(filename,prog_ns,prog_ns,
1688 1688 exit_ignore=exit_ignore)
1689 1689 t1 = clock2()
1690 1690 t_usr = t1[0]-t0[0]
1691 1691 t_sys = t1[1]-t0[1]
1692 1692 print "\nIPython CPU timings (estimated):"
1693 1693 print "Total runs performed:",nruns
1694 1694 print " Times : %10s %10s" % ('Total','Per run')
1695 1695 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1696 1696 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1697 1697
1698 1698 else:
1699 1699 # regular execution
1700 1700 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1701 1701
1702 1702 if opts.has_key('i'):
1703 1703 self.shell.user_ns['__name__'] = __name__save
1704 1704 else:
1705 1705 # The shell MUST hold a reference to prog_ns so after %run
1706 1706 # exits, the python deletion mechanism doesn't zero it out
1707 1707 # (leaving dangling references).
1708 1708 self.shell.cache_main_mod(prog_ns,filename)
1709 1709 # update IPython interactive namespace
1710 1710
1711 1711 # Some forms of read errors on the file may mean the
1712 1712 # __name__ key was never set; using pop we don't have to
1713 1713 # worry about a possible KeyError.
1714 1714 prog_ns.pop('__name__', None)
1715 1715
1716 1716 self.shell.user_ns.update(prog_ns)
1717 1717 finally:
1718 1718 # It's a bit of a mystery why, but __builtins__ can change from
1719 1719 # being a module to becoming a dict missing some key data after
1720 1720 # %run. As best I can see, this is NOT something IPython is doing
1721 1721 # at all, and similar problems have been reported before:
1722 1722 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1723 1723 # Since this seems to be done by the interpreter itself, the best
1724 1724 # we can do is to at least restore __builtins__ for the user on
1725 1725 # exit.
1726 1726 self.shell.user_ns['__builtins__'] = __builtin__
1727 1727
1728 1728 # Ensure key global structures are restored
1729 1729 sys.argv = save_argv
1730 1730 if restore_main:
1731 1731 sys.modules['__main__'] = restore_main
1732 1732 else:
1733 1733 # Remove from sys.modules the reference to main_mod we'd
1734 1734 # added. Otherwise it will trap references to objects
1735 1735 # contained therein.
1736 1736 del sys.modules[main_mod_name]
1737 1737
1738 1738 self.shell.reloadhist()
1739 1739
1740 1740 return stats
1741 1741
1742 1742 def magic_runlog(self, parameter_s =''):
1743 1743 """Run files as logs.
1744 1744
1745 1745 Usage:\\
1746 1746 %runlog file1 file2 ...
1747 1747
1748 1748 Run the named files (treating them as log files) in sequence inside
1749 1749 the interpreter, and return to the prompt. This is much slower than
1750 1750 %run because each line is executed in a try/except block, but it
1751 1751 allows running files with syntax errors in them.
1752 1752
1753 1753 Normally IPython will guess when a file is one of its own logfiles, so
1754 1754 you can typically use %run even for logs. This shorthand allows you to
1755 1755 force any file to be treated as a log file."""
1756 1756
1757 1757 for f in parameter_s.split():
1758 1758 self.shell.safe_execfile(f,self.shell.user_ns,
1759 1759 self.shell.user_ns,islog=1)
1760 1760
1761 1761 @testdec.skip_doctest
1762 1762 def magic_timeit(self, parameter_s =''):
1763 1763 """Time execution of a Python statement or expression
1764 1764
1765 1765 Usage:\\
1766 1766 %timeit [-n<N> -r<R> [-t|-c]] statement
1767 1767
1768 1768 Time execution of a Python statement or expression using the timeit
1769 1769 module.
1770 1770
1771 1771 Options:
1772 1772 -n<N>: execute the given statement <N> times in a loop. If this value
1773 1773 is not given, a fitting value is chosen.
1774 1774
1775 1775 -r<R>: repeat the loop iteration <R> times and take the best result.
1776 1776 Default: 3
1777 1777
1778 1778 -t: use time.time to measure the time, which is the default on Unix.
1779 1779 This function measures wall time.
1780 1780
1781 1781 -c: use time.clock to measure the time, which is the default on
1782 1782 Windows and measures wall time. On Unix, resource.getrusage is used
1783 1783 instead and returns the CPU user time.
1784 1784
1785 1785 -p<P>: use a precision of <P> digits to display the timing result.
1786 1786 Default: 3
1787 1787
1788 1788
1789 1789 Examples:
1790 1790
1791 1791 In [1]: %timeit pass
1792 1792 10000000 loops, best of 3: 53.3 ns per loop
1793 1793
1794 1794 In [2]: u = None
1795 1795
1796 1796 In [3]: %timeit u is None
1797 1797 10000000 loops, best of 3: 184 ns per loop
1798 1798
1799 1799 In [4]: %timeit -r 4 u == None
1800 1800 1000000 loops, best of 4: 242 ns per loop
1801 1801
1802 1802 In [5]: import time
1803 1803
1804 1804 In [6]: %timeit -n1 time.sleep(2)
1805 1805 1 loops, best of 3: 2 s per loop
1806 1806
1807 1807
1808 1808 The times reported by %timeit will be slightly higher than those
1809 1809 reported by the timeit.py script when variables are accessed. This is
1810 1810 due to the fact that %timeit executes the statement in the namespace
1811 1811 of the shell, compared with timeit.py, which uses a single setup
1812 1812 statement to import function or create variables. Generally, the bias
1813 1813 does not matter as long as results from timeit.py are not mixed with
1814 1814 those from %timeit."""
1815 1815
1816 1816 import timeit
1817 1817 import math
1818 1818
1819 1819 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1820 1820 # certain terminals. Until we figure out a robust way of
1821 1821 # auto-detecting if the terminal can deal with it, use plain 'us' for
1822 1822 # microseconds. I am really NOT happy about disabling the proper
1823 1823 # 'micro' prefix, but crashing is worse... If anyone knows what the
1824 1824 # right solution for this is, I'm all ears...
1825 1825 #
1826 1826 # Note: using
1827 1827 #
1828 1828 # s = u'\xb5'
1829 1829 # s.encode(sys.getdefaultencoding())
1830 1830 #
1831 1831 # is not sufficient, as I've seen terminals where that fails but
1832 1832 # print s
1833 1833 #
1834 1834 # succeeds
1835 1835 #
1836 1836 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1837 1837
1838 1838 #units = [u"s", u"ms",u'\xb5',"ns"]
1839 1839 units = [u"s", u"ms",u'us',"ns"]
1840 1840
1841 1841 scaling = [1, 1e3, 1e6, 1e9]
1842 1842
1843 1843 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1844 1844 posix=False)
1845 1845 if stmt == "":
1846 1846 return
1847 1847 timefunc = timeit.default_timer
1848 1848 number = int(getattr(opts, "n", 0))
1849 1849 repeat = int(getattr(opts, "r", timeit.default_repeat))
1850 1850 precision = int(getattr(opts, "p", 3))
1851 1851 if hasattr(opts, "t"):
1852 1852 timefunc = time.time
1853 1853 if hasattr(opts, "c"):
1854 1854 timefunc = clock
1855 1855
1856 1856 timer = timeit.Timer(timer=timefunc)
1857 1857 # this code has tight coupling to the inner workings of timeit.Timer,
1858 1858 # but is there a better way to achieve that the code stmt has access
1859 1859 # to the shell namespace?
1860 1860
1861 1861 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1862 1862 'setup': "pass"}
1863 1863 # Track compilation time so it can be reported if too long
1864 1864 # Minimum time above which compilation time will be reported
1865 1865 tc_min = 0.1
1866 1866
1867 1867 t0 = clock()
1868 1868 code = compile(src, "<magic-timeit>", "exec")
1869 1869 tc = clock()-t0
1870 1870
1871 1871 ns = {}
1872 1872 exec code in self.shell.user_ns, ns
1873 1873 timer.inner = ns["inner"]
1874 1874
1875 1875 if number == 0:
1876 1876 # determine number so that 0.2 <= total time < 2.0
1877 1877 number = 1
1878 1878 for i in range(1, 10):
1879 1879 if timer.timeit(number) >= 0.2:
1880 1880 break
1881 1881 number *= 10
1882 1882
1883 1883 best = min(timer.repeat(repeat, number)) / number
1884 1884
1885 1885 if best > 0.0:
1886 1886 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1887 1887 else:
1888 1888 order = 3
1889 1889 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1890 1890 precision,
1891 1891 best * scaling[order],
1892 1892 units[order])
1893 1893 if tc > tc_min:
1894 1894 print "Compiler time: %.2f s" % tc
1895 1895
1896 1896 @testdec.skip_doctest
1897 1897 def magic_time(self,parameter_s = ''):
1898 1898 """Time execution of a Python statement or expression.
1899 1899
1900 1900 The CPU and wall clock times are printed, and the value of the
1901 1901 expression (if any) is returned. Note that under Win32, system time
1902 1902 is always reported as 0, since it can not be measured.
1903 1903
1904 1904 This function provides very basic timing functionality. In Python
1905 1905 2.3, the timeit module offers more control and sophistication, so this
1906 1906 could be rewritten to use it (patches welcome).
1907 1907
1908 1908 Some examples:
1909 1909
1910 1910 In [1]: time 2**128
1911 1911 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1912 1912 Wall time: 0.00
1913 1913 Out[1]: 340282366920938463463374607431768211456L
1914 1914
1915 1915 In [2]: n = 1000000
1916 1916
1917 1917 In [3]: time sum(range(n))
1918 1918 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1919 1919 Wall time: 1.37
1920 1920 Out[3]: 499999500000L
1921 1921
1922 1922 In [4]: time print 'hello world'
1923 1923 hello world
1924 1924 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1925 1925 Wall time: 0.00
1926 1926
1927 1927 Note that the time needed by Python to compile the given expression
1928 1928 will be reported if it is more than 0.1s. In this example, the
1929 1929 actual exponentiation is done by Python at compilation time, so while
1930 1930 the expression can take a noticeable amount of time to compute, that
1931 1931 time is purely due to the compilation:
1932 1932
1933 1933 In [5]: time 3**9999;
1934 1934 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1935 1935 Wall time: 0.00 s
1936 1936
1937 1937 In [6]: time 3**999999;
1938 1938 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1939 1939 Wall time: 0.00 s
1940 1940 Compiler : 0.78 s
1941 1941 """
1942 1942
1943 1943 # fail immediately if the given expression can't be compiled
1944 1944
1945 1945 expr = self.shell.prefilter(parameter_s,False)
1946 1946
1947 1947 # Minimum time above which compilation time will be reported
1948 1948 tc_min = 0.1
1949 1949
1950 1950 try:
1951 1951 mode = 'eval'
1952 1952 t0 = clock()
1953 1953 code = compile(expr,'<timed eval>',mode)
1954 1954 tc = clock()-t0
1955 1955 except SyntaxError:
1956 1956 mode = 'exec'
1957 1957 t0 = clock()
1958 1958 code = compile(expr,'<timed exec>',mode)
1959 1959 tc = clock()-t0
1960 1960 # skew measurement as little as possible
1961 1961 glob = self.shell.user_ns
1962 1962 clk = clock2
1963 1963 wtime = time.time
1964 1964 # time execution
1965 1965 wall_st = wtime()
1966 1966 if mode=='eval':
1967 1967 st = clk()
1968 1968 out = eval(code,glob)
1969 1969 end = clk()
1970 1970 else:
1971 1971 st = clk()
1972 1972 exec code in glob
1973 1973 end = clk()
1974 1974 out = None
1975 1975 wall_end = wtime()
1976 1976 # Compute actual times and report
1977 1977 wall_time = wall_end-wall_st
1978 1978 cpu_user = end[0]-st[0]
1979 1979 cpu_sys = end[1]-st[1]
1980 1980 cpu_tot = cpu_user+cpu_sys
1981 1981 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1982 1982 (cpu_user,cpu_sys,cpu_tot)
1983 1983 print "Wall time: %.2f s" % wall_time
1984 1984 if tc > tc_min:
1985 1985 print "Compiler : %.2f s" % tc
1986 1986 return out
1987 1987
1988 1988 @testdec.skip_doctest
1989 1989 def magic_macro(self,parameter_s = ''):
1990 1990 """Define a set of input lines as a macro for future re-execution.
1991 1991
1992 1992 Usage:\\
1993 1993 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1994 1994
1995 1995 Options:
1996 1996
1997 1997 -r: use 'raw' input. By default, the 'processed' history is used,
1998 1998 so that magics are loaded in their transformed version to valid
1999 1999 Python. If this option is given, the raw input as typed as the
2000 2000 command line is used instead.
2001 2001
2002 2002 This will define a global variable called `name` which is a string
2003 2003 made of joining the slices and lines you specify (n1,n2,... numbers
2004 2004 above) from your input history into a single string. This variable
2005 2005 acts like an automatic function which re-executes those lines as if
2006 2006 you had typed them. You just type 'name' at the prompt and the code
2007 2007 executes.
2008 2008
2009 2009 The notation for indicating number ranges is: n1-n2 means 'use line
2010 2010 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
2011 2011 using the lines numbered 5,6 and 7.
2012 2012
2013 2013 Note: as a 'hidden' feature, you can also use traditional python slice
2014 2014 notation, where N:M means numbers N through M-1.
2015 2015
2016 2016 For example, if your history contains (%hist prints it):
2017 2017
2018 2018 44: x=1
2019 2019 45: y=3
2020 2020 46: z=x+y
2021 2021 47: print x
2022 2022 48: a=5
2023 2023 49: print 'x',x,'y',y
2024 2024
2025 2025 you can create a macro with lines 44 through 47 (included) and line 49
2026 2026 called my_macro with:
2027 2027
2028 2028 In [55]: %macro my_macro 44-47 49
2029 2029
2030 2030 Now, typing `my_macro` (without quotes) will re-execute all this code
2031 2031 in one pass.
2032 2032
2033 2033 You don't need to give the line-numbers in order, and any given line
2034 2034 number can appear multiple times. You can assemble macros with any
2035 2035 lines from your input history in any order.
2036 2036
2037 2037 The macro is a simple object which holds its value in an attribute,
2038 2038 but IPython's display system checks for macros and executes them as
2039 2039 code instead of printing them when you type their name.
2040 2040
2041 2041 You can view a macro's contents by explicitly printing it with:
2042 2042
2043 2043 'print macro_name'.
2044 2044
2045 2045 For one-off cases which DON'T contain magic function calls in them you
2046 2046 can obtain similar results by explicitly executing slices from your
2047 2047 input history with:
2048 2048
2049 2049 In [60]: exec In[44:48]+In[49]"""
2050 2050
2051 2051 opts,args = self.parse_options(parameter_s,'r',mode='list')
2052 2052 if not args:
2053 2053 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2054 2054 macs.sort()
2055 2055 return macs
2056 2056 if len(args) == 1:
2057 2057 raise UsageError(
2058 2058 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2059 2059 name,ranges = args[0], args[1:]
2060 2060
2061 2061 #print 'rng',ranges # dbg
2062 2062 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2063 2063 macro = Macro(lines)
2064 2064 self.shell.user_ns.update({name:macro})
2065 2065 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2066 2066 print 'Macro contents:'
2067 2067 print macro,
2068 2068
2069 2069 def magic_save(self,parameter_s = ''):
2070 2070 """Save a set of lines to a given filename.
2071 2071
2072 2072 Usage:\\
2073 2073 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2074 2074
2075 2075 Options:
2076 2076
2077 2077 -r: use 'raw' input. By default, the 'processed' history is used,
2078 2078 so that magics are loaded in their transformed version to valid
2079 2079 Python. If this option is given, the raw input as typed as the
2080 2080 command line is used instead.
2081 2081
2082 2082 This function uses the same syntax as %macro for line extraction, but
2083 2083 instead of creating a macro it saves the resulting string to the
2084 2084 filename you specify.
2085 2085
2086 2086 It adds a '.py' extension to the file if you don't do so yourself, and
2087 2087 it asks for confirmation before overwriting existing files."""
2088 2088
2089 2089 opts,args = self.parse_options(parameter_s,'r',mode='list')
2090 2090 fname,ranges = args[0], args[1:]
2091 2091 if not fname.endswith('.py'):
2092 2092 fname += '.py'
2093 2093 if os.path.isfile(fname):
2094 2094 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2095 2095 if ans.lower() not in ['y','yes']:
2096 2096 print 'Operation cancelled.'
2097 2097 return
2098 2098 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2099 2099 f = file(fname,'w')
2100 2100 f.write(cmds)
2101 2101 f.close()
2102 2102 print 'The following commands were written to file `%s`:' % fname
2103 2103 print cmds
2104 2104
2105 2105 def _edit_macro(self,mname,macro):
2106 2106 """open an editor with the macro data in a file"""
2107 2107 filename = self.shell.mktempfile(macro.value)
2108 2108 self.shell.hooks.editor(filename)
2109 2109
2110 2110 # and make a new macro object, to replace the old one
2111 2111 mfile = open(filename)
2112 2112 mvalue = mfile.read()
2113 2113 mfile.close()
2114 2114 self.shell.user_ns[mname] = Macro(mvalue)
2115 2115
2116 2116 def magic_ed(self,parameter_s=''):
2117 2117 """Alias to %edit."""
2118 2118 return self.magic_edit(parameter_s)
2119 2119
2120 2120 @testdec.skip_doctest
2121 2121 def magic_edit(self,parameter_s='',last_call=['','']):
2122 2122 """Bring up an editor and execute the resulting code.
2123 2123
2124 2124 Usage:
2125 2125 %edit [options] [args]
2126 2126
2127 2127 %edit runs IPython's editor hook. The default version of this hook is
2128 2128 set to call the __IPYTHON__.rc.editor command. This is read from your
2129 2129 environment variable $EDITOR. If this isn't found, it will default to
2130 2130 vi under Linux/Unix and to notepad under Windows. See the end of this
2131 2131 docstring for how to change the editor hook.
2132 2132
2133 2133 You can also set the value of this editor via the command line option
2134 2134 '-editor' or in your ipythonrc file. This is useful if you wish to use
2135 2135 specifically for IPython an editor different from your typical default
2136 2136 (and for Windows users who typically don't set environment variables).
2137 2137
2138 2138 This command allows you to conveniently edit multi-line code right in
2139 2139 your IPython session.
2140 2140
2141 2141 If called without arguments, %edit opens up an empty editor with a
2142 2142 temporary file and will execute the contents of this file when you
2143 2143 close it (don't forget to save it!).
2144 2144
2145 2145
2146 2146 Options:
2147 2147
2148 2148 -n <number>: open the editor at a specified line number. By default,
2149 2149 the IPython editor hook uses the unix syntax 'editor +N filename', but
2150 2150 you can configure this by providing your own modified hook if your
2151 2151 favorite editor supports line-number specifications with a different
2152 2152 syntax.
2153 2153
2154 2154 -p: this will call the editor with the same data as the previous time
2155 2155 it was used, regardless of how long ago (in your current session) it
2156 2156 was.
2157 2157
2158 2158 -r: use 'raw' input. This option only applies to input taken from the
2159 2159 user's history. By default, the 'processed' history is used, so that
2160 2160 magics are loaded in their transformed version to valid Python. If
2161 2161 this option is given, the raw input as typed as the command line is
2162 2162 used instead. When you exit the editor, it will be executed by
2163 2163 IPython's own processor.
2164 2164
2165 2165 -x: do not execute the edited code immediately upon exit. This is
2166 2166 mainly useful if you are editing programs which need to be called with
2167 2167 command line arguments, which you can then do using %run.
2168 2168
2169 2169
2170 2170 Arguments:
2171 2171
2172 2172 If arguments are given, the following possibilites exist:
2173 2173
2174 2174 - The arguments are numbers or pairs of colon-separated numbers (like
2175 2175 1 4:8 9). These are interpreted as lines of previous input to be
2176 2176 loaded into the editor. The syntax is the same of the %macro command.
2177 2177
2178 2178 - If the argument doesn't start with a number, it is evaluated as a
2179 2179 variable and its contents loaded into the editor. You can thus edit
2180 2180 any string which contains python code (including the result of
2181 2181 previous edits).
2182 2182
2183 2183 - If the argument is the name of an object (other than a string),
2184 2184 IPython will try to locate the file where it was defined and open the
2185 2185 editor at the point where it is defined. You can use `%edit function`
2186 2186 to load an editor exactly at the point where 'function' is defined,
2187 2187 edit it and have the file be executed automatically.
2188 2188
2189 2189 If the object is a macro (see %macro for details), this opens up your
2190 2190 specified editor with a temporary file containing the macro's data.
2191 2191 Upon exit, the macro is reloaded with the contents of the file.
2192 2192
2193 2193 Note: opening at an exact line is only supported under Unix, and some
2194 2194 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2195 2195 '+NUMBER' parameter necessary for this feature. Good editors like
2196 2196 (X)Emacs, vi, jed, pico and joe all do.
2197 2197
2198 2198 - If the argument is not found as a variable, IPython will look for a
2199 2199 file with that name (adding .py if necessary) and load it into the
2200 2200 editor. It will execute its contents with execfile() when you exit,
2201 2201 loading any code in the file into your interactive namespace.
2202 2202
2203 2203 After executing your code, %edit will return as output the code you
2204 2204 typed in the editor (except when it was an existing file). This way
2205 2205 you can reload the code in further invocations of %edit as a variable,
2206 2206 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2207 2207 the output.
2208 2208
2209 2209 Note that %edit is also available through the alias %ed.
2210 2210
2211 2211 This is an example of creating a simple function inside the editor and
2212 2212 then modifying it. First, start up the editor:
2213 2213
2214 2214 In [1]: ed
2215 2215 Editing... done. Executing edited code...
2216 2216 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2217 2217
2218 2218 We can then call the function foo():
2219 2219
2220 2220 In [2]: foo()
2221 2221 foo() was defined in an editing session
2222 2222
2223 2223 Now we edit foo. IPython automatically loads the editor with the
2224 2224 (temporary) file where foo() was previously defined:
2225 2225
2226 2226 In [3]: ed foo
2227 2227 Editing... done. Executing edited code...
2228 2228
2229 2229 And if we call foo() again we get the modified version:
2230 2230
2231 2231 In [4]: foo()
2232 2232 foo() has now been changed!
2233 2233
2234 2234 Here is an example of how to edit a code snippet successive
2235 2235 times. First we call the editor:
2236 2236
2237 2237 In [5]: ed
2238 2238 Editing... done. Executing edited code...
2239 2239 hello
2240 2240 Out[5]: "print 'hello'n"
2241 2241
2242 2242 Now we call it again with the previous output (stored in _):
2243 2243
2244 2244 In [6]: ed _
2245 2245 Editing... done. Executing edited code...
2246 2246 hello world
2247 2247 Out[6]: "print 'hello world'n"
2248 2248
2249 2249 Now we call it with the output #8 (stored in _8, also as Out[8]):
2250 2250
2251 2251 In [7]: ed _8
2252 2252 Editing... done. Executing edited code...
2253 2253 hello again
2254 2254 Out[7]: "print 'hello again'n"
2255 2255
2256 2256
2257 2257 Changing the default editor hook:
2258 2258
2259 2259 If you wish to write your own editor hook, you can put it in a
2260 2260 configuration file which you load at startup time. The default hook
2261 2261 is defined in the IPython.core.hooks module, and you can use that as a
2262 2262 starting example for further modifications. That file also has
2263 2263 general instructions on how to set a new hook for use once you've
2264 2264 defined it."""
2265 2265
2266 2266 # FIXME: This function has become a convoluted mess. It needs a
2267 2267 # ground-up rewrite with clean, simple logic.
2268 2268
2269 2269 def make_filename(arg):
2270 2270 "Make a filename from the given args"
2271 2271 try:
2272 2272 filename = get_py_filename(arg)
2273 2273 except IOError:
2274 2274 if args.endswith('.py'):
2275 2275 filename = arg
2276 2276 else:
2277 2277 filename = None
2278 2278 return filename
2279 2279
2280 2280 # custom exceptions
2281 2281 class DataIsObject(Exception): pass
2282 2282
2283 2283 opts,args = self.parse_options(parameter_s,'prxn:')
2284 2284 # Set a few locals from the options for convenience:
2285 2285 opts_p = opts.has_key('p')
2286 2286 opts_r = opts.has_key('r')
2287 2287
2288 2288 # Default line number value
2289 2289 lineno = opts.get('n',None)
2290 2290
2291 2291 if opts_p:
2292 2292 args = '_%s' % last_call[0]
2293 2293 if not self.shell.user_ns.has_key(args):
2294 2294 args = last_call[1]
2295 2295
2296 2296 # use last_call to remember the state of the previous call, but don't
2297 2297 # let it be clobbered by successive '-p' calls.
2298 2298 try:
2299 2299 last_call[0] = self.shell.outputcache.prompt_count
2300 2300 if not opts_p:
2301 2301 last_call[1] = parameter_s
2302 2302 except:
2303 2303 pass
2304 2304
2305 2305 # by default this is done with temp files, except when the given
2306 2306 # arg is a filename
2307 2307 use_temp = 1
2308 2308
2309 2309 if re.match(r'\d',args):
2310 2310 # Mode where user specifies ranges of lines, like in %macro.
2311 2311 # This means that you can't edit files whose names begin with
2312 2312 # numbers this way. Tough.
2313 2313 ranges = args.split()
2314 2314 data = ''.join(self.extract_input_slices(ranges,opts_r))
2315 2315 elif args.endswith('.py'):
2316 2316 filename = make_filename(args)
2317 2317 data = ''
2318 2318 use_temp = 0
2319 2319 elif args:
2320 2320 try:
2321 2321 # Load the parameter given as a variable. If not a string,
2322 2322 # process it as an object instead (below)
2323 2323
2324 2324 #print '*** args',args,'type',type(args) # dbg
2325 2325 data = eval(args,self.shell.user_ns)
2326 2326 if not type(data) in StringTypes:
2327 2327 raise DataIsObject
2328 2328
2329 2329 except (NameError,SyntaxError):
2330 2330 # given argument is not a variable, try as a filename
2331 2331 filename = make_filename(args)
2332 2332 if filename is None:
2333 2333 warn("Argument given (%s) can't be found as a variable "
2334 2334 "or as a filename." % args)
2335 2335 return
2336 2336
2337 2337 data = ''
2338 2338 use_temp = 0
2339 2339 except DataIsObject:
2340 2340
2341 2341 # macros have a special edit function
2342 2342 if isinstance(data,Macro):
2343 2343 self._edit_macro(args,data)
2344 2344 return
2345 2345
2346 2346 # For objects, try to edit the file where they are defined
2347 2347 try:
2348 2348 filename = inspect.getabsfile(data)
2349 2349 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2350 2350 # class created by %edit? Try to find source
2351 2351 # by looking for method definitions instead, the
2352 2352 # __module__ in those classes is FakeModule.
2353 2353 attrs = [getattr(data, aname) for aname in dir(data)]
2354 2354 for attr in attrs:
2355 2355 if not inspect.ismethod(attr):
2356 2356 continue
2357 2357 filename = inspect.getabsfile(attr)
2358 2358 if filename and 'fakemodule' not in filename.lower():
2359 2359 # change the attribute to be the edit target instead
2360 2360 data = attr
2361 2361 break
2362 2362
2363 2363 datafile = 1
2364 2364 except TypeError:
2365 2365 filename = make_filename(args)
2366 2366 datafile = 1
2367 2367 warn('Could not find file where `%s` is defined.\n'
2368 2368 'Opening a file named `%s`' % (args,filename))
2369 2369 # Now, make sure we can actually read the source (if it was in
2370 2370 # a temp file it's gone by now).
2371 2371 if datafile:
2372 2372 try:
2373 2373 if lineno is None:
2374 2374 lineno = inspect.getsourcelines(data)[1]
2375 2375 except IOError:
2376 2376 filename = make_filename(args)
2377 2377 if filename is None:
2378 2378 warn('The file `%s` where `%s` was defined cannot '
2379 2379 'be read.' % (filename,data))
2380 2380 return
2381 2381 use_temp = 0
2382 2382 else:
2383 2383 data = ''
2384 2384
2385 2385 if use_temp:
2386 2386 filename = self.shell.mktempfile(data)
2387 2387 print 'IPython will make a temporary file named:',filename
2388 2388
2389 2389 # do actual editing here
2390 2390 print 'Editing...',
2391 2391 sys.stdout.flush()
2392 2392 try:
2393 2393 self.shell.hooks.editor(filename,lineno)
2394 2394 except ipapi.TryNext:
2395 2395 warn('Could not open editor')
2396 2396 return
2397 2397
2398 2398 # XXX TODO: should this be generalized for all string vars?
2399 2399 # For now, this is special-cased to blocks created by cpaste
2400 2400 if args.strip() == 'pasted_block':
2401 2401 self.shell.user_ns['pasted_block'] = file_read(filename)
2402 2402
2403 2403 if opts.has_key('x'): # -x prevents actual execution
2404 2404 print
2405 2405 else:
2406 2406 print 'done. Executing edited code...'
2407 2407 if opts_r:
2408 2408 self.shell.runlines(file_read(filename))
2409 2409 else:
2410 2410 self.shell.safe_execfile(filename,self.shell.user_ns,
2411 2411 self.shell.user_ns)
2412 2412
2413 2413
2414 2414 if use_temp:
2415 2415 try:
2416 2416 return open(filename).read()
2417 2417 except IOError,msg:
2418 2418 if msg.filename == filename:
2419 2419 warn('File not found. Did you forget to save?')
2420 2420 return
2421 2421 else:
2422 2422 self.shell.showtraceback()
2423 2423
2424 2424 def magic_xmode(self,parameter_s = ''):
2425 2425 """Switch modes for the exception handlers.
2426 2426
2427 2427 Valid modes: Plain, Context and Verbose.
2428 2428
2429 2429 If called without arguments, acts as a toggle."""
2430 2430
2431 2431 def xmode_switch_err(name):
2432 2432 warn('Error changing %s exception modes.\n%s' %
2433 2433 (name,sys.exc_info()[1]))
2434 2434
2435 2435 shell = self.shell
2436 2436 new_mode = parameter_s.strip().capitalize()
2437 2437 try:
2438 2438 shell.InteractiveTB.set_mode(mode=new_mode)
2439 2439 print 'Exception reporting mode:',shell.InteractiveTB.mode
2440 2440 except:
2441 2441 xmode_switch_err('user')
2442 2442
2443 2443 # threaded shells use a special handler in sys.excepthook
2444 2444 if shell.isthreaded:
2445 2445 try:
2446 2446 shell.sys_excepthook.set_mode(mode=new_mode)
2447 2447 except:
2448 2448 xmode_switch_err('threaded')
2449 2449
2450 2450 def magic_colors(self,parameter_s = ''):
2451 2451 """Switch color scheme for prompts, info system and exception handlers.
2452 2452
2453 2453 Currently implemented schemes: NoColor, Linux, LightBG.
2454 2454
2455 2455 Color scheme names are not case-sensitive."""
2456 2456
2457 2457 def color_switch_err(name):
2458 2458 warn('Error changing %s color schemes.\n%s' %
2459 2459 (name,sys.exc_info()[1]))
2460 2460
2461 2461
2462 2462 new_scheme = parameter_s.strip()
2463 2463 if not new_scheme:
2464 2464 raise UsageError(
2465 2465 "%colors: you must specify a color scheme. See '%colors?'")
2466 2466 return
2467 2467 # local shortcut
2468 2468 shell = self.shell
2469 2469
2470 2470 import IPython.utils.rlineimpl as readline
2471 2471
2472 2472 if not readline.have_readline and sys.platform == "win32":
2473 2473 msg = """\
2474 2474 Proper color support under MS Windows requires the pyreadline library.
2475 2475 You can find it at:
2476 2476 http://ipython.scipy.org/moin/PyReadline/Intro
2477 2477 Gary's readline needs the ctypes module, from:
2478 2478 http://starship.python.net/crew/theller/ctypes
2479 2479 (Note that ctypes is already part of Python versions 2.5 and newer).
2480 2480
2481 2481 Defaulting color scheme to 'NoColor'"""
2482 2482 new_scheme = 'NoColor'
2483 2483 warn(msg)
2484 2484
2485 2485 # readline option is 0
2486 2486 if not shell.has_readline:
2487 2487 new_scheme = 'NoColor'
2488 2488
2489 2489 # Set prompt colors
2490 2490 try:
2491 2491 shell.outputcache.set_colors(new_scheme)
2492 2492 except:
2493 2493 color_switch_err('prompt')
2494 2494 else:
2495 2495 shell.rc.colors = \
2496 2496 shell.outputcache.color_table.active_scheme_name
2497 2497 # Set exception colors
2498 2498 try:
2499 2499 shell.InteractiveTB.set_colors(scheme = new_scheme)
2500 2500 shell.SyntaxTB.set_colors(scheme = new_scheme)
2501 2501 except:
2502 2502 color_switch_err('exception')
2503 2503
2504 2504 # threaded shells use a verbose traceback in sys.excepthook
2505 2505 if shell.isthreaded:
2506 2506 try:
2507 2507 shell.sys_excepthook.set_colors(scheme=new_scheme)
2508 2508 except:
2509 2509 color_switch_err('system exception handler')
2510 2510
2511 2511 # Set info (for 'object?') colors
2512 2512 if shell.rc.color_info:
2513 2513 try:
2514 2514 shell.inspector.set_active_scheme(new_scheme)
2515 2515 except:
2516 2516 color_switch_err('object inspector')
2517 2517 else:
2518 2518 shell.inspector.set_active_scheme('NoColor')
2519 2519
2520 2520 def magic_color_info(self,parameter_s = ''):
2521 2521 """Toggle color_info.
2522 2522
2523 2523 The color_info configuration parameter controls whether colors are
2524 2524 used for displaying object details (by things like %psource, %pfile or
2525 2525 the '?' system). This function toggles this value with each call.
2526 2526
2527 2527 Note that unless you have a fairly recent pager (less works better
2528 2528 than more) in your system, using colored object information displays
2529 2529 will not work properly. Test it and see."""
2530 2530
2531 2531 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2532 2532 self.magic_colors(self.shell.rc.colors)
2533 2533 print 'Object introspection functions have now coloring:',
2534 2534 print ['OFF','ON'][self.shell.rc.color_info]
2535 2535
2536 2536 def magic_Pprint(self, parameter_s=''):
2537 2537 """Toggle pretty printing on/off."""
2538 2538
2539 2539 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2540 2540 print 'Pretty printing has been turned', \
2541 2541 ['OFF','ON'][self.shell.rc.pprint]
2542 2542
2543 2543 def magic_exit(self, parameter_s=''):
2544 2544 """Exit IPython, confirming if configured to do so.
2545 2545
2546 2546 You can configure whether IPython asks for confirmation upon exit by
2547 2547 setting the confirm_exit flag in the ipythonrc file."""
2548 2548
2549 2549 self.shell.exit()
2550 2550
2551 2551 def magic_quit(self, parameter_s=''):
2552 2552 """Exit IPython, confirming if configured to do so (like %exit)"""
2553 2553
2554 2554 self.shell.exit()
2555 2555
2556 2556 def magic_Exit(self, parameter_s=''):
2557 2557 """Exit IPython without confirmation."""
2558 2558
2559 2559 self.shell.ask_exit()
2560 2560
2561 2561 #......................................................................
2562 2562 # Functions to implement unix shell-type things
2563 2563
2564 2564 @testdec.skip_doctest
2565 2565 def magic_alias(self, parameter_s = ''):
2566 2566 """Define an alias for a system command.
2567 2567
2568 2568 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2569 2569
2570 2570 Then, typing 'alias_name params' will execute the system command 'cmd
2571 2571 params' (from your underlying operating system).
2572 2572
2573 2573 Aliases have lower precedence than magic functions and Python normal
2574 2574 variables, so if 'foo' is both a Python variable and an alias, the
2575 2575 alias can not be executed until 'del foo' removes the Python variable.
2576 2576
2577 2577 You can use the %l specifier in an alias definition to represent the
2578 2578 whole line when the alias is called. For example:
2579 2579
2580 2580 In [2]: alias all echo "Input in brackets: <%l>"
2581 2581 In [3]: all hello world
2582 2582 Input in brackets: <hello world>
2583 2583
2584 2584 You can also define aliases with parameters using %s specifiers (one
2585 2585 per parameter):
2586 2586
2587 2587 In [1]: alias parts echo first %s second %s
2588 2588 In [2]: %parts A B
2589 2589 first A second B
2590 2590 In [3]: %parts A
2591 2591 Incorrect number of arguments: 2 expected.
2592 2592 parts is an alias to: 'echo first %s second %s'
2593 2593
2594 2594 Note that %l and %s are mutually exclusive. You can only use one or
2595 2595 the other in your aliases.
2596 2596
2597 2597 Aliases expand Python variables just like system calls using ! or !!
2598 2598 do: all expressions prefixed with '$' get expanded. For details of
2599 2599 the semantic rules, see PEP-215:
2600 2600 http://www.python.org/peps/pep-0215.html. This is the library used by
2601 2601 IPython for variable expansion. If you want to access a true shell
2602 2602 variable, an extra $ is necessary to prevent its expansion by IPython:
2603 2603
2604 2604 In [6]: alias show echo
2605 2605 In [7]: PATH='A Python string'
2606 2606 In [8]: show $PATH
2607 2607 A Python string
2608 2608 In [9]: show $$PATH
2609 2609 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2610 2610
2611 2611 You can use the alias facility to acess all of $PATH. See the %rehash
2612 2612 and %rehashx functions, which automatically create aliases for the
2613 2613 contents of your $PATH.
2614 2614
2615 2615 If called with no parameters, %alias prints the current alias table."""
2616 2616
2617 2617 par = parameter_s.strip()
2618 2618 if not par:
2619 2619 stored = self.db.get('stored_aliases', {} )
2620 2620 atab = self.shell.alias_table
2621 2621 aliases = atab.keys()
2622 2622 aliases.sort()
2623 2623 res = []
2624 2624 showlast = []
2625 2625 for alias in aliases:
2626 2626 special = False
2627 2627 try:
2628 2628 tgt = atab[alias][1]
2629 2629 except (TypeError, AttributeError):
2630 2630 # unsubscriptable? probably a callable
2631 2631 tgt = atab[alias]
2632 2632 special = True
2633 2633 # 'interesting' aliases
2634 2634 if (alias in stored or
2635 2635 special or
2636 2636 alias.lower() != os.path.splitext(tgt)[0].lower() or
2637 2637 ' ' in tgt):
2638 2638 showlast.append((alias, tgt))
2639 2639 else:
2640 2640 res.append((alias, tgt ))
2641 2641
2642 2642 # show most interesting aliases last
2643 2643 res.extend(showlast)
2644 2644 print "Total number of aliases:",len(aliases)
2645 2645 return res
2646 2646 try:
2647 2647 alias,cmd = par.split(None,1)
2648 2648 except:
2649 2649 print oinspect.getdoc(self.magic_alias)
2650 2650 else:
2651 2651 nargs = cmd.count('%s')
2652 2652 if nargs>0 and cmd.find('%l')>=0:
2653 2653 error('The %s and %l specifiers are mutually exclusive '
2654 2654 'in alias definitions.')
2655 2655 else: # all looks OK
2656 2656 self.shell.alias_table[alias] = (nargs,cmd)
2657 2657 self.shell.alias_table_validate(verbose=0)
2658 2658 # end magic_alias
2659 2659
2660 2660 def magic_unalias(self, parameter_s = ''):
2661 2661 """Remove an alias"""
2662 2662
2663 2663 aname = parameter_s.strip()
2664 2664 if aname in self.shell.alias_table:
2665 2665 del self.shell.alias_table[aname]
2666 2666 stored = self.db.get('stored_aliases', {} )
2667 2667 if aname in stored:
2668 2668 print "Removing %stored alias",aname
2669 2669 del stored[aname]
2670 2670 self.db['stored_aliases'] = stored
2671 2671
2672 2672
2673 2673 def magic_rehashx(self, parameter_s = ''):
2674 2674 """Update the alias table with all executable files in $PATH.
2675 2675
2676 2676 This version explicitly checks that every entry in $PATH is a file
2677 2677 with execute access (os.X_OK), so it is much slower than %rehash.
2678 2678
2679 2679 Under Windows, it checks executability as a match agains a
2680 2680 '|'-separated string of extensions, stored in the IPython config
2681 2681 variable win_exec_ext. This defaults to 'exe|com|bat'.
2682 2682
2683 2683 This function also resets the root module cache of module completer,
2684 2684 used on slow filesystems.
2685 2685 """
2686 2686
2687 2687
2688 2688 ip = self.api
2689 2689
2690 2690 # for the benefit of module completer in ipy_completers.py
2691 2691 del ip.db['rootmodules']
2692 2692
2693 2693 path = [os.path.abspath(os.path.expanduser(p)) for p in
2694 2694 os.environ.get('PATH','').split(os.pathsep)]
2695 2695 path = filter(os.path.isdir,path)
2696 2696
2697 2697 alias_table = self.shell.alias_table
2698 2698 syscmdlist = []
2699 2699 if os.name == 'posix':
2700 2700 isexec = lambda fname:os.path.isfile(fname) and \
2701 2701 os.access(fname,os.X_OK)
2702 2702 else:
2703 2703
2704 2704 try:
2705 2705 winext = os.environ['pathext'].replace(';','|').replace('.','')
2706 2706 except KeyError:
2707 2707 winext = 'exe|com|bat|py'
2708 2708 if 'py' not in winext:
2709 2709 winext += '|py'
2710 2710 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2711 2711 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2712 2712 savedir = os.getcwd()
2713 2713 try:
2714 2714 # write the whole loop for posix/Windows so we don't have an if in
2715 2715 # the innermost part
2716 2716 if os.name == 'posix':
2717 2717 for pdir in path:
2718 2718 os.chdir(pdir)
2719 2719 for ff in os.listdir(pdir):
2720 2720 if isexec(ff) and ff not in self.shell.no_alias:
2721 2721 # each entry in the alias table must be (N,name),
2722 2722 # where N is the number of positional arguments of the
2723 2723 # alias.
2724 2724 # Dots will be removed from alias names, since ipython
2725 2725 # assumes names with dots to be python code
2726 2726 alias_table[ff.replace('.','')] = (0,ff)
2727 2727 syscmdlist.append(ff)
2728 2728 else:
2729 2729 for pdir in path:
2730 2730 os.chdir(pdir)
2731 2731 for ff in os.listdir(pdir):
2732 2732 base, ext = os.path.splitext(ff)
2733 2733 if isexec(ff) and base.lower() not in self.shell.no_alias:
2734 2734 if ext.lower() == '.exe':
2735 2735 ff = base
2736 2736 alias_table[base.lower().replace('.','')] = (0,ff)
2737 2737 syscmdlist.append(ff)
2738 2738 # Make sure the alias table doesn't contain keywords or builtins
2739 2739 self.shell.alias_table_validate()
2740 2740 # Call again init_auto_alias() so we get 'rm -i' and other
2741 2741 # modified aliases since %rehashx will probably clobber them
2742 2742
2743 2743 # no, we don't want them. if %rehashx clobbers them, good,
2744 2744 # we'll probably get better versions
2745 2745 # self.shell.init_auto_alias()
2746 2746 db = ip.db
2747 2747 db['syscmdlist'] = syscmdlist
2748 2748 finally:
2749 2749 os.chdir(savedir)
2750 2750
2751 2751 def magic_pwd(self, parameter_s = ''):
2752 2752 """Return the current working directory path."""
2753 2753 return os.getcwd()
2754 2754
2755 2755 def magic_cd(self, parameter_s=''):
2756 2756 """Change the current working directory.
2757 2757
2758 2758 This command automatically maintains an internal list of directories
2759 2759 you visit during your IPython session, in the variable _dh. The
2760 2760 command %dhist shows this history nicely formatted. You can also
2761 2761 do 'cd -<tab>' to see directory history conveniently.
2762 2762
2763 2763 Usage:
2764 2764
2765 2765 cd 'dir': changes to directory 'dir'.
2766 2766
2767 2767 cd -: changes to the last visited directory.
2768 2768
2769 2769 cd -<n>: changes to the n-th directory in the directory history.
2770 2770
2771 2771 cd --foo: change to directory that matches 'foo' in history
2772 2772
2773 2773 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2774 2774 (note: cd <bookmark_name> is enough if there is no
2775 2775 directory <bookmark_name>, but a bookmark with the name exists.)
2776 2776 'cd -b <tab>' allows you to tab-complete bookmark names.
2777 2777
2778 2778 Options:
2779 2779
2780 2780 -q: quiet. Do not print the working directory after the cd command is
2781 2781 executed. By default IPython's cd command does print this directory,
2782 2782 since the default prompts do not display path information.
2783 2783
2784 2784 Note that !cd doesn't work for this purpose because the shell where
2785 2785 !command runs is immediately discarded after executing 'command'."""
2786 2786
2787 2787 parameter_s = parameter_s.strip()
2788 2788 #bkms = self.shell.persist.get("bookmarks",{})
2789 2789
2790 2790 oldcwd = os.getcwd()
2791 2791 numcd = re.match(r'(-)(\d+)$',parameter_s)
2792 2792 # jump in directory history by number
2793 2793 if numcd:
2794 2794 nn = int(numcd.group(2))
2795 2795 try:
2796 2796 ps = self.shell.user_ns['_dh'][nn]
2797 2797 except IndexError:
2798 2798 print 'The requested directory does not exist in history.'
2799 2799 return
2800 2800 else:
2801 2801 opts = {}
2802 2802 elif parameter_s.startswith('--'):
2803 2803 ps = None
2804 2804 fallback = None
2805 2805 pat = parameter_s[2:]
2806 2806 dh = self.shell.user_ns['_dh']
2807 2807 # first search only by basename (last component)
2808 2808 for ent in reversed(dh):
2809 2809 if pat in os.path.basename(ent) and os.path.isdir(ent):
2810 2810 ps = ent
2811 2811 break
2812 2812
2813 2813 if fallback is None and pat in ent and os.path.isdir(ent):
2814 2814 fallback = ent
2815 2815
2816 2816 # if we have no last part match, pick the first full path match
2817 2817 if ps is None:
2818 2818 ps = fallback
2819 2819
2820 2820 if ps is None:
2821 2821 print "No matching entry in directory history"
2822 2822 return
2823 2823 else:
2824 2824 opts = {}
2825 2825
2826 2826
2827 2827 else:
2828 2828 #turn all non-space-escaping backslashes to slashes,
2829 2829 # for c:\windows\directory\names\
2830 2830 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2831 2831 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2832 2832 # jump to previous
2833 2833 if ps == '-':
2834 2834 try:
2835 2835 ps = self.shell.user_ns['_dh'][-2]
2836 2836 except IndexError:
2837 2837 raise UsageError('%cd -: No previous directory to change to.')
2838 2838 # jump to bookmark if needed
2839 2839 else:
2840 2840 if not os.path.isdir(ps) or opts.has_key('b'):
2841 2841 bkms = self.db.get('bookmarks', {})
2842 2842
2843 2843 if bkms.has_key(ps):
2844 2844 target = bkms[ps]
2845 2845 print '(bookmark:%s) -> %s' % (ps,target)
2846 2846 ps = target
2847 2847 else:
2848 2848 if opts.has_key('b'):
2849 2849 raise UsageError("Bookmark '%s' not found. "
2850 2850 "Use '%%bookmark -l' to see your bookmarks." % ps)
2851 2851
2852 2852 # at this point ps should point to the target dir
2853 2853 if ps:
2854 2854 try:
2855 2855 os.chdir(os.path.expanduser(ps))
2856 2856 if self.shell.rc.term_title:
2857 2857 #print 'set term title:',self.shell.rc.term_title # dbg
2858 2858 platutils.set_term_title('IPy ' + abbrev_cwd())
2859 2859 except OSError:
2860 2860 print sys.exc_info()[1]
2861 2861 else:
2862 2862 cwd = os.getcwd()
2863 2863 dhist = self.shell.user_ns['_dh']
2864 2864 if oldcwd != cwd:
2865 2865 dhist.append(cwd)
2866 2866 self.db['dhist'] = compress_dhist(dhist)[-100:]
2867 2867
2868 2868 else:
2869 2869 os.chdir(self.shell.home_dir)
2870 2870 if self.shell.rc.term_title:
2871 2871 platutils.set_term_title("IPy ~")
2872 2872 cwd = os.getcwd()
2873 2873 dhist = self.shell.user_ns['_dh']
2874 2874
2875 2875 if oldcwd != cwd:
2876 2876 dhist.append(cwd)
2877 2877 self.db['dhist'] = compress_dhist(dhist)[-100:]
2878 2878 if not 'q' in opts and self.shell.user_ns['_dh']:
2879 2879 print self.shell.user_ns['_dh'][-1]
2880 2880
2881 2881
2882 2882 def magic_env(self, parameter_s=''):
2883 2883 """List environment variables."""
2884 2884
2885 2885 return os.environ.data
2886 2886
2887 2887 def magic_pushd(self, parameter_s=''):
2888 2888 """Place the current dir on stack and change directory.
2889 2889
2890 2890 Usage:\\
2891 2891 %pushd ['dirname']
2892 2892 """
2893 2893
2894 2894 dir_s = self.shell.dir_stack
2895 2895 tgt = os.path.expanduser(parameter_s)
2896 2896 cwd = os.getcwd().replace(self.home_dir,'~')
2897 2897 if tgt:
2898 2898 self.magic_cd(parameter_s)
2899 2899 dir_s.insert(0,cwd)
2900 2900 return self.magic_dirs()
2901 2901
2902 2902 def magic_popd(self, parameter_s=''):
2903 2903 """Change to directory popped off the top of the stack.
2904 2904 """
2905 2905 if not self.shell.dir_stack:
2906 2906 raise UsageError("%popd on empty stack")
2907 2907 top = self.shell.dir_stack.pop(0)
2908 2908 self.magic_cd(top)
2909 2909 print "popd ->",top
2910 2910
2911 2911 def magic_dirs(self, parameter_s=''):
2912 2912 """Return the current directory stack."""
2913 2913
2914 2914 return self.shell.dir_stack
2915 2915
2916 2916 def magic_dhist(self, parameter_s=''):
2917 2917 """Print your history of visited directories.
2918 2918
2919 2919 %dhist -> print full history\\
2920 2920 %dhist n -> print last n entries only\\
2921 2921 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2922 2922
2923 2923 This history is automatically maintained by the %cd command, and
2924 2924 always available as the global list variable _dh. You can use %cd -<n>
2925 2925 to go to directory number <n>.
2926 2926
2927 2927 Note that most of time, you should view directory history by entering
2928 2928 cd -<TAB>.
2929 2929
2930 2930 """
2931 2931
2932 2932 dh = self.shell.user_ns['_dh']
2933 2933 if parameter_s:
2934 2934 try:
2935 2935 args = map(int,parameter_s.split())
2936 2936 except:
2937 2937 self.arg_err(Magic.magic_dhist)
2938 2938 return
2939 2939 if len(args) == 1:
2940 2940 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2941 2941 elif len(args) == 2:
2942 2942 ini,fin = args
2943 2943 else:
2944 2944 self.arg_err(Magic.magic_dhist)
2945 2945 return
2946 2946 else:
2947 2947 ini,fin = 0,len(dh)
2948 2948 nlprint(dh,
2949 2949 header = 'Directory history (kept in _dh)',
2950 2950 start=ini,stop=fin)
2951 2951
2952 2952 @testdec.skip_doctest
2953 2953 def magic_sc(self, parameter_s=''):
2954 2954 """Shell capture - execute a shell command and capture its output.
2955 2955
2956 2956 DEPRECATED. Suboptimal, retained for backwards compatibility.
2957 2957
2958 2958 You should use the form 'var = !command' instead. Example:
2959 2959
2960 2960 "%sc -l myfiles = ls ~" should now be written as
2961 2961
2962 2962 "myfiles = !ls ~"
2963 2963
2964 2964 myfiles.s, myfiles.l and myfiles.n still apply as documented
2965 2965 below.
2966 2966
2967 2967 --
2968 2968 %sc [options] varname=command
2969 2969
2970 2970 IPython will run the given command using commands.getoutput(), and
2971 2971 will then update the user's interactive namespace with a variable
2972 2972 called varname, containing the value of the call. Your command can
2973 2973 contain shell wildcards, pipes, etc.
2974 2974
2975 2975 The '=' sign in the syntax is mandatory, and the variable name you
2976 2976 supply must follow Python's standard conventions for valid names.
2977 2977
2978 2978 (A special format without variable name exists for internal use)
2979 2979
2980 2980 Options:
2981 2981
2982 2982 -l: list output. Split the output on newlines into a list before
2983 2983 assigning it to the given variable. By default the output is stored
2984 2984 as a single string.
2985 2985
2986 2986 -v: verbose. Print the contents of the variable.
2987 2987
2988 2988 In most cases you should not need to split as a list, because the
2989 2989 returned value is a special type of string which can automatically
2990 2990 provide its contents either as a list (split on newlines) or as a
2991 2991 space-separated string. These are convenient, respectively, either
2992 2992 for sequential processing or to be passed to a shell command.
2993 2993
2994 2994 For example:
2995 2995
2996 2996 # all-random
2997 2997
2998 2998 # Capture into variable a
2999 2999 In [1]: sc a=ls *py
3000 3000
3001 3001 # a is a string with embedded newlines
3002 3002 In [2]: a
3003 3003 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
3004 3004
3005 3005 # which can be seen as a list:
3006 3006 In [3]: a.l
3007 3007 Out[3]: ['setup.py', 'win32_manual_post_install.py']
3008 3008
3009 3009 # or as a whitespace-separated string:
3010 3010 In [4]: a.s
3011 3011 Out[4]: 'setup.py win32_manual_post_install.py'
3012 3012
3013 3013 # a.s is useful to pass as a single command line:
3014 3014 In [5]: !wc -l $a.s
3015 3015 146 setup.py
3016 3016 130 win32_manual_post_install.py
3017 3017 276 total
3018 3018
3019 3019 # while the list form is useful to loop over:
3020 3020 In [6]: for f in a.l:
3021 3021 ...: !wc -l $f
3022 3022 ...:
3023 3023 146 setup.py
3024 3024 130 win32_manual_post_install.py
3025 3025
3026 3026 Similiarly, the lists returned by the -l option are also special, in
3027 3027 the sense that you can equally invoke the .s attribute on them to
3028 3028 automatically get a whitespace-separated string from their contents:
3029 3029
3030 3030 In [7]: sc -l b=ls *py
3031 3031
3032 3032 In [8]: b
3033 3033 Out[8]: ['setup.py', 'win32_manual_post_install.py']
3034 3034
3035 3035 In [9]: b.s
3036 3036 Out[9]: 'setup.py win32_manual_post_install.py'
3037 3037
3038 3038 In summary, both the lists and strings used for ouptut capture have
3039 3039 the following special attributes:
3040 3040
3041 3041 .l (or .list) : value as list.
3042 3042 .n (or .nlstr): value as newline-separated string.
3043 3043 .s (or .spstr): value as space-separated string.
3044 3044 """
3045 3045
3046 3046 opts,args = self.parse_options(parameter_s,'lv')
3047 3047 # Try to get a variable name and command to run
3048 3048 try:
3049 3049 # the variable name must be obtained from the parse_options
3050 3050 # output, which uses shlex.split to strip options out.
3051 3051 var,_ = args.split('=',1)
3052 3052 var = var.strip()
3053 3053 # But the the command has to be extracted from the original input
3054 3054 # parameter_s, not on what parse_options returns, to avoid the
3055 3055 # quote stripping which shlex.split performs on it.
3056 3056 _,cmd = parameter_s.split('=',1)
3057 3057 except ValueError:
3058 3058 var,cmd = '',''
3059 3059 # If all looks ok, proceed
3060 3060 out,err = self.shell.getoutputerror(cmd)
3061 3061 if err:
3062 3062 print >> Term.cerr,err
3063 3063 if opts.has_key('l'):
3064 3064 out = SList(out.split('\n'))
3065 3065 else:
3066 3066 out = LSString(out)
3067 3067 if opts.has_key('v'):
3068 3068 print '%s ==\n%s' % (var,pformat(out))
3069 3069 if var:
3070 3070 self.shell.user_ns.update({var:out})
3071 3071 else:
3072 3072 return out
3073 3073
3074 3074 def magic_sx(self, parameter_s=''):
3075 3075 """Shell execute - run a shell command and capture its output.
3076 3076
3077 3077 %sx command
3078 3078
3079 3079 IPython will run the given command using commands.getoutput(), and
3080 3080 return the result formatted as a list (split on '\\n'). Since the
3081 3081 output is _returned_, it will be stored in ipython's regular output
3082 3082 cache Out[N] and in the '_N' automatic variables.
3083 3083
3084 3084 Notes:
3085 3085
3086 3086 1) If an input line begins with '!!', then %sx is automatically
3087 3087 invoked. That is, while:
3088 3088 !ls
3089 3089 causes ipython to simply issue system('ls'), typing
3090 3090 !!ls
3091 3091 is a shorthand equivalent to:
3092 3092 %sx ls
3093 3093
3094 3094 2) %sx differs from %sc in that %sx automatically splits into a list,
3095 3095 like '%sc -l'. The reason for this is to make it as easy as possible
3096 3096 to process line-oriented shell output via further python commands.
3097 3097 %sc is meant to provide much finer control, but requires more
3098 3098 typing.
3099 3099
3100 3100 3) Just like %sc -l, this is a list with special attributes:
3101 3101
3102 3102 .l (or .list) : value as list.
3103 3103 .n (or .nlstr): value as newline-separated string.
3104 3104 .s (or .spstr): value as whitespace-separated string.
3105 3105
3106 3106 This is very useful when trying to use such lists as arguments to
3107 3107 system commands."""
3108 3108
3109 3109 if parameter_s:
3110 3110 out,err = self.shell.getoutputerror(parameter_s)
3111 3111 if err:
3112 3112 print >> Term.cerr,err
3113 3113 return SList(out.split('\n'))
3114 3114
3115 3115 def magic_bg(self, parameter_s=''):
3116 3116 """Run a job in the background, in a separate thread.
3117 3117
3118 3118 For example,
3119 3119
3120 3120 %bg myfunc(x,y,z=1)
3121 3121
3122 3122 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3123 3123 execution starts, a message will be printed indicating the job
3124 3124 number. If your job number is 5, you can use
3125 3125
3126 3126 myvar = jobs.result(5) or myvar = jobs[5].result
3127 3127
3128 3128 to assign this result to variable 'myvar'.
3129 3129
3130 3130 IPython has a job manager, accessible via the 'jobs' object. You can
3131 3131 type jobs? to get more information about it, and use jobs.<TAB> to see
3132 3132 its attributes. All attributes not starting with an underscore are
3133 3133 meant for public use.
3134 3134
3135 3135 In particular, look at the jobs.new() method, which is used to create
3136 3136 new jobs. This magic %bg function is just a convenience wrapper
3137 3137 around jobs.new(), for expression-based jobs. If you want to create a
3138 3138 new job with an explicit function object and arguments, you must call
3139 3139 jobs.new() directly.
3140 3140
3141 3141 The jobs.new docstring also describes in detail several important
3142 3142 caveats associated with a thread-based model for background job
3143 3143 execution. Type jobs.new? for details.
3144 3144
3145 3145 You can check the status of all jobs with jobs.status().
3146 3146
3147 3147 The jobs variable is set by IPython into the Python builtin namespace.
3148 3148 If you ever declare a variable named 'jobs', you will shadow this
3149 3149 name. You can either delete your global jobs variable to regain
3150 3150 access to the job manager, or make a new name and assign it manually
3151 3151 to the manager (stored in IPython's namespace). For example, to
3152 3152 assign the job manager to the Jobs name, use:
3153 3153
3154 3154 Jobs = __builtins__.jobs"""
3155 3155
3156 3156 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3157 3157
3158 3158 def magic_r(self, parameter_s=''):
3159 3159 """Repeat previous input.
3160 3160
3161 3161 Note: Consider using the more powerfull %rep instead!
3162 3162
3163 3163 If given an argument, repeats the previous command which starts with
3164 3164 the same string, otherwise it just repeats the previous input.
3165 3165
3166 3166 Shell escaped commands (with ! as first character) are not recognized
3167 3167 by this system, only pure python code and magic commands.
3168 3168 """
3169 3169
3170 3170 start = parameter_s.strip()
3171 3171 esc_magic = self.shell.ESC_MAGIC
3172 3172 # Identify magic commands even if automagic is on (which means
3173 3173 # the in-memory version is different from that typed by the user).
3174 3174 if self.shell.rc.automagic:
3175 3175 start_magic = esc_magic+start
3176 3176 else:
3177 3177 start_magic = start
3178 3178 # Look through the input history in reverse
3179 3179 for n in range(len(self.shell.input_hist)-2,0,-1):
3180 3180 input = self.shell.input_hist[n]
3181 3181 # skip plain 'r' lines so we don't recurse to infinity
3182 3182 if input != '_ip.magic("r")\n' and \
3183 3183 (input.startswith(start) or input.startswith(start_magic)):
3184 3184 #print 'match',`input` # dbg
3185 3185 print 'Executing:',input,
3186 3186 self.shell.runlines(input)
3187 3187 return
3188 3188 print 'No previous input matching `%s` found.' % start
3189 3189
3190 3190
3191 3191 def magic_bookmark(self, parameter_s=''):
3192 3192 """Manage IPython's bookmark system.
3193 3193
3194 3194 %bookmark <name> - set bookmark to current dir
3195 3195 %bookmark <name> <dir> - set bookmark to <dir>
3196 3196 %bookmark -l - list all bookmarks
3197 3197 %bookmark -d <name> - remove bookmark
3198 3198 %bookmark -r - remove all bookmarks
3199 3199
3200 3200 You can later on access a bookmarked folder with:
3201 3201 %cd -b <name>
3202 3202 or simply '%cd <name>' if there is no directory called <name> AND
3203 3203 there is such a bookmark defined.
3204 3204
3205 3205 Your bookmarks persist through IPython sessions, but they are
3206 3206 associated with each profile."""
3207 3207
3208 3208 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3209 3209 if len(args) > 2:
3210 3210 raise UsageError("%bookmark: too many arguments")
3211 3211
3212 3212 bkms = self.db.get('bookmarks',{})
3213 3213
3214 3214 if opts.has_key('d'):
3215 3215 try:
3216 3216 todel = args[0]
3217 3217 except IndexError:
3218 3218 raise UsageError(
3219 3219 "%bookmark -d: must provide a bookmark to delete")
3220 3220 else:
3221 3221 try:
3222 3222 del bkms[todel]
3223 3223 except KeyError:
3224 3224 raise UsageError(
3225 3225 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3226 3226
3227 3227 elif opts.has_key('r'):
3228 3228 bkms = {}
3229 3229 elif opts.has_key('l'):
3230 3230 bks = bkms.keys()
3231 3231 bks.sort()
3232 3232 if bks:
3233 3233 size = max(map(len,bks))
3234 3234 else:
3235 3235 size = 0
3236 3236 fmt = '%-'+str(size)+'s -> %s'
3237 3237 print 'Current bookmarks:'
3238 3238 for bk in bks:
3239 3239 print fmt % (bk,bkms[bk])
3240 3240 else:
3241 3241 if not args:
3242 3242 raise UsageError("%bookmark: You must specify the bookmark name")
3243 3243 elif len(args)==1:
3244 3244 bkms[args[0]] = os.getcwd()
3245 3245 elif len(args)==2:
3246 3246 bkms[args[0]] = args[1]
3247 3247 self.db['bookmarks'] = bkms
3248 3248
3249 3249 def magic_pycat(self, parameter_s=''):
3250 3250 """Show a syntax-highlighted file through a pager.
3251 3251
3252 3252 This magic is similar to the cat utility, but it will assume the file
3253 3253 to be Python source and will show it with syntax highlighting. """
3254 3254
3255 3255 try:
3256 3256 filename = get_py_filename(parameter_s)
3257 3257 cont = file_read(filename)
3258 3258 except IOError:
3259 3259 try:
3260 3260 cont = eval(parameter_s,self.user_ns)
3261 3261 except NameError:
3262 3262 cont = None
3263 3263 if cont is None:
3264 3264 print "Error: no such file or variable"
3265 3265 return
3266 3266
3267 3267 page(self.shell.pycolorize(cont),
3268 3268 screen_lines=self.shell.rc.screen_length)
3269 3269
3270 3270 def _rerun_pasted(self):
3271 3271 """ Rerun a previously pasted command.
3272 3272 """
3273 3273 b = self.user_ns.get('pasted_block', None)
3274 3274 if b is None:
3275 3275 raise UsageError('No previous pasted block available')
3276 3276 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3277 3277 exec b in self.user_ns
3278 3278
3279 3279 def _get_pasted_lines(self, sentinel):
3280 3280 """ Yield pasted lines until the user enters the given sentinel value.
3281 3281 """
3282 3282 from IPython.core import iplib
3283 3283 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3284 3284 while True:
3285 3285 l = iplib.raw_input_original(':')
3286 3286 if l == sentinel:
3287 3287 return
3288 3288 else:
3289 3289 yield l
3290 3290
3291 3291 def _strip_pasted_lines_for_code(self, raw_lines):
3292 3292 """ Strip non-code parts of a sequence of lines to return a block of
3293 3293 code.
3294 3294 """
3295 3295 # Regular expressions that declare text we strip from the input:
3296 3296 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3297 3297 r'^\s*(\s?>)+', # Python input prompt
3298 3298 r'^\s*\.{3,}', # Continuation prompts
3299 3299 r'^\++',
3300 3300 ]
3301 3301
3302 3302 strip_from_start = map(re.compile,strip_re)
3303 3303
3304 3304 lines = []
3305 3305 for l in raw_lines:
3306 3306 for pat in strip_from_start:
3307 3307 l = pat.sub('',l)
3308 3308 lines.append(l)
3309 3309
3310 3310 block = "\n".join(lines) + '\n'
3311 3311 #print "block:\n",block
3312 3312 return block
3313 3313
3314 3314 def _execute_block(self, block, par):
3315 3315 """ Execute a block, or store it in a variable, per the user's request.
3316 3316 """
3317 3317 if not par:
3318 3318 b = textwrap.dedent(block)
3319 3319 self.user_ns['pasted_block'] = b
3320 3320 exec b in self.user_ns
3321 3321 else:
3322 3322 self.user_ns[par] = SList(block.splitlines())
3323 3323 print "Block assigned to '%s'" % par
3324 3324
3325 3325 def magic_cpaste(self, parameter_s=''):
3326 3326 """Allows you to paste & execute a pre-formatted code block from clipboard.
3327 3327
3328 3328 You must terminate the block with '--' (two minus-signs) alone on the
3329 3329 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3330 3330 is the new sentinel for this operation)
3331 3331
3332 3332 The block is dedented prior to execution to enable execution of method
3333 3333 definitions. '>' and '+' characters at the beginning of a line are
3334 3334 ignored, to allow pasting directly from e-mails, diff files and
3335 3335 doctests (the '...' continuation prompt is also stripped). The
3336 3336 executed block is also assigned to variable named 'pasted_block' for
3337 3337 later editing with '%edit pasted_block'.
3338 3338
3339 3339 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3340 3340 This assigns the pasted block to variable 'foo' as string, without
3341 3341 dedenting or executing it (preceding >>> and + is still stripped)
3342 3342
3343 3343 '%cpaste -r' re-executes the block previously entered by cpaste.
3344 3344
3345 3345 Do not be alarmed by garbled output on Windows (it's a readline bug).
3346 3346 Just press enter and type -- (and press enter again) and the block
3347 3347 will be what was just pasted.
3348 3348
3349 3349 IPython statements (magics, shell escapes) are not supported (yet).
3350 3350
3351 3351 See also
3352 3352 --------
3353 3353 paste: automatically pull code from clipboard.
3354 3354 """
3355 3355
3356 3356 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3357 3357 par = args.strip()
3358 3358 if opts.has_key('r'):
3359 3359 self._rerun_pasted()
3360 3360 return
3361 3361
3362 3362 sentinel = opts.get('s','--')
3363 3363
3364 3364 block = self._strip_pasted_lines_for_code(
3365 3365 self._get_pasted_lines(sentinel))
3366 3366
3367 3367 self._execute_block(block, par)
3368 3368
3369 3369 def magic_paste(self, parameter_s=''):
3370 3370 """Allows you to paste & execute a pre-formatted code block from clipboard.
3371 3371
3372 3372 The text is pulled directly from the clipboard without user
3373 3373 intervention and printed back on the screen before execution (unless
3374 3374 the -q flag is given to force quiet mode).
3375 3375
3376 3376 The block is dedented prior to execution to enable execution of method
3377 3377 definitions. '>' and '+' characters at the beginning of a line are
3378 3378 ignored, to allow pasting directly from e-mails, diff files and
3379 3379 doctests (the '...' continuation prompt is also stripped). The
3380 3380 executed block is also assigned to variable named 'pasted_block' for
3381 3381 later editing with '%edit pasted_block'.
3382 3382
3383 3383 You can also pass a variable name as an argument, e.g. '%paste foo'.
3384 3384 This assigns the pasted block to variable 'foo' as string, without
3385 3385 dedenting or executing it (preceding >>> and + is still stripped)
3386 3386
3387 3387 Options
3388 3388 -------
3389 3389
3390 3390 -r: re-executes the block previously entered by cpaste.
3391 3391
3392 3392 -q: quiet mode: do not echo the pasted text back to the terminal.
3393 3393
3394 3394 IPython statements (magics, shell escapes) are not supported (yet).
3395 3395
3396 3396 See also
3397 3397 --------
3398 3398 cpaste: manually paste code into terminal until you mark its end.
3399 3399 """
3400 3400 opts,args = self.parse_options(parameter_s,'rq',mode='string')
3401 3401 par = args.strip()
3402 3402 if opts.has_key('r'):
3403 3403 self._rerun_pasted()
3404 3404 return
3405 3405
3406 3406 text = self.shell.hooks.clipboard_get()
3407 3407 block = self._strip_pasted_lines_for_code(text.splitlines())
3408 3408
3409 3409 # By default, echo back to terminal unless quiet mode is requested
3410 3410 if not opts.has_key('q'):
3411 3411 write = self.shell.write
3412 3412 write(block)
3413 3413 if not block.endswith('\n'):
3414 3414 write('\n')
3415 3415 write("## -- End pasted text --\n")
3416 3416
3417 3417 self._execute_block(block, par)
3418 3418
3419 3419 def magic_quickref(self,arg):
3420 3420 """ Show a quick reference sheet """
3421 3421 import IPython.core.usage
3422 3422 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3423 3423
3424 3424 page(qr)
3425 3425
3426 3426 def magic_upgrade(self,arg):
3427 3427 """ Upgrade your IPython installation
3428 3428
3429 3429 This will copy the config files that don't yet exist in your
3430 3430 ipython dir from the system config dir. Use this after upgrading
3431 3431 IPython if you don't wish to delete your .ipython dir.
3432 3432
3433 3433 Call with -nolegacy to get rid of ipythonrc* files (recommended for
3434 3434 new users)
3435 3435
3436 3436 """
3437 3437 ip = self.getapi()
3438 3438 ipinstallation = path(IPython.__file__).dirname()
3439 3439 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'utils' / 'upgradedir.py')
3440 3440 src_config = ipinstallation / 'config' / 'userconfig'
3441 3441 userdir = path(ip.options.ipythondir)
3442 3442 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
3443 3443 print ">",cmd
3444 3444 shell(cmd)
3445 3445 if arg == '-nolegacy':
3446 3446 legacy = userdir.files('ipythonrc*')
3447 3447 print "Nuking legacy files:",legacy
3448 3448
3449 3449 [p.remove() for p in legacy]
3450 3450 suffix = (sys.platform == 'win32' and '.ini' or '')
3451 3451 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
3452 3452
3453 3453
3454 3454 def magic_doctest_mode(self,parameter_s=''):
3455 3455 """Toggle doctest mode on and off.
3456 3456
3457 3457 This mode allows you to toggle the prompt behavior between normal
3458 3458 IPython prompts and ones that are as similar to the default IPython
3459 3459 interpreter as possible.
3460 3460
3461 3461 It also supports the pasting of code snippets that have leading '>>>'
3462 3462 and '...' prompts in them. This means that you can paste doctests from
3463 3463 files or docstrings (even if they have leading whitespace), and the
3464 3464 code will execute correctly. You can then use '%history -tn' to see
3465 3465 the translated history without line numbers; this will give you the
3466 3466 input after removal of all the leading prompts and whitespace, which
3467 3467 can be pasted back into an editor.
3468 3468
3469 3469 With these features, you can switch into this mode easily whenever you
3470 3470 need to do testing and changes to doctests, without having to leave
3471 3471 your existing IPython session.
3472 3472 """
3473 3473
3474 3474 # XXX - Fix this to have cleaner activate/deactivate calls.
3475 3475 from IPython.extensions import InterpreterPasteInput as ipaste
3476 3476 from IPython.utils.ipstruct import Struct
3477 3477
3478 3478 # Shorthands
3479 3479 shell = self.shell
3480 3480 oc = shell.outputcache
3481 3481 rc = shell.rc
3482 3482 meta = shell.meta
3483 3483 # dstore is a data store kept in the instance metadata bag to track any
3484 3484 # changes we make, so we can undo them later.
3485 3485 dstore = meta.setdefault('doctest_mode',Struct())
3486 3486 save_dstore = dstore.setdefault
3487 3487
3488 3488 # save a few values we'll need to recover later
3489 3489 mode = save_dstore('mode',False)
3490 3490 save_dstore('rc_pprint',rc.pprint)
3491 3491 save_dstore('xmode',shell.InteractiveTB.mode)
3492 3492 save_dstore('rc_separate_out',rc.separate_out)
3493 3493 save_dstore('rc_separate_out2',rc.separate_out2)
3494 3494 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
3495 3495 save_dstore('rc_separate_in',rc.separate_in)
3496 3496
3497 3497 if mode == False:
3498 3498 # turn on
3499 3499 ipaste.activate_prefilter()
3500 3500
3501 3501 oc.prompt1.p_template = '>>> '
3502 3502 oc.prompt2.p_template = '... '
3503 3503 oc.prompt_out.p_template = ''
3504 3504
3505 3505 # Prompt separators like plain python
3506 3506 oc.input_sep = oc.prompt1.sep = ''
3507 3507 oc.output_sep = ''
3508 3508 oc.output_sep2 = ''
3509 3509
3510 3510 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3511 3511 oc.prompt_out.pad_left = False
3512 3512
3513 3513 rc.pprint = False
3514 3514
3515 3515 shell.magic_xmode('Plain')
3516 3516
3517 3517 else:
3518 3518 # turn off
3519 3519 ipaste.deactivate_prefilter()
3520 3520
3521 3521 oc.prompt1.p_template = rc.prompt_in1
3522 3522 oc.prompt2.p_template = rc.prompt_in2
3523 3523 oc.prompt_out.p_template = rc.prompt_out
3524 3524
3525 3525 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3526 3526
3527 3527 oc.output_sep = dstore.rc_separate_out
3528 3528 oc.output_sep2 = dstore.rc_separate_out2
3529 3529
3530 3530 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3531 3531 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3532 3532
3533 3533 rc.pprint = dstore.rc_pprint
3534 3534
3535 3535 shell.magic_xmode(dstore.xmode)
3536 3536
3537 3537 # Store new mode and inform
3538 3538 dstore.mode = bool(1-int(mode))
3539 3539 print 'Doctest mode is:',
3540 3540 print ['OFF','ON'][dstore.mode]
3541 3541
3542 3542 def magic_gui(self, parameter_s=''):
3543 3543 """Enable or disable IPython GUI event loop integration.
3544 3544
3545 %gui [-a] [GUINAME]
3546
3545 3547 This magic replaces IPython's threaded shells that were activated
3546 3548 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3547 3549 can now be enabled, disabled and swtiched at runtime and keyboard
3548 3550 interrupts should work without any problems. The following toolkits
3549 3551 are supports: wxPython, PyQt4, PyGTK, and Tk::
3550 3552
3551 3553 %gui wx # enable wxPython event loop integration
3552 3554 %gui qt4 # enable PyQt4 event loop integration
3553 3555 %gui gtk # enable PyGTK event loop integration
3554 3556 %gui tk # enable Tk event loop integration
3555 3557 %gui # disable all event loop integration
3556 3558
3557 3559 WARNING: after any of these has been called you can simply create
3558 3560 an application object, but DO NOT start the event loop yourself, as
3559 3561 we have already handled that.
3560 3562
3561 3563 If you want us to create an appropriate application object add the
3562 3564 "-a" flag to your command::
3563 3565
3564 3566 %gui -a wx
3565 3567
3566 3568 This is highly recommended for most users.
3567 3569 """
3568 3570 from IPython.lib import inputhook
3569 3571 if "-a" in parameter_s:
3570 3572 app = True
3571 3573 else:
3572 3574 app = False
3573 3575 if not parameter_s:
3574 3576 inputhook.clear_inputhook()
3575 3577 elif 'wx' in parameter_s:
3576 3578 return inputhook.enable_wx(app)
3577 3579 elif 'qt4' in parameter_s:
3578 3580 return inputhook.enable_qt4(app)
3579 3581 elif 'gtk' in parameter_s:
3580 3582 return inputhook.enable_gtk(app)
3581 3583 elif 'tk' in parameter_s:
3582 3584 return inputhook.enable_tk(app)
3583 3585
3584 3586
3585 3587 # end Magic
@@ -1,181 +1,226 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Inputhook management for GUI event loop integration.
5 5 """
6 6
7 7 #-----------------------------------------------------------------------------
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 ctypes
19 19 import sys
20 20
21 21 #-----------------------------------------------------------------------------
22 22 # Code
23 23 #-----------------------------------------------------------------------------
24 24
25 25
26 26 class InputHookManager(object):
27 """Manage PyOS_InputHook for different GUI toolkits."""
27 """Manage PyOS_InputHook for different GUI toolkits.
28
29 This class installs various hooks under ``PyOSInputHook`` to handle
30 GUI event loop integration.
31 """
28 32
29 33 def __init__(self):
30 34 self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int)
31 35 self._reset()
32 36
33 37 def _reset(self):
34 38 self._callback_pyfunctype = None
35 39 self._callback = None
36 40 self._installed = False
41 self._current_gui = None
37 42
38 43 def get_pyos_inputhook(self):
39 44 """Return the current PyOS_InputHook as a ctypes.c_void_p.
40 45 """
41 46 return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook")
42 47
43 48 def get_pyos_inputhook_as_func(self):
44 49 """Return the current PyOS_InputHook as a ctypes.PYFUNCYPE.
45 50 """
46 51 return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook")
47 52
48 53 def set_inputhook(self, callback):
49 54 """Set PyOS_InputHook to callback and return the previous one.
50 55 """
51 56 self._callback = callback
52 57 self._callback_pyfunctype = self.PYFUNC(callback)
53 58 pyos_inputhook_ptr = self.get_pyos_inputhook()
54 59 original = self.get_pyos_inputhook_as_func()
55 60 pyos_inputhook_ptr.value = \
56 61 ctypes.cast(self._callback_pyfunctype, ctypes.c_void_p).value
57 62 self._installed = True
58 63 return original
59 64
60 65 def clear_inputhook(self):
61 66 """Set PyOS_InputHook to NULL and return the previous one.
62 67 """
63 68 pyos_inputhook_ptr = self.get_pyos_inputhook()
64 69 original = self.get_pyos_inputhook_as_func()
65 70 pyos_inputhook_ptr.value = ctypes.c_void_p(None).value
66 71 self._reset()
67 72 return original
68 73
69 74 def enable_wx(self, app=False):
70 75 """Enable event loop integration with wxPython.
71 76
77 Parameters
78 ----------
79 app : bool
80 Create a running application object or not.
81
82 Notes
83 -----
72 84 This methods sets the PyOS_InputHook for wxPython, which allows
73 85 the wxPython to integrate with terminal based applications like
74 86 IPython.
75 87
76 88 Once this has been called, you can use wx interactively by doing::
77 89
78 90 >>> import wx
79 91 >>> app = wx.App(redirect=False, clearSigInt=False)
80 92
81 93 Both options this constructor are important for things to work
82 94 properly in an interactive context.
83 95
84 96 But, *don't start the event loop*. That is handled automatically by
85 97 PyOS_InputHook.
86 98 """
87 99 from IPython.lib.inputhookwx import inputhook_wx
88 100 self.set_inputhook(inputhook_wx)
101 self._current_gui = 'wx'
89 102 if app:
90 103 import wx
91 104 app = wx.App(redirect=False, clearSigInt=False)
92 105 return app
93 106
94 107 def disable_wx(self):
95 108 """Disable event loop integration with wxPython.
96 109
97 110 This merely sets PyOS_InputHook to NULL.
98 111 """
99 112 self.clear_inputhook()
100 113
101 114 def enable_qt4(self, app=False):
102 115 """Enable event loop integration with PyQt4.
103 116
117 Parameters
118 ----------
119 app : bool
120 Create a running application object or not.
121
122 Notes
123 -----
104 124 This methods sets the PyOS_InputHook for wxPython, which allows
105 125 the PyQt4 to integrate with terminal based applications like
106 126 IPython.
107 127
108 128 Once this has been called, you can simply create a QApplication and
109 129 use it. But, *don't start the event loop*. That is handled
110 130 automatically by PyOS_InputHook.
111 131 """
112 132 from PyQt4 import QtCore
113 133 # PyQt4 has had this since 4.3.1. In version 4.2, PyOS_InputHook
114 134 # was set when QtCore was imported, but if it ever got removed,
115 135 # you couldn't reset it. For earlier versions we can
116 136 # probably implement a ctypes version.
117 137 try:
118 138 QtCore.pyqtRestoreInputHook()
119 139 except AttributeError:
120 140 pass
141 self._current_gui = 'qt4'
121 142 if app:
122 143 from PyQt4 import QtGui
123 144 app = QtGui.QApplication(sys.argv)
124 145 return app
125 146
126 147 def disable_qt4(self):
127 148 """Disable event loop integration with PyQt4.
128 149
129 150 This merely sets PyOS_InputHook to NULL.
130 151 """
131 152 self.clear_inputhook()
132 153
133 154 def enable_gtk(self, app=False):
134 155 """Enable event loop integration with PyGTK.
135 156
157 Parameters
158 ----------
159 app : bool
160 Create a running application object or not.
161
162 Notes
163 -----
136 164 This methods sets the PyOS_InputHook for PyGTK, which allows
137 165 the PyGTK to integrate with terminal based applications like
138 166 IPython.
139 167
140 168 Once this has been called, you can simple create PyGTK objects and
141 169 use them. But, *don't start the event loop*. That is handled
142 170 automatically by PyOS_InputHook.
143 171 """
144 172 import gtk
145 173 try:
146 174 gtk.set_interactive(True)
175 self._current_gui = 'gtk'
147 176 except AttributeError:
148 177 # For older versions of gtk, use our own ctypes version
149 178 from IPython.lib.inputhookgtk import inputhook_gtk
150 179 add_inputhook(inputhook_gtk)
151 180
152 181 def disable_gtk(self):
153 182 """Disable event loop integration with PyGTK.
154 183
155 184 This merely sets PyOS_InputHook to NULL.
156 185 """
157 186 self.clear_inputhook()
158 187
159 188 def enable_tk(self, app=False):
160 # Creating a Tkinter.Tk object sets PyOS_InputHook()
161 pass
189 """Enable event loop integration with Tk.
190
191 Parameters
192 ----------
193 app : bool
194 Create a running application object or not.
195
196 Notes
197 -----
198 Currently this is a no-op as creating a :class:`Tkinter.Tk` object
199 sets ``PyOS_InputHook``.
200 """
201 self._current_gui = 'tk'
162 202
163 203 def disable_tk(self):
164 204 """Disable event loop integration with Tkinter.
165 205
166 206 This merely sets PyOS_InputHook to NULL.
167 207 """
168 208 self.clear_inputhook()
169 209
210 def current_gui(self):
211 """Return a string indicating the currently active GUI or None."""
212 return self._current_gui
213
170 214 inputhook_manager = InputHookManager()
171 215
172 216 enable_wx = inputhook_manager.enable_wx
173 217 disable_wx = inputhook_manager.disable_wx
174 218 enable_qt4 = inputhook_manager.enable_qt4
175 219 disable_qt4 = inputhook_manager.disable_qt4
176 220 enable_gtk = inputhook_manager.enable_gtk
177 221 disable_gtk = inputhook_manager.disable_gtk
178 222 enable_tk = inputhook_manager.enable_tk
179 223 disable_tk = inputhook_manager.disable_tk
180 224 clear_inputhook = inputhook_manager.clear_inputhook
181 225 set_inputhook = inputhook_manager.set_inputhook
226 current_gui = inputhook_manager.current_gui No newline at end of file
@@ -1,34 +1,36 b''
1 1 #!/usr/bin/env python
2 2 """Script to auto-generate our API docs.
3 3 """
4 4 # stdlib imports
5 5 import os
6 6 import sys
7 7
8 8 # local imports
9 9 sys.path.append(os.path.abspath('sphinxext'))
10 10 from apigen import ApiDocWriter
11 11
12 12 #*****************************************************************************
13 13 if __name__ == '__main__':
14 14 pjoin = os.path.join
15 15 package = 'IPython'
16 16 outdir = pjoin('source','api','generated')
17 17 docwriter = ApiDocWriter(package,rst_extension='.txt')
18 18 docwriter.package_skip_patterns += [r'\.fixes$',
19 19 r'\.externals$',
20 20 r'\.extensions',
21 21 r'\.kernel.config',
22 22 r'\.attic',
23 r'\.quarantine',
24 r'\.deathrow'
23 25 ]
24 docwriter.module_skip_patterns += [ r'\.FakeModule',
26 docwriter.module_skip_patterns += [ r'\.core.fakemodule',
25 27 r'\.cocoa',
26 28 r'\.ipdoctest',
27 29 r'\.Gnuplot',
28 30 r'\.frontend.process.winprocess',
29 31 ]
30 32 docwriter.write_api_docs(outdir)
31 33 docwriter.write_index(outdir, 'gen',
32 34 relative_to = pjoin('source','api')
33 35 )
34 36 print '%d files written' % len(docwriter.written_modules)
@@ -1,515 +1,517 b''
1 1 .. _development:
2 2
3 3 ==============================
4 4 IPython development guidelines
5 5 ==============================
6 6
7 7
8 8 Overview
9 9 ========
10 10
11 11 This document describes IPython from the perspective of developers. Most
12 12 importantly, it gives information for people who want to contribute to the
13 13 development of IPython. So if you want to help out, read on!
14 14
15 15 How to contribute to IPython
16 16 ============================
17 17
18 18 IPython development is done using Bazaar [Bazaar]_ and Launchpad [Launchpad]_.
19 19 This makes it easy for people to contribute to the development of IPython.
20 20 There are several ways in which you can join in.
21 21
22 22 If you have a small change that you want to send to the team, you can edit your
23 23 bazaar checkout of IPython (see below) in-place, and ask bazaar for the
24 24 differences::
25 25
26 26 $ cd /path/to/your/copy/of/ipython
27 27 $ bzr diff > my_fixes.diff
28 28
29 29 This produces a patch file with your fixes, which we can apply to the source
30 30 tree. This file should then be attached to a ticket in our `bug tracker
31 31 <https://bugs.launchpad.net/ipython>`_, indicating what it does.
32 32
33 33 This model of creating small, self-contained patches works very well and there
34 34 are open source projects that do their entire development this way. However,
35 35 in IPython we have found that for tracking larger changes, making use of
36 36 bazaar's full capabilities in conjunction with Launchpad's code hosting
37 37 services makes for a much better experience.
38 38
39 39 Making your own branch of IPython allows you to refine your changes over time,
40 40 track the development of the main team, and propose your own full version of
41 41 the code for others to use and review, with a minimum amount of fuss. The next
42 42 parts of this document will explain how to do this.
43 43
44 44 Install Bazaar and create a Launchpad account
45 45 ---------------------------------------------
46 46
47 47 First make sure you have installed Bazaar (see their `website
48 48 <http://bazaar-vcs.org/>`_). To see that Bazaar is installed and knows about
49 49 you, try the following::
50 50
51 51 $ bzr whoami
52 52 Joe Coder <jcoder@gmail.com>
53 53
54 54 This should display your name and email. Next, you will want to create an
55 55 account on the `Launchpad website <http://www.launchpad.net>`_ and setup your
56 56 ssh keys. For more information of setting up your ssh keys, see `this link
57 57 <https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair>`_.
58 58
59 59 Get the main IPython branch from Launchpad
60 60 ------------------------------------------
61 61
62 62 Now, you can get a copy of the main IPython development branch (we call this
63 63 the "trunk")::
64 64
65 65 $ bzr branch lp:ipython
66 66
67 67 Create a working branch
68 68 -----------------------
69 69
70 70 When working on IPython, you won't actually make edits directly to the
71 71 :file:`lp:ipython` branch. Instead, you will create a separate branch for your
72 72 changes. For now, let's assume you want to do your work in a branch named
73 73 "ipython-mybranch". Create this branch by doing::
74 74
75 75 $ bzr branch ipython ipython-mybranch
76 76
77 77 When you actually create a branch, you will want to give it a name that
78 78 reflects the nature of the work that you will be doing in it, like
79 79 "install-docs-update".
80 80
81 81 Make edits in your working branch
82 82 ---------------------------------
83 83
84 84 Now you are ready to actually make edits in your :file:`ipython-mybranch`
85 85 branch. Before doing this, it is helpful to install this branch so you can
86 86 test your changes as you work. This is easiest if you have setuptools
87 87 installed. Then, just do::
88 88
89 89 $ cd ipython-mybranch
90 90 $ python setupegg.py develop
91 91
92 92 Now, make some changes. After a while, you will want to commit your changes.
93 93 This let's Bazaar know that you like the changes you have made and gives you
94 94 an opportunity to keep a nice record of what you have done. This looks like
95 95 this::
96 96
97 97 $ ...do work in ipython-mybranch...
98 98 $ bzr commit -m "the commit message goes here"
99 99
100 100 Please note that since we now don't use an old-style linear ChangeLog (that
101 101 tends to cause problems with distributed version control systems), you should
102 102 ensure that your log messages are reasonably detailed. Use a docstring-like
103 103 approach in the commit messages (including the second line being left
104 104 *blank*)::
105 105
106 106 Single line summary of changes being committed.
107 107
108 108 * more details when warranted ...
109 109 * including crediting outside contributors if they sent the
110 110 code/bug/idea!
111 111
112 112 As you work, you will repeat this edit/commit cycle many times. If you work on
113 113 your branch for a long time, you will also want to get the latest changes from
114 114 the :file:`lp:ipython` branch. This can be done with the following sequence of
115 115 commands::
116 116
117 117 $ ls
118 118 ipython
119 119 ipython-mybranch
120 120
121 121 $ cd ipython
122 122 $ bzr pull
123 123 $ cd ../ipython-mybranch
124 124 $ bzr merge ../ipython
125 125 $ bzr commit -m "Merging changes from trunk"
126 126
127 127 Along the way, you should also run the IPython test suite. You can do this
128 128 using the :command:`iptest` command (which is basically a customized version of
129 129 :command:`nosetests`)::
130 130
131 131 $ cd
132 132 $ iptest
133 133
134 134 The :command:`iptest` command will also pick up and run any tests you have
135 written. See :ref:`_devel_testing` for further details on the testing system.
135 written. See :ref:`testing documentation <devel_testing>` for further details
136 on the testing system.
136 137
137 138
138 139 Post your branch and request a code review
139 140 ------------------------------------------
140 141
141 142 Once you are done with your edits, you should post your branch on Launchpad so
142 143 that other IPython developers can review the changes and help you merge your
143 144 changes into the main development branch. To post your branch on Launchpad,
144 145 do::
145 146
146 147 $ cd ipython-mybranch
147 148 $ bzr push lp:~yourusername/ipython/ipython-mybranch
148 149
149 150 Then, go to the `IPython Launchpad site <www.launchpad.net/ipython>`_, and you
150 151 should see your branch under the "Code" tab. If you click on your branch, you
151 152 can provide a short description of the branch as well as mark its status. Most
152 153 importantly, you should click the link that reads "Propose for merging into
153 154 another branch". What does this do?
154 155
155 156 This let's the other IPython developers know that your branch is ready to be
156 157 reviewed and merged into the main development branch. During this review
157 158 process, other developers will give you feedback and help you get your code
158 159 ready to be merged. What types of things will we be looking for:
159 160
160 161 * All code is documented.
161 162 * All code has tests.
162 163 * The entire IPython test suite passes.
163 164
164 165 Once your changes have been reviewed and approved, someone will merge them
165 166 into the main development branch.
166 167
167 168
168 169 Some notes for core developers when merging third-party contributions
169 170 =====================================================================
170 171
171 172 Core developers, who ultimately merge any approved branch (from themselves,
172 173 another developer, or any third-party contribution) will typically use
173 :command:`bzr merge` to merge the branch into the trunk and push it to the main
174 Launcphad site. This is a short list of things to keep in mind when doing this
175 process, so that the project history is easy to understand in the long run, and
176 that generating release notes is as painless and accurate as possible.
177
178 - When you merge any non-trivial functionality (from one small bug fix to a big
179 feature branch), please remember to always edit the changes_ file
180 accordingly. This file has one main section for each release, and if you
181 edit it as you go, noting what new features, bug fixes or API changes you
182 have made, the release notes will be almost finished when they are needed
183 later. This is much easier if done when you merge the work, rather than
184 weeks or months later by re-reading a massive Bazaar log.
185
186 - When big merges are done, the practice of putting a summary commit message in
187 the merge is *extremely* useful. It makes this kind of job much nicer,
174 :command:`bzr merge` to merge the branch into the trunk and push it to the
175 main Launcphad site. This is a short list of things to keep in mind when doing
176 this process, so that the project history is easy to understand in the long
177 run, and that generating release notes is as painless and accurate as
178 possible.
179
180 - When you merge any non-trivial functionality (from one small bug fix to a
181 big feature branch), please remember to always edit the :file:`changes.txt`
182 file accordingly. This file has one main section for each release, and if
183 you edit it as you go, noting what new features, bug fixes or API changes
184 you have made, the release notes will be almost finished when they are
185 needed later. This is much easier if done when you merge the work, rather
186 than weeks or months later by re-reading a massive Bazaar log.
187
188 - When big merges are done, the practice of putting a summary commit message
189 in the merge is *extremely* useful. It makes this kind of job much nicer,
188 190 because that summary log message can be almost copy/pasted without changes,
189 191 if it was well written, rather than dissecting the next-level messages from
190 192 the individual commits.
191 193
192 194 - It's important that we remember to always credit who gave us something if
193 195 it's not the committer. In general, we have been fairly good on this front,
194 196 this is just a reminder to keep things up. As a note, if you are ever
195 197 committing something that is completely (or almost so) a third-party
196 198 contribution, do the commit as::
197 199
198 200 $ bzr commit --author="Someone Else"
199 201
200 202 This way it will show that name separately in the log, which makes it even
201 203 easier to spot. Obviously we often rework third party contributions
202 204 extensively, but this is still good to keep in mind for cases when we don't
203 205 touch the code too much.
204 206
205 207
206 208 Documentation
207 209 =============
208 210
209 211 Standalone documentation
210 212 ------------------------
211 213
212 214 All standalone documentation should be written in plain text (``.txt``) files
213 215 using reStructuredText [reStructuredText]_ for markup and formatting. All such
214 216 documentation should be placed in directory :file:`docs/source` of the IPython
215 217 source tree. The documentation in this location will serve as the main source
216 218 for IPython documentation and all existing documentation should be converted
217 219 to this format.
218 220
219 221 To build the final documentation, we use Sphinx [Sphinx]_. Once you have
220 222 Sphinx installed, you can build the html docs yourself by doing::
221 223
222 224 $ cd ipython-mybranch/docs
223 225 $ make html
224 226
225 227 Docstring format
226 228 ----------------
227 229
228 230 Good docstrings are very important. All new code should have docstrings that
229 231 are formatted using reStructuredText for markup and formatting, since it is
230 232 understood by a wide variety of tools. Details about using reStructuredText
231 233 for docstrings can be found `here
232 234 <http://epydoc.sourceforge.net/manual-othermarkup.html>`_.
233 235
234 236 Additional PEPs of interest regarding documentation of code:
235 237
236 238 * `Docstring Conventions <http://www.python.org/peps/pep-0257.html>`_
237 239 * `Docstring Processing System Framework <http://www.python.org/peps/pep-0256.html>`_
238 240 * `Docutils Design Specification <http://www.python.org/peps/pep-0258.html>`_
239 241
240 242
241 243 Coding conventions
242 244 ==================
243 245
244 246 General
245 247 -------
246 248
247 249 In general, we'll try to follow the standard Python style conventions as
248 250 described here:
249 251
250 252 * `Style Guide for Python Code <http://www.python.org/peps/pep-0008.html>`_
251 253
252 254
253 255 Other comments:
254 256
255 257 * In a large file, top level classes and functions should be
256 258 separated by 2-3 lines to make it easier to separate them visually.
257 259 * Use 4 spaces for indentation.
258 260 * Keep the ordering of methods the same in classes that have the same
259 261 methods. This is particularly true for classes that implement an interface.
260 262
261 263 Naming conventions
262 264 ------------------
263 265
264 266 In terms of naming conventions, we'll follow the guidelines from the `Style
265 267 Guide for Python Code`_.
266 268
267 269 For all new IPython code (and much existing code is being refactored), we'll
268 270 use:
269 271
270 272 * All ``lowercase`` module names.
271 273
272 274 * ``CamelCase`` for class names.
273 275
274 276 * ``lowercase_with_underscores`` for methods, functions, variables and
275 277 attributes.
276 278
277 279 There are, however, some important exceptions to these rules. In some cases,
278 280 IPython code will interface with packages (Twisted, Wx, Qt) that use other
279 281 conventions. At some level this makes it impossible to adhere to our own
280 282 standards at all times. In particular, when subclassing classes that use other
281 283 naming conventions, you must follow their naming conventions. To deal with
282 284 cases like this, we propose the following policy:
283 285
284 286 * If you are subclassing a class that uses different conventions, use its
285 287 naming conventions throughout your subclass. Thus, if you are creating a
286 288 Twisted Protocol class, used Twisted's
287 289 ``namingSchemeForMethodsAndAttributes.``
288 290
289 291 * All IPython's official interfaces should use our conventions. In some cases
290 292 this will mean that you need to provide shadow names (first implement
291 293 ``fooBar`` and then ``foo_bar = fooBar``). We want to avoid this at all
292 294 costs, but it will probably be necessary at times. But, please use this
293 295 sparingly!
294 296
295 297 Implementation-specific *private* methods will use
296 298 ``_single_underscore_prefix``. Names with a leading double underscore will
297 299 *only* be used in special cases, as they makes subclassing difficult (such
298 300 names are not easily seen by child classes).
299 301
300 302 Occasionally some run-in lowercase names are used, but mostly for very short
301 303 names or where we are implementing methods very similar to existing ones in a
302 304 base class (like ``runlines()`` where ``runsource()`` and ``runcode()`` had
303 305 established precedent).
304 306
305 307 The old IPython codebase has a big mix of classes and modules prefixed with an
306 308 explicit ``IP``. In Python this is mostly unnecessary, redundant and frowned
307 309 upon, as namespaces offer cleaner prefixing. The only case where this approach
308 310 is justified is for classes which are expected to be imported into external
309 311 namespaces and a very generic name (like Shell) is too likely to clash with
310 312 something else. We'll need to revisit this issue as we clean up and refactor
311 313 the code, but in general we should remove as many unnecessary ``IP``/``ip``
312 314 prefixes as possible. However, if a prefix seems absolutely necessary the more
313 315 specific ``IPY`` or ``ipy`` are preferred.
314 316
315 317 .. _devel_testing:
316 318
317 319 Testing system
318 320 ==============
319 321
320 322 It is extremely important that all code contributed to IPython has tests.
321 323 Tests should be written as unittests, doctests or as entities that the Nose
322 324 [Nose]_ testing package will find. Regardless of how the tests are written, we
323 325 will use Nose for discovering and running the tests. Nose will be required to
324 326 run the IPython test suite, but will not be required to simply use IPython.
325 327
326 328 Tests of Twisted using code need to follow two additional guidelines:
327 329
328 330 1. Twisted using tests should be written by subclassing the :class:`TestCase`
329 331 class that comes with :mod:`twisted.trial.unittest`.
330 332
331 333 2. All :class:`Deferred` instances that are created in the test must be
332 334 properly chained and the final one *must* be the return value of the test
333 335 method.
334 336
335 337 When these two things are done, Nose will be able to run the tests and the
336 338 twisted reactor will be handled correctly.
337 339
338 340 Each subpackage in IPython should have its own :file:`tests` directory that
339 341 contains all of the tests for that subpackage. This allows each subpackage to
340 342 be self-contained. A good convention to follow is to have a file named
341 343 :file:`test_foo.py` for each module :file:`foo.py` in the package. This makes
342 344 it easy to organize the tests, though like most conventions, it's OK to break
343 345 it if logic and common sense dictate otherwise.
344 346
345 347 If a subpackage has any dependencies beyond the Python standard library, the
346 348 tests for that subpackage should be skipped if the dependencies are not
347 349 found. This is very important so users don't get tests failing simply because
348 350 they don't have dependencies. We ship a set of decorators in the
349 351 :mod:`IPython.testing` package to tag tests that may be platform-specific or
350 352 otherwise may have restrictions; if the existing ones don't fit your needs, add
351 353 a new decorator in that location so other tests can reuse it.
352 354
353 355 To run the IPython test suite, use the :command:`iptest` command that is
354 356 installed with IPython (if you are using IPython in-place, without installing
355 357 it, you can find this script in the :file:`scripts` directory)::
356 358
357 359 $ iptest
358 360
359 361 This command colects all IPython tests into separate groups, and then calls
360 362 either Nose with the proper options and extensions, or Twisted's
361 363 :command:`trial`. This ensures that tests that need the Twisted reactor
362 364 management facilities execute separate of Nose. If any individual test group
363 365 fails, :command:`iptest` will print what you need to type so you can rerun that
364 366 particular test group alone for debugging.
365 367
366 368 By default, :command:`iptest` runs the entire IPython test
367 369 suite (skipping tests that may be platform-specific or which depend on tools
368 370 you may not have). But you can also use it to run only one specific test file,
369 371 or a specific test function. For example, this will run only the
370 372 :file:`test_magic` file from the test suite::
371 373
372 374 $ iptest IPython.tests.test_magic
373 375 ----------------------------------------------------------------------
374 376 Ran 10 tests in 0.348s
375 377
376 378 OK (SKIP=3)
377 379 Deleting object: second_pass
378 380
379 381 while the ``path:function`` syntax allows you to select a specific function in
380 382 that file to run::
381 383
382 384 $ iptest IPython.tests.test_magic:test_obj_del
383 385 ----------------------------------------------------------------------
384 386 Ran 1 test in 0.204s
385 387
386 388 OK
387 389
388 390 Since :command:`iptest` is based on nosetests, you can pass it any regular
389 391 nosetests option. For example, you can use ``--pdb`` or ``--pdb-failures`` to
390 392 automatically activate the interactive Pdb debugger on errors or failures. See
391 393 the nosetests documentation for further details.
392 394
393 395
394 396 A few tips for writing tests
395 397 ----------------------------
396 398
397 399 You can write tests either as normal test files, using all the conventions that
398 400 Nose recognizes, or as doctests. Note that *all* IPython functions should have
399 401 at least one example that serves as a doctest, whenever technically feasible.
400 402 However, example doctests should only be in the main docstring if they are *a
401 403 good example*, i.e. if they convey useful information about the function. If
402 404 you simply would like to write a test as a doctest, put it in a separate test
403 405 file and write a no-op function whose only purpose is its docstring.
404 406
405 407 Note, however, that in a file named :file:`test_X`, functions whose only test
406 408 is their docstring (as a doctest) and which have no test functionality of their
407 409 own, should be called *doctest_foo* instead of *test_foo*, otherwise they get
408 410 double-counted (the empty function call is counted as a test, which just
409 411 inflates tests numbers artificially). This restriction does not apply to
410 412 functions in files with other names, due to how Nose discovers tests.
411 413
412 414 You can use IPython examples in your docstrings. Those can make full use of
413 415 IPython functionality (magics, variable substitution, etc), but be careful to
414 416 keep them generic enough that they run identically on all Operating Systems.
415 417
416 418 The prompts in your doctests can be either of the plain Python ``>>>`` variety
417 419 or ``In [1]:`` IPython style. Since this is the IPython system, after all, we
418 420 encourage you to use IPython prompts throughout, unless you are illustrating a
419 421 specific aspect of the normal prompts (such as the ``%doctest_mode`` magic).
420 422
421 423 If a test isn't safe to run inside the main nose process (e.g. because it loads
422 424 a GUI toolkit), consider running it in a subprocess and capturing its output
423 425 for evaluation and test decision later. Here is an example of how to do it, by
424 426 relying on the builtin ``_ip`` object that contains the public IPython api as
425 427 defined in :mod:`IPython.ipapi`::
426 428
427 429 def test_obj_del():
428 430 """Test that object's __del__ methods are called on exit."""
429 431 test_dir = os.path.dirname(__file__)
430 432 del_file = os.path.join(test_dir,'obj_del.py')
431 433 out = _ip.IP.getoutput('ipython %s' % del_file)
432 434 nt.assert_equals(out,'object A deleted')
433 435
434 436
435 437
436 438 If a doctest contains input whose output you don't want to verify identically
437 439 via doctest (random output, an object id, etc), you can mark a docstring with
438 440 ``#random``. All of these test will have their code executed but no output
439 441 checking will be done::
440 442
441 443 >>> 1+3
442 444 junk goes here... # random
443 445
444 446 >>> 1+2
445 447 again, anything goes #random
446 448 if multiline, the random mark is only needed once.
447 449
448 450 >>> 1+2
449 451 You can also put the random marker at the end:
450 452 # random
451 453
452 454 >>> 1+2
453 455 # random
454 456 .. or at the beginning.
455 457
456 458 In a case where you want an *entire* docstring to be executed but not verified
457 459 (this only serves to check that the code runs without crashing, so it should be
458 460 used very sparingly), you can put ``# all-random`` in the docstring.
459 461
460 462 .. _devel_config:
461 463
462 464 Release checklist
463 465 =================
464 466
465 467 Most of the release process is automated by the :file:`release` script in the
466 468 :file:`tools` directory. This is just a handy reminder for the release manager.
467 469
468 470 #. First, run :file:`build_release`, which does all the file checking and
469 471 building that the real release script will do. This will let you do test
470 472 installations, check that the build procedure runs OK, etc. You may want to
471 473 disable a few things like multi-version RPM building while testing, because
472 474 otherwise the build takes really long.
473 475
474 476 #. Run the release script, which makes the tar.gz, eggs and Win32 .exe
475 477 installer. It posts them to the site and registers the release with PyPI.
476 478
477 479 #. Updating the website with announcements and links to the updated
478 480 changes.txt in html form. Remember to put a short note both on the news
479 481 page of the site and on Launcphad.
480 482
481 483 #. Drafting a short release announcement with i) highlights and ii) a link to
482 484 the html changes.txt.
483 485
484 486 #. Make sure that the released version of the docs is live on the site.
485 487
486 488 #. Celebrate!
487 489
488 490 Porting to 3.0
489 491 ==============
490 492
491 493 There are no definite plans for porting of IPython to python 3. The major
492 494 issue is the dependency on twisted framework for the networking/threading
493 495 stuff. It is possible that it the traditional IPython interactive console
494 496 could be ported more easily since it has no such dependency. Here are a few
495 497 things that will need to be considered when doing such a port especially
496 498 if we want to have a codebase that works directly on both 2.x and 3.x.
497 499
498 500 1. The syntax for exceptions changed (PEP 3110). The old
499 501 `except exc, var` changed to `except exc as var`. At last
500 502 count there was 78 occurences of this usage in the codebase. This
501 503 is a particularly problematic issue, because it's not easy to
502 504 implement it in a 2.5-compatible way.
503 505
504 506 Because it is quite difficult to support simultaneously Python 2.5 and 3.x, we
505 507 will likely at some point put out a release that requires strictly 2.6 and
506 508 abandons 2.5 compatibility. This will then allow us to port the code to using
507 509 :func:`print` as a function, `except exc as var` syntax, etc. But as of
508 510 version 0.11 at least, we will retain Python 2.5 compatibility.
509 511
510 512
511 513 .. [Bazaar] Bazaar. http://bazaar-vcs.org/
512 514 .. [Launchpad] Launchpad. http://www.launchpad.net/ipython
513 515 .. [reStructuredText] reStructuredText. http://docutils.sourceforge.net/rst.html
514 516 .. [Sphinx] Sphinx. http://sphinx.pocoo.org/
515 517 .. [Nose] Nose: a discovery based unittest extension. http://code.google.com/p/python-nose/
@@ -1,94 +1,84 b''
1 1 =============================
2 2 IPython module reorganization
3 3 =============================
4 4
5 5 Currently, IPython has many top-level modules that serve many different
6 6 purposes. The lack of organization make it very difficult for developers to
7 7 work on IPython and understand its design. This document contains notes about
8 8 how we will reorganize the modules into sub-packages.
9 9
10 10 .. warning::
11 11
12 12 This effort will possibly break third party packages that use IPython as
13 13 a library or hack on the IPython internals.
14 14
15 15 .. warning::
16 16
17 17 This effort will result in the removal from IPython of certain modules
18 18 that are not used anymore, don't currently work, are unmaintained, etc.
19 19
20 20
21 21 Current subpackges
22 22 ==================
23 23
24 24 IPython currently has the following sub-packages:
25 25
26 26 * :mod:`IPython.config`
27 27
28 28 * :mod:`IPython.Extensions`
29 29
30 30 * :mod:`IPython.external`
31 31
32 32 * :mod:`IPython.frontend`
33 33
34 34 * :mod:`IPython.gui`
35 35
36 36 * :mod:`IPython.kernel`
37 37
38 38 * :mod:`IPython.testing`
39 39
40 40 * :mod:`IPython.tests`
41 41
42 42 * :mod:`IPython.tools`
43 43
44 44 * :mod:`IPython.UserConfig`
45 45
46 46 New Subpackages to be created
47 47 =============================
48 48
49 49 We propose to create the following new sub-packages:
50 50
51 51 * :mod:`IPython.core`. This sub-package will contain the core of the IPython
52 52 interpreter, but none of its extended capabilities.
53 53
54 54 * :mod:`IPython.lib`. IPython has many extended capabilities that are not part
55 55 of the IPython core. These things will go here.
56 56
57 57 * :mod:`IPython.utils`. This sub-package will contain anything that might
58 58 eventually be found in the Python standard library, like things in
59 59 :mod:`genutils`. Each sub-module in this sub-package should contain
60 60 functions and classes that serve a single purpose.
61 61
62 62 * :mod:`IPython.deathrow`. This is for code that is untested and/or rotting
63 63 and needs to be removed from IPython. Eventually all this code will either
64 64 i) be revived by someone willing to maintain it with tests and docs and
65 65 re-included into IPython or 2) be removed from IPython proper, but put into
66 66 a separate top-level (not IPython) package that we keep around. No new code
67 67 will be allowed here.
68 68
69 69 * :mod:`IPython.quarantine`. This is for code that doesn't meet IPython's
70 70 standards, but that we plan on keeping. To be moved out of this sub-package
71 71 a module needs to have a maintainer, tests and documentation.
72 72
73 73 Procedure
74 74 =========
75 75
76 76 1. Move the file to its new location with its new name.
77 77 2. Rename all import statements to reflect the change.
78 78 3. Run PyFlakes on each changes module.
79 3. Add tests/test_imports.py to test it.
79 4. Add tests/test_imports.py to test it.
80 80
81 81 Status
82 82 ======
83 83
84 The new subpackages have been created and the top-level modules have been
85 moved and renamed. Import tests have been created for all of the moved and
86 renamed modules. The build infrastructure (setup.py and friends) have been
87 updated and tested on Mac and Windows. Finally, a compatibility layer has been
88 added for iplib, ipapi and Shell. The follow things still need to be done::
89
90 * I need to modify iptests to properly skip modules that are no longer top
91 level modules.
92
93 * When running python setup.py sdist, the Sphinx API docs fail to build
94 because of something going on with IPython.core.fakemodule
84 This branch was merged into trunk in early August of 2009.
@@ -1,81 +1,73 b''
1 1 .. _roadmap:
2 2
3 3 ===================
4 4 Development roadmap
5 5 ===================
6 6
7 IPython is an ambitious project that is still under heavy development. However, we want IPython to become useful to as many people as possible, as quickly as possible. To help us accomplish this, we are laying out a roadmap of where we are headed and what needs to happen to get there. Hopefully, this will help the IPython developers figure out the best things to work on for each upcoming release.
7 IPython is an ambitious project that is still under heavy development.
8 However, we want IPython to become useful to as many people as possible, as
9 quickly as possible. To help us accomplish this, we are laying out a roadmap
10 of where we are headed and what needs to happen to get there. Hopefully, this
11 will help the IPython developers figure out the best things to work on for
12 each upcoming release.
8 13
9 14 Work targeted to particular releases
10 15 ====================================
11 16
12 Release 0.10
13 ------------
14
15 * Initial refactor of :command:`ipcluster`.
16
17 * Better TextMate integration.
18
19 * Merge in the daemon branch.
20
21 17 Release 0.11
22 18 ------------
23 19
24 * Refactor the configuration system and command line options for
25 :command:`ipengine` and :command:`ipcontroller`. This will include the
26 creation of cluster directories that encapsulate all the configuration
27 files, log files and security related files for a particular cluster.
20 * [DONE] Full module and package reorganization.
21
22 * [DONE] Removal of the threaded shells and new implementation of GUI support
23 based on ``PyOSInputHook``.
28 24
29 * Refactor :command:`ipcluster` to support the new configuration system.
25 * Refactor the configuration system.
30 26
31 * Refactor the daemon stuff to support the new configuration system.
27 * Prepare to refactor IPython's core by creating a new component and
28 application system.
32 29
33 * Merge back in the core of the notebook.
34 30
35 31 Release 0.12
36 32 ------------
37 33
38 * Fully integrate process startup with the daemons for full process
39 management.
40 34
41 * Make the capabilites of :command:`ipcluster` available from simple Python
42 classes.
43 35
44 36 Major areas of work
45 37 ===================
46 38
47 39 Refactoring the main IPython core
48 40 ---------------------------------
49 41
50 42 Process management for :mod:`IPython.kernel`
51 43 --------------------------------------------
52 44
53 45 Configuration system
54 46 --------------------
55 47
56 48 Performance problems
57 49 --------------------
58 50
59 51 Currently, we have a number of performance issues that are waiting to bite users:
60 52
61 53 * The controller stores a large amount of state in Python dictionaries. Under
62 54 heavy usage, these dicts with get very large, causing memory usage problems.
63 55 We need to develop more scalable solutions to this problem, such as using a
64 56 sqlite database to store this state. This will also help the controller to
65 57 be more fault tolerant.
66 58
67 59 * We currently don't have a good way of handling large objects in the
68 60 controller. The biggest problem is that because we don't have any way of
69 61 streaming objects, we get lots of temporary copies in the low-level buffers.
70 62 We need to implement a better serialization approach and true streaming
71 63 support.
72 64
73 65 * The controller currently unpickles and repickles objects. We need to use the
74 66 [push|pull]_serialized methods instead.
75 67
76 68 * Currently the controller is a bottleneck. The best approach for this is to
77 69 separate the controller itself into multiple processes, one for the core
78 70 controller and one each for the controller interfaces.
79 71
80 72
81 73
@@ -1,1632 +1,1539 b''
1 1 =================
2 2 IPython reference
3 3 =================
4 4
5 5 .. _command_line_options:
6 6
7 7 Command-line usage
8 8 ==================
9 9
10 10 You start IPython with the command::
11 11
12 12 $ ipython [options] files
13 13
14 14 If invoked with no options, it executes all the files listed in sequence
15 15 and drops you into the interpreter while still acknowledging any options
16 16 you may have set in your ipythonrc file. This behavior is different from
17 17 standard Python, which when called as python -i will only execute one
18 18 file and ignore your configuration setup.
19 19
20 20 Please note that some of the configuration options are not available at
21 21 the command line, simply because they are not practical here. Look into
22 22 your ipythonrc configuration file for details on those. This file
23 23 typically installed in the $HOME/.ipython directory. For Windows users,
24 24 $HOME resolves to C:\\Documents and Settings\\YourUserName in most
25 25 instances. In the rest of this text, we will refer to this directory as
26 26 IPYTHONDIR.
27 27
28 .. _Threading options:
29 28
30 29
31 30 Special Threading Options
32 31 -------------------------
33 32
34 The following special options are ONLY valid at the beginning of the
35 command line, and not later. This is because they control the initial-
36 ization of ipython itself, before the normal option-handling mechanism
37 is active.
38
39 -gthread, -qthread, -q4thread, -wthread, -pylab:
40 Only one of these can be given, and it can only be given as
41 the first option passed to IPython (it will have no effect in
42 any other position). They provide threading support for the
43 GTK, Qt (versions 3 and 4) and WXPython toolkits, and for the
44 matplotlib library.
45
46 With any of the first four options, IPython starts running a
47 separate thread for the graphical toolkit's operation, so that
48 you can open and control graphical elements from within an
49 IPython command line, without blocking. All four provide
50 essentially the same functionality, respectively for GTK, Qt3,
51 Qt4 and WXWidgets (via their Python interfaces).
52
53 Note that with -wthread, you can additionally use the
54 -wxversion option to request a specific version of wx to be
55 used. This requires that you have the wxversion Python module
56 installed, which is part of recent wxPython distributions.
57
58 If -pylab is given, IPython loads special support for the mat
59 plotlib library (http://matplotlib.sourceforge.net), allowing
60 interactive usage of any of its backends as defined in the
61 user's ~/.matplotlib/matplotlibrc file. It automatically
62 activates GTK, Qt or WX threading for IPyhton if the choice of
63 matplotlib backend requires it. It also modifies the %run
64 command to correctly execute (without blocking) any
65 matplotlib-based script which calls show() at the end.
66
67 -tk
68 The -g/q/q4/wthread options, and -pylab (if matplotlib is
69 configured to use GTK, Qt3, Qt4 or WX), will normally block Tk
70 graphical interfaces. This means that when either GTK, Qt or WX
71 threading is active, any attempt to open a Tk GUI will result in a
72 dead window, and possibly cause the Python interpreter to crash.
73 An extra option, -tk, is available to address this issue. It can
74 only be given as a second option after any of the above (-gthread,
75 -wthread or -pylab).
76
77 If -tk is given, IPython will try to coordinate Tk threading
78 with GTK, Qt or WX. This is however potentially unreliable, and
79 you will have to test on your platform and Python configuration to
80 determine whether it works for you. Debian users have reported
81 success, apparently due to the fact that Debian builds all of Tcl,
82 Tk, Tkinter and Python with pthreads support. Under other Linux
83 environments (such as Fedora Core 2/3), this option has caused
84 random crashes and lockups of the Python interpreter. Under other
85 operating systems (Mac OSX and Windows), you'll need to try it to
86 find out, since currently no user reports are available.
87
88 There is unfortunately no way for IPython to determine at run time
89 whether -tk will work reliably or not, so you will need to do some
90 experiments before relying on it for regular work.
91
92
33 Previously IPython had command line options for controlling GUI event loop
34 integration (-gthread, -qthread, -q4thread, -wthread, -pylab). As of IPython
35 version 0.11, these have been deprecated. Please see the new ``%gui``
36 magic command or :ref:`this section <gui_support>` for details on the new
37 interface.
93 38
94 39 Regular Options
95 40 ---------------
96 41
97 42 After the above threading options have been given, regular options can
98 43 follow in any order. All options can be abbreviated to their shortest
99 44 non-ambiguous form and are case-sensitive. One or two dashes can be
100 45 used. Some options have an alternate short form, indicated after a ``|``.
101 46
102 47 Most options can also be set from your ipythonrc configuration file. See
103 48 the provided example for more details on what the options do. Options
104 49 given at the command line override the values set in the ipythonrc file.
105 50
106 51 All options with a [no] prepended can be specified in negated form
107 52 (-nooption instead of -option) to turn the feature off.
108 53
109 54 -help print a help message and exit.
110 55
111 56 -pylab
112 this can only be given as the first option passed to IPython
113 (it will have no effect in any other position). It adds
114 special support for the matplotlib library
115 (http://matplotlib.sourceforge.ne), allowing interactive usage
116 of any of its backends as defined in the user's .matplotlibrc
117 file. It automatically activates GTK or WX threading for
118 IPyhton if the choice of matplotlib backend requires it. It
119 also modifies the %run command to correctly execute (without
120 blocking) any matplotlib-based script which calls show() at
121 the end. See `Matplotlib support`_ for more details.
57 Deprecated. See :ref:`Matplotlib support <matplotlib_support>`
58 for more details.
122 59
123 60 -autocall <val>
124 61 Make IPython automatically call any callable object even if you
125 62 didn't type explicit parentheses. For example, 'str 43' becomes
126 63 'str(43)' automatically. The value can be '0' to disable the feature,
127 64 '1' for smart autocall, where it is not applied if there are no more
128 65 arguments on the line, and '2' for full autocall, where all callable
129 66 objects are automatically called (even if no arguments are
130 67 present). The default is '1'.
131 68
132 69 -[no]autoindent
133 70 Turn automatic indentation on/off.
134 71
135 72 -[no]automagic
136 73 make magic commands automatic (without needing their first character
137 74 to be %). Type %magic at the IPython prompt for more information.
138 75
139 76 -[no]autoedit_syntax
140 77 When a syntax error occurs after editing a file, automatically
141 78 open the file to the trouble causing line for convenient
142 79 fixing.
143 80
144 81 -[no]banner Print the initial information banner (default on).
145 82
146 83 -c <command>
147 84 execute the given command string. This is similar to the -c
148 85 option in the normal Python interpreter.
149 86
150 87 -cache_size, cs <n>
151 88 size of the output cache (maximum number of entries to hold in
152 89 memory). The default is 1000, you can change it permanently in your
153 90 config file. Setting it to 0 completely disables the caching system,
154 91 and the minimum value accepted is 20 (if you provide a value less than
155 92 20, it is reset to 0 and a warning is issued) This limit is defined
156 93 because otherwise you'll spend more time re-flushing a too small cache
157 94 than working.
158 95
159 96 -classic, cl
160 97 Gives IPython a similar feel to the classic Python
161 98 prompt.
162 99
163 100 -colors <scheme>
164 101 Color scheme for prompts and exception reporting. Currently
165 102 implemented: NoColor, Linux and LightBG.
166 103
167 104 -[no]color_info
168 105 IPython can display information about objects via a set of functions,
169 106 and optionally can use colors for this, syntax highlighting source
170 107 code and various other elements. However, because this information is
171 108 passed through a pager (like 'less') and many pagers get confused with
172 109 color codes, this option is off by default. You can test it and turn
173 110 it on permanently in your ipythonrc file if it works for you. As a
174 111 reference, the 'less' pager supplied with Mandrake 8.2 works ok, but
175 112 that in RedHat 7.2 doesn't.
176 113
177 114 Test it and turn it on permanently if it works with your
178 115 system. The magic function %color_info allows you to toggle this
179 116 interactively for testing.
180 117
181 118 -[no]debug
182 119 Show information about the loading process. Very useful to pin down
183 120 problems with your configuration files or to get details about
184 121 session restores.
185 122
186 123 -[no]deep_reload:
187 124 IPython can use the deep_reload module which reloads changes in
188 125 modules recursively (it replaces the reload() function, so you don't
189 126 need to change anything to use it). deep_reload() forces a full
190 127 reload of modules whose code may have changed, which the default
191 128 reload() function does not.
192 129
193 130 When deep_reload is off, IPython will use the normal reload(),
194 131 but deep_reload will still be available as dreload(). This
195 132 feature is off by default [which means that you have both
196 133 normal reload() and dreload()].
197 134
198 135 -editor <name>
199 136 Which editor to use with the %edit command. By default,
200 137 IPython will honor your EDITOR environment variable (if not
201 138 set, vi is the Unix default and notepad the Windows one).
202 139 Since this editor is invoked on the fly by IPython and is
203 140 meant for editing small code snippets, you may want to use a
204 141 small, lightweight editor here (in case your default EDITOR is
205 142 something like Emacs).
206 143
207 144 -ipythondir <name>
208 145 name of your IPython configuration directory IPYTHONDIR. This
209 146 can also be specified through the environment variable
210 147 IPYTHONDIR.
211 148
212 149 -log, l
213 150 generate a log file of all input. The file is named
214 151 ipython_log.py in your current directory (which prevents logs
215 152 from multiple IPython sessions from trampling each other). You
216 153 can use this to later restore a session by loading your
217 154 logfile as a file to be executed with option -logplay (see
218 155 below).
219 156
220 157 -logfile, lf <name> specify the name of your logfile.
221 158
222 159 -logplay, lp <name>
223 160
224 161 you can replay a previous log. For restoring a session as close as
225 162 possible to the state you left it in, use this option (don't just run
226 163 the logfile). With -logplay, IPython will try to reconstruct the
227 164 previous working environment in full, not just execute the commands in
228 165 the logfile.
229 166
230 167 When a session is restored, logging is automatically turned on
231 168 again with the name of the logfile it was invoked with (it is
232 169 read from the log header). So once you've turned logging on for
233 170 a session, you can quit IPython and reload it as many times as
234 171 you want and it will continue to log its history and restore
235 172 from the beginning every time.
236 173
237 174 Caveats: there are limitations in this option. The history
238 175 variables _i*,_* and _dh don't get restored properly. In the
239 176 future we will try to implement full session saving by writing
240 177 and retrieving a 'snapshot' of the memory state of IPython. But
241 178 our first attempts failed because of inherent limitations of
242 179 Python's Pickle module, so this may have to wait.
243 180
244 181 -[no]messages
245 182 Print messages which IPython collects about its startup
246 183 process (default on).
247 184
248 185 -[no]pdb
249 186 Automatically call the pdb debugger after every uncaught
250 187 exception. If you are used to debugging using pdb, this puts
251 188 you automatically inside of it after any call (either in
252 189 IPython or in code called by it) which triggers an exception
253 190 which goes uncaught.
254 191
255 192 -pydb
256 193 Makes IPython use the third party "pydb" package as debugger,
257 194 instead of pdb. Requires that pydb is installed.
258 195
259 196 -[no]pprint
260 197 ipython can optionally use the pprint (pretty printer) module
261 198 for displaying results. pprint tends to give a nicer display
262 199 of nested data structures. If you like it, you can turn it on
263 200 permanently in your config file (default off).
264 201
265 202 -profile, p <name>
266 203
267 204 assume that your config file is ipythonrc-<name> or
268 205 ipy_profile_<name>.py (looks in current dir first, then in
269 206 IPYTHONDIR). This is a quick way to keep and load multiple
270 207 config files for different tasks, especially if you use the
271 208 include option of config files. You can keep a basic
272 209 IPYTHONDIR/ipythonrc file and then have other 'profiles' which
273 210 include this one and load extra things for particular
274 211 tasks. For example:
275 212
276 213 1. $HOME/.ipython/ipythonrc : load basic things you always want.
277 214 2. $HOME/.ipython/ipythonrc-math : load (1) and basic math-related modules.
278 215 3. $HOME/.ipython/ipythonrc-numeric : load (1) and Numeric and plotting modules.
279 216
280 217 Since it is possible to create an endless loop by having
281 218 circular file inclusions, IPython will stop if it reaches 15
282 219 recursive inclusions.
283 220
284 221 -prompt_in1, pi1 <string>
285 222
286 223 Specify the string used for input prompts. Note that if you are using
287 224 numbered prompts, the number is represented with a '\#' in the
288 225 string. Don't forget to quote strings with spaces embedded in
289 226 them. Default: 'In [\#]:'. The :ref:`prompts section <prompts>`
290 227 discusses in detail all the available escapes to customize your
291 228 prompts.
292 229
293 230 -prompt_in2, pi2 <string>
294 231 Similar to the previous option, but used for the continuation
295 232 prompts. The special sequence '\D' is similar to '\#', but
296 233 with all digits replaced dots (so you can have your
297 234 continuation prompt aligned with your input prompt). Default:
298 235 ' .\D.:' (note three spaces at the start for alignment with
299 236 'In [\#]').
300 237
301 238 -prompt_out,po <string>
302 239 String used for output prompts, also uses numbers like
303 240 prompt_in1. Default: 'Out[\#]:'
304 241
305 242 -quick start in bare bones mode (no config file loaded).
306 243
307 244 -rcfile <name>
308 245 name of your IPython resource configuration file. Normally
309 246 IPython loads ipythonrc (from current directory) or
310 247 IPYTHONDIR/ipythonrc.
311 248
312 249 If the loading of your config file fails, IPython starts with
313 250 a bare bones configuration (no modules loaded at all).
314 251
315 252 -[no]readline
316 253 use the readline library, which is needed to support name
317 254 completion and command history, among other things. It is
318 255 enabled by default, but may cause problems for users of
319 256 X/Emacs in Python comint or shell buffers.
320 257
321 258 Note that X/Emacs 'eterm' buffers (opened with M-x term) support
322 259 IPython's readline and syntax coloring fine, only 'emacs' (M-x
323 260 shell and C-c !) buffers do not.
324 261
325 262 -screen_length, sl <n>
326 263 number of lines of your screen. This is used to control
327 264 printing of very long strings. Strings longer than this number
328 265 of lines will be sent through a pager instead of directly
329 266 printed.
330 267
331 268 The default value for this is 0, which means IPython will
332 269 auto-detect your screen size every time it needs to print certain
333 270 potentially long strings (this doesn't change the behavior of the
334 271 'print' keyword, it's only triggered internally). If for some
335 272 reason this isn't working well (it needs curses support), specify
336 273 it yourself. Otherwise don't change the default.
337 274
338 275 -separate_in, si <string>
339 276
340 277 separator before input prompts.
341 278 Default: '\n'
342 279
343 280 -separate_out, so <string>
344 281 separator before output prompts.
345 282 Default: nothing.
346 283
347 284 -separate_out2, so2
348 285 separator after output prompts.
349 286 Default: nothing.
350 287 For these three options, use the value 0 to specify no separator.
351 288
352 289 -nosep
353 290 shorthand for '-SeparateIn 0 -SeparateOut 0 -SeparateOut2
354 291 0'. Simply removes all input/output separators.
355 292
356 293 -upgrade
357 294 allows you to upgrade your IPYTHONDIR configuration when you
358 295 install a new version of IPython. Since new versions may
359 296 include new command line options or example files, this copies
360 297 updated ipythonrc-type files. However, it backs up (with a
361 298 .old extension) all files which it overwrites so that you can
362 299 merge back any customizations you might have in your personal
363 300 files. Note that you should probably use %upgrade instead,
364 301 it's a safer alternative.
365 302
366 303
367 304 -Version print version information and exit.
368 305
369 306 -wxversion <string>
370 Select a specific version of wxPython (used in conjunction
371 with -wthread). Requires the wxversion module, part of recent
372 wxPython distributions
307 Deprecated.
373 308
374 309 -xmode <modename>
375 310
376 311 Mode for exception reporting.
377 312
378 313 Valid modes: Plain, Context and Verbose.
379 314
380 315 * Plain: similar to python's normal traceback printing.
381 316 * Context: prints 5 lines of context source code around each
382 317 line in the traceback.
383 318 * Verbose: similar to Context, but additionally prints the
384 319 variables currently visible where the exception happened
385 320 (shortening their strings if too long). This can potentially be
386 321 very slow, if you happen to have a huge data structure whose
387 322 string representation is complex to compute. Your computer may
388 323 appear to freeze for a while with cpu usage at 100%. If this
389 324 occurs, you can cancel the traceback with Ctrl-C (maybe hitting it
390 325 more than once).
391 326
392 327 Interactive use
393 328 ===============
394 329
395 330 Warning: IPython relies on the existence of a global variable called
396 331 _ip which controls the shell itself. If you redefine _ip to anything,
397 332 bizarre behavior will quickly occur.
398 333
399 334 Other than the above warning, IPython is meant to work as a drop-in
400 335 replacement for the standard interactive interpreter. As such, any code
401 336 which is valid python should execute normally under IPython (cases where
402 337 this is not true should be reported as bugs). It does, however, offer
403 338 many features which are not available at a standard python prompt. What
404 339 follows is a list of these.
405 340
406 341
407 342 Caution for Windows users
408 343 -------------------------
409 344
410 345 Windows, unfortunately, uses the '\' character as a path
411 346 separator. This is a terrible choice, because '\' also represents the
412 347 escape character in most modern programming languages, including
413 348 Python. For this reason, using '/' character is recommended if you
414 349 have problems with ``\``. However, in Windows commands '/' flags
415 350 options, so you can not use it for the root directory. This means that
416 351 paths beginning at the root must be typed in a contrived manner like:
417 352 ``%copy \opt/foo/bar.txt \tmp``
418 353
419 354 .. _magic:
420 355
421 356 Magic command system
422 357 --------------------
423 358
424 359 IPython will treat any line whose first character is a % as a special
425 360 call to a 'magic' function. These allow you to control the behavior of
426 361 IPython itself, plus a lot of system-type features. They are all
427 362 prefixed with a % character, but parameters are given without
428 363 parentheses or quotes.
429 364
430 365 Example: typing '%cd mydir' (without the quotes) changes you working
431 366 directory to 'mydir', if it exists.
432 367
433 368 If you have 'automagic' enabled (in your ipythonrc file, via the command
434 369 line option -automagic or with the %automagic function), you don't need
435 370 to type in the % explicitly. IPython will scan its internal list of
436 371 magic functions and call one if it exists. With automagic on you can
437 372 then just type 'cd mydir' to go to directory 'mydir'. The automagic
438 373 system has the lowest possible precedence in name searches, so defining
439 374 an identifier with the same name as an existing magic function will
440 375 shadow it for automagic use. You can still access the shadowed magic
441 376 function by explicitly using the % character at the beginning of the line.
442 377
443 378 An example (with automagic on) should clarify all this::
444 379
445 380 In [1]: cd ipython # %cd is called by automagic
446 381
447 382 /home/fperez/ipython
448 383
449 384 In [2]: cd=1 # now cd is just a variable
450 385
451 386 In [3]: cd .. # and doesn't work as a function anymore
452 387
453 388 ------------------------------
454 389
455 390 File "<console>", line 1
456 391
457 392 cd ..
458 393
459 394 ^
460 395
461 396 SyntaxError: invalid syntax
462 397
463 398 In [4]: %cd .. # but %cd always works
464 399
465 400 /home/fperez
466 401
467 402 In [5]: del cd # if you remove the cd variable
468 403
469 404 In [6]: cd ipython # automagic can work again
470 405
471 406 /home/fperez/ipython
472 407
473 408 You can define your own magic functions to extend the system. The
474 409 following example defines a new magic command, %impall::
475 410
476 411 import IPython.ipapi
477 412
478 413 ip = IPython.ipapi.get()
479 414
480 415 def doimp(self, arg):
481 416
482 417 ip = self.api
483 418
484 419 ip.ex("import %s; reload(%s); from %s import *" % (
485 420
486 421 arg,arg,arg)
487 422
488 423 )
489 424
490 425 ip.expose_magic('impall', doimp)
491 426
492 427 You can also define your own aliased names for magic functions. In your
493 428 ipythonrc file, placing a line like::
494 429
495 430 execute __IP.magic_cl = __IP.magic_clear
496 431
497 432 will define %cl as a new name for %clear.
498 433
499 434 Type %magic for more information, including a list of all available
500 435 magic functions at any time and their docstrings. You can also type
501 436 %magic_function_name? (see sec. 6.4 <#sec:dyn-object-info> for
502 437 information on the '?' system) to get information about any particular
503 438 magic function you are interested in.
504 439
505 440 The API documentation for the :mod:`IPython.Magic` module contains the full
506 441 docstrings of all currently available magic commands.
507 442
508 443
509 444 Access to the standard Python help
510 445 ----------------------------------
511 446
512 447 As of Python 2.1, a help system is available with access to object docstrings
513 448 and the Python manuals. Simply type 'help' (no quotes) to access it. You can
514 449 also type help(object) to obtain information about a given object, and
515 450 help('keyword') for information on a keyword. As noted :ref:`here
516 451 <accessing_help>`, you need to properly configure your environment variable
517 452 PYTHONDOCS for this feature to work correctly.
518 453
519 454 .. _dynamic_object_info:
520 455
521 456 Dynamic object information
522 457 --------------------------
523 458
524 459 Typing ?word or word? prints detailed information about an object. If
525 460 certain strings in the object are too long (docstrings, code, etc.) they
526 461 get snipped in the center for brevity. This system gives access variable
527 462 types and values, full source code for any object (if available),
528 463 function prototypes and other useful information.
529 464
530 465 Typing ??word or word?? gives access to the full information without
531 466 snipping long strings. Long strings are sent to the screen through the
532 467 less pager if longer than the screen and printed otherwise. On systems
533 468 lacking the less command, IPython uses a very basic internal pager.
534 469
535 470 The following magic functions are particularly useful for gathering
536 471 information about your working environment. You can get more details by
537 472 typing %magic or querying them individually (use %function_name? with or
538 473 without the %), this is just a summary:
539 474
540 475 * **%pdoc <object>**: Print (or run through a pager if too long) the
541 476 docstring for an object. If the given object is a class, it will
542 477 print both the class and the constructor docstrings.
543 478 * **%pdef <object>**: Print the definition header for any callable
544 479 object. If the object is a class, print the constructor information.
545 480 * **%psource <object>**: Print (or run through a pager if too long)
546 481 the source code for an object.
547 482 * **%pfile <object>**: Show the entire source file where an object was
548 483 defined via a pager, opening it at the line where the object
549 484 definition begins.
550 485 * **%who/%whos**: These functions give information about identifiers
551 486 you have defined interactively (not things you loaded or defined
552 487 in your configuration files). %who just prints a list of
553 488 identifiers and %whos prints a table with some basic details about
554 489 each identifier.
555 490
556 491 Note that the dynamic object information functions (?/??, %pdoc, %pfile,
557 492 %pdef, %psource) give you access to documentation even on things which
558 493 are not really defined as separate identifiers. Try for example typing
559 494 {}.get? or after doing import os, type os.path.abspath??.
560 495
561 496
562 497 .. _readline:
563 498
564 499 Readline-based features
565 500 -----------------------
566 501
567 502 These features require the GNU readline library, so they won't work if
568 503 your Python installation lacks readline support. We will first describe
569 504 the default behavior IPython uses, and then how to change it to suit
570 505 your preferences.
571 506
572 507
573 508 Command line completion
574 509 +++++++++++++++++++++++
575 510
576 511 At any time, hitting TAB will complete any available python commands or
577 512 variable names, and show you a list of the possible completions if
578 513 there's no unambiguous one. It will also complete filenames in the
579 514 current directory if no python names match what you've typed so far.
580 515
581 516
582 517 Search command history
583 518 ++++++++++++++++++++++
584 519
585 520 IPython provides two ways for searching through previous input and thus
586 521 reduce the need for repetitive typing:
587 522
588 523 1. Start typing, and then use Ctrl-p (previous,up) and Ctrl-n
589 524 (next,down) to search through only the history items that match
590 525 what you've typed so far. If you use Ctrl-p/Ctrl-n at a blank
591 526 prompt, they just behave like normal arrow keys.
592 527 2. Hit Ctrl-r: opens a search prompt. Begin typing and the system
593 528 searches your history for lines that contain what you've typed so
594 529 far, completing as much as it can.
595 530
596 531
597 532 Persistent command history across sessions
598 533 ++++++++++++++++++++++++++++++++++++++++++
599 534
600 535 IPython will save your input history when it leaves and reload it next
601 536 time you restart it. By default, the history file is named
602 537 $IPYTHONDIR/history, but if you've loaded a named profile,
603 538 '-PROFILE_NAME' is appended to the name. This allows you to keep
604 539 separate histories related to various tasks: commands related to
605 540 numerical work will not be clobbered by a system shell history, for
606 541 example.
607 542
608 543
609 544 Autoindent
610 545 ++++++++++
611 546
612 547 IPython can recognize lines ending in ':' and indent the next line,
613 548 while also un-indenting automatically after 'raise' or 'return'.
614 549
615 550 This feature uses the readline library, so it will honor your ~/.inputrc
616 551 configuration (or whatever file your INPUTRC variable points to). Adding
617 552 the following lines to your .inputrc file can make indenting/unindenting
618 553 more convenient (M-i indents, M-u unindents)::
619 554
620 555 $if Python
621 556 "\M-i": " "
622 557 "\M-u": "\d\d\d\d"
623 558 $endif
624 559
625 560 Note that there are 4 spaces between the quote marks after "M-i" above.
626 561
627 562 Warning: this feature is ON by default, but it can cause problems with
628 563 the pasting of multi-line indented code (the pasted code gets
629 564 re-indented on each line). A magic function %autoindent allows you to
630 565 toggle it on/off at runtime. You can also disable it permanently on in
631 566 your ipythonrc file (set autoindent 0).
632 567
633 568
634 569 Customizing readline behavior
635 570 +++++++++++++++++++++++++++++
636 571
637 572 All these features are based on the GNU readline library, which has an
638 573 extremely customizable interface. Normally, readline is configured via a
639 574 file which defines the behavior of the library; the details of the
640 575 syntax for this can be found in the readline documentation available
641 576 with your system or on the Internet. IPython doesn't read this file (if
642 577 it exists) directly, but it does support passing to readline valid
643 578 options via a simple interface. In brief, you can customize readline by
644 579 setting the following options in your ipythonrc configuration file (note
645 580 that these options can not be specified at the command line):
646 581
647 582 * **readline_parse_and_bind**: this option can appear as many times as
648 583 you want, each time defining a string to be executed via a
649 584 readline.parse_and_bind() command. The syntax for valid commands
650 585 of this kind can be found by reading the documentation for the GNU
651 586 readline library, as these commands are of the kind which readline
652 587 accepts in its configuration file.
653 588 * **readline_remove_delims**: a string of characters to be removed
654 589 from the default word-delimiters list used by readline, so that
655 590 completions may be performed on strings which contain them. Do not
656 591 change the default value unless you know what you're doing.
657 592 * **readline_omit__names**: when tab-completion is enabled, hitting
658 593 <tab> after a '.' in a name will complete all attributes of an
659 594 object, including all the special methods whose names include
660 595 double underscores (like __getitem__ or __class__). If you'd
661 596 rather not see these names by default, you can set this option to
662 597 1. Note that even when this option is set, you can still see those
663 598 names by explicitly typing a _ after the period and hitting <tab>:
664 599 'name._<tab>' will always complete attribute names starting with '_'.
665 600
666 601 This option is off by default so that new users see all
667 602 attributes of any objects they are dealing with.
668 603
669 604 You will find the default values along with a corresponding detailed
670 605 explanation in your ipythonrc file.
671 606
672 607
673 608 Session logging and restoring
674 609 -----------------------------
675 610
676 611 You can log all input from a session either by starting IPython with the
677 612 command line switches -log or -logfile (see :ref:`here <command_line_options>`)
678 613 or by activating the logging at any moment with the magic function %logstart.
679 614
680 615 Log files can later be reloaded with the -logplay option and IPython
681 616 will attempt to 'replay' the log by executing all the lines in it, thus
682 617 restoring the state of a previous session. This feature is not quite
683 618 perfect, but can still be useful in many cases.
684 619
685 620 The log files can also be used as a way to have a permanent record of
686 621 any code you wrote while experimenting. Log files are regular text files
687 622 which you can later open in your favorite text editor to extract code or
688 623 to 'clean them up' before using them to replay a session.
689 624
690 625 The %logstart function for activating logging in mid-session is used as
691 626 follows:
692 627
693 628 %logstart [log_name [log_mode]]
694 629
695 630 If no name is given, it defaults to a file named 'log' in your
696 631 IPYTHONDIR directory, in 'rotate' mode (see below).
697 632
698 633 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
699 634 history up to that point and then continues logging.
700 635
701 636 %logstart takes a second optional parameter: logging mode. This can be
702 637 one of (note that the modes are given unquoted):
703 638
704 639 * [over:] overwrite existing log_name.
705 640 * [backup:] rename (if exists) to log_name~ and start log_name.
706 641 * [append:] well, that says it.
707 642 * [rotate:] create rotating logs log_name.1~, log_name.2~, etc.
708 643
709 644 The %logoff and %logon functions allow you to temporarily stop and
710 645 resume logging to a file which had previously been started with
711 646 %logstart. They will fail (with an explanation) if you try to use them
712 647 before logging has been started.
713 648
714 649 .. _system_shell_access:
715 650
716 651 System shell access
717 652 -------------------
718 653
719 654 Any input line beginning with a ! character is passed verbatim (minus
720 655 the !, of course) to the underlying operating system. For example,
721 656 typing !ls will run 'ls' in the current directory.
722 657
723 658 Manual capture of command output
724 659 --------------------------------
725 660
726 661 If the input line begins with two exclamation marks, !!, the command is
727 662 executed but its output is captured and returned as a python list, split
728 663 on newlines. Any output sent by the subprocess to standard error is
729 664 printed separately, so that the resulting list only captures standard
730 665 output. The !! syntax is a shorthand for the %sx magic command.
731 666
732 667 Finally, the %sc magic (short for 'shell capture') is similar to %sx,
733 668 but allowing more fine-grained control of the capture details, and
734 669 storing the result directly into a named variable. The direct use of
735 670 %sc is now deprecated, and you should ise the ``var = !cmd`` syntax
736 671 instead.
737 672
738 673 IPython also allows you to expand the value of python variables when
739 674 making system calls. Any python variable or expression which you prepend
740 675 with $ will get expanded before the system call is made::
741 676
742 677 In [1]: pyvar='Hello world'
743 678 In [2]: !echo "A python variable: $pyvar"
744 679 A python variable: Hello world
745 680
746 681 If you want the shell to actually see a literal $, you need to type it
747 682 twice::
748 683
749 684 In [3]: !echo "A system variable: $$HOME"
750 685 A system variable: /home/fperez
751 686
752 687 You can pass arbitrary expressions, though you'll need to delimit them
753 688 with {} if there is ambiguity as to the extent of the expression::
754 689
755 690 In [5]: x=10
756 691 In [6]: y=20
757 692 In [13]: !echo $x+y
758 693 10+y
759 694 In [7]: !echo ${x+y}
760 695 30
761 696
762 697 Even object attributes can be expanded::
763 698
764 699 In [12]: !echo $sys.argv
765 700 [/home/fperez/usr/bin/ipython]
766 701
767 702
768 703 System command aliases
769 704 ----------------------
770 705
771 706 The %alias magic function and the alias option in the ipythonrc
772 707 configuration file allow you to define magic functions which are in fact
773 708 system shell commands. These aliases can have parameters.
774 709
775 710 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
776 711
777 712 Then, typing '%alias_name params' will execute the system command 'cmd
778 713 params' (from your underlying operating system).
779 714
780 715 You can also define aliases with parameters using %s specifiers (one per
781 716 parameter). The following example defines the %parts function as an
782 717 alias to the command 'echo first %s second %s' where each %s will be
783 718 replaced by a positional parameter to the call to %parts::
784 719
785 720 In [1]: alias parts echo first %s second %s
786 721 In [2]: %parts A B
787 722 first A second B
788 723 In [3]: %parts A
789 724 Incorrect number of arguments: 2 expected.
790 725 parts is an alias to: 'echo first %s second %s'
791 726
792 727 If called with no parameters, %alias prints the table of currently
793 728 defined aliases.
794 729
795 730 The %rehash/rehashx magics allow you to load your entire $PATH as
796 731 ipython aliases. See their respective docstrings (or sec. 6.2
797 732 <#sec:magic> for further details).
798 733
799 734
800 735 .. _dreload:
801 736
802 737 Recursive reload
803 738 ----------------
804 739
805 740 The dreload function does a recursive reload of a module: changes made
806 741 to the module since you imported will actually be available without
807 742 having to exit.
808 743
809 744
810 745 Verbose and colored exception traceback printouts
811 746 -------------------------------------------------
812 747
813 748 IPython provides the option to see very detailed exception tracebacks,
814 749 which can be especially useful when debugging large programs. You can
815 750 run any Python file with the %run function to benefit from these
816 751 detailed tracebacks. Furthermore, both normal and verbose tracebacks can
817 752 be colored (if your terminal supports it) which makes them much easier
818 753 to parse visually.
819 754
820 755 See the magic xmode and colors functions for details (just type %magic).
821 756
822 757 These features are basically a terminal version of Ka-Ping Yee's cgitb
823 758 module, now part of the standard Python library.
824 759
825 760
826 761 .. _input_caching:
827 762
828 763 Input caching system
829 764 --------------------
830 765
831 766 IPython offers numbered prompts (In/Out) with input and output caching
832 767 (also referred to as 'input history'). All input is saved and can be
833 768 retrieved as variables (besides the usual arrow key recall), in
834 769 addition to the %rep magic command that brings a history entry
835 770 up for editing on the next command line.
836 771
837 772 The following GLOBAL variables always exist (so don't overwrite them!):
838 773 _i: stores previous input. _ii: next previous. _iii: next-next previous.
839 774 _ih : a list of all input _ih[n] is the input from line n and this list
840 775 is aliased to the global variable In. If you overwrite In with a
841 776 variable of your own, you can remake the assignment to the internal list
842 777 with a simple 'In=_ih'.
843 778
844 779 Additionally, global variables named _i<n> are dynamically created (<n>
845 780 being the prompt counter), such that
846 781 _i<n> == _ih[<n>] == In[<n>].
847 782
848 783 For example, what you typed at prompt 14 is available as _i14, _ih[14]
849 784 and In[14].
850 785
851 786 This allows you to easily cut and paste multi line interactive prompts
852 787 by printing them out: they print like a clean string, without prompt
853 788 characters. You can also manipulate them like regular variables (they
854 789 are strings), modify or exec them (typing 'exec _i9' will re-execute the
855 790 contents of input prompt 9, 'exec In[9:14]+In[18]' will re-execute lines
856 791 9 through 13 and line 18).
857 792
858 793 You can also re-execute multiple lines of input easily by using the
859 794 magic %macro function (which automates the process and allows
860 795 re-execution without having to type 'exec' every time). The macro system
861 796 also allows you to re-execute previous lines which include magic
862 797 function calls (which require special processing). Type %macro? or see
863 798 sec. 6.2 <#sec:magic> for more details on the macro system.
864 799
865 800 A history function %hist allows you to see any part of your input
866 801 history by printing a range of the _i variables.
867 802
868 803 You can also search ('grep') through your history by typing
869 804 '%hist -g somestring'. This also searches through the so called *shadow history*,
870 805 which remembers all the commands (apart from multiline code blocks)
871 806 you have ever entered. Handy for searching for svn/bzr URL's, IP adrresses
872 807 etc. You can bring shadow history entries listed by '%hist -g' up for editing
873 808 (or re-execution by just pressing ENTER) with %rep command. Shadow history
874 809 entries are not available as _iNUMBER variables, and they are identified by
875 810 the '0' prefix in %hist -g output. That is, history entry 12 is a normal
876 811 history entry, but 0231 is a shadow history entry.
877 812
878 813 Shadow history was added because the readline history is inherently very
879 814 unsafe - if you have multiple IPython sessions open, the last session
880 815 to close will overwrite the history of previountly closed session. Likewise,
881 816 if a crash occurs, history is never saved, whereas shadow history entries
882 817 are added after entering every command (so a command executed
883 818 in another IPython session is immediately available in other IPython
884 819 sessions that are open).
885 820
886 821 To conserve space, a command can exist in shadow history only once - it doesn't
887 822 make sense to store a common line like "cd .." a thousand times. The idea is
888 823 mainly to provide a reliable place where valuable, hard-to-remember commands can
889 824 always be retrieved, as opposed to providing an exact sequence of commands
890 825 you have entered in actual order.
891 826
892 827 Because shadow history has all the commands you have ever executed,
893 828 time taken by %hist -g will increase oven time. If it ever starts to take
894 829 too long (or it ends up containing sensitive information like passwords),
895 830 clear the shadow history by `%clear shadow_nuke`.
896 831
897 832 Time taken to add entries to shadow history should be negligible, but
898 833 in any case, if you start noticing performance degradation after using
899 834 IPython for a long time (or running a script that floods the shadow history!),
900 835 you can 'compress' the shadow history by executing
901 836 `%clear shadow_compress`. In practice, this should never be necessary
902 837 in normal use.
903 838
904 839 .. _output_caching:
905 840
906 841 Output caching system
907 842 ---------------------
908 843
909 844 For output that is returned from actions, a system similar to the input
910 845 cache exists but using _ instead of _i. Only actions that produce a
911 846 result (NOT assignments, for example) are cached. If you are familiar
912 847 with Mathematica, IPython's _ variables behave exactly like
913 848 Mathematica's % variables.
914 849
915 850 The following GLOBAL variables always exist (so don't overwrite them!):
916 851
917 852 * [_] (a single underscore) : stores previous output, like Python's
918 853 default interpreter.
919 854 * [__] (two underscores): next previous.
920 855 * [___] (three underscores): next-next previous.
921 856
922 857 Additionally, global variables named _<n> are dynamically created (<n>
923 858 being the prompt counter), such that the result of output <n> is always
924 859 available as _<n> (don't use the angle brackets, just the number, e.g.
925 860 _21).
926 861
927 862 These global variables are all stored in a global dictionary (not a
928 863 list, since it only has entries for lines which returned a result)
929 864 available under the names _oh and Out (similar to _ih and In). So the
930 865 output from line 12 can be obtained as _12, Out[12] or _oh[12]. If you
931 866 accidentally overwrite the Out variable you can recover it by typing
932 867 'Out=_oh' at the prompt.
933 868
934 869 This system obviously can potentially put heavy memory demands on your
935 870 system, since it prevents Python's garbage collector from removing any
936 871 previously computed results. You can control how many results are kept
937 872 in memory with the option (at the command line or in your ipythonrc
938 873 file) cache_size. If you set it to 0, the whole system is completely
939 874 disabled and the prompts revert to the classic '>>>' of normal Python.
940 875
941 876
942 877 Directory history
943 878 -----------------
944 879
945 880 Your history of visited directories is kept in the global list _dh, and
946 881 the magic %cd command can be used to go to any entry in that list. The
947 882 %dhist command allows you to view this history. Do ``cd -<TAB`` to
948 883 conventiently view the directory history.
949 884
950 885
951 886 Automatic parentheses and quotes
952 887 --------------------------------
953 888
954 889 These features were adapted from Nathan Gray's LazyPython. They are
955 890 meant to allow less typing for common situations.
956 891
957 892
958 893 Automatic parentheses
959 894 ---------------------
960 895
961 896 Callable objects (i.e. functions, methods, etc) can be invoked like this
962 897 (notice the commas between the arguments)::
963 898
964 899 >>> callable_ob arg1, arg2, arg3
965 900
966 901 and the input will be translated to this::
967 902
968 903 -> callable_ob(arg1, arg2, arg3)
969 904
970 905 You can force automatic parentheses by using '/' as the first character
971 906 of a line. For example::
972 907
973 908 >>> /globals # becomes 'globals()'
974 909
975 910 Note that the '/' MUST be the first character on the line! This won't work::
976 911
977 912 >>> print /globals # syntax error
978 913
979 914 In most cases the automatic algorithm should work, so you should rarely
980 915 need to explicitly invoke /. One notable exception is if you are trying
981 916 to call a function with a list of tuples as arguments (the parenthesis
982 917 will confuse IPython)::
983 918
984 919 In [1]: zip (1,2,3),(4,5,6) # won't work
985 920
986 921 but this will work::
987 922
988 923 In [2]: /zip (1,2,3),(4,5,6)
989 924 ---> zip ((1,2,3),(4,5,6))
990 925 Out[2]= [(1, 4), (2, 5), (3, 6)]
991 926
992 927 IPython tells you that it has altered your command line by displaying
993 928 the new command line preceded by ->. e.g.::
994 929
995 930 In [18]: callable list
996 931 ----> callable (list)
997 932
998 933
999 934 Automatic quoting
1000 935 -----------------
1001 936
1002 937 You can force automatic quoting of a function's arguments by using ','
1003 938 or ';' as the first character of a line. For example::
1004 939
1005 940 >>> ,my_function /home/me # becomes my_function("/home/me")
1006 941
1007 942 If you use ';' instead, the whole argument is quoted as a single string
1008 943 (while ',' splits on whitespace)::
1009 944
1010 945 >>> ,my_function a b c # becomes my_function("a","b","c")
1011 946
1012 947 >>> ;my_function a b c # becomes my_function("a b c")
1013 948
1014 949 Note that the ',' or ';' MUST be the first character on the line! This
1015 950 won't work::
1016 951
1017 952 >>> x = ,my_function /home/me # syntax error
1018 953
1019 954 IPython as your default Python environment
1020 955 ==========================================
1021 956
1022 957 Python honors the environment variable PYTHONSTARTUP and will execute at
1023 958 startup the file referenced by this variable. If you put at the end of
1024 959 this file the following two lines of code::
1025 960
1026 961 import IPython
1027 962 IPython.Shell.IPShell().mainloop(sys_exit=1)
1028 963
1029 964 then IPython will be your working environment anytime you start Python.
1030 965 The sys_exit=1 is needed to have IPython issue a call to sys.exit() when
1031 966 it finishes, otherwise you'll be back at the normal Python '>>>'
1032 967 prompt.
1033 968
1034 969 This is probably useful to developers who manage multiple Python
1035 970 versions and don't want to have correspondingly multiple IPython
1036 971 versions. Note that in this mode, there is no way to pass IPython any
1037 972 command-line options, as those are trapped first by Python itself.
1038 973
1039 974 .. _Embedding:
1040 975
1041 976 Embedding IPython
1042 977 =================
1043 978
1044 979 It is possible to start an IPython instance inside your own Python
1045 980 programs. This allows you to evaluate dynamically the state of your
1046 981 code, operate with your variables, analyze them, etc. Note however that
1047 982 any changes you make to values while in the shell do not propagate back
1048 983 to the running code, so it is safe to modify your values because you
1049 984 won't break your code in bizarre ways by doing so.
1050 985
1051 986 This feature allows you to easily have a fully functional python
1052 987 environment for doing object introspection anywhere in your code with a
1053 988 simple function call. In some cases a simple print statement is enough,
1054 989 but if you need to do more detailed analysis of a code fragment this
1055 990 feature can be very valuable.
1056 991
1057 992 It can also be useful in scientific computing situations where it is
1058 993 common to need to do some automatic, computationally intensive part and
1059 994 then stop to look at data, plots, etc.
1060 995 Opening an IPython instance will give you full access to your data and
1061 996 functions, and you can resume program execution once you are done with
1062 997 the interactive part (perhaps to stop again later, as many times as
1063 998 needed).
1064 999
1065 1000 The following code snippet is the bare minimum you need to include in
1066 1001 your Python programs for this to work (detailed examples follow later)::
1067 1002
1068 1003 from IPython.Shell import IPShellEmbed
1069 1004
1070 1005 ipshell = IPShellEmbed()
1071 1006
1072 1007 ipshell() # this call anywhere in your program will start IPython
1073 1008
1074 1009 You can run embedded instances even in code which is itself being run at
1075 1010 the IPython interactive prompt with '%run <filename>'. Since it's easy
1076 1011 to get lost as to where you are (in your top-level IPython or in your
1077 1012 embedded one), it's a good idea in such cases to set the in/out prompts
1078 1013 to something different for the embedded instances. The code examples
1079 1014 below illustrate this.
1080 1015
1081 1016 You can also have multiple IPython instances in your program and open
1082 1017 them separately, for example with different options for data
1083 1018 presentation. If you close and open the same instance multiple times,
1084 1019 its prompt counters simply continue from each execution to the next.
1085 1020
1086 1021 Please look at the docstrings in the Shell.py module for more details on
1087 1022 the use of this system.
1088 1023
1089 1024 The following sample file illustrating how to use the embedding
1090 1025 functionality is provided in the examples directory as example-embed.py.
1091 1026 It should be fairly self-explanatory::
1092 1027
1093 1028
1094 1029 #!/usr/bin/env python
1095 1030
1096 1031 """An example of how to embed an IPython shell into a running program.
1097 1032
1098 1033 Please see the documentation in the IPython.Shell module for more details.
1099 1034
1100 1035 The accompanying file example-embed-short.py has quick code fragments for
1101 1036 embedding which you can cut and paste in your code once you understand how
1102 1037 things work.
1103 1038
1104 1039 The code in this file is deliberately extra-verbose, meant for learning."""
1105 1040
1106 1041 # The basics to get you going:
1107 1042
1108 1043 # IPython sets the __IPYTHON__ variable so you can know if you have nested
1109 1044 # copies running.
1110 1045
1111 1046 # Try running this code both at the command line and from inside IPython (with
1112 1047 # %run example-embed.py)
1113 1048 try:
1114 1049 __IPYTHON__
1115 1050 except NameError:
1116 1051 nested = 0
1117 1052 args = ['']
1118 1053 else:
1119 1054 print "Running nested copies of IPython."
1120 1055 print "The prompts for the nested copy have been modified"
1121 1056 nested = 1
1122 1057 # what the embedded instance will see as sys.argv:
1123 1058 args = ['-pi1','In <\\#>: ','-pi2',' .\\D.: ',
1124 1059 '-po','Out<\\#>: ','-nosep']
1125 1060
1126 1061 # First import the embeddable shell class
1127 1062 from IPython.Shell import IPShellEmbed
1128 1063
1129 1064 # Now create an instance of the embeddable shell. The first argument is a
1130 1065 # string with options exactly as you would type them if you were starting
1131 1066 # IPython at the system command line. Any parameters you want to define for
1132 1067 # configuration can thus be specified here.
1133 1068 ipshell = IPShellEmbed(args,
1134 1069 banner = 'Dropping into IPython',
1135 1070 exit_msg = 'Leaving Interpreter, back to program.')
1136 1071
1137 1072 # Make a second instance, you can have as many as you want.
1138 1073 if nested:
1139 1074 args[1] = 'In2<\\#>'
1140 1075 else:
1141 1076 args = ['-pi1','In2<\\#>: ','-pi2',' .\\D.: ',
1142 1077 '-po','Out<\\#>: ','-nosep']
1143 1078 ipshell2 = IPShellEmbed(args,banner = 'Second IPython instance.')
1144 1079
1145 1080 print '\nHello. This is printed from the main controller program.\n'
1146 1081
1147 1082 # You can then call ipshell() anywhere you need it (with an optional
1148 1083 # message):
1149 1084 ipshell('***Called from top level. '
1150 1085 'Hit Ctrl-D to exit interpreter and continue program.\n'
1151 1086 'Note that if you use %kill_embedded, you can fully deactivate\n'
1152 1087 'This embedded instance so it will never turn on again')
1153 1088
1154 1089 print '\nBack in caller program, moving along...\n'
1155 1090
1156 1091 #---------------------------------------------------------------------------
1157 1092 # More details:
1158 1093
1159 1094 # IPShellEmbed instances don't print the standard system banner and
1160 1095 # messages. The IPython banner (which actually may contain initialization
1161 1096 # messages) is available as <instance>.IP.BANNER in case you want it.
1162 1097
1163 1098 # IPShellEmbed instances print the following information everytime they
1164 1099 # start:
1165 1100
1166 1101 # - A global startup banner.
1167 1102
1168 1103 # - A call-specific header string, which you can use to indicate where in the
1169 1104 # execution flow the shell is starting.
1170 1105
1171 1106 # They also print an exit message every time they exit.
1172 1107
1173 1108 # Both the startup banner and the exit message default to None, and can be set
1174 1109 # either at the instance constructor or at any other time with the
1175 1110 # set_banner() and set_exit_msg() methods.
1176 1111
1177 1112 # The shell instance can be also put in 'dummy' mode globally or on a per-call
1178 1113 # basis. This gives you fine control for debugging without having to change
1179 1114 # code all over the place.
1180 1115
1181 1116 # The code below illustrates all this.
1182 1117
1183 1118
1184 1119 # This is how the global banner and exit_msg can be reset at any point
1185 1120 ipshell.set_banner('Entering interpreter - New Banner')
1186 1121 ipshell.set_exit_msg('Leaving interpreter - New exit_msg')
1187 1122
1188 1123 def foo(m):
1189 1124 s = 'spam'
1190 1125 ipshell('***In foo(). Try @whos, or print s or m:')
1191 1126 print 'foo says m = ',m
1192 1127
1193 1128 def bar(n):
1194 1129 s = 'eggs'
1195 1130 ipshell('***In bar(). Try @whos, or print s or n:')
1196 1131 print 'bar says n = ',n
1197 1132
1198 1133 # Some calls to the above functions which will trigger IPython:
1199 1134 print 'Main program calling foo("eggs")\n'
1200 1135 foo('eggs')
1201 1136
1202 1137 # The shell can be put in 'dummy' mode where calls to it silently return. This
1203 1138 # allows you, for example, to globally turn off debugging for a program with a
1204 1139 # single call.
1205 1140 ipshell.set_dummy_mode(1)
1206 1141 print '\nTrying to call IPython which is now "dummy":'
1207 1142 ipshell()
1208 1143 print 'Nothing happened...'
1209 1144 # The global 'dummy' mode can still be overridden for a single call
1210 1145 print '\nOverriding dummy mode manually:'
1211 1146 ipshell(dummy=0)
1212 1147
1213 1148 # Reactivate the IPython shell
1214 1149 ipshell.set_dummy_mode(0)
1215 1150
1216 1151 print 'You can even have multiple embedded instances:'
1217 1152 ipshell2()
1218 1153
1219 1154 print '\nMain program calling bar("spam")\n'
1220 1155 bar('spam')
1221 1156
1222 1157 print 'Main program finished. Bye!'
1223 1158
1224 1159 #********************** End of file <example-embed.py> ***********************
1225 1160
1226 1161 Once you understand how the system functions, you can use the following
1227 1162 code fragments in your programs which are ready for cut and paste::
1228 1163
1229 1164
1230 1165 """Quick code snippets for embedding IPython into other programs.
1231 1166
1232 1167 See example-embed.py for full details, this file has the bare minimum code for
1233 1168 cut and paste use once you understand how to use the system."""
1234 1169
1235 1170 #---------------------------------------------------------------------------
1236 1171 # This code loads IPython but modifies a few things if it detects it's running
1237 1172 # embedded in another IPython session (helps avoid confusion)
1238 1173
1239 1174 try:
1240 1175 __IPYTHON__
1241 1176 except NameError:
1242 1177 argv = ['']
1243 1178 banner = exit_msg = ''
1244 1179 else:
1245 1180 # Command-line options for IPython (a list like sys.argv)
1246 1181 argv = ['-pi1','In <\\#>:','-pi2',' .\\D.:','-po','Out<\\#>:']
1247 1182 banner = '*** Nested interpreter ***'
1248 1183 exit_msg = '*** Back in main IPython ***'
1249 1184
1250 1185 # First import the embeddable shell class
1251 1186 from IPython.Shell import IPShellEmbed
1252 1187 # Now create the IPython shell instance. Put ipshell() anywhere in your code
1253 1188 # where you want it to open.
1254 1189 ipshell = IPShellEmbed(argv,banner=banner,exit_msg=exit_msg)
1255 1190
1256 1191 #---------------------------------------------------------------------------
1257 1192 # This code will load an embeddable IPython shell always with no changes for
1258 1193 # nested embededings.
1259 1194
1260 1195 from IPython.Shell import IPShellEmbed
1261 1196 ipshell = IPShellEmbed()
1262 1197 # Now ipshell() will open IPython anywhere in the code.
1263 1198
1264 1199 #---------------------------------------------------------------------------
1265 1200 # This code loads an embeddable shell only if NOT running inside
1266 1201 # IPython. Inside IPython, the embeddable shell variable ipshell is just a
1267 1202 # dummy function.
1268 1203
1269 1204 try:
1270 1205 __IPYTHON__
1271 1206 except NameError:
1272 1207 from IPython.Shell import IPShellEmbed
1273 1208 ipshell = IPShellEmbed()
1274 1209 # Now ipshell() will open IPython anywhere in the code
1275 1210 else:
1276 1211 # Define a dummy ipshell() so the same code doesn't crash inside an
1277 1212 # interactive IPython
1278 1213 def ipshell(): pass
1279 1214
1280 1215 #******************* End of file <example-embed-short.py> ********************
1281 1216
1282 1217 Using the Python debugger (pdb)
1283 1218 ===============================
1284 1219
1285 1220 Running entire programs via pdb
1286 1221 -------------------------------
1287 1222
1288 1223 pdb, the Python debugger, is a powerful interactive debugger which
1289 1224 allows you to step through code, set breakpoints, watch variables,
1290 1225 etc. IPython makes it very easy to start any script under the control
1291 1226 of pdb, regardless of whether you have wrapped it into a 'main()'
1292 1227 function or not. For this, simply type '%run -d myscript' at an
1293 1228 IPython prompt. See the %run command's documentation (via '%run?' or
1294 1229 in Sec. magic_ for more details, including how to control where pdb
1295 1230 will stop execution first.
1296 1231
1297 1232 For more information on the use of the pdb debugger, read the included
1298 1233 pdb.doc file (part of the standard Python distribution). On a stock
1299 1234 Linux system it is located at /usr/lib/python2.3/pdb.doc, but the
1300 1235 easiest way to read it is by using the help() function of the pdb module
1301 1236 as follows (in an IPython prompt):
1302 1237
1303 1238 In [1]: import pdb
1304 1239 In [2]: pdb.help()
1305 1240
1306 1241 This will load the pdb.doc document in a file viewer for you automatically.
1307 1242
1308 1243
1309 1244 Automatic invocation of pdb on exceptions
1310 1245 -----------------------------------------
1311 1246
1312 1247 IPython, if started with the -pdb option (or if the option is set in
1313 1248 your rc file) can call the Python pdb debugger every time your code
1314 1249 triggers an uncaught exception. This feature
1315 1250 can also be toggled at any time with the %pdb magic command. This can be
1316 1251 extremely useful in order to find the origin of subtle bugs, because pdb
1317 1252 opens up at the point in your code which triggered the exception, and
1318 1253 while your program is at this point 'dead', all the data is still
1319 1254 available and you can walk up and down the stack frame and understand
1320 1255 the origin of the problem.
1321 1256
1322 1257 Furthermore, you can use these debugging facilities both with the
1323 1258 embedded IPython mode and without IPython at all. For an embedded shell
1324 1259 (see sec. Embedding_), simply call the constructor with
1325 1260 '-pdb' in the argument string and automatically pdb will be called if an
1326 1261 uncaught exception is triggered by your code.
1327 1262
1328 1263 For stand-alone use of the feature in your programs which do not use
1329 1264 IPython at all, put the following lines toward the top of your 'main'
1330 1265 routine::
1331 1266
1332 1267 import sys
1333 1268 from IPython.core import ultratb
1334 1269 sys.excepthook = ultratb.FormattedTB(mode='Verbose',
1335 1270 color_scheme='Linux', call_pdb=1)
1336 1271
1337 1272 The mode keyword can be either 'Verbose' or 'Plain', giving either very
1338 1273 detailed or normal tracebacks respectively. The color_scheme keyword can
1339 1274 be one of 'NoColor', 'Linux' (default) or 'LightBG'. These are the same
1340 1275 options which can be set in IPython with -colors and -xmode.
1341 1276
1342 1277 This will give any of your programs detailed, colored tracebacks with
1343 1278 automatic invocation of pdb.
1344 1279
1345 1280
1346 1281 Extensions for syntax processing
1347 1282 ================================
1348 1283
1349 1284 This isn't for the faint of heart, because the potential for breaking
1350 1285 things is quite high. But it can be a very powerful and useful feature.
1351 1286 In a nutshell, you can redefine the way IPython processes the user input
1352 1287 line to accept new, special extensions to the syntax without needing to
1353 1288 change any of IPython's own code.
1354 1289
1355 1290 In the IPython/extensions directory you will find some examples
1356 1291 supplied, which we will briefly describe now. These can be used 'as is'
1357 1292 (and both provide very useful functionality), or you can use them as a
1358 1293 starting point for writing your own extensions.
1359 1294
1360 1295
1361 1296 Pasting of code starting with '>>> ' or '... '
1362 1297 ----------------------------------------------
1363 1298
1364 1299 In the python tutorial it is common to find code examples which have
1365 1300 been taken from real python sessions. The problem with those is that all
1366 1301 the lines begin with either '>>> ' or '... ', which makes it impossible
1367 1302 to paste them all at once. One must instead do a line by line manual
1368 1303 copying, carefully removing the leading extraneous characters.
1369 1304
1370 1305 This extension identifies those starting characters and removes them
1371 1306 from the input automatically, so that one can paste multi-line examples
1372 1307 directly into IPython, saving a lot of time. Please look at the file
1373 1308 InterpreterPasteInput.py in the IPython/extensions directory for details
1374 1309 on how this is done.
1375 1310
1376 1311 IPython comes with a special profile enabling this feature, called
1377 1312 tutorial. Simply start IPython via 'ipython -p tutorial' and the feature
1378 1313 will be available. In a normal IPython session you can activate the
1379 1314 feature by importing the corresponding module with:
1380 1315 In [1]: import IPython.extensions.InterpreterPasteInput
1381 1316
1382 1317 The following is a 'screenshot' of how things work when this extension
1383 1318 is on, copying an example from the standard tutorial::
1384 1319
1385 1320 IPython profile: tutorial
1386 1321
1387 1322 *** Pasting of code with ">>>" or "..." has been enabled.
1388 1323
1389 1324 In [1]: >>> def fib2(n): # return Fibonacci series up to n
1390 1325 ...: ... """Return a list containing the Fibonacci series up to
1391 1326 n."""
1392 1327 ...: ... result = []
1393 1328 ...: ... a, b = 0, 1
1394 1329 ...: ... while b < n:
1395 1330 ...: ... result.append(b) # see below
1396 1331 ...: ... a, b = b, a+b
1397 1332 ...: ... return result
1398 1333 ...:
1399 1334
1400 1335 In [2]: fib2(10)
1401 1336 Out[2]: [1, 1, 2, 3, 5, 8]
1402 1337
1403 1338 Note that as currently written, this extension does not recognize
1404 1339 IPython's prompts for pasting. Those are more complicated, since the
1405 1340 user can change them very easily, they involve numbers and can vary in
1406 1341 length. One could however extract all the relevant information from the
1407 1342 IPython instance and build an appropriate regular expression. This is
1408 1343 left as an exercise for the reader.
1409 1344
1410 1345
1411 1346 Input of physical quantities with units
1412 1347 ---------------------------------------
1413 1348
1414 1349 The module PhysicalQInput allows a simplified form of input for physical
1415 1350 quantities with units. This file is meant to be used in conjunction with
1416 1351 the PhysicalQInteractive module (in the same directory) and
1417 1352 Physics.PhysicalQuantities from Konrad Hinsen's ScientificPython
1418 1353 (http://dirac.cnrs-orleans.fr/ScientificPython/).
1419 1354
1420 1355 The Physics.PhysicalQuantities module defines PhysicalQuantity objects,
1421 1356 but these must be declared as instances of a class. For example, to
1422 1357 define v as a velocity of 3 m/s, normally you would write::
1423 1358
1424 1359 In [1]: v = PhysicalQuantity(3,'m/s')
1425 1360
1426 1361 Using the PhysicalQ_Input extension this can be input instead as:
1427 1362 In [1]: v = 3 m/s
1428 1363 which is much more convenient for interactive use (even though it is
1429 1364 blatantly invalid Python syntax).
1430 1365
1431 1366 The physics profile supplied with IPython (enabled via 'ipython -p
1432 1367 physics') uses these extensions, which you can also activate with:
1433 1368
1434 1369 from math import * # math MUST be imported BEFORE PhysicalQInteractive
1435 1370 from IPython.extensions.PhysicalQInteractive import *
1436 1371 import IPython.extensions.PhysicalQInput
1437 1372
1373 .. _gui_support:
1438 1374
1439 Threading support
1440 =================
1375 GUI event loop support support
1376 ==============================
1377
1378 .. versionadded:: 0.11
1379 The ``%gui`` magic and :mod:`IPython.lib.inputhook`.
1380
1381 IPython has excellent support for working interactively with Graphical User
1382 Interface (GUI) toolkits, such as wxPython, PyQt4, PyGTK and Tk. This is
1383 implemented using Python's builtin ``PyOSInputHook`` hook. This implementation
1384 is extremely robust compared to our previous threaded based version. The
1385 advantages of
1386
1387 * GUIs can be enabled and disabled dynamically at runtime.
1388 * The active GUI can be switched dynamically at runtime.
1389 * In some cases, multiple GUIs can run simultaneously with no problems.
1390 * There is a developer API in :mod:`IPython.lib.inputhook` for customizing
1391 all of these things.
1392
1393 For users, enabling GUI event loop integration is simple. You simple use the
1394 ``%gui`` magic as follows::
1395
1396 %gui [-a] [GUINAME]
1397
1398 With no arguments, ``%gui`` removes all GUI support. Valid ``GUINAME``
1399 arguments are ``wx``, ``qt4``, ``gtk`` and ``tk``. The ``-a`` option will
1400 create and return a running application object for the selected GUI toolkit.
1401
1402 This to use wxPython interactively and create a running :class:`wx.App`
1403 object, do::
1404
1405 %gui -a wx
1406
1407 For information on IPython's Matplotlib integration (and the ``pylab`` mode)
1408 see :ref:`this section <matplotlib_support>`.
1441 1409
1442 WARNING: The threading support is still somewhat experimental, and it
1443 has only seen reasonable testing under Linux. Threaded code is
1444 particularly tricky to debug, and it tends to show extremely
1445 platform-dependent behavior. Since I only have access to Linux machines,
1446 I will have to rely on user's experiences and assistance for this area
1447 of IPython to improve under other platforms.
1448
1449 IPython, via the -gthread , -qthread, -q4thread and -wthread options
1450 (described in Sec. `Threading options`_), can run in
1451 multithreaded mode to support pyGTK, Qt3, Qt4 and WXPython applications
1452 respectively. These GUI toolkits need to control the python main loop of
1453 execution, so under a normal Python interpreter, starting a pyGTK, Qt3,
1454 Qt4 or WXPython application will immediately freeze the shell.
1455
1456 IPython, with one of these options (you can only use one at a time),
1457 separates the graphical loop and IPython's code execution run into
1458 different threads. This allows you to test interactively (with %run, for
1459 example) your GUI code without blocking.
1460
1461 A nice mini-tutorial on using IPython along with the Qt Designer
1462 application is available at the SciPy wiki:
1463 http://www.scipy.org/Cookbook/Matplotlib/Qt_with_IPython_and_Designer.
1464
1465
1466 Tk issues
1467 ---------
1468
1469 As indicated in Sec. `Threading options`_, a special -tk option is
1470 provided to try and allow Tk graphical applications to coexist
1471 interactively with WX, Qt or GTK ones. Whether this works at all,
1472 however, is very platform and configuration dependent. Please
1473 experiment with simple test cases before committing to using this
1474 combination of Tk and GTK/Qt/WX threading in a production environment.
1475
1476
1477 I/O pitfalls
1478 ------------
1479
1480 Be mindful that the Python interpreter switches between threads every
1481 $N$ bytecodes, where the default value as of Python 2.3 is $N=100.$ This
1482 value can be read by using the sys.getcheckinterval() function, and it
1483 can be reset via sys.setcheckinterval(N). This switching of threads can
1484 cause subtly confusing effects if one of your threads is doing file I/O.
1485 In text mode, most systems only flush file buffers when they encounter a
1486 '\n'. An instruction as simple as::
1487
1488 print >> filehandle, ''hello world''
1489
1490 actually consists of several bytecodes, so it is possible that the
1491 newline does not reach your file before the next thread switch.
1492 Similarly, if you are writing to a file in binary mode, the file won't
1493 be flushed until the buffer fills, and your other thread may see
1494 apparently truncated files.
1495
1496 For this reason, if you are using IPython's thread support and have (for
1497 example) a GUI application which will read data generated by files
1498 written to from the IPython thread, the safest approach is to open all
1499 of your files in unbuffered mode (the third argument to the file/open
1500 function is the buffering value)::
1501
1502 filehandle = open(filename,mode,0)
1503
1504 This is obviously a brute force way of avoiding race conditions with the
1505 file buffering. If you want to do it cleanly, and you have a resource
1506 which is being shared by the interactive IPython loop and your GUI
1507 thread, you should really handle it with thread locking and
1508 syncrhonization properties. The Python documentation discusses these.
1410 For developers that want to use IPython's GUI event loop integration in
1411 the form of a library, the capabilities are exposed in library form
1412 in the :mod:`IPython.lib.inputhook`. Interested developers should see the
1413 module docstrings for more information.
1414
1415 .. _matplotlib_support:
1416
1417 Plotting with matplotlib
1418 ========================
1419
1420
1421 `Matplotlib`_ provides high quality 2D and
1422 3D plotting for Python. Matplotlib can produce plots on screen using a variety
1423 of GUI toolkits, including Tk, PyGTK, PyQt4 and wxPython. It also provides a
1424 number of commands useful for scientific computing, all with a syntax
1425 compatible with that of the popular Matlab program.
1426
1427 Many IPython users have come to rely on IPython's ``-pylab`` mode which
1428 automates the integration of Matplotlib with IPython. We are still in the
1429 process of working with the Matplotlib developers to finalize the new pylab
1430 API, but for now you can use Matplotlib interactively using the following
1431 commands::
1432
1433 %gui -a wx
1434 import matplotlib
1435 matplotlib.use('wxagg')
1436 from matplotlib import pylab
1437 pylab.interactive(True)
1438
1439 All of this will soon be automated as Matplotlib beings to include
1440 new logic that uses our new GUI support.
1509 1441
1510 1442 .. _interactive_demos:
1511 1443
1512 1444 Interactive demos with IPython
1513 1445 ==============================
1514 1446
1515 1447 IPython ships with a basic system for running scripts interactively in
1516 1448 sections, useful when presenting code to audiences. A few tags embedded
1517 1449 in comments (so that the script remains valid Python code) divide a file
1518 1450 into separate blocks, and the demo can be run one block at a time, with
1519 1451 IPython printing (with syntax highlighting) the block before executing
1520 1452 it, and returning to the interactive prompt after each block. The
1521 1453 interactive namespace is updated after each block is run with the
1522 1454 contents of the demo's namespace.
1523 1455
1524 1456 This allows you to show a piece of code, run it and then execute
1525 1457 interactively commands based on the variables just created. Once you
1526 1458 want to continue, you simply execute the next block of the demo. The
1527 1459 following listing shows the markup necessary for dividing a script into
1528 1460 sections for execution as a demo::
1529 1461
1530 1462
1531 1463 """A simple interactive demo to illustrate the use of IPython's Demo class.
1532 1464
1533 1465 Any python script can be run as a demo, but that does little more than showing
1534 1466 it on-screen, syntax-highlighted in one shot. If you add a little simple
1535 1467 markup, you can stop at specified intervals and return to the ipython prompt,
1536 1468 resuming execution later.
1537 1469 """
1538 1470
1539 1471 print 'Hello, welcome to an interactive IPython demo.'
1540 1472 print 'Executing this block should require confirmation before proceeding,'
1541 1473 print 'unless auto_all has been set to true in the demo object'
1542 1474
1543 1475 # The mark below defines a block boundary, which is a point where IPython will
1544 1476 # stop execution and return to the interactive prompt.
1545 1477 # Note that in actual interactive execution,
1546 1478 # <demo> --- stop ---
1547 1479
1548 1480 x = 1
1549 1481 y = 2
1550 1482
1551 1483 # <demo> --- stop ---
1552 1484
1553 1485 # the mark below makes this block as silent
1554 1486 # <demo> silent
1555 1487
1556 1488 print 'This is a silent block, which gets executed but not printed.'
1557 1489
1558 1490 # <demo> --- stop ---
1559 1491 # <demo> auto
1560 1492 print 'This is an automatic block.'
1561 1493 print 'It is executed without asking for confirmation, but printed.'
1562 1494 z = x+y
1563 1495
1564 1496 print 'z=',x
1565 1497
1566 1498 # <demo> --- stop ---
1567 1499 # This is just another normal block.
1568 1500 print 'z is now:', z
1569 1501
1570 1502 print 'bye!'
1571 1503
1572 1504 In order to run a file as a demo, you must first make a Demo object out
1573 1505 of it. If the file is named myscript.py, the following code will make a
1574 1506 demo::
1575 1507
1576 1508 from IPython.demo import Demo
1577 1509
1578 1510 mydemo = Demo('myscript.py')
1579 1511
1580 1512 This creates the mydemo object, whose blocks you run one at a time by
1581 1513 simply calling the object with no arguments. If you have autocall active
1582 1514 in IPython (the default), all you need to do is type::
1583 1515
1584 1516 mydemo
1585 1517
1586 1518 and IPython will call it, executing each block. Demo objects can be
1587 1519 restarted, you can move forward or back skipping blocks, re-execute the
1588 1520 last block, etc. Simply use the Tab key on a demo object to see its
1589 1521 methods, and call '?' on them to see their docstrings for more usage
1590 1522 details. In addition, the demo module itself contains a comprehensive
1591 1523 docstring, which you can access via::
1592 1524
1593 1525 from IPython import demo
1594 1526
1595 1527 demo?
1596 1528
1597 1529 Limitations: It is important to note that these demos are limited to
1598 1530 fairly simple uses. In particular, you can not put division marks in
1599 1531 indented code (loops, if statements, function definitions, etc.)
1600 1532 Supporting something like this would basically require tracking the
1601 1533 internal execution state of the Python interpreter, so only top-level
1602 1534 divisions are allowed. If you want to be able to open an IPython
1603 1535 instance at an arbitrary point in a program, you can use IPython's
1604 1536 embedding facilities, described in detail in Sec. 9
1605 1537
1538 .. [Matplotlib] Matplotlib. http://matplotlib.sourceforge.net
1606 1539
1607 .. _Matplotlib support:
1608
1609 Plotting with matplotlib
1610 ========================
1611
1612 The matplotlib library (http://matplotlib.sourceforge.net
1613 http://matplotlib.sourceforge.net) provides high quality 2D plotting for
1614 Python. Matplotlib can produce plots on screen using a variety of GUI
1615 toolkits, including Tk, GTK and WXPython. It also provides a number of
1616 commands useful for scientific computing, all with a syntax compatible
1617 with that of the popular Matlab program.
1618
1619 IPython accepts the special option -pylab (see :ref:`here
1620 <command_line_options>`). This configures it to support matplotlib, honoring
1621 the settings in the .matplotlibrc file. IPython will detect the user's choice
1622 of matplotlib GUI backend, and automatically select the proper threading model
1623 to prevent blocking. It also sets matplotlib in interactive mode and modifies
1624 %run slightly, so that any matplotlib-based script can be executed using %run
1625 and the final show() command does not block the interactive shell.
1626
1627 The -pylab option must be given first in order for IPython to configure its
1628 threading mode. However, you can still issue other options afterwards. This
1629 allows you to have a matplotlib-based environment customized with additional
1630 modules using the standard IPython profile mechanism (see :ref:`here
1631 <profiles>`): ``ipython -pylab -p myprofile`` will load the profile defined in
1632 ipythonrc-myprofile after configuring matplotlib.
@@ -1,16 +1,15 b''
1 1 .. _parallel_index:
2 2
3 3 ====================================
4 4 Using IPython for parallel computing
5 5 ====================================
6 6
7 7 .. toctree::
8 8 :maxdepth: 2
9 9
10 10 parallel_intro.txt
11 11 parallel_process.txt
12 12 parallel_multiengine.txt
13 13 parallel_task.txt
14 14 parallel_mpi.txt
15 15 parallel_security.txt
16 visionhpc.txt
@@ -1,205 +1,237 b''
1 1 .. _ip1par:
2 2
3 3 ============================
4 4 Overview and getting started
5 5 ============================
6 6
7 7 Introduction
8 8 ============
9 9
10 10 This section gives an overview of IPython's sophisticated and powerful
11 11 architecture for parallel and distributed computing. This architecture
12 12 abstracts out parallelism in a very general way, which enables IPython to
13 13 support many different styles of parallelism including:
14 14
15 15 * Single program, multiple data (SPMD) parallelism.
16 16 * Multiple program, multiple data (MPMD) parallelism.
17 17 * Message passing using MPI.
18 18 * Task farming.
19 19 * Data parallel.
20 20 * Combinations of these approaches.
21 21 * Custom user defined approaches.
22 22
23 23 Most importantly, IPython enables all types of parallel applications to
24 24 be developed, executed, debugged and monitored *interactively*. Hence,
25 25 the ``I`` in IPython. The following are some example usage cases for IPython:
26 26
27 27 * Quickly parallelize algorithms that are embarrassingly parallel
28 28 using a number of simple approaches. Many simple things can be
29 29 parallelized interactively in one or two lines of code.
30 30
31 31 * Steer traditional MPI applications on a supercomputer from an
32 32 IPython session on your laptop.
33 33
34 34 * Analyze and visualize large datasets (that could be remote and/or
35 35 distributed) interactively using IPython and tools like
36 36 matplotlib/TVTK.
37 37
38 38 * Develop, test and debug new parallel algorithms
39 39 (that may use MPI) interactively.
40 40
41 41 * Tie together multiple MPI jobs running on different systems into
42 42 one giant distributed and parallel system.
43 43
44 44 * Start a parallel job on your cluster and then have a remote
45 45 collaborator connect to it and pull back data into their
46 46 local IPython session for plotting and analysis.
47 47
48 48 * Run a set of tasks on a set of CPUs using dynamic load balancing.
49 49
50 50 Architecture overview
51 51 =====================
52 52
53 53 The IPython architecture consists of three components:
54 54
55 55 * The IPython engine.
56 56 * The IPython controller.
57 57 * Various controller clients.
58 58
59 59 These components live in the :mod:`IPython.kernel` package and are
60 60 installed with IPython. They do, however, have additional dependencies
61 61 that must be installed. For more information, see our
62 62 :ref:`installation documentation <install_index>`.
63 63
64 64 IPython engine
65 65 ---------------
66 66
67 67 The IPython engine is a Python instance that takes Python commands over a
68 68 network connection. Eventually, the IPython engine will be a full IPython
69 69 interpreter, but for now, it is a regular Python interpreter. The engine
70 70 can also handle incoming and outgoing Python objects sent over a network
71 71 connection. When multiple engines are started, parallel and distributed
72 72 computing becomes possible. An important feature of an IPython engine is
73 73 that it blocks while user code is being executed. Read on for how the
74 74 IPython controller solves this problem to expose a clean asynchronous API
75 75 to the user.
76 76
77 77 IPython controller
78 78 ------------------
79 79
80 80 The IPython controller provides an interface for working with a set of
81 81 engines. At an general level, the controller is a process to which
82 82 IPython engines can connect. For each connected engine, the controller
83 83 manages a queue. All actions that can be performed on the engine go
84 84 through this queue. While the engines themselves block when user code is
85 85 run, the controller hides that from the user to provide a fully
86 86 asynchronous interface to a set of engines.
87 87
88 88 .. note::
89 89
90 90 Because the controller listens on a network port for engines to
91 91 connect to it, it must be started *before* any engines are started.
92 92
93 The controller also provides a single point of contact for users who wish
94 to utilize the engines connected to the controller. There are different
95 ways of working with a controller. In IPython these ways correspond to different interfaces that the controller is adapted to. Currently we have two default interfaces to the controller:
93 The controller also provides a single point of contact for users who wish to
94 utilize the engines connected to the controller. There are different ways of
95 working with a controller. In IPython these ways correspond to different
96 interfaces that the controller is adapted to. Currently we have two default
97 interfaces to the controller:
96 98
97 99 * The MultiEngine interface, which provides the simplest possible way of
98 100 working with engines interactively.
99 * The Task interface, which provides presents the engines as a load balanced
101 * The Task interface, which presents the engines as a load balanced
100 102 task farming system.
101 103
102 104 Advanced users can easily add new custom interfaces to enable other
103 105 styles of parallelism.
104 106
105 107 .. note::
106 108
107 109 A single controller and set of engines can be accessed
108 110 through multiple interfaces simultaneously. This opens the
109 111 door for lots of interesting things.
110 112
111 113 Controller clients
112 114 ------------------
113 115
114 116 For each controller interface, there is a corresponding client. These
115 117 clients allow users to interact with a set of engines through the
116 118 interface. Here are the two default clients:
117 119
118 120 * The :class:`MultiEngineClient` class.
119 121 * The :class:`TaskClient` class.
120 122
121 123 Security
122 124 --------
123 125
124 By default (as long as `pyOpenSSL` is installed) all network connections between the controller and engines and the controller and clients are secure. What does this mean? First of all, all of the connections will be encrypted using SSL. Second, the connections are authenticated. We handle authentication in a capability based security model [Capability]_. In this model, a "capability (known in some systems as a key) is a communicable, unforgeable token of authority". Put simply, a capability is like a key to your house. If you have the key to your house, you can get in. If not, you can't.
125
126 In our architecture, the controller is the only process that listens on network ports, and is thus responsible to creating these keys. In IPython, these keys are known as Foolscap URLs, or FURLs, because of the underlying network protocol we are using. As a user, you don't need to know anything about the details of these FURLs, other than that when the controller starts, it saves a set of FURLs to files named :file:`something.furl`. The default location of these files is the :file:`~./ipython/security` directory.
127
128 To connect and authenticate to the controller an engine or client simply needs to present an appropriate FURL (that was originally created by the controller) to the controller. Thus, the FURL files need to be copied to a location where the clients and engines can find them. Typically, this is the :file:`~./ipython/security` directory on the host where the client/engine is running (which could be a different host than the controller). Once the FURL files are copied over, everything should work fine.
126 By default (as long as `pyOpenSSL` is installed) all network connections
127 between the controller and engines and the controller and clients are secure.
128 What does this mean? First of all, all of the connections will be encrypted
129 using SSL. Second, the connections are authenticated. We handle authentication
130 in a capability based security model [Capability]_. In this model, a
131 "capability (known in some systems as a key) is a communicable, unforgeable
132 token of authority". Put simply, a capability is like a key to your house. If
133 you have the key to your house, you can get in. If not, you can't.
134
135 In our architecture, the controller is the only process that listens on
136 network ports, and is thus responsible to creating these keys. In IPython,
137 these keys are known as Foolscap URLs, or FURLs, because of the underlying
138 network protocol we are using. As a user, you don't need to know anything
139 about the details of these FURLs, other than that when the controller starts,
140 it saves a set of FURLs to files named :file:`something.furl`. The default
141 location of these files is the :file:`~./ipython/security` directory.
142
143 To connect and authenticate to the controller an engine or client simply needs
144 to present an appropriate FURL (that was originally created by the controller)
145 to the controller. Thus, the FURL files need to be copied to a location where
146 the clients and engines can find them. Typically, this is the
147 :file:`~./ipython/security` directory on the host where the client/engine is
148 running (which could be a different host than the controller). Once the FURL
149 files are copied over, everything should work fine.
129 150
130 151 Currently, there are three FURL files that the controller creates:
131 152
132 153 ipcontroller-engine.furl
133 154 This FURL file is the key that gives an engine the ability to connect
134 155 to a controller.
135 156
136 157 ipcontroller-tc.furl
137 158 This FURL file is the key that a :class:`TaskClient` must use to
138 159 connect to the task interface of a controller.
139 160
140 161 ipcontroller-mec.furl
141 162 This FURL file is the key that a :class:`MultiEngineClient` must use
142 163 to connect to the multiengine interface of a controller.
143 164
144 165 More details of how these FURL files are used are given below.
145 166
146 167 A detailed description of the security model and its implementation in IPython
147 168 can be found :ref:`here <parallelsecurity>`.
148 169
149 170 Getting Started
150 171 ===============
151 172
152 To use IPython for parallel computing, you need to start one instance of
153 the controller and one or more instances of the engine. Initially, it is best to simply start a controller and engines on a single host using the :command:`ipcluster` command. To start a controller and 4 engines on you localhost, just do::
173 To use IPython for parallel computing, you need to start one instance of the
174 controller and one or more instances of the engine. Initially, it is best to
175 simply start a controller and engines on a single host using the
176 :command:`ipcluster` command. To start a controller and 4 engines on your
177 localhost, just do::
154 178
155 179 $ ipcluster local -n 4
156 180
157 More details about starting the IPython controller and engines can be found :ref:`here <parallel_process>`
181 More details about starting the IPython controller and engines can be found
182 :ref:`here <parallel_process>`
158 183
159 184 Once you have started the IPython controller and one or more engines, you
160 185 are ready to use the engines to do something useful. To make sure
161 186 everything is working correctly, try the following commands:
162 187
163 188 .. sourcecode:: ipython
164 189
165 190 In [1]: from IPython.kernel import client
166 191
167 192 In [2]: mec = client.MultiEngineClient()
168 193
169 194 In [4]: mec.get_ids()
170 195 Out[4]: [0, 1, 2, 3]
171 196
172 197 In [5]: mec.execute('print "Hello World"')
173 198 Out[5]:
174 199 <Results List>
175 200 [0] In [1]: print "Hello World"
176 201 [0] Out[1]: Hello World
177 202
178 203 [1] In [1]: print "Hello World"
179 204 [1] Out[1]: Hello World
180 205
181 206 [2] In [1]: print "Hello World"
182 207 [2] Out[1]: Hello World
183 208
184 209 [3] In [1]: print "Hello World"
185 210 [3] Out[1]: Hello World
186 211
187 Remember, a client also needs to present a FURL file to the controller. How does this happen? When a multiengine client is created with no arguments, the client tries to find the corresponding FURL file in the local :file:`~./ipython/security` directory. If it finds it, you are set. If you have put the FURL file in a different location or it has a different name, create the client like this::
212 Remember, a client also needs to present a FURL file to the controller. How
213 does this happen? When a multiengine client is created with no arguments, the
214 client tries to find the corresponding FURL file in the local
215 :file:`~./ipython/security` directory. If it finds it, you are set. If you
216 have put the FURL file in a different location or it has a different name,
217 create the client like this::
188 218
189 219 mec = client.MultiEngineClient('/path/to/my/ipcontroller-mec.furl')
190 220
191 221 Same thing hold true of creating a task client::
192 222
193 223 tc = client.TaskClient('/path/to/my/ipcontroller-tc.furl')
194 224
195 You are now ready to learn more about the :ref:`MultiEngine <parallelmultiengine>` and :ref:`Task <paralleltask>` interfaces to the controller.
225 You are now ready to learn more about the :ref:`MultiEngine
226 <parallelmultiengine>` and :ref:`Task <paralleltask>` interfaces to the
227 controller.
196 228
197 229 .. note::
198 230
199 231 Don't forget that the engine, multiengine client and task client all have
200 232 *different* furl files. You must move *each* of these around to an
201 233 appropriate location so that the engines and clients can use them to
202 234 connect to the controller.
203 235
204 236 .. [Capability] Capability-based security, http://en.wikipedia.org/wiki/Capability-based_security
205 237
@@ -1,157 +1,176 b''
1 1 .. _parallelmpi:
2 2
3 3 =======================
4 4 Using MPI with IPython
5 5 =======================
6 6
7 Often, a parallel algorithm will require moving data between the engines. One way of accomplishing this is by doing a pull and then a push using the multiengine client. However, this will be slow as all the data has to go through the controller to the client and then back through the controller, to its final destination.
7 Often, a parallel algorithm will require moving data between the engines. One
8 way of accomplishing this is by doing a pull and then a push using the
9 multiengine client. However, this will be slow as all the data has to go
10 through the controller to the client and then back through the controller, to
11 its final destination.
8 12
9 A much better way of moving data between engines is to use a message passing library, such as the Message Passing Interface (MPI) [MPI]_. IPython's parallel computing architecture has been designed from the ground up to integrate with MPI. This document describes how to use MPI with IPython.
13 A much better way of moving data between engines is to use a message passing
14 library, such as the Message Passing Interface (MPI) [MPI]_. IPython's
15 parallel computing architecture has been designed from the ground up to
16 integrate with MPI. This document describes how to use MPI with IPython.
10 17
11 18 Additional installation requirements
12 19 ====================================
13 20
14 21 If you want to use MPI with IPython, you will need to install:
15 22
16 23 * A standard MPI implementation such as OpenMPI [OpenMPI]_ or MPICH.
17 24 * The mpi4py [mpi4py]_ package.
18 25
19 26 .. note::
20 27
21 28 The mpi4py package is not a strict requirement. However, you need to
22 29 have *some* way of calling MPI from Python. You also need some way of
23 30 making sure that :func:`MPI_Init` is called when the IPython engines start
24 31 up. There are a number of ways of doing this and a good number of
25 32 associated subtleties. We highly recommend just using mpi4py as it
26 33 takes care of most of these problems. If you want to do something
27 34 different, let us know and we can help you get started.
28 35
29 36 Starting the engines with MPI enabled
30 37 =====================================
31 38
32 39 To use code that calls MPI, there are typically two things that MPI requires.
33 40
34 41 1. The process that wants to call MPI must be started using
35 42 :command:`mpiexec` or a batch system (like PBS) that has MPI support.
36 43 2. Once the process starts, it must call :func:`MPI_Init`.
37 44
38 There are a couple of ways that you can start the IPython engines and get these things to happen.
45 There are a couple of ways that you can start the IPython engines and get
46 these things to happen.
39 47
40 48 Automatic starting using :command:`mpiexec` and :command:`ipcluster`
41 49 --------------------------------------------------------------------
42 50
43 The easiest approach is to use the `mpiexec` mode of :command:`ipcluster`, which will first start a controller and then a set of engines using :command:`mpiexec`::
51 The easiest approach is to use the `mpiexec` mode of :command:`ipcluster`,
52 which will first start a controller and then a set of engines using
53 :command:`mpiexec`::
44 54
45 55 $ ipcluster mpiexec -n 4
46 56
47 57 This approach is best as interrupting :command:`ipcluster` will automatically
48 58 stop and clean up the controller and engines.
49 59
50 60 Manual starting using :command:`mpiexec`
51 61 ----------------------------------------
52 62
53 If you want to start the IPython engines using the :command:`mpiexec`, just do::
63 If you want to start the IPython engines using the :command:`mpiexec`, just
64 do::
54 65
55 66 $ mpiexec -n 4 ipengine --mpi=mpi4py
56 67
57 68 This requires that you already have a controller running and that the FURL
58 69 files for the engines are in place. We also have built in support for
59 70 PyTrilinos [PyTrilinos]_, which can be used (assuming is installed) by
60 71 starting the engines with::
61 72
62 73 mpiexec -n 4 ipengine --mpi=pytrilinos
63 74
64 75 Automatic starting using PBS and :command:`ipcluster`
65 76 -----------------------------------------------------
66 77
67 The :command:`ipcluster` command also has built-in integration with PBS. For more information on this approach, see our documentation on :ref:`ipcluster <parallel_process>`.
78 The :command:`ipcluster` command also has built-in integration with PBS. For
79 more information on this approach, see our documentation on :ref:`ipcluster
80 <parallel_process>`.
68 81
69 82 Actually using MPI
70 83 ==================
71 84
72 Once the engines are running with MPI enabled, you are ready to go. You can now call any code that uses MPI in the IPython engines. And, all of this can be done interactively. Here we show a simple example that uses mpi4py [mpi4py]_.
85 Once the engines are running with MPI enabled, you are ready to go. You can
86 now call any code that uses MPI in the IPython engines. And, all of this can
87 be done interactively. Here we show a simple example that uses mpi4py
88 [mpi4py]_.
73 89
74 First, lets define a simply function that uses MPI to calculate the sum of a distributed array. Save the following text in a file called :file:`psum.py`:
90 First, lets define a simply function that uses MPI to calculate the sum of a
91 distributed array. Save the following text in a file called :file:`psum.py`:
75 92
76 93 .. sourcecode:: python
77 94
78 95 from mpi4py import MPI
79 96 import numpy as np
80 97
81 98 def psum(a):
82 99 s = np.sum(a)
83 100 return MPI.COMM_WORLD.Allreduce(s,MPI.SUM)
84 101
85 102 Now, start an IPython cluster in the same directory as :file:`psum.py`::
86 103
87 104 $ ipcluster mpiexec -n 4
88 105
89 Finally, connect to the cluster and use this function interactively. In this case, we create a random array on each engine and sum up all the random arrays using our :func:`psum` function:
106 Finally, connect to the cluster and use this function interactively. In this
107 case, we create a random array on each engine and sum up all the random arrays
108 using our :func:`psum` function:
90 109
91 110 .. sourcecode:: ipython
92 111
93 112 In [1]: from IPython.kernel import client
94 113
95 114 In [2]: mec = client.MultiEngineClient()
96 115
97 116 In [3]: mec.activate()
98 117
99 118 In [4]: px import numpy as np
100 119 Parallel execution on engines: all
101 120 Out[4]:
102 121 <Results List>
103 122 [0] In [13]: import numpy as np
104 123 [1] In [13]: import numpy as np
105 124 [2] In [13]: import numpy as np
106 125 [3] In [13]: import numpy as np
107 126
108 127 In [6]: px a = np.random.rand(100)
109 128 Parallel execution on engines: all
110 129 Out[6]:
111 130 <Results List>
112 131 [0] In [15]: a = np.random.rand(100)
113 132 [1] In [15]: a = np.random.rand(100)
114 133 [2] In [15]: a = np.random.rand(100)
115 134 [3] In [15]: a = np.random.rand(100)
116 135
117 136 In [7]: px from psum import psum
118 137 Parallel execution on engines: all
119 138 Out[7]:
120 139 <Results List>
121 140 [0] In [16]: from psum import psum
122 141 [1] In [16]: from psum import psum
123 142 [2] In [16]: from psum import psum
124 143 [3] In [16]: from psum import psum
125 144
126 145 In [8]: px s = psum(a)
127 146 Parallel execution on engines: all
128 147 Out[8]:
129 148 <Results List>
130 149 [0] In [17]: s = psum(a)
131 150 [1] In [17]: s = psum(a)
132 151 [2] In [17]: s = psum(a)
133 152 [3] In [17]: s = psum(a)
134 153
135 154 In [9]: px print s
136 155 Parallel execution on engines: all
137 156 Out[9]:
138 157 <Results List>
139 158 [0] In [18]: print s
140 159 [0] Out[18]: 187.451545803
141 160
142 161 [1] In [18]: print s
143 162 [1] Out[18]: 187.451545803
144 163
145 164 [2] In [18]: print s
146 165 [2] Out[18]: 187.451545803
147 166
148 167 [3] In [18]: print s
149 168 [3] Out[18]: 187.451545803
150 169
151 170 Any Python code that makes calls to MPI can be used in this manner, including
152 171 compiled C, C++ and Fortran libraries that have been exposed to Python.
153 172
154 173 .. [MPI] Message Passing Interface. http://www-unix.mcs.anl.gov/mpi/
155 174 .. [mpi4py] MPI for Python. mpi4py: http://mpi4py.scipy.org/
156 175 .. [OpenMPI] Open MPI. http://www.open-mpi.org/
157 176 .. [PyTrilinos] PyTrilinos. http://trilinos.sandia.gov/packages/pytrilinos/
@@ -1,828 +1,835 b''
1 1 .. _parallelmultiengine:
2 2
3 3 ===============================
4 4 IPython's multiengine interface
5 5 ===============================
6 6
7 7 The multiengine interface represents one possible way of working with a set of
8 8 IPython engines. The basic idea behind the multiengine interface is that the
9 9 capabilities of each engine are directly and explicitly exposed to the user.
10 10 Thus, in the multiengine interface, each engine is given an id that is used to
11 11 identify the engine and give it work to do. This interface is very intuitive
12 12 and is designed with interactive usage in mind, and is thus the best place for
13 13 new users of IPython to begin.
14 14
15 15 Starting the IPython controller and engines
16 16 ===========================================
17 17
18 18 To follow along with this tutorial, you will need to start the IPython
19 19 controller and four IPython engines. The simplest way of doing this is to use
20 20 the :command:`ipcluster` command::
21 21
22 22 $ ipcluster local -n 4
23 23
24 24 For more detailed information about starting the controller and engines, see
25 25 our :ref:`introduction <ip1par>` to using IPython for parallel computing.
26 26
27 27 Creating a ``MultiEngineClient`` instance
28 28 =========================================
29 29
30 30 The first step is to import the IPython :mod:`IPython.kernel.client` module
31 31 and then create a :class:`MultiEngineClient` instance:
32 32
33 33 .. sourcecode:: ipython
34 34
35 35 In [1]: from IPython.kernel import client
36 36
37 37 In [2]: mec = client.MultiEngineClient()
38 38
39 39 This form assumes that the :file:`ipcontroller-mec.furl` is in the
40 40 :file:`~./ipython/security` directory on the client's host. If not, the
41 41 location of the FURL file must be given as an argument to the
42 42 constructor:
43 43
44 44 .. sourcecode:: ipython
45 45
46 46 In [2]: mec = client.MultiEngineClient('/path/to/my/ipcontroller-mec.furl')
47 47
48 48 To make sure there are engines connected to the controller, use can get a list
49 49 of engine ids:
50 50
51 51 .. sourcecode:: ipython
52 52
53 53 In [3]: mec.get_ids()
54 54 Out[3]: [0, 1, 2, 3]
55 55
56 56 Here we see that there are four engines ready to do work for us.
57 57
58 58 Quick and easy parallelism
59 59 ==========================
60 60
61 In many cases, you simply want to apply a Python function to a sequence of objects, but *in parallel*. The multiengine interface provides two simple ways of accomplishing this: a parallel version of :func:`map` and ``@parallel`` function decorator.
61 In many cases, you simply want to apply a Python function to a sequence of
62 objects, but *in parallel*. The multiengine interface provides two simple ways
63 of accomplishing this: a parallel version of :func:`map` and ``@parallel``
64 function decorator.
62 65
63 66 Parallel map
64 67 ------------
65 68
66 69 Python's builtin :func:`map` functions allows a function to be applied to a
67 70 sequence element-by-element. This type of code is typically trivial to
68 71 parallelize. In fact, the multiengine interface in IPython already has a
69 72 parallel version of :meth:`map` that works just like its serial counterpart:
70 73
71 74 .. sourcecode:: ipython
72 75
73 76 In [63]: serial_result = map(lambda x:x**10, range(32))
74 77
75 78 In [64]: parallel_result = mec.map(lambda x:x**10, range(32))
76 79
77 80 In [65]: serial_result==parallel_result
78 81 Out[65]: True
79 82
80 83 .. note::
81 84
82 85 The multiengine interface version of :meth:`map` does not do any load
83 86 balancing. For a load balanced version, see the task interface.
84 87
85 88 .. seealso::
86 89
87 90 The :meth:`map` method has a number of options that can be controlled by
88 91 the :meth:`mapper` method. See its docstring for more information.
89 92
90 93 Parallel function decorator
91 94 ---------------------------
92 95
93 Parallel functions are just like normal function, but they can be called on sequences and *in parallel*. The multiengine interface provides a decorator that turns any Python function into a parallel function:
96 Parallel functions are just like normal function, but they can be called on
97 sequences and *in parallel*. The multiengine interface provides a decorator
98 that turns any Python function into a parallel function:
94 99
95 100 .. sourcecode:: ipython
96 101
97 102 In [10]: @mec.parallel()
98 103 ....: def f(x):
99 104 ....: return 10.0*x**4
100 105 ....:
101 106
102 107 In [11]: f(range(32)) # this is done in parallel
103 108 Out[11]:
104 109 [0.0,10.0,160.0,...]
105 110
106 111 See the docstring for the :meth:`parallel` decorator for options.
107 112
108 113 Running Python commands
109 114 =======================
110 115
111 116 The most basic type of operation that can be performed on the engines is to
112 117 execute Python code. Executing Python code can be done in blocking or
113 118 non-blocking mode (blocking is default) using the :meth:`execute` method.
114 119
115 120 Blocking execution
116 121 ------------------
117 122
118 123 In blocking mode, the :class:`MultiEngineClient` object (called ``mec`` in
119 124 these examples) submits the command to the controller, which places the
120 125 command in the engines' queues for execution. The :meth:`execute` call then
121 126 blocks until the engines are done executing the command:
122 127
123 128 .. sourcecode:: ipython
124 129
125 130 # The default is to run on all engines
126 131 In [4]: mec.execute('a=5')
127 132 Out[4]:
128 133 <Results List>
129 134 [0] In [1]: a=5
130 135 [1] In [1]: a=5
131 136 [2] In [1]: a=5
132 137 [3] In [1]: a=5
133 138
134 139 In [5]: mec.execute('b=10')
135 140 Out[5]:
136 141 <Results List>
137 142 [0] In [2]: b=10
138 143 [1] In [2]: b=10
139 144 [2] In [2]: b=10
140 145 [3] In [2]: b=10
141 146
142 147 Python commands can be executed on specific engines by calling execute using
143 148 the ``targets`` keyword argument:
144 149
145 150 .. sourcecode:: ipython
146 151
147 152 In [6]: mec.execute('c=a+b',targets=[0,2])
148 153 Out[6]:
149 154 <Results List>
150 155 [0] In [3]: c=a+b
151 156 [2] In [3]: c=a+b
152 157
153 158
154 159 In [7]: mec.execute('c=a-b',targets=[1,3])
155 160 Out[7]:
156 161 <Results List>
157 162 [1] In [3]: c=a-b
158 163 [3] In [3]: c=a-b
159 164
160 165
161 166 In [8]: mec.execute('print c')
162 167 Out[8]:
163 168 <Results List>
164 169 [0] In [4]: print c
165 170 [0] Out[4]: 15
166 171
167 172 [1] In [4]: print c
168 173 [1] Out[4]: -5
169 174
170 175 [2] In [4]: print c
171 176 [2] Out[4]: 15
172 177
173 178 [3] In [4]: print c
174 179 [3] Out[4]: -5
175 180
176 181 This example also shows one of the most important things about the IPython
177 182 engines: they have a persistent user namespaces. The :meth:`execute` method
178 183 returns a Python ``dict`` that contains useful information:
179 184
180 185 .. sourcecode:: ipython
181 186
182 187 In [9]: result_dict = mec.execute('d=10; print d')
183 188
184 189 In [10]: for r in result_dict:
185 190 ....: print r
186 191 ....:
187 192 ....:
188 193 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 0, 'stdout': '10\n'}
189 194 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 1, 'stdout': '10\n'}
190 195 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 2, 'stdout': '10\n'}
191 196 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 3, 'stdout': '10\n'}
192 197
193 198 Non-blocking execution
194 199 ----------------------
195 200
196 201 In non-blocking mode, :meth:`execute` submits the command to be executed and
197 202 then returns a :class:`PendingResult` object immediately. The
198 203 :class:`PendingResult` object gives you a way of getting a result at a later
199 204 time through its :meth:`get_result` method or :attr:`r` attribute. This allows
200 205 you to quickly submit long running commands without blocking your local
201 206 Python/IPython session:
202 207
203 208 .. sourcecode:: ipython
204 209
205 210 # In blocking mode
206 211 In [6]: mec.execute('import time')
207 212 Out[6]:
208 213 <Results List>
209 214 [0] In [1]: import time
210 215 [1] In [1]: import time
211 216 [2] In [1]: import time
212 217 [3] In [1]: import time
213 218
214 219 # In non-blocking mode
215 220 In [7]: pr = mec.execute('time.sleep(10)',block=False)
216 221
217 222 # Now block for the result
218 223 In [8]: pr.get_result()
219 224 Out[8]:
220 225 <Results List>
221 226 [0] In [2]: time.sleep(10)
222 227 [1] In [2]: time.sleep(10)
223 228 [2] In [2]: time.sleep(10)
224 229 [3] In [2]: time.sleep(10)
225 230
226 231 # Again in non-blocking mode
227 232 In [9]: pr = mec.execute('time.sleep(10)',block=False)
228 233
229 234 # Poll to see if the result is ready
230 235 In [10]: pr.get_result(block=False)
231 236
232 237 # A shorthand for get_result(block=True)
233 238 In [11]: pr.r
234 239 Out[11]:
235 240 <Results List>
236 241 [0] In [3]: time.sleep(10)
237 242 [1] In [3]: time.sleep(10)
238 243 [2] In [3]: time.sleep(10)
239 244 [3] In [3]: time.sleep(10)
240 245
241 246 Often, it is desirable to wait until a set of :class:`PendingResult` objects
242 247 are done. For this, there is a the method :meth:`barrier`. This method takes a
243 248 tuple of :class:`PendingResult` objects and blocks until all of the associated
244 249 results are ready:
245 250
246 251 .. sourcecode:: ipython
247 252
248 253 In [72]: mec.block=False
249 254
250 255 # A trivial list of PendingResults objects
251 256 In [73]: pr_list = [mec.execute('time.sleep(3)') for i in range(10)]
252 257
253 258 # Wait until all of them are done
254 259 In [74]: mec.barrier(pr_list)
255 260
256 261 # Then, their results are ready using get_result or the r attribute
257 262 In [75]: pr_list[0].r
258 263 Out[75]:
259 264 <Results List>
260 265 [0] In [20]: time.sleep(3)
261 266 [1] In [19]: time.sleep(3)
262 267 [2] In [20]: time.sleep(3)
263 268 [3] In [19]: time.sleep(3)
264 269
265 270
266 271 The ``block`` and ``targets`` keyword arguments and attributes
267 272 --------------------------------------------------------------
268 273
269 274 Most methods in the multiengine interface (like :meth:`execute`) accept
270 275 ``block`` and ``targets`` as keyword arguments. As we have seen above, these
271 276 keyword arguments control the blocking mode and which engines the command is
272 277 applied to. The :class:`MultiEngineClient` class also has :attr:`block` and
273 278 :attr:`targets` attributes that control the default behavior when the keyword
274 279 arguments are not provided. Thus the following logic is used for :attr:`block`
275 280 and :attr:`targets`:
276 281
277 282 * If no keyword argument is provided, the instance attributes are used.
278 283 * Keyword argument, if provided override the instance attributes.
279 284
280 285 The following examples demonstrate how to use the instance attributes:
281 286
282 287 .. sourcecode:: ipython
283 288
284 289 In [16]: mec.targets = [0,2]
285 290
286 291 In [17]: mec.block = False
287 292
288 293 In [18]: pr = mec.execute('a=5')
289 294
290 295 In [19]: pr.r
291 296 Out[19]:
292 297 <Results List>
293 298 [0] In [6]: a=5
294 299 [2] In [6]: a=5
295 300
296 301 # Note targets='all' means all engines
297 302 In [20]: mec.targets = 'all'
298 303
299 304 In [21]: mec.block = True
300 305
301 306 In [22]: mec.execute('b=10; print b')
302 307 Out[22]:
303 308 <Results List>
304 309 [0] In [7]: b=10; print b
305 310 [0] Out[7]: 10
306 311
307 312 [1] In [6]: b=10; print b
308 313 [1] Out[6]: 10
309 314
310 315 [2] In [7]: b=10; print b
311 316 [2] Out[7]: 10
312 317
313 318 [3] In [6]: b=10; print b
314 319 [3] Out[6]: 10
315 320
316 321 The :attr:`block` and :attr:`targets` instance attributes also determine the
317 322 behavior of the parallel magic commands.
318 323
319 324
320 325 Parallel magic commands
321 326 -----------------------
322 327
323 328 We provide a few IPython magic commands (``%px``, ``%autopx`` and ``%result``)
324 329 that make it more pleasant to execute Python commands on the engines
325 330 interactively. These are simply shortcuts to :meth:`execute` and
326 331 :meth:`get_result`. The ``%px`` magic executes a single Python command on the
327 332 engines specified by the :attr:`targets` attribute of the
328 333 :class:`MultiEngineClient` instance (by default this is ``'all'``):
329 334
330 335 .. sourcecode:: ipython
331 336
332 337 # Make this MultiEngineClient active for parallel magic commands
333 338 In [23]: mec.activate()
334 339
335 340 In [24]: mec.block=True
336 341
337 342 In [25]: import numpy
338 343
339 344 In [26]: %px import numpy
340 345 Executing command on Controller
341 346 Out[26]:
342 347 <Results List>
343 348 [0] In [8]: import numpy
344 349 [1] In [7]: import numpy
345 350 [2] In [8]: import numpy
346 351 [3] In [7]: import numpy
347 352
348 353
349 354 In [27]: %px a = numpy.random.rand(2,2)
350 355 Executing command on Controller
351 356 Out[27]:
352 357 <Results List>
353 358 [0] In [9]: a = numpy.random.rand(2,2)
354 359 [1] In [8]: a = numpy.random.rand(2,2)
355 360 [2] In [9]: a = numpy.random.rand(2,2)
356 361 [3] In [8]: a = numpy.random.rand(2,2)
357 362
358 363
359 364 In [28]: %px print numpy.linalg.eigvals(a)
360 365 Executing command on Controller
361 366 Out[28]:
362 367 <Results List>
363 368 [0] In [10]: print numpy.linalg.eigvals(a)
364 369 [0] Out[10]: [ 1.28167017 0.14197338]
365 370
366 371 [1] In [9]: print numpy.linalg.eigvals(a)
367 372 [1] Out[9]: [-0.14093616 1.27877273]
368 373
369 374 [2] In [10]: print numpy.linalg.eigvals(a)
370 375 [2] Out[10]: [-0.37023573 1.06779409]
371 376
372 377 [3] In [9]: print numpy.linalg.eigvals(a)
373 378 [3] Out[9]: [ 0.83664764 -0.25602658]
374 379
375 380 The ``%result`` magic gets and prints the stdin/stdout/stderr of the last
376 381 command executed on each engine. It is simply a shortcut to the
377 382 :meth:`get_result` method:
378 383
379 384 .. sourcecode:: ipython
380 385
381 386 In [29]: %result
382 387 Out[29]:
383 388 <Results List>
384 389 [0] In [10]: print numpy.linalg.eigvals(a)
385 390 [0] Out[10]: [ 1.28167017 0.14197338]
386 391
387 392 [1] In [9]: print numpy.linalg.eigvals(a)
388 393 [1] Out[9]: [-0.14093616 1.27877273]
389 394
390 395 [2] In [10]: print numpy.linalg.eigvals(a)
391 396 [2] Out[10]: [-0.37023573 1.06779409]
392 397
393 398 [3] In [9]: print numpy.linalg.eigvals(a)
394 399 [3] Out[9]: [ 0.83664764 -0.25602658]
395 400
396 401 The ``%autopx`` magic switches to a mode where everything you type is executed
397 402 on the engines given by the :attr:`targets` attribute:
398 403
399 404 .. sourcecode:: ipython
400 405
401 406 In [30]: mec.block=False
402 407
403 408 In [31]: %autopx
404 409 Auto Parallel Enabled
405 410 Type %autopx to disable
406 411
407 412 In [32]: max_evals = []
408 413 <IPython.kernel.multiengineclient.PendingResult object at 0x17b8a70>
409 414
410 415 In [33]: for i in range(100):
411 416 ....: a = numpy.random.rand(10,10)
412 417 ....: a = a+a.transpose()
413 418 ....: evals = numpy.linalg.eigvals(a)
414 419 ....: max_evals.append(evals[0].real)
415 420 ....:
416 421 ....:
417 422 <IPython.kernel.multiengineclient.PendingResult object at 0x17af8f0>
418 423
419 424 In [34]: %autopx
420 425 Auto Parallel Disabled
421 426
422 427 In [35]: mec.block=True
423 428
424 429 In [36]: px print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
425 430 Executing command on Controller
426 431 Out[36]:
427 432 <Results List>
428 433 [0] In [13]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
429 434 [0] Out[13]: Average max eigenvalue is: 10.1387247332
430 435
431 436 [1] In [12]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
432 437 [1] Out[12]: Average max eigenvalue is: 10.2076902286
433 438
434 439 [2] In [13]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
435 440 [2] Out[13]: Average max eigenvalue is: 10.1891484655
436 441
437 442 [3] In [12]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
438 443 [3] Out[12]: Average max eigenvalue is: 10.1158837784
439 444
440 445
441 446 Moving Python objects around
442 447 ============================
443 448
444 449 In addition to executing code on engines, you can transfer Python objects to
445 450 and from your IPython session and the engines. In IPython, these operations
446 451 are called :meth:`push` (sending an object to the engines) and :meth:`pull`
447 452 (getting an object from the engines).
448 453
449 454 Basic push and pull
450 455 -------------------
451 456
452 457 Here are some examples of how you use :meth:`push` and :meth:`pull`:
453 458
454 459 .. sourcecode:: ipython
455 460
456 461 In [38]: mec.push(dict(a=1.03234,b=3453))
457 462 Out[38]: [None, None, None, None]
458 463
459 464 In [39]: mec.pull('a')
460 465 Out[39]: [1.03234, 1.03234, 1.03234, 1.03234]
461 466
462 467 In [40]: mec.pull('b',targets=0)
463 468 Out[40]: [3453]
464 469
465 470 In [41]: mec.pull(('a','b'))
466 471 Out[41]: [[1.03234, 3453], [1.03234, 3453], [1.03234, 3453], [1.03234, 3453]]
467 472
468 473 In [42]: mec.zip_pull(('a','b'))
469 474 Out[42]: [(1.03234, 1.03234, 1.03234, 1.03234), (3453, 3453, 3453, 3453)]
470 475
471 476 In [43]: mec.push(dict(c='speed'))
472 477 Out[43]: [None, None, None, None]
473 478
474 479 In [44]: %px print c
475 480 Executing command on Controller
476 481 Out[44]:
477 482 <Results List>
478 483 [0] In [14]: print c
479 484 [0] Out[14]: speed
480 485
481 486 [1] In [13]: print c
482 487 [1] Out[13]: speed
483 488
484 489 [2] In [14]: print c
485 490 [2] Out[14]: speed
486 491
487 492 [3] In [13]: print c
488 493 [3] Out[13]: speed
489 494
490 495 In non-blocking mode :meth:`push` and :meth:`pull` also return
491 496 :class:`PendingResult` objects:
492 497
493 498 .. sourcecode:: ipython
494 499
495 500 In [47]: mec.block=False
496 501
497 502 In [48]: pr = mec.pull('a')
498 503
499 504 In [49]: pr.r
500 505 Out[49]: [1.03234, 1.03234, 1.03234, 1.03234]
501 506
502 507
503 508 Push and pull for functions
504 509 ---------------------------
505 510
506 511 Functions can also be pushed and pulled using :meth:`push_function` and
507 512 :meth:`pull_function`:
508 513
509 514 .. sourcecode:: ipython
510 515
511 516 In [52]: mec.block=True
512 517
513 518 In [53]: def f(x):
514 519 ....: return 2.0*x**4
515 520 ....:
516 521
517 522 In [54]: mec.push_function(dict(f=f))
518 523 Out[54]: [None, None, None, None]
519 524
520 525 In [55]: mec.execute('y = f(4.0)')
521 526 Out[55]:
522 527 <Results List>
523 528 [0] In [15]: y = f(4.0)
524 529 [1] In [14]: y = f(4.0)
525 530 [2] In [15]: y = f(4.0)
526 531 [3] In [14]: y = f(4.0)
527 532
528 533
529 534 In [56]: px print y
530 535 Executing command on Controller
531 536 Out[56]:
532 537 <Results List>
533 538 [0] In [16]: print y
534 539 [0] Out[16]: 512.0
535 540
536 541 [1] In [15]: print y
537 542 [1] Out[15]: 512.0
538 543
539 544 [2] In [16]: print y
540 545 [2] Out[16]: 512.0
541 546
542 547 [3] In [15]: print y
543 548 [3] Out[15]: 512.0
544 549
545 550
546 551 Dictionary interface
547 552 --------------------
548 553
549 554 As a shorthand to :meth:`push` and :meth:`pull`, the
550 555 :class:`MultiEngineClient` class implements some of the Python dictionary
551 556 interface. This make the remote namespaces of the engines appear as a local
552 557 dictionary. Underneath, this uses :meth:`push` and :meth:`pull`:
553 558
554 559 .. sourcecode:: ipython
555 560
556 561 In [50]: mec.block=True
557 562
558 563 In [51]: mec['a']=['foo','bar']
559 564
560 565 In [52]: mec['a']
561 566 Out[52]: [['foo', 'bar'], ['foo', 'bar'], ['foo', 'bar'], ['foo', 'bar']]
562 567
563 568 Scatter and gather
564 569 ------------------
565 570
566 571 Sometimes it is useful to partition a sequence and push the partitions to
567 572 different engines. In MPI language, this is know as scatter/gather and we
568 573 follow that terminology. However, it is important to remember that in
569 574 IPython's :class:`MultiEngineClient` class, :meth:`scatter` is from the
570 575 interactive IPython session to the engines and :meth:`gather` is from the
571 576 engines back to the interactive IPython session. For scatter/gather operations
572 577 between engines, MPI should be used:
573 578
574 579 .. sourcecode:: ipython
575 580
576 581 In [58]: mec.scatter('a',range(16))
577 582 Out[58]: [None, None, None, None]
578 583
579 584 In [59]: px print a
580 585 Executing command on Controller
581 586 Out[59]:
582 587 <Results List>
583 588 [0] In [17]: print a
584 589 [0] Out[17]: [0, 1, 2, 3]
585 590
586 591 [1] In [16]: print a
587 592 [1] Out[16]: [4, 5, 6, 7]
588 593
589 594 [2] In [17]: print a
590 595 [2] Out[17]: [8, 9, 10, 11]
591 596
592 597 [3] In [16]: print a
593 598 [3] Out[16]: [12, 13, 14, 15]
594 599
595 600
596 601 In [60]: mec.gather('a')
597 602 Out[60]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
598 603
599 604 Other things to look at
600 605 =======================
601 606
602 607 How to do parallel list comprehensions
603 608 --------------------------------------
604 609
605 610 In many cases list comprehensions are nicer than using the map function. While
606 611 we don't have fully parallel list comprehensions, it is simple to get the
607 612 basic effect using :meth:`scatter` and :meth:`gather`:
608 613
609 614 .. sourcecode:: ipython
610 615
611 616 In [66]: mec.scatter('x',range(64))
612 617 Out[66]: [None, None, None, None]
613 618
614 619 In [67]: px y = [i**10 for i in x]
615 620 Executing command on Controller
616 621 Out[67]:
617 622 <Results List>
618 623 [0] In [19]: y = [i**10 for i in x]
619 624 [1] In [18]: y = [i**10 for i in x]
620 625 [2] In [19]: y = [i**10 for i in x]
621 626 [3] In [18]: y = [i**10 for i in x]
622 627
623 628
624 629 In [68]: y = mec.gather('y')
625 630
626 631 In [69]: print y
627 632 [0, 1, 1024, 59049, 1048576, 9765625, 60466176, 282475249, 1073741824,...]
628 633
629 634 Parallel exceptions
630 635 -------------------
631 636
632 637 In the multiengine interface, parallel commands can raise Python exceptions,
633 638 just like serial commands. But, it is a little subtle, because a single
634 639 parallel command can actually raise multiple exceptions (one for each engine
635 640 the command was run on). To express this idea, the MultiEngine interface has a
636 641 :exc:`CompositeError` exception class that will be raised in most cases. The
637 642 :exc:`CompositeError` class is a special type of exception that wraps one or
638 643 more other types of exceptions. Here is how it works:
639 644
640 645 .. sourcecode:: ipython
641 646
642 647 In [76]: mec.block=True
643 648
644 649 In [77]: mec.execute('1/0')
645 650 ---------------------------------------------------------------------------
646 651 CompositeError Traceback (most recent call last)
647 652
648 653 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
649 654
650 655 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in execute(self, lines, targets, block)
651 656 432 targets, block = self._findTargetsAndBlock(targets, block)
652 657 433 result = blockingCallFromThread(self.smultiengine.execute, lines,
653 658 --> 434 targets=targets, block=block)
654 659 435 if block:
655 660 436 result = ResultList(result)
656 661
657 662 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
658 663 72 result.raiseException()
659 664 73 except Exception, e:
660 665 ---> 74 raise e
661 666 75 return result
662 667 76
663 668
664 669 CompositeError: one or more exceptions from call to method: execute
665 670 [0:execute]: ZeroDivisionError: integer division or modulo by zero
666 671 [1:execute]: ZeroDivisionError: integer division or modulo by zero
667 672 [2:execute]: ZeroDivisionError: integer division or modulo by zero
668 673 [3:execute]: ZeroDivisionError: integer division or modulo by zero
669 674
670 Notice how the error message printed when :exc:`CompositeError` is raised has information about the individual exceptions that were raised on each engine. If you want, you can even raise one of these original exceptions:
675 Notice how the error message printed when :exc:`CompositeError` is raised has
676 information about the individual exceptions that were raised on each engine.
677 If you want, you can even raise one of these original exceptions:
671 678
672 679 .. sourcecode:: ipython
673 680
674 681 In [80]: try:
675 682 ....: mec.execute('1/0')
676 683 ....: except client.CompositeError, e:
677 684 ....: e.raise_exception()
678 685 ....:
679 686 ....:
680 687 ---------------------------------------------------------------------------
681 688 ZeroDivisionError Traceback (most recent call last)
682 689
683 690 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
684 691
685 692 /ipython1-client-r3021/ipython1/kernel/error.pyc in raise_exception(self, excid)
686 693 156 raise IndexError("an exception with index %i does not exist"%excid)
687 694 157 else:
688 695 --> 158 raise et, ev, etb
689 696 159
690 697 160 def collect_exceptions(rlist, method):
691 698
692 699 ZeroDivisionError: integer division or modulo by zero
693 700
694 701 If you are working in IPython, you can simple type ``%debug`` after one of
695 702 these :exc:`CompositeError` exceptions is raised, and inspect the exception
696 703 instance:
697 704
698 705 .. sourcecode:: ipython
699 706
700 707 In [81]: mec.execute('1/0')
701 708 ---------------------------------------------------------------------------
702 709 CompositeError Traceback (most recent call last)
703 710
704 711 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
705 712
706 713 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in execute(self, lines, targets, block)
707 714 432 targets, block = self._findTargetsAndBlock(targets, block)
708 715 433 result = blockingCallFromThread(self.smultiengine.execute, lines,
709 716 --> 434 targets=targets, block=block)
710 717 435 if block:
711 718 436 result = ResultList(result)
712 719
713 720 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
714 721 72 result.raiseException()
715 722 73 except Exception, e:
716 723 ---> 74 raise e
717 724 75 return result
718 725 76
719 726
720 727 CompositeError: one or more exceptions from call to method: execute
721 728 [0:execute]: ZeroDivisionError: integer division or modulo by zero
722 729 [1:execute]: ZeroDivisionError: integer division or modulo by zero
723 730 [2:execute]: ZeroDivisionError: integer division or modulo by zero
724 731 [3:execute]: ZeroDivisionError: integer division or modulo by zero
725 732
726 733 In [82]: %debug
727 734 >
728 735
729 736 /ipython1-client-r3021/ipython1/kernel/twistedutil.py(74)blockingCallFromThread()
730 737 73 except Exception, e:
731 738 ---> 74 raise e
732 739 75 return result
733 740
734 741 # With the debugger running, e is the exceptions instance. We can tab complete
735 742 # on it and see the extra methods that are available.
736 743 ipdb> e.
737 744 e.__class__ e.__getitem__ e.__new__ e.__setstate__ e.args
738 745 e.__delattr__ e.__getslice__ e.__reduce__ e.__str__ e.elist
739 746 e.__dict__ e.__hash__ e.__reduce_ex__ e.__weakref__ e.message
740 747 e.__doc__ e.__init__ e.__repr__ e._get_engine_str e.print_tracebacks
741 748 e.__getattribute__ e.__module__ e.__setattr__ e._get_traceback e.raise_exception
742 749 ipdb> e.print_tracebacks()
743 750 [0:execute]:
744 751 ---------------------------------------------------------------------------
745 752 ZeroDivisionError Traceback (most recent call last)
746 753
747 754 /ipython1-client-r3021/docs/examples/<string> in <module>()
748 755
749 756 ZeroDivisionError: integer division or modulo by zero
750 757
751 758 [1:execute]:
752 759 ---------------------------------------------------------------------------
753 760 ZeroDivisionError Traceback (most recent call last)
754 761
755 762 /ipython1-client-r3021/docs/examples/<string> in <module>()
756 763
757 764 ZeroDivisionError: integer division or modulo by zero
758 765
759 766 [2:execute]:
760 767 ---------------------------------------------------------------------------
761 768 ZeroDivisionError Traceback (most recent call last)
762 769
763 770 /ipython1-client-r3021/docs/examples/<string> in <module>()
764 771
765 772 ZeroDivisionError: integer division or modulo by zero
766 773
767 774 [3:execute]:
768 775 ---------------------------------------------------------------------------
769 776 ZeroDivisionError Traceback (most recent call last)
770 777
771 778 /ipython1-client-r3021/docs/examples/<string> in <module>()
772 779
773 780 ZeroDivisionError: integer division or modulo by zero
774 781
775 782 .. note::
776 783
777 784 The above example appears to be broken right now because of a change in
778 785 how we are using Twisted.
779 786
780 787 All of this same error handling magic even works in non-blocking mode:
781 788
782 789 .. sourcecode:: ipython
783 790
784 791 In [83]: mec.block=False
785 792
786 793 In [84]: pr = mec.execute('1/0')
787 794
788 795 In [85]: pr.r
789 796 ---------------------------------------------------------------------------
790 797 CompositeError Traceback (most recent call last)
791 798
792 799 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
793 800
794 801 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in _get_r(self)
795 802 170
796 803 171 def _get_r(self):
797 804 --> 172 return self.get_result(block=True)
798 805 173
799 806 174 r = property(_get_r)
800 807
801 808 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in get_result(self, default, block)
802 809 131 return self.result
803 810 132 try:
804 811 --> 133 result = self.client.get_pending_deferred(self.result_id, block)
805 812 134 except error.ResultNotCompleted:
806 813 135 return default
807 814
808 815 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in get_pending_deferred(self, deferredID, block)
809 816 385
810 817 386 def get_pending_deferred(self, deferredID, block):
811 818 --> 387 return blockingCallFromThread(self.smultiengine.get_pending_deferred, deferredID, block)
812 819 388
813 820 389 def barrier(self, pendingResults):
814 821
815 822 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
816 823 72 result.raiseException()
817 824 73 except Exception, e:
818 825 ---> 74 raise e
819 826 75 return result
820 827 76
821 828
822 829 CompositeError: one or more exceptions from call to method: execute
823 830 [0:execute]: ZeroDivisionError: integer division or modulo by zero
824 831 [1:execute]: ZeroDivisionError: integer division or modulo by zero
825 832 [2:execute]: ZeroDivisionError: integer division or modulo by zero
826 833 [3:execute]: ZeroDivisionError: integer division or modulo by zero
827 834
828 835
@@ -1,351 +1,387 b''
1 1 .. _parallel_process:
2 2
3 3 ===========================================
4 4 Starting the IPython controller and engines
5 5 ===========================================
6 6
7 7 To use IPython for parallel computing, you need to start one instance of
8 8 the controller and one or more instances of the engine. The controller
9 9 and each engine can run on different machines or on the same machine.
10 10 Because of this, there are many different possibilities.
11 11
12 12 Broadly speaking, there are two ways of going about starting a controller and engines:
13 13
14 14 * In an automated manner using the :command:`ipcluster` command.
15 15 * In a more manual way using the :command:`ipcontroller` and
16 16 :command:`ipengine` commands.
17 17
18 This document describes both of these methods. We recommend that new users start with the :command:`ipcluster` command as it simplifies many common usage cases.
18 This document describes both of these methods. We recommend that new users
19 start with the :command:`ipcluster` command as it simplifies many common usage
20 cases.
19 21
20 22 General considerations
21 23 ======================
22 24
23 Before delving into the details about how you can start a controller and engines using the various methods, we outline some of the general issues that come up when starting the controller and engines. These things come up no matter which method you use to start your IPython cluster.
25 Before delving into the details about how you can start a controller and
26 engines using the various methods, we outline some of the general issues that
27 come up when starting the controller and engines. These things come up no
28 matter which method you use to start your IPython cluster.
24 29
25 Let's say that you want to start the controller on ``host0`` and engines on hosts ``host1``-``hostn``. The following steps are then required:
30 Let's say that you want to start the controller on ``host0`` and engines on
31 hosts ``host1``-``hostn``. The following steps are then required:
26 32
27 33 1. Start the controller on ``host0`` by running :command:`ipcontroller` on
28 34 ``host0``.
29 35 2. Move the FURL file (:file:`ipcontroller-engine.furl`) created by the
30 36 controller from ``host0`` to hosts ``host1``-``hostn``.
31 37 3. Start the engines on hosts ``host1``-``hostn`` by running
32 38 :command:`ipengine`. This command has to be told where the FURL file
33 39 (:file:`ipcontroller-engine.furl`) is located.
34 40
35 41 At this point, the controller and engines will be connected. By default, the
36 42 FURL files created by the controller are put into the
37 43 :file:`~/.ipython/security` directory. If the engines share a filesystem with
38 44 the controller, step 2 can be skipped as the engines will automatically look
39 45 at that location.
40 46
41 47 The final step required required to actually use the running controller from a
42 48 client is to move the FURL files :file:`ipcontroller-mec.furl` and
43 49 :file:`ipcontroller-tc.furl` from ``host0`` to the host where the clients will
44 be run. If these file are put into the :file:`~/.ipython/security` directory of the client's host, they will be found automatically. Otherwise, the full path to them has to be passed to the client's constructor.
50 be run. If these file are put into the :file:`~/.ipython/security` directory
51 of the client's host, they will be found automatically. Otherwise, the full
52 path to them has to be passed to the client's constructor.
45 53
46 54 Using :command:`ipcluster`
47 55 ==========================
48 56
49 The :command:`ipcluster` command provides a simple way of starting a controller and engines in the following situations:
57 The :command:`ipcluster` command provides a simple way of starting a
58 controller and engines in the following situations:
50 59
51 60 1. When the controller and engines are all run on localhost. This is useful
52 61 for testing or running on a multicore computer.
53 62 2. When engines are started using the :command:`mpirun` command that comes
54 63 with most MPI [MPI]_ implementations
55 64 3. When engines are started using the PBS [PBS]_ batch system.
56 65 4. When the controller is started on localhost and the engines are started on
57 66 remote nodes using :command:`ssh`.
58 67
59 68 .. note::
60 69
61 70 It is also possible for advanced users to add support to
62 71 :command:`ipcluster` for starting controllers and engines using other
63 72 methods (like Sun's Grid Engine for example).
64 73
65 74 .. note::
66 75
67 76 Currently :command:`ipcluster` requires that the
68 77 :file:`~/.ipython/security` directory live on a shared filesystem that is
69 78 seen by both the controller and engines. If you don't have a shared file
70 79 system you will need to use :command:`ipcontroller` and
71 80 :command:`ipengine` directly. This constraint can be relaxed if you are
72 81 using the :command:`ssh` method to start the cluster.
73 82
74 83 Underneath the hood, :command:`ipcluster` just uses :command:`ipcontroller`
75 84 and :command:`ipengine` to perform the steps described above.
76 85
77 86 Using :command:`ipcluster` in local mode
78 87 ----------------------------------------
79 88
80 89 To start one controller and 4 engines on localhost, just do::
81 90
82 91 $ ipcluster local -n 4
83 92
84 93 To see other command line options for the local mode, do::
85 94
86 95 $ ipcluster local -h
87 96
88 97 Using :command:`ipcluster` in mpiexec/mpirun mode
89 98 -------------------------------------------------
90 99
91 100 The mpiexec/mpirun mode is useful if you:
92 101
93 102 1. Have MPI installed.
94 103 2. Your systems are configured to use the :command:`mpiexec` or
95 104 :command:`mpirun` commands to start MPI processes.
96 105
97 106 .. note::
98 107
99 108 The preferred command to use is :command:`mpiexec`. However, we also
100 109 support :command:`mpirun` for backwards compatibility. The underlying
101 110 logic used is exactly the same, the only difference being the name of the
102 111 command line program that is called.
103 112
104 113 If these are satisfied, you can start an IPython cluster using::
105 114
106 115 $ ipcluster mpiexec -n 4
107 116
108 117 This does the following:
109 118
110 119 1. Starts the IPython controller on current host.
111 120 2. Uses :command:`mpiexec` to start 4 engines.
112 121
113 On newer MPI implementations (such as OpenMPI), this will work even if you don't make any calls to MPI or call :func:`MPI_Init`. However, older MPI implementations actually require each process to call :func:`MPI_Init` upon starting. The easiest way of having this done is to install the mpi4py [mpi4py]_ package and then call ipcluster with the ``--mpi`` option::
122 On newer MPI implementations (such as OpenMPI), this will work even if you
123 don't make any calls to MPI or call :func:`MPI_Init`. However, older MPI
124 implementations actually require each process to call :func:`MPI_Init` upon
125 starting. The easiest way of having this done is to install the mpi4py
126 [mpi4py]_ package and then call ipcluster with the ``--mpi`` option::
114 127
115 128 $ ipcluster mpiexec -n 4 --mpi=mpi4py
116 129
117 Unfortunately, even this won't work for some MPI implementations. If you are having problems with this, you will likely have to use a custom Python executable that itself calls :func:`MPI_Init` at the appropriate time. Fortunately, mpi4py comes with such a custom Python executable that is easy to install and use. However, this custom Python executable approach will not work with :command:`ipcluster` currently.
130 Unfortunately, even this won't work for some MPI implementations. If you are
131 having problems with this, you will likely have to use a custom Python
132 executable that itself calls :func:`MPI_Init` at the appropriate time.
133 Fortunately, mpi4py comes with such a custom Python executable that is easy to
134 install and use. However, this custom Python executable approach will not work
135 with :command:`ipcluster` currently.
118 136
119 137 Additional command line options for this mode can be found by doing::
120 138
121 139 $ ipcluster mpiexec -h
122 140
123 141 More details on using MPI with IPython can be found :ref:`here <parallelmpi>`.
124 142
125 143
126 144 Using :command:`ipcluster` in PBS mode
127 145 --------------------------------------
128 146
129 The PBS mode uses the Portable Batch System [PBS]_ to start the engines. To use this mode, you first need to create a PBS script template that will be used to start the engines. Here is a sample PBS script template:
147 The PBS mode uses the Portable Batch System [PBS]_ to start the engines. To
148 use this mode, you first need to create a PBS script template that will be
149 used to start the engines. Here is a sample PBS script template:
130 150
131 151 .. sourcecode:: bash
132 152
133 153 #PBS -N ipython
134 154 #PBS -j oe
135 155 #PBS -l walltime=00:10:00
136 156 #PBS -l nodes=${n/4}:ppn=4
137 157 #PBS -q parallel
138 158
139 159 cd $$PBS_O_WORKDIR
140 160 export PATH=$$HOME/usr/local/bin
141 161 export PYTHONPATH=$$HOME/usr/local/lib/python2.4/site-packages
142 162 /usr/local/bin/mpiexec -n ${n} ipengine --logfile=$$PBS_O_WORKDIR/ipengine
143 163
144 164 There are a few important points about this template:
145 165
146 166 1. This template will be rendered at runtime using IPython's :mod:`Itpl`
147 167 template engine.
148 168
149 169 2. Instead of putting in the actual number of engines, use the notation
150 170 ``${n}`` to indicate the number of engines to be started. You can also uses
151 171 expressions like ``${n/4}`` in the template to indicate the number of
152 172 nodes.
153 173
154 174 3. Because ``$`` is a special character used by the template engine, you must
155 175 escape any ``$`` by using ``$$``. This is important when referring to
156 176 environment variables in the template.
157 177
158 178 4. Any options to :command:`ipengine` should be given in the batch script
159 179 template.
160 180
161 181 5. Depending on the configuration of you system, you may have to set
162 182 environment variables in the script template.
163 183
164 Once you have created such a script, save it with a name like :file:`pbs.template`. Now you are ready to start your job::
184 Once you have created such a script, save it with a name like
185 :file:`pbs.template`. Now you are ready to start your job::
165 186
166 187 $ ipcluster pbs -n 128 --pbs-script=pbs.template
167 188
168 189 Additional command line options for this mode can be found by doing::
169 190
170 191 $ ipcluster pbs -h
171 192
172 193 Using :command:`ipcluster` in SSH mode
173 194 --------------------------------------
174 195
175 196 The SSH mode uses :command:`ssh` to execute :command:`ipengine` on remote
176 197 nodes and the :command:`ipcontroller` on localhost.
177 198
178 When using using this mode it highly recommended that you have set up SSH keys and are using ssh-agent [SSH]_ for password-less logins.
199 When using using this mode it highly recommended that you have set up SSH keys
200 and are using ssh-agent [SSH]_ for password-less logins.
179 201
180 To use this mode you need a python file describing the cluster, here is an example of such a "clusterfile":
202 To use this mode you need a python file describing the cluster, here is an
203 example of such a "clusterfile":
181 204
182 205 .. sourcecode:: python
183 206
184 207 send_furl = True
185 208 engines = { 'host1.example.com' : 2,
186 209 'host2.example.com' : 5,
187 210 'host3.example.com' : 1,
188 211 'host4.example.com' : 8 }
189 212
190 Since this is a regular python file usual python syntax applies. Things to note:
213 Since this is a regular python file usual python syntax applies. Things to
214 note:
191 215
192 216 * The `engines` dict, where the keys is the host we want to run engines on and
193 217 the value is the number of engines to run on that host.
194 218 * send_furl can either be `True` or `False`, if `True` it will copy over the
195 219 furl needed for :command:`ipengine` to each host.
196 220
197 221 The ``--clusterfile`` command line option lets you specify the file to use for
198 222 the cluster definition. Once you have your cluster file and you can
199 223 :command:`ssh` into the remote hosts with out an password you are ready to
200 224 start your cluster like so:
201 225
202 226 .. sourcecode:: bash
203 227
204 228 $ ipcluster ssh --clusterfile /path/to/my/clusterfile.py
205 229
206 230
207 Two helper shell scripts are used to start and stop :command:`ipengine` on remote hosts:
231 Two helper shell scripts are used to start and stop :command:`ipengine` on
232 remote hosts:
208 233
209 234 * sshx.sh
210 235 * engine_killer.sh
211 236
212 Defaults for both of these are contained in the source code for :command:`ipcluster`. The default scripts are written to a local file in a tmep directory and then copied to a temp directory on the remote host and executed from there. On most Unix, Linux and OS X systems this is /tmp.
237 Defaults for both of these are contained in the source code for
238 :command:`ipcluster`. The default scripts are written to a local file in a
239 tmep directory and then copied to a temp directory on the remote host and
240 executed from there. On most Unix, Linux and OS X systems this is /tmp.
213 241
214 242 The default sshx.sh is the following:
215 243
216 244 .. sourcecode:: bash
217 245
218 246 #!/bin/sh
219 247 "$@" &> /dev/null &
220 248 echo $!
221 249
222 250 If you want to use a custom sshx.sh script you need to use the ``--sshx``
223 251 option and specify the file to use. Using a custom sshx.sh file could be
224 252 helpful when you need to setup the environment on the remote host before
225 253 executing :command:`ipengine`.
226 254
227 255 For a detailed options list:
228 256
229 257 .. sourcecode:: bash
230 258
231 259 $ ipcluster ssh -h
232 260
233 261 Current limitations of the SSH mode of :command:`ipcluster` are:
234 262
235 263 * Untested on Windows. Would require a working :command:`ssh` on Windows.
236 264 Also, we are using shell scripts to setup and execute commands on remote
237 265 hosts.
238 266 * :command:`ipcontroller` is started on localhost, with no option to start it
239 267 on a remote node.
240 268
241 269 Using the :command:`ipcontroller` and :command:`ipengine` commands
242 270 ==================================================================
243 271
244 It is also possible to use the :command:`ipcontroller` and :command:`ipengine` commands to start your controller and engines. This approach gives you full control over all aspects of the startup process.
272 It is also possible to use the :command:`ipcontroller` and :command:`ipengine`
273 commands to start your controller and engines. This approach gives you full
274 control over all aspects of the startup process.
245 275
246 276 Starting the controller and engine on your local machine
247 277 --------------------------------------------------------
248 278
249 279 To use :command:`ipcontroller` and :command:`ipengine` to start things on your
250 280 local machine, do the following.
251 281
252 282 First start the controller::
253 283
254 284 $ ipcontroller
255 285
256 Next, start however many instances of the engine you want using (repeatedly) the command::
286 Next, start however many instances of the engine you want using (repeatedly)
287 the command::
257 288
258 289 $ ipengine
259 290
260 The engines should start and automatically connect to the controller using the FURL files in :file:`~./ipython/security`. You are now ready to use the controller and engines from IPython.
291 The engines should start and automatically connect to the controller using the
292 FURL files in :file:`~./ipython/security`. You are now ready to use the
293 controller and engines from IPython.
261 294
262 295 .. warning::
263 296
264 297 The order of the above operations is very important. You *must*
265 298 start the controller before the engines, since the engines connect
266 299 to the controller as they get started.
267 300
268 301 .. note::
269 302
270 303 On some platforms (OS X), to put the controller and engine into the
271 304 background you may need to give these commands in the form ``(ipcontroller
272 305 &)`` and ``(ipengine &)`` (with the parentheses) for them to work
273 306 properly.
274 307
275 308 Starting the controller and engines on different hosts
276 309 ------------------------------------------------------
277 310
278 311 When the controller and engines are running on different hosts, things are
279 312 slightly more complicated, but the underlying ideas are the same:
280 313
281 314 1. Start the controller on a host using :command:`ipcontroller`.
282 2. Copy :file:`ipcontroller-engine.furl` from :file:`~./ipython/security` on the controller's host to the host where the engines will run.
315 2. Copy :file:`ipcontroller-engine.furl` from :file:`~./ipython/security` on
316 the controller's host to the host where the engines will run.
283 317 3. Use :command:`ipengine` on the engine's hosts to start the engines.
284 318
285 The only thing you have to be careful of is to tell :command:`ipengine` where the :file:`ipcontroller-engine.furl` file is located. There are two ways you can do this:
319 The only thing you have to be careful of is to tell :command:`ipengine` where
320 the :file:`ipcontroller-engine.furl` file is located. There are two ways you
321 can do this:
286 322
287 323 * Put :file:`ipcontroller-engine.furl` in the :file:`~./ipython/security`
288 324 directory on the engine's host, where it will be found automatically.
289 325 * Call :command:`ipengine` with the ``--furl-file=full_path_to_the_file``
290 326 flag.
291 327
292 328 The ``--furl-file`` flag works like this::
293 329
294 330 $ ipengine --furl-file=/path/to/my/ipcontroller-engine.furl
295 331
296 332 .. note::
297 333
298 334 If the controller's and engine's hosts all have a shared file system
299 335 (:file:`~./ipython/security` is the same on all of them), then things
300 336 will just work!
301 337
302 338 Make FURL files persistent
303 339 ---------------------------
304 340
305 341 At fist glance it may seem that that managing the FURL files is a bit
306 342 annoying. Going back to the house and key analogy, copying the FURL around
307 343 each time you start the controller is like having to make a new key every time
308 344 you want to unlock the door and enter your house. As with your house, you want
309 345 to be able to create the key (or FURL file) once, and then simply use it at
310 346 any point in the future.
311 347
312 348 This is possible, but before you do this, you **must** remove any old FURL
313 349 files in the :file:`~/.ipython/security` directory.
314 350
315 351 .. warning::
316 352
317 353 You **must** remove old FURL files before using persistent FURL files.
318 354
319 355 Then, The only thing you have to do is decide what ports the controller will
320 356 listen on for the engines and clients. This is done as follows::
321 357
322 358 $ ipcontroller -r --client-port=10101 --engine-port=10102
323 359
324 360 These options also work with all of the various modes of
325 361 :command:`ipcluster`::
326 362
327 363 $ ipcluster local -n 2 -r --client-port=10101 --engine-port=10102
328 364
329 365 Then, just copy the furl files over the first time and you are set. You can
330 366 start and stop the controller and engines any many times as you want in the
331 367 future, just make sure to tell the controller to use the *same* ports.
332 368
333 369 .. note::
334 370
335 371 You may ask the question: what ports does the controller listen on if you
336 372 don't tell is to use specific ones? The default is to use high random port
337 373 numbers. We do this for two reasons: i) to increase security through
338 374 obscurity and ii) to multiple controllers on a given host to start and
339 375 automatically use different ports.
340 376
341 377 Log files
342 378 ---------
343 379
344 380 All of the components of IPython have log files associated with them.
345 381 These log files can be extremely useful in debugging problems with
346 382 IPython and can be found in the directory :file:`~/.ipython/log`. Sending
347 383 the log files to us will often help us to debug any problems.
348 384
349 385
350 386 .. [PBS] Portable Batch System. http://www.openpbs.org/
351 387 .. [SSH] SSH-Agent http://en.wikipedia.org/wiki/Ssh-agent
@@ -1,363 +1,364 b''
1 1 .. _parallelsecurity:
2 2
3 3 ===========================
4 4 Security details of IPython
5 5 ===========================
6 6
7 7 IPython's :mod:`IPython.kernel` package exposes the full power of the Python
8 8 interpreter over a TCP/IP network for the purposes of parallel computing. This
9 9 feature brings up the important question of IPython's security model. This
10 10 document gives details about this model and how it is implemented in IPython's
11 11 architecture.
12 12
13 13 Processs and network topology
14 14 =============================
15 15
16 16 To enable parallel computing, IPython has a number of different processes that
17 17 run. These processes are discussed at length in the IPython documentation and
18 18 are summarized here:
19 19
20 20 * The IPython *engine*. This process is a full blown Python
21 21 interpreter in which user code is executed. Multiple
22 22 engines are started to make parallel computing possible.
23 23 * The IPython *controller*. This process manages a set of
24 24 engines, maintaining a queue for each and presenting
25 25 an asynchronous interface to the set of engines.
26 26 * The IPython *client*. This process is typically an
27 27 interactive Python process that is used to coordinate the
28 28 engines to get a parallel computation done.
29 29
30 30 Collectively, these three processes are called the IPython *kernel*.
31 31
32 32 These three processes communicate over TCP/IP connections with a well defined
33 33 topology. The IPython controller is the only process that listens on TCP/IP
34 34 sockets. Upon starting, an engine connects to a controller and registers
35 35 itself with the controller. These engine/controller TCP/IP connections persist
36 36 for the lifetime of each engine.
37 37
38 38 The IPython client also connects to the controller using one or more TCP/IP
39 39 connections. These connections persist for the lifetime of the client only.
40 40
41 41 A given IPython controller and set of engines typically has a relatively short
42 42 lifetime. Typically this lifetime corresponds to the duration of a single
43 43 parallel simulation performed by a single user. Finally, the controller,
44 44 engines and client processes typically execute with the permissions of that
45 45 same user. More specifically, the controller and engines are *not* executed as
46 46 root or with any other superuser permissions.
47 47
48 48 Application logic
49 49 =================
50 50
51 51 When running the IPython kernel to perform a parallel computation, a user
52 52 utilizes the IPython client to send Python commands and data through the
53 53 IPython controller to the IPython engines, where those commands are executed
54 54 and the data processed. The design of IPython ensures that the client is the
55 only access point for the capabilities of the engines. That is, the only way of addressing the engines is through a client.
55 only access point for the capabilities of the engines. That is, the only way
56 of addressing the engines is through a client.
56 57
57 58 A user can utilize the client to instruct the IPython engines to execute
58 59 arbitrary Python commands. These Python commands can include calls to the
59 60 system shell, access the filesystem, etc., as required by the user's
60 61 application code. From this perspective, when a user runs an IPython engine on
61 62 a host, that engine has the same capabilities and permissions as the user
62 63 themselves (as if they were logged onto the engine's host with a terminal).
63 64
64 65 Secure network connections
65 66 ==========================
66 67
67 68 Overview
68 69 --------
69 70
70 71 All TCP/IP connections between the client and controller as well as the
71 72 engines and controller are fully encrypted and authenticated. This section
72 73 describes the details of the encryption and authentication approached used
73 74 within IPython.
74 75
75 76 IPython uses the Foolscap network protocol [Foolscap]_ for all communications
76 77 between processes. Thus, the details of IPython's security model are directly
77 78 related to those of Foolscap. Thus, much of the following discussion is
78 79 actually just a discussion of the security that is built in to Foolscap.
79 80
80 81 Encryption
81 82 ----------
82 83
83 84 For encryption purposes, IPython and Foolscap use the well known Secure Socket
84 85 Layer (SSL) protocol [RFC5246]_. We use the implementation of this protocol
85 86 provided by the OpenSSL project through the pyOpenSSL [pyOpenSSL]_ Python
86 87 bindings to OpenSSL.
87 88
88 89 Authentication
89 90 --------------
90 91
91 92 IPython clients and engines must also authenticate themselves with the
92 93 controller. This is handled in a capabilities based security model
93 94 [Capability]_. In this model, the controller creates a strong cryptographic
94 95 key or token that represents each set of capability that the controller
95 96 offers. Any party who has this key and presents it to the controller has full
96 97 access to the corresponding capabilities of the controller. This model is
97 98 analogous to using a physical key to gain access to physical items
98 99 (capabilities) behind a locked door.
99 100
100 101 For a capabilities based authentication system to prevent unauthorized access,
101 102 two things must be ensured:
102 103
103 104 * The keys must be cryptographically strong. Otherwise attackers could gain
104 105 access by a simple brute force key guessing attack.
105 106 * The actual keys must be distributed only to authorized parties.
106 107
107 108 The keys in Foolscap are called Foolscap URL's or FURLs. The following section
108 109 gives details about how these FURLs are created in Foolscap. The IPython
109 110 controller creates a number of FURLs for different purposes:
110 111
111 112 * One FURL that grants IPython engines access to the controller. Also
112 113 implicit in this access is permission to execute code sent by an
113 114 authenticated IPython client.
114 115 * Two or more FURLs that grant IPython clients access to the controller.
115 116 Implicit in this access is permission to give the controller's engine code
116 117 to execute.
117 118
118 119 Upon starting, the controller creates these different FURLS and writes them
119 files in the user-read-only directory :file:`$HOME/.ipython/security`. Thus, only the
120 user who starts the controller has access to the FURLs.
120 files in the user-read-only directory :file:`$HOME/.ipython/security`. Thus,
121 only the user who starts the controller has access to the FURLs.
121 122
122 123 For an IPython client or engine to authenticate with a controller, it must
123 124 present the appropriate FURL to the controller upon connecting. If the
124 125 FURL matches what the controller expects for a given capability, access is
125 126 granted. If not, access is denied. The exchange of FURLs is done after
126 127 encrypted communications channels have been established to prevent attackers
127 128 from capturing them.
128 129
129 130 .. note::
130 131
131 132 The FURL is similar to an unsigned private key in SSH.
132 133
133 134 Details of the Foolscap handshake
134 135 ---------------------------------
135 136
136 137 In this section we detail the precise security handshake that takes place at
137 138 the beginning of any network connection in IPython. For the purposes of this
138 139 discussion, the SERVER is the IPython controller process and the CLIENT is the
139 140 IPython engine or client process.
140 141
141 142 Upon starting, all IPython processes do the following:
142 143
143 144 1. Create a public key x509 certificate (ISO/IEC 9594).
144 145 2. Create a hash of the contents of the certificate using the SHA-1 algorithm.
145 146 The base-32 encoded version of this hash is saved by the process as its
146 147 process id (actually in Foolscap, this is the Tub id, but here refer to
147 148 it as the process id).
148 149
149 150 Upon starting, the IPython controller also does the following:
150 151
151 152 1. Save the x509 certificate to disk in a secure location. The CLIENT
152 153 certificate is never saved to disk.
153 154 2. Create a FURL for each capability that the controller has. There are
154 155 separate capabilities the controller offers for clients and engines. The
155 156 FURL is created using: a) the process id of the SERVER, b) the IP
156 157 address and port the SERVER is listening on and c) a 160 bit,
157 158 cryptographically secure string that represents the capability (the
158 159 "capability id").
159 160 3. The FURLs are saved to disk in a secure location on the SERVER's host.
160 161
161 162 For a CLIENT to be able to connect to the SERVER and access a capability of
162 163 that SERVER, the CLIENT must have knowledge of the FURL for that SERVER's
163 164 capability. This typically requires that the file containing the FURL be
164 165 moved from the SERVER's host to the CLIENT's host. This is done by the end
165 166 user who started the SERVER and wishes to have a CLIENT connect to the SERVER.
166 167
167 168 When a CLIENT connects to the SERVER, the following handshake protocol takes
168 169 place:
169 170
170 171 1. The CLIENT tells the SERVER what process (or Tub) id it expects the SERVER
171 172 to have.
172 173 2. If the SERVER has that process id, it notifies the CLIENT that it will now
173 174 enter encrypted mode. If the SERVER has a different id, the SERVER aborts.
174 175 3. Both CLIENT and SERVER initiate the SSL handshake protocol.
175 176 4. Both CLIENT and SERVER request the certificate of their peer and verify
176 177 that certificate. If this succeeds, all further communications are
177 178 encrypted.
178 179 5. Both CLIENT and SERVER send a hello block containing connection parameters
179 180 and their process id.
180 181 6. The CLIENT and SERVER check that their peer's stated process id matches the
181 182 hash of the x509 certificate the peer presented. If not, the connection is
182 183 aborted.
183 184 7. The CLIENT verifies that the SERVER's stated id matches the id of the
184 185 SERVER the CLIENT is intending to connect to. If not, the connection is
185 186 aborted.
186 187 8. The CLIENT and SERVER elect a master who decides on the final connection
187 188 parameters.
188 189
189 190 The public/private key pair associated with each process's x509 certificate
190 191 are completely hidden from this handshake protocol. There are however, used
191 192 internally by OpenSSL as part of the SSL handshake protocol. Each process
192 193 keeps their own private key hidden and sends its peer only the public key
193 194 (embedded in the certificate).
194 195
195 196 Finally, when the CLIENT requests access to a particular SERVER capability,
196 197 the following happens:
197 198
198 199 1. The CLIENT asks the SERVER for access to a capability by presenting that
199 200 capabilities id.
200 201 2. If the SERVER has a capability with that id, access is granted. If not,
201 202 access is not granted.
202 203 3. Once access has been gained, the CLIENT can use the capability.
203 204
204 205 Specific security vulnerabilities
205 206 =================================
206 207
207 208 There are a number of potential security vulnerabilities present in IPython's
208 209 architecture. In this section we discuss those vulnerabilities and detail how
209 210 the security architecture described above prevents them from being exploited.
210 211
211 212 Unauthorized clients
212 213 --------------------
213 214
214 215 The IPython client can instruct the IPython engines to execute arbitrary
215 216 Python code with the permissions of the user who started the engines. If an
216 217 attacker were able to connect their own hostile IPython client to the IPython
217 218 controller, they could instruct the engines to execute code.
218 219
219 220 This attack is prevented by the capabilities based client authentication
220 221 performed after the encrypted channel has been established. The relevant
221 222 authentication information is encoded into the FURL that clients must
222 223 present to gain access to the IPython controller. By limiting the distribution
223 224 of those FURLs, a user can grant access to only authorized persons.
224 225
225 226 It is highly unlikely that a client FURL could be guessed by an attacker
226 227 in a brute force guessing attack. A given instance of the IPython controller
227 228 only runs for a relatively short amount of time (on the order of hours). Thus
228 229 an attacker would have only a limited amount of time to test a search space of
229 230 size 2**320. Furthermore, even if a controller were to run for a longer amount
230 231 of time, this search space is quite large (larger for instance than that of
231 232 typical username/password pair).
232 233
233 234 Unauthorized engines
234 235 --------------------
235 236
236 237 If an attacker were able to connect a hostile engine to a user's controller,
237 238 the user might unknowingly send sensitive code or data to the hostile engine.
238 239 This attacker's engine would then have full access to that code and data.
239 240
240 241 This type of attack is prevented in the same way as the unauthorized client
241 242 attack, through the usage of the capabilities based authentication scheme.
242 243
243 244 Unauthorized controllers
244 245 ------------------------
245 246
246 247 It is also possible that an attacker could try to convince a user's IPython
247 248 client or engine to connect to a hostile IPython controller. That controller
248 249 would then have full access to the code and data sent between the IPython
249 250 client and the IPython engines.
250 251
251 252 Again, this attack is prevented through the FURLs, which ensure that a
252 253 client or engine connects to the correct controller. It is also important to
253 254 note that the FURLs also encode the IP address and port that the
254 255 controller is listening on, so there is little chance of mistakenly connecting
255 256 to a controller running on a different IP address and port.
256 257
257 258 When starting an engine or client, a user must specify which FURL to use
258 259 for that connection. Thus, in order to introduce a hostile controller, the
259 260 attacker must convince the user to use the FURLs associated with the
260 261 hostile controller. As long as a user is diligent in only using FURLs from
261 262 trusted sources, this attack is not possible.
262 263
263 264 Other security measures
264 265 =======================
265 266
266 267 A number of other measures are taken to further limit the security risks
267 268 involved in running the IPython kernel.
268 269
269 270 First, by default, the IPython controller listens on random port numbers.
270 271 While this can be overridden by the user, in the default configuration, an
271 272 attacker would have to do a port scan to even find a controller to attack.
272 273 When coupled with the relatively short running time of a typical controller
273 274 (on the order of hours), an attacker would have to work extremely hard and
274 275 extremely *fast* to even find a running controller to attack.
275 276
276 277 Second, much of the time, especially when run on supercomputers or clusters,
277 278 the controller is running behind a firewall. Thus, for engines or client to
278 279 connect to the controller:
279 280
280 281 * The different processes have to all be behind the firewall.
281 282
282 283 or:
283 284
284 285 * The user has to use SSH port forwarding to tunnel the
285 286 connections through the firewall.
286 287
287 288 In either case, an attacker is presented with addition barriers that prevent
288 289 attacking or even probing the system.
289 290
290 291 Summary
291 292 =======
292 293
293 294 IPython's architecture has been carefully designed with security in mind. The
294 295 capabilities based authentication model, in conjunction with the encrypted
295 296 TCP/IP channels, address the core potential vulnerabilities in the system,
296 297 while still enabling user's to use the system in open networks.
297 298
298 299 Other questions
299 300 ===============
300 301
301 302 About keys
302 303 ----------
303 304
304 305 Can you clarify the roles of the certificate and its keys versus the FURL,
305 306 which is also called a key?
306 307
307 308 The certificate created by IPython processes is a standard public key x509
308 309 certificate, that is used by the SSL handshake protocol to setup encrypted
309 310 channel between the controller and the IPython engine or client. This public
310 311 and private key associated with this certificate are used only by the SSL
311 312 handshake protocol in setting up this encrypted channel.
312 313
313 314 The FURL serves a completely different and independent purpose from the
314 315 key pair associated with the certificate. When we refer to a FURL as a
315 316 key, we are using the word "key" in the capabilities based security model
316 317 sense. This has nothing to do with "key" in the public/private key sense used
317 318 in the SSL protocol.
318 319
319 320 With that said the FURL is used as an cryptographic key, to grant
320 321 IPython engines and clients access to particular capabilities that the
321 322 controller offers.
322 323
323 324 Self signed certificates
324 325 ------------------------
325 326
326 327 Is the controller creating a self-signed certificate? Is this created for per
327 328 instance/session, one-time-setup or each-time the controller is started?
328 329
329 330 The Foolscap network protocol, which handles the SSL protocol details, creates
330 331 a self-signed x509 certificate using OpenSSL for each IPython process. The
331 332 lifetime of the certificate is handled differently for the IPython controller
332 333 and the engines/client.
333 334
334 335 For the IPython engines and client, the certificate is only held in memory for
335 336 the lifetime of its process. It is never written to disk.
336 337
337 338 For the controller, the certificate can be created anew each time the
338 339 controller starts or it can be created once and reused each time the
339 340 controller starts. If at any point, the certificate is deleted, a new one is
340 341 created the next time the controller starts.
341 342
342 343 SSL private key
343 344 ---------------
344 345
345 346 How the private key (associated with the certificate) is distributed?
346 347
347 348 In the usual implementation of the SSL protocol, the private key is never
348 349 distributed. We follow this standard always.
349 350
350 351 SSL versus Foolscap authentication
351 352 ----------------------------------
352 353
353 354 Many SSL connections only perform one sided authentication (the server to the
354 355 client). How is the client authentication in IPython's system related to SSL
355 356 authentication?
356 357
357 358 We perform a two way SSL handshake in which both parties request and verify
358 359 the certificate of their peer. This mutual authentication is handled by the
359 360 SSL handshake and is separate and independent from the additional
360 361 authentication steps that the CLIENT and SERVER perform after an encrypted
361 362 channel is established.
362 363
363 364 .. [RFC5246] <http://tools.ietf.org/html/rfc5246>
@@ -1,99 +1,120 b''
1 1 .. _paralleltask:
2 2
3 3 ==========================
4 4 The IPython task interface
5 5 ==========================
6 6
7 The task interface to the controller presents the engines as a fault tolerant, dynamic load-balanced system or workers. Unlike the multiengine interface, in the task interface, the user have no direct access to individual engines. In some ways, this interface is simpler, but in other ways it is more powerful.
8
9 Best of all the user can use both of these interfaces running at the same time to take advantage or both of their strengths. When the user can break up the user's work into segments that do not depend on previous execution, the task interface is ideal. But it also has more power and flexibility, allowing the user to guide the distribution of jobs, without having to assign tasks to engines explicitly.
7 The task interface to the controller presents the engines as a fault tolerant,
8 dynamic load-balanced system or workers. Unlike the multiengine interface, in
9 the task interface, the user have no direct access to individual engines. In
10 some ways, this interface is simpler, but in other ways it is more powerful.
11
12 Best of all the user can use both of these interfaces running at the same time
13 to take advantage or both of their strengths. When the user can break up the
14 user's work into segments that do not depend on previous execution, the task
15 interface is ideal. But it also has more power and flexibility, allowing the
16 user to guide the distribution of jobs, without having to assign tasks to
17 engines explicitly.
10 18
11 19 Starting the IPython controller and engines
12 20 ===========================================
13 21
14 22 To follow along with this tutorial, you will need to start the IPython
15 23 controller and four IPython engines. The simplest way of doing this is to use
16 24 the :command:`ipcluster` command::
17 25
18 26 $ ipcluster local -n 4
19 27
20 28 For more detailed information about starting the controller and engines, see
21 29 our :ref:`introduction <ip1par>` to using IPython for parallel computing.
22 30
23 31 Creating a ``TaskClient`` instance
24 32 =========================================
25 33
26 34 The first step is to import the IPython :mod:`IPython.kernel.client` module
27 35 and then create a :class:`TaskClient` instance:
28 36
29 37 .. sourcecode:: ipython
30 38
31 39 In [1]: from IPython.kernel import client
32 40
33 41 In [2]: tc = client.TaskClient()
34 42
35 43 This form assumes that the :file:`ipcontroller-tc.furl` is in the
36 44 :file:`~./ipython/security` directory on the client's host. If not, the
37 45 location of the FURL file must be given as an argument to the
38 46 constructor:
39 47
40 48 .. sourcecode:: ipython
41 49
42 50 In [2]: mec = client.TaskClient('/path/to/my/ipcontroller-tc.furl')
43 51
44 52 Quick and easy parallelism
45 53 ==========================
46 54
47 In many cases, you simply want to apply a Python function to a sequence of objects, but *in parallel*. Like the multiengine interface, the task interface provides two simple ways of accomplishing this: a parallel version of :func:`map` and ``@parallel`` function decorator. However, the verions in the task interface have one important difference: they are dynamically load balanced. Thus, if the execution time per item varies significantly, you should use the versions in the task interface.
55 In many cases, you simply want to apply a Python function to a sequence of
56 objects, but *in parallel*. Like the multiengine interface, the task interface
57 provides two simple ways of accomplishing this: a parallel version of
58 :func:`map` and ``@parallel`` function decorator. However, the verions in the
59 task interface have one important difference: they are dynamically load
60 balanced. Thus, if the execution time per item varies significantly, you
61 should use the versions in the task interface.
48 62
49 63 Parallel map
50 64 ------------
51 65
52 The parallel :meth:`map` in the task interface is similar to that in the multiengine interface:
66 The parallel :meth:`map` in the task interface is similar to that in the
67 multiengine interface:
53 68
54 69 .. sourcecode:: ipython
55 70
56 71 In [63]: serial_result = map(lambda x:x**10, range(32))
57 72
58 73 In [64]: parallel_result = tc.map(lambda x:x**10, range(32))
59 74
60 75 In [65]: serial_result==parallel_result
61 76 Out[65]: True
62 77
63 78 Parallel function decorator
64 79 ---------------------------
65 80
66 Parallel functions are just like normal function, but they can be called on sequences and *in parallel*. The multiengine interface provides a decorator that turns any Python function into a parallel function:
81 Parallel functions are just like normal function, but they can be called on
82 sequences and *in parallel*. The multiengine interface provides a decorator
83 that turns any Python function into a parallel function:
67 84
68 85 .. sourcecode:: ipython
69 86
70 87 In [10]: @tc.parallel()
71 88 ....: def f(x):
72 89 ....: return 10.0*x**4
73 90 ....:
74 91
75 92 In [11]: f(range(32)) # this is done in parallel
76 93 Out[11]:
77 94 [0.0,10.0,160.0,...]
78 95
79 96 More details
80 97 ============
81 98
82 The :class:`TaskClient` has many more powerful features that allow quite a bit of flexibility in how tasks are defined and run. The next places to look are in the following classes:
99 The :class:`TaskClient` has many more powerful features that allow quite a bit
100 of flexibility in how tasks are defined and run. The next places to look are
101 in the following classes:
83 102
84 103 * :class:`IPython.kernel.client.TaskClient`
85 104 * :class:`IPython.kernel.client.StringTask`
86 105 * :class:`IPython.kernel.client.MapTask`
87 106
88 107 The following is an overview of how to use these classes together:
89 108
90 109 1. Create a :class:`TaskClient`.
91 110 2. Create one or more instances of :class:`StringTask` or :class:`MapTask`
92 111 to define your tasks.
93 112 3. Submit your tasks to using the :meth:`run` method of your
94 113 :class:`TaskClient` instance.
95 114 4. Use :meth:`TaskClient.get_task_result` to get the results of the
96 115 tasks.
97 116
98 We are in the process of developing more detailed information about the task interface. For now, the docstrings of the :class:`TaskClient`, :class:`StringTask` and :class:`MapTask` classes should be consulted.
117 We are in the process of developing more detailed information about the task
118 interface. For now, the docstrings of the :class:`TaskClient`,
119 :class:`StringTask` and :class:`MapTask` classes should be consulted.
99 120
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now