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