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