##// END OF EJS Templates
- Bug fixes in Demo code to support demos with IPython syntax...
fperez -
Show More

The requested changes are too big and content was truncated. Show full diff

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