##// END OF EJS Templates
callable alias fixes
vivainio -
Show More
@@ -1,182 +1,183 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 %store magic for lightweight persistence.
3 %store magic for lightweight persistence.
4
4
5 Stores variables, aliases etc. in PickleShare database.
5 Stores variables, aliases etc. in PickleShare database.
6
6
7 $Id: iplib.py 1107 2006-01-30 19:02:20Z vivainio $
7 $Id: iplib.py 1107 2006-01-30 19:02:20Z vivainio $
8 """
8 """
9
9
10 import IPython.ipapi
10 import IPython.ipapi
11 ip = IPython.ipapi.get()
11 ip = IPython.ipapi.get()
12
12
13 import pickleshare
13 import pickleshare
14
14
15 import inspect,pickle,os,sys,textwrap
15 import inspect,pickle,os,sys,textwrap
16 from IPython.FakeModule import FakeModule
16 from IPython.FakeModule import FakeModule
17
17
18 def restore_aliases(self):
18 def restore_aliases(self):
19 ip = self.getapi()
19 ip = self.getapi()
20 staliases = ip.db.get('stored_aliases', {})
20 staliases = ip.db.get('stored_aliases', {})
21 for k,v in staliases.items():
21 for k,v in staliases.items():
22 #print "restore alias",k,v # dbg
22 #print "restore alias",k,v # dbg
23 self.alias_table[k] = v
23 #self.alias_table[k] = v
24 ip.defalias(k,v)
24
25
25
26
26 def refresh_variables(ip):
27 def refresh_variables(ip):
27 db = ip.db
28 db = ip.db
28 for key in db.keys('autorestore/*'):
29 for key in db.keys('autorestore/*'):
29 # strip autorestore
30 # strip autorestore
30 justkey = os.path.basename(key)
31 justkey = os.path.basename(key)
31 try:
32 try:
32 obj = db[key]
33 obj = db[key]
33 except KeyError:
34 except KeyError:
34 print "Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey
35 print "Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey
35 print "The error was:",sys.exc_info()[0]
36 print "The error was:",sys.exc_info()[0]
36 else:
37 else:
37 #print "restored",justkey,"=",obj #dbg
38 #print "restored",justkey,"=",obj #dbg
38 ip.user_ns[justkey] = obj
39 ip.user_ns[justkey] = obj
39
40
40
41
41 def restore_dhist(ip):
42 def restore_dhist(ip):
42 db = ip.db
43 db = ip.db
43 ip.user_ns['_dh'] = db.get('dhist',[])
44 ip.user_ns['_dh'] = db.get('dhist',[])
44
45
45 def restore_data(self):
46 def restore_data(self):
46 ip = self.getapi()
47 ip = self.getapi()
47 refresh_variables(ip)
48 refresh_variables(ip)
48 restore_aliases(self)
49 restore_aliases(self)
49 restore_dhist(self)
50 restore_dhist(self)
50 raise IPython.ipapi.TryNext
51 raise IPython.ipapi.TryNext
51
52
52 ip.set_hook('late_startup_hook', restore_data)
53 ip.set_hook('late_startup_hook', restore_data)
53
54
54 def magic_store(self, parameter_s=''):
55 def magic_store(self, parameter_s=''):
55 """Lightweight persistence for python variables.
56 """Lightweight persistence for python variables.
56
57
57 Example:
58 Example:
58
59
59 ville@badger[~]|1> A = ['hello',10,'world']\\
60 ville@badger[~]|1> A = ['hello',10,'world']\\
60 ville@badger[~]|2> %store A\\
61 ville@badger[~]|2> %store A\\
61 ville@badger[~]|3> Exit
62 ville@badger[~]|3> Exit
62
63
63 (IPython session is closed and started again...)
64 (IPython session is closed and started again...)
64
65
65 ville@badger:~$ ipython -p pysh\\
66 ville@badger:~$ ipython -p pysh\\
66 ville@badger[~]|1> print A
67 ville@badger[~]|1> print A
67
68
68 ['hello', 10, 'world']
69 ['hello', 10, 'world']
69
70
70 Usage:
71 Usage:
71
72
72 %store - Show list of all variables and their current values\\
73 %store - Show list of all variables and their current values\\
73 %store <var> - Store the *current* value of the variable to disk\\
74 %store <var> - Store the *current* value of the variable to disk\\
74 %store -d <var> - Remove the variable and its value from storage\\
75 %store -d <var> - Remove the variable and its value from storage\\
75 %store -z - Remove all variables from storage\\
76 %store -z - Remove all variables from storage\\
76 %store -r - Refresh all variables from store (delete current vals)\\
77 %store -r - Refresh all variables from store (delete current vals)\\
77 %store foo >a.txt - Store value of foo to new file a.txt\\
78 %store foo >a.txt - Store value of foo to new file a.txt\\
78 %store foo >>a.txt - Append value of foo to file a.txt\\
79 %store foo >>a.txt - Append value of foo to file a.txt\\
79
80
80 It should be noted that if you change the value of a variable, you
81 It should be noted that if you change the value of a variable, you
81 need to %store it again if you want to persist the new value.
82 need to %store it again if you want to persist the new value.
82
83
83 Note also that the variables will need to be pickleable; most basic
84 Note also that the variables will need to be pickleable; most basic
84 python types can be safely %stored.
85 python types can be safely %stored.
85
86
86 Also aliases can be %store'd across sessions.
87 Also aliases can be %store'd across sessions.
87 """
88 """
88
89
89 opts,argsl = self.parse_options(parameter_s,'drz',mode='string')
90 opts,argsl = self.parse_options(parameter_s,'drz',mode='string')
90 args = argsl.split(None,1)
91 args = argsl.split(None,1)
91 ip = self.getapi()
92 ip = self.getapi()
92 db = ip.db
93 db = ip.db
93 # delete
94 # delete
94 if opts.has_key('d'):
95 if opts.has_key('d'):
95 try:
96 try:
96 todel = args[0]
97 todel = args[0]
97 except IndexError:
98 except IndexError:
98 error('You must provide the variable to forget')
99 error('You must provide the variable to forget')
99 else:
100 else:
100 try:
101 try:
101 del db['autorestore/' + todel]
102 del db['autorestore/' + todel]
102 except:
103 except:
103 error("Can't delete variable '%s'" % todel)
104 error("Can't delete variable '%s'" % todel)
104 # reset
105 # reset
105 elif opts.has_key('z'):
106 elif opts.has_key('z'):
106 for k in db.keys('autorestore/*'):
107 for k in db.keys('autorestore/*'):
107 del db[k]
108 del db[k]
108
109
109 elif opts.has_key('r'):
110 elif opts.has_key('r'):
110 refresh_variables(ip)
111 refresh_variables(ip)
111
112
112
113
113 # run without arguments -> list variables & values
114 # run without arguments -> list variables & values
114 elif not args:
115 elif not args:
115 vars = self.db.keys('autorestore/*')
116 vars = self.db.keys('autorestore/*')
116 vars.sort()
117 vars.sort()
117 if vars:
118 if vars:
118 size = max(map(len,vars))
119 size = max(map(len,vars))
119 else:
120 else:
120 size = 0
121 size = 0
121
122
122 print 'Stored variables and their in-db values:'
123 print 'Stored variables and their in-db values:'
123 fmt = '%-'+str(size)+'s -> %s'
124 fmt = '%-'+str(size)+'s -> %s'
124 get = db.get
125 get = db.get
125 for var in vars:
126 for var in vars:
126 justkey = os.path.basename(var)
127 justkey = os.path.basename(var)
127 # print 30 first characters from every var
128 # print 30 first characters from every var
128 print fmt % (justkey,repr(get(var,'<unavailable>'))[:50])
129 print fmt % (justkey,repr(get(var,'<unavailable>'))[:50])
129
130
130 # default action - store the variable
131 # default action - store the variable
131 else:
132 else:
132 # %store foo >file.txt or >>file.txt
133 # %store foo >file.txt or >>file.txt
133 if len(args) > 1 and args[1].startswith('>'):
134 if len(args) > 1 and args[1].startswith('>'):
134 fnam = os.path.expanduser(args[1].lstrip('>').lstrip())
135 fnam = os.path.expanduser(args[1].lstrip('>').lstrip())
135 if args[1].startswith('>>'):
136 if args[1].startswith('>>'):
136 fil = open(fnam,'a')
137 fil = open(fnam,'a')
137 else:
138 else:
138 fil = open(fnam,'w')
139 fil = open(fnam,'w')
139 obj = ip.ev(args[0])
140 obj = ip.ev(args[0])
140 print "Writing '%s' (%s) to file '%s'." % (args[0],
141 print "Writing '%s' (%s) to file '%s'." % (args[0],
141 obj.__class__.__name__, fnam)
142 obj.__class__.__name__, fnam)
142
143
143
144
144 if not isinstance (obj,basestring):
145 if not isinstance (obj,basestring):
145 from pprint import pprint
146 from pprint import pprint
146 pprint(obj,fil)
147 pprint(obj,fil)
147 else:
148 else:
148 fil.write(obj)
149 fil.write(obj)
149 if not obj.endswith('\n'):
150 if not obj.endswith('\n'):
150 fil.write('\n')
151 fil.write('\n')
151
152
152 fil.close()
153 fil.close()
153 return
154 return
154
155
155 # %store foo
156 # %store foo
156 try:
157 try:
157 obj = ip.user_ns[args[0]]
158 obj = ip.user_ns[args[0]]
158 except KeyError:
159 except KeyError:
159 # it might be an alias
160 # it might be an alias
160 if args[0] in self.alias_table:
161 if args[0] in self.alias_table:
161 staliases = db.get('stored_aliases',{})
162 staliases = db.get('stored_aliases',{})
162 staliases[ args[0] ] = self.alias_table[ args[0] ]
163 staliases[ args[0] ] = self.alias_table[ args[0] ]
163 db['stored_aliases'] = staliases
164 db['stored_aliases'] = staliases
164 print "Alias stored:", args[0], self.alias_table[ args[0] ]
165 print "Alias stored:", args[0], self.alias_table[ args[0] ]
165 return
166 return
166 else:
167 else:
167 print "Error: unknown variable '%s'" % args[0]
168 print "Error: unknown variable '%s'" % args[0]
168
169
169 else:
170 else:
170 if isinstance(inspect.getmodule(obj), FakeModule):
171 if isinstance(inspect.getmodule(obj), FakeModule):
171 print textwrap.dedent("""\
172 print textwrap.dedent("""\
172 Warning:%s is %s
173 Warning:%s is %s
173 Proper storage of interactively declared classes (or instances
174 Proper storage of interactively declared classes (or instances
174 of those classes) is not possible! Only instances
175 of those classes) is not possible! Only instances
175 of classes in real modules on file system can be %%store'd.
176 of classes in real modules on file system can be %%store'd.
176 """ % (args[0], obj) )
177 """ % (args[0], obj) )
177 return
178 return
178 #pickled = pickle.dumps(obj)
179 #pickled = pickle.dumps(obj)
179 self.db[ 'autorestore/' + args[0] ] = obj
180 self.db[ 'autorestore/' + args[0] ] = obj
180 print "Stored '%s' (%s)" % (args[0], obj.__class__.__name__)
181 print "Stored '%s' (%s)" % (args[0], obj.__class__.__name__)
181
182
182 ip.expose_magic('store',magic_store)
183 ip.expose_magic('store',magic_store)
@@ -1,3002 +1,3006 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 2607 2007-08-13 13:25:24Z fperez $"""
4 $Id: Magic.py 2637 2007-08-17 16:18:05Z vivainio $"""
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 from sets import Set
38 from sets import Set
39
39
40 # cProfile was added in Python2.5
40 # cProfile was added in Python2.5
41 try:
41 try:
42 import cProfile as profile
42 import cProfile as profile
43 import pstats
43 import pstats
44 except ImportError:
44 except ImportError:
45 # profile isn't bundled by default in Debian for license reasons
45 # profile isn't bundled by default in Debian for license reasons
46 try:
46 try:
47 import profile,pstats
47 import profile,pstats
48 except ImportError:
48 except ImportError:
49 profile = pstats = None
49 profile = pstats = None
50
50
51 # Homebrewed
51 # Homebrewed
52 import IPython
52 import IPython
53 from IPython import Debugger, OInspect, wildcard
53 from IPython import Debugger, OInspect, wildcard
54 from IPython.FakeModule import FakeModule
54 from IPython.FakeModule import FakeModule
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
56 from IPython.PyColorize import Parser
56 from IPython.PyColorize import Parser
57 from IPython.ipstruct import Struct
57 from IPython.ipstruct import Struct
58 from IPython.macro import Macro
58 from IPython.macro import Macro
59 from IPython.genutils import *
59 from IPython.genutils import *
60 from IPython import platutils
60 from IPython import platutils
61 import IPython.generics
61 import IPython.generics
62 import IPython.ipapi
62 import IPython.ipapi
63
63
64 #***************************************************************************
64 #***************************************************************************
65 # Utility functions
65 # Utility functions
66 def on_off(tag):
66 def on_off(tag):
67 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
67 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
68 return ['OFF','ON'][tag]
68 return ['OFF','ON'][tag]
69
69
70 class Bunch: pass
70 class Bunch: pass
71
71
72 def compress_dhist(dh):
72 def compress_dhist(dh):
73 head, tail = dh[:-10], dh[-10:]
73 head, tail = dh[:-10], dh[-10:]
74
74
75 newhead = []
75 newhead = []
76 done = Set()
76 done = Set()
77 for h in head:
77 for h in head:
78 if h in done:
78 if h in done:
79 continue
79 continue
80 newhead.append(h)
80 newhead.append(h)
81 done.add(h)
81 done.add(h)
82
82
83 return newhead + tail
83 return newhead + tail
84
84
85
85
86 #***************************************************************************
86 #***************************************************************************
87 # Main class implementing Magic functionality
87 # Main class implementing Magic functionality
88 class Magic:
88 class Magic:
89 """Magic functions for InteractiveShell.
89 """Magic functions for InteractiveShell.
90
90
91 Shell functions which can be reached as %function_name. All magic
91 Shell functions which can be reached as %function_name. All magic
92 functions should accept a string, which they can parse for their own
92 functions should accept a string, which they can parse for their own
93 needs. This can make some functions easier to type, eg `%cd ../`
93 needs. This can make some functions easier to type, eg `%cd ../`
94 vs. `%cd("../")`
94 vs. `%cd("../")`
95
95
96 ALL definitions MUST begin with the prefix magic_. The user won't need it
96 ALL definitions MUST begin with the prefix magic_. The user won't need it
97 at the command line, but it is is needed in the definition. """
97 at the command line, but it is is needed in the definition. """
98
98
99 # class globals
99 # class globals
100 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
100 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
101 'Automagic is ON, % prefix NOT needed for magic functions.']
101 'Automagic is ON, % prefix NOT needed for magic functions.']
102
102
103 #......................................................................
103 #......................................................................
104 # some utility functions
104 # some utility functions
105
105
106 def __init__(self,shell):
106 def __init__(self,shell):
107
107
108 self.options_table = {}
108 self.options_table = {}
109 if profile is None:
109 if profile is None:
110 self.magic_prun = self.profile_missing_notice
110 self.magic_prun = self.profile_missing_notice
111 self.shell = shell
111 self.shell = shell
112
112
113 # namespace for holding state we may need
113 # namespace for holding state we may need
114 self._magic_state = Bunch()
114 self._magic_state = Bunch()
115
115
116 def profile_missing_notice(self, *args, **kwargs):
116 def profile_missing_notice(self, *args, **kwargs):
117 error("""\
117 error("""\
118 The profile module could not be found. If you are a Debian user,
118 The profile module could not be found. If you are a Debian user,
119 it has been removed from the standard Debian package because of its non-free
119 it has been removed from the standard Debian package because of its non-free
120 license. To use profiling, please install"python2.3-profiler" from non-free.""")
120 license. To use profiling, please install"python2.3-profiler" from non-free.""")
121
121
122 def default_option(self,fn,optstr):
122 def default_option(self,fn,optstr):
123 """Make an entry in the options_table for fn, with value optstr"""
123 """Make an entry in the options_table for fn, with value optstr"""
124
124
125 if fn not in self.lsmagic():
125 if fn not in self.lsmagic():
126 error("%s is not a magic function" % fn)
126 error("%s is not a magic function" % fn)
127 self.options_table[fn] = optstr
127 self.options_table[fn] = optstr
128
128
129 def lsmagic(self):
129 def lsmagic(self):
130 """Return a list of currently available magic functions.
130 """Return a list of currently available magic functions.
131
131
132 Gives a list of the bare names after mangling (['ls','cd', ...], not
132 Gives a list of the bare names after mangling (['ls','cd', ...], not
133 ['magic_ls','magic_cd',...]"""
133 ['magic_ls','magic_cd',...]"""
134
134
135 # FIXME. This needs a cleanup, in the way the magics list is built.
135 # FIXME. This needs a cleanup, in the way the magics list is built.
136
136
137 # magics in class definition
137 # magics in class definition
138 class_magic = lambda fn: fn.startswith('magic_') and \
138 class_magic = lambda fn: fn.startswith('magic_') and \
139 callable(Magic.__dict__[fn])
139 callable(Magic.__dict__[fn])
140 # in instance namespace (run-time user additions)
140 # in instance namespace (run-time user additions)
141 inst_magic = lambda fn: fn.startswith('magic_') and \
141 inst_magic = lambda fn: fn.startswith('magic_') and \
142 callable(self.__dict__[fn])
142 callable(self.__dict__[fn])
143 # and bound magics by user (so they can access self):
143 # and bound magics by user (so they can access self):
144 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
144 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
145 callable(self.__class__.__dict__[fn])
145 callable(self.__class__.__dict__[fn])
146 magics = filter(class_magic,Magic.__dict__.keys()) + \
146 magics = filter(class_magic,Magic.__dict__.keys()) + \
147 filter(inst_magic,self.__dict__.keys()) + \
147 filter(inst_magic,self.__dict__.keys()) + \
148 filter(inst_bound_magic,self.__class__.__dict__.keys())
148 filter(inst_bound_magic,self.__class__.__dict__.keys())
149 out = []
149 out = []
150 for fn in magics:
150 for fn in magics:
151 out.append(fn.replace('magic_','',1))
151 out.append(fn.replace('magic_','',1))
152 out.sort()
152 out.sort()
153 return out
153 return out
154
154
155 def extract_input_slices(self,slices,raw=False):
155 def extract_input_slices(self,slices,raw=False):
156 """Return as a string a set of input history slices.
156 """Return as a string a set of input history slices.
157
157
158 Inputs:
158 Inputs:
159
159
160 - slices: the set of slices is given as a list of strings (like
160 - slices: the set of slices is given as a list of strings (like
161 ['1','4:8','9'], since this function is for use by magic functions
161 ['1','4:8','9'], since this function is for use by magic functions
162 which get their arguments as strings.
162 which get their arguments as strings.
163
163
164 Optional inputs:
164 Optional inputs:
165
165
166 - raw(False): by default, the processed input is used. If this is
166 - raw(False): by default, the processed input is used. If this is
167 true, the raw input history is used instead.
167 true, the raw input history is used instead.
168
168
169 Note that slices can be called with two notations:
169 Note that slices can be called with two notations:
170
170
171 N:M -> standard python form, means including items N...(M-1).
171 N:M -> standard python form, means including items N...(M-1).
172
172
173 N-M -> include items N..M (closed endpoint)."""
173 N-M -> include items N..M (closed endpoint)."""
174
174
175 if raw:
175 if raw:
176 hist = self.shell.input_hist_raw
176 hist = self.shell.input_hist_raw
177 else:
177 else:
178 hist = self.shell.input_hist
178 hist = self.shell.input_hist
179
179
180 cmds = []
180 cmds = []
181 for chunk in slices:
181 for chunk in slices:
182 if ':' in chunk:
182 if ':' in chunk:
183 ini,fin = map(int,chunk.split(':'))
183 ini,fin = map(int,chunk.split(':'))
184 elif '-' in chunk:
184 elif '-' in chunk:
185 ini,fin = map(int,chunk.split('-'))
185 ini,fin = map(int,chunk.split('-'))
186 fin += 1
186 fin += 1
187 else:
187 else:
188 ini = int(chunk)
188 ini = int(chunk)
189 fin = ini+1
189 fin = ini+1
190 cmds.append(hist[ini:fin])
190 cmds.append(hist[ini:fin])
191 return cmds
191 return cmds
192
192
193 def _ofind(self, oname, namespaces=None):
193 def _ofind(self, oname, namespaces=None):
194 """Find an object in the available namespaces.
194 """Find an object in the available namespaces.
195
195
196 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
196 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
197
197
198 Has special code to detect magic functions.
198 Has special code to detect magic functions.
199 """
199 """
200
200
201 oname = oname.strip()
201 oname = oname.strip()
202
202
203 alias_ns = None
203 alias_ns = None
204 if namespaces is None:
204 if namespaces is None:
205 # Namespaces to search in:
205 # Namespaces to search in:
206 # Put them in a list. The order is important so that we
206 # Put them in a list. The order is important so that we
207 # find things in the same order that Python finds them.
207 # find things in the same order that Python finds them.
208 namespaces = [ ('Interactive', self.shell.user_ns),
208 namespaces = [ ('Interactive', self.shell.user_ns),
209 ('IPython internal', self.shell.internal_ns),
209 ('IPython internal', self.shell.internal_ns),
210 ('Python builtin', __builtin__.__dict__),
210 ('Python builtin', __builtin__.__dict__),
211 ('Alias', self.shell.alias_table),
211 ('Alias', self.shell.alias_table),
212 ]
212 ]
213 alias_ns = self.shell.alias_table
213 alias_ns = self.shell.alias_table
214
214
215 # initialize results to 'null'
215 # initialize results to 'null'
216 found = 0; obj = None; ospace = None; ds = None;
216 found = 0; obj = None; ospace = None; ds = None;
217 ismagic = 0; isalias = 0; parent = None
217 ismagic = 0; isalias = 0; parent = None
218
218
219 # Look for the given name by splitting it in parts. If the head is
219 # Look for the given name by splitting it in parts. If the head is
220 # found, then we look for all the remaining parts as members, and only
220 # found, then we look for all the remaining parts as members, and only
221 # declare success if we can find them all.
221 # declare success if we can find them all.
222 oname_parts = oname.split('.')
222 oname_parts = oname.split('.')
223 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
223 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
224 for nsname,ns in namespaces:
224 for nsname,ns in namespaces:
225 try:
225 try:
226 obj = ns[oname_head]
226 obj = ns[oname_head]
227 except KeyError:
227 except KeyError:
228 continue
228 continue
229 else:
229 else:
230 #print 'oname_rest:', oname_rest # dbg
230 #print 'oname_rest:', oname_rest # dbg
231 for part in oname_rest:
231 for part in oname_rest:
232 try:
232 try:
233 parent = obj
233 parent = obj
234 obj = getattr(obj,part)
234 obj = getattr(obj,part)
235 except:
235 except:
236 # Blanket except b/c some badly implemented objects
236 # Blanket except b/c some badly implemented objects
237 # allow __getattr__ to raise exceptions other than
237 # allow __getattr__ to raise exceptions other than
238 # AttributeError, which then crashes IPython.
238 # AttributeError, which then crashes IPython.
239 break
239 break
240 else:
240 else:
241 # If we finish the for loop (no break), we got all members
241 # If we finish the for loop (no break), we got all members
242 found = 1
242 found = 1
243 ospace = nsname
243 ospace = nsname
244 if ns == alias_ns:
244 if ns == alias_ns:
245 isalias = 1
245 isalias = 1
246 break # namespace loop
246 break # namespace loop
247
247
248 # Try to see if it's magic
248 # Try to see if it's magic
249 if not found:
249 if not found:
250 if oname.startswith(self.shell.ESC_MAGIC):
250 if oname.startswith(self.shell.ESC_MAGIC):
251 oname = oname[1:]
251 oname = oname[1:]
252 obj = getattr(self,'magic_'+oname,None)
252 obj = getattr(self,'magic_'+oname,None)
253 if obj is not None:
253 if obj is not None:
254 found = 1
254 found = 1
255 ospace = 'IPython internal'
255 ospace = 'IPython internal'
256 ismagic = 1
256 ismagic = 1
257
257
258 # Last try: special-case some literals like '', [], {}, etc:
258 # Last try: special-case some literals like '', [], {}, etc:
259 if not found and oname_head in ["''",'""','[]','{}','()']:
259 if not found and oname_head in ["''",'""','[]','{}','()']:
260 obj = eval(oname_head)
260 obj = eval(oname_head)
261 found = 1
261 found = 1
262 ospace = 'Interactive'
262 ospace = 'Interactive'
263
263
264 return {'found':found, 'obj':obj, 'namespace':ospace,
264 return {'found':found, 'obj':obj, 'namespace':ospace,
265 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
265 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
266
266
267 def arg_err(self,func):
267 def arg_err(self,func):
268 """Print docstring if incorrect arguments were passed"""
268 """Print docstring if incorrect arguments were passed"""
269 print 'Error in arguments:'
269 print 'Error in arguments:'
270 print OInspect.getdoc(func)
270 print OInspect.getdoc(func)
271
271
272 def format_latex(self,strng):
272 def format_latex(self,strng):
273 """Format a string for latex inclusion."""
273 """Format a string for latex inclusion."""
274
274
275 # Characters that need to be escaped for latex:
275 # Characters that need to be escaped for latex:
276 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
276 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
277 # Magic command names as headers:
277 # Magic command names as headers:
278 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
278 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
279 re.MULTILINE)
279 re.MULTILINE)
280 # Magic commands
280 # Magic commands
281 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
281 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
282 re.MULTILINE)
282 re.MULTILINE)
283 # Paragraph continue
283 # Paragraph continue
284 par_re = re.compile(r'\\$',re.MULTILINE)
284 par_re = re.compile(r'\\$',re.MULTILINE)
285
285
286 # The "\n" symbol
286 # The "\n" symbol
287 newline_re = re.compile(r'\\n')
287 newline_re = re.compile(r'\\n')
288
288
289 # Now build the string for output:
289 # Now build the string for output:
290 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
290 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
291 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
291 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
292 strng)
292 strng)
293 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
293 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
294 strng = par_re.sub(r'\\\\',strng)
294 strng = par_re.sub(r'\\\\',strng)
295 strng = escape_re.sub(r'\\\1',strng)
295 strng = escape_re.sub(r'\\\1',strng)
296 strng = newline_re.sub(r'\\textbackslash{}n',strng)
296 strng = newline_re.sub(r'\\textbackslash{}n',strng)
297 return strng
297 return strng
298
298
299 def format_screen(self,strng):
299 def format_screen(self,strng):
300 """Format a string for screen printing.
300 """Format a string for screen printing.
301
301
302 This removes some latex-type format codes."""
302 This removes some latex-type format codes."""
303 # Paragraph continue
303 # Paragraph continue
304 par_re = re.compile(r'\\$',re.MULTILINE)
304 par_re = re.compile(r'\\$',re.MULTILINE)
305 strng = par_re.sub('',strng)
305 strng = par_re.sub('',strng)
306 return strng
306 return strng
307
307
308 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
308 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
309 """Parse options passed to an argument string.
309 """Parse options passed to an argument string.
310
310
311 The interface is similar to that of getopt(), but it returns back a
311 The interface is similar to that of getopt(), but it returns back a
312 Struct with the options as keys and the stripped argument string still
312 Struct with the options as keys and the stripped argument string still
313 as a string.
313 as a string.
314
314
315 arg_str is quoted as a true sys.argv vector by using shlex.split.
315 arg_str is quoted as a true sys.argv vector by using shlex.split.
316 This allows us to easily expand variables, glob files, quote
316 This allows us to easily expand variables, glob files, quote
317 arguments, etc.
317 arguments, etc.
318
318
319 Options:
319 Options:
320 -mode: default 'string'. If given as 'list', the argument string is
320 -mode: default 'string'. If given as 'list', the argument string is
321 returned as a list (split on whitespace) instead of a string.
321 returned as a list (split on whitespace) instead of a string.
322
322
323 -list_all: put all option values in lists. Normally only options
323 -list_all: put all option values in lists. Normally only options
324 appearing more than once are put in a list.
324 appearing more than once are put in a list.
325
325
326 -posix (True): whether to split the input line in POSIX mode or not,
326 -posix (True): whether to split the input line in POSIX mode or not,
327 as per the conventions outlined in the shlex module from the
327 as per the conventions outlined in the shlex module from the
328 standard library."""
328 standard library."""
329
329
330 # inject default options at the beginning of the input line
330 # inject default options at the beginning of the input line
331 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
331 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
332 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
332 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
333
333
334 mode = kw.get('mode','string')
334 mode = kw.get('mode','string')
335 if mode not in ['string','list']:
335 if mode not in ['string','list']:
336 raise ValueError,'incorrect mode given: %s' % mode
336 raise ValueError,'incorrect mode given: %s' % mode
337 # Get options
337 # Get options
338 list_all = kw.get('list_all',0)
338 list_all = kw.get('list_all',0)
339 posix = kw.get('posix',True)
339 posix = kw.get('posix',True)
340
340
341 # Check if we have more than one argument to warrant extra processing:
341 # Check if we have more than one argument to warrant extra processing:
342 odict = {} # Dictionary with options
342 odict = {} # Dictionary with options
343 args = arg_str.split()
343 args = arg_str.split()
344 if len(args) >= 1:
344 if len(args) >= 1:
345 # If the list of inputs only has 0 or 1 thing in it, there's no
345 # If the list of inputs only has 0 or 1 thing in it, there's no
346 # need to look for options
346 # need to look for options
347 argv = arg_split(arg_str,posix)
347 argv = arg_split(arg_str,posix)
348 # Do regular option processing
348 # Do regular option processing
349 try:
349 try:
350 opts,args = getopt(argv,opt_str,*long_opts)
350 opts,args = getopt(argv,opt_str,*long_opts)
351 except GetoptError,e:
351 except GetoptError,e:
352 raise GetoptError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
352 raise GetoptError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
353 " ".join(long_opts)))
353 " ".join(long_opts)))
354 for o,a in opts:
354 for o,a in opts:
355 if o.startswith('--'):
355 if o.startswith('--'):
356 o = o[2:]
356 o = o[2:]
357 else:
357 else:
358 o = o[1:]
358 o = o[1:]
359 try:
359 try:
360 odict[o].append(a)
360 odict[o].append(a)
361 except AttributeError:
361 except AttributeError:
362 odict[o] = [odict[o],a]
362 odict[o] = [odict[o],a]
363 except KeyError:
363 except KeyError:
364 if list_all:
364 if list_all:
365 odict[o] = [a]
365 odict[o] = [a]
366 else:
366 else:
367 odict[o] = a
367 odict[o] = a
368
368
369 # Prepare opts,args for return
369 # Prepare opts,args for return
370 opts = Struct(odict)
370 opts = Struct(odict)
371 if mode == 'string':
371 if mode == 'string':
372 args = ' '.join(args)
372 args = ' '.join(args)
373
373
374 return opts,args
374 return opts,args
375
375
376 #......................................................................
376 #......................................................................
377 # And now the actual magic functions
377 # And now the actual magic functions
378
378
379 # Functions for IPython shell work (vars,funcs, config, etc)
379 # Functions for IPython shell work (vars,funcs, config, etc)
380 def magic_lsmagic(self, parameter_s = ''):
380 def magic_lsmagic(self, parameter_s = ''):
381 """List currently available magic functions."""
381 """List currently available magic functions."""
382 mesc = self.shell.ESC_MAGIC
382 mesc = self.shell.ESC_MAGIC
383 print 'Available magic functions:\n'+mesc+\
383 print 'Available magic functions:\n'+mesc+\
384 (' '+mesc).join(self.lsmagic())
384 (' '+mesc).join(self.lsmagic())
385 print '\n' + Magic.auto_status[self.shell.rc.automagic]
385 print '\n' + Magic.auto_status[self.shell.rc.automagic]
386 return None
386 return None
387
387
388 def magic_magic(self, parameter_s = ''):
388 def magic_magic(self, parameter_s = ''):
389 """Print information about the magic function system."""
389 """Print information about the magic function system."""
390
390
391 mode = ''
391 mode = ''
392 try:
392 try:
393 if parameter_s.split()[0] == '-latex':
393 if parameter_s.split()[0] == '-latex':
394 mode = 'latex'
394 mode = 'latex'
395 if parameter_s.split()[0] == '-brief':
395 if parameter_s.split()[0] == '-brief':
396 mode = 'brief'
396 mode = 'brief'
397 except:
397 except:
398 pass
398 pass
399
399
400 magic_docs = []
400 magic_docs = []
401 for fname in self.lsmagic():
401 for fname in self.lsmagic():
402 mname = 'magic_' + fname
402 mname = 'magic_' + fname
403 for space in (Magic,self,self.__class__):
403 for space in (Magic,self,self.__class__):
404 try:
404 try:
405 fn = space.__dict__[mname]
405 fn = space.__dict__[mname]
406 except KeyError:
406 except KeyError:
407 pass
407 pass
408 else:
408 else:
409 break
409 break
410 if mode == 'brief':
410 if mode == 'brief':
411 # only first line
411 # only first line
412 fndoc = fn.__doc__.split('\n',1)[0]
412 fndoc = fn.__doc__.split('\n',1)[0]
413 else:
413 else:
414 fndoc = fn.__doc__
414 fndoc = fn.__doc__
415
415
416 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
416 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
417 fname,fndoc))
417 fname,fndoc))
418 magic_docs = ''.join(magic_docs)
418 magic_docs = ''.join(magic_docs)
419
419
420 if mode == 'latex':
420 if mode == 'latex':
421 print self.format_latex(magic_docs)
421 print self.format_latex(magic_docs)
422 return
422 return
423 else:
423 else:
424 magic_docs = self.format_screen(magic_docs)
424 magic_docs = self.format_screen(magic_docs)
425 if mode == 'brief':
425 if mode == 'brief':
426 return magic_docs
426 return magic_docs
427
427
428 outmsg = """
428 outmsg = """
429 IPython's 'magic' functions
429 IPython's 'magic' functions
430 ===========================
430 ===========================
431
431
432 The magic function system provides a series of functions which allow you to
432 The magic function system provides a series of functions which allow you to
433 control the behavior of IPython itself, plus a lot of system-type
433 control the behavior of IPython itself, plus a lot of system-type
434 features. All these functions are prefixed with a % character, but parameters
434 features. All these functions are prefixed with a % character, but parameters
435 are given without parentheses or quotes.
435 are given without parentheses or quotes.
436
436
437 NOTE: If you have 'automagic' enabled (via the command line option or with the
437 NOTE: If you have 'automagic' enabled (via the command line option or with the
438 %automagic function), you don't need to type in the % explicitly. By default,
438 %automagic function), you don't need to type in the % explicitly. By default,
439 IPython ships with automagic on, so you should only rarely need the % escape.
439 IPython ships with automagic on, so you should only rarely need the % escape.
440
440
441 Example: typing '%cd mydir' (without the quotes) changes you working directory
441 Example: typing '%cd mydir' (without the quotes) changes you working directory
442 to 'mydir', if it exists.
442 to 'mydir', if it exists.
443
443
444 You can define your own magic functions to extend the system. See the supplied
444 You can define your own magic functions to extend the system. See the supplied
445 ipythonrc and example-magic.py files for details (in your ipython
445 ipythonrc and example-magic.py files for details (in your ipython
446 configuration directory, typically $HOME/.ipython/).
446 configuration directory, typically $HOME/.ipython/).
447
447
448 You can also define your own aliased names for magic functions. In your
448 You can also define your own aliased names for magic functions. In your
449 ipythonrc file, placing a line like:
449 ipythonrc file, placing a line like:
450
450
451 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
451 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
452
452
453 will define %pf as a new name for %profile.
453 will define %pf as a new name for %profile.
454
454
455 You can also call magics in code using the ipmagic() function, which IPython
455 You can also call magics in code using the ipmagic() function, which IPython
456 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
456 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
457
457
458 For a list of the available magic functions, use %lsmagic. For a description
458 For a list of the available magic functions, use %lsmagic. For a description
459 of any of them, type %magic_name?, e.g. '%cd?'.
459 of any of them, type %magic_name?, e.g. '%cd?'.
460
460
461 Currently the magic system has the following functions:\n"""
461 Currently the magic system has the following functions:\n"""
462
462
463 mesc = self.shell.ESC_MAGIC
463 mesc = self.shell.ESC_MAGIC
464 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
464 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
465 "\n\n%s%s\n\n%s" % (outmsg,
465 "\n\n%s%s\n\n%s" % (outmsg,
466 magic_docs,mesc,mesc,
466 magic_docs,mesc,mesc,
467 (' '+mesc).join(self.lsmagic()),
467 (' '+mesc).join(self.lsmagic()),
468 Magic.auto_status[self.shell.rc.automagic] ) )
468 Magic.auto_status[self.shell.rc.automagic] ) )
469
469
470 page(outmsg,screen_lines=self.shell.rc.screen_length)
470 page(outmsg,screen_lines=self.shell.rc.screen_length)
471
471
472
472
473 def magic_autoindent(self, parameter_s = ''):
473 def magic_autoindent(self, parameter_s = ''):
474 """Toggle autoindent on/off (if available)."""
474 """Toggle autoindent on/off (if available)."""
475
475
476 self.shell.set_autoindent()
476 self.shell.set_autoindent()
477 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
477 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
478
478
479 def magic_system_verbose(self, parameter_s = ''):
479 def magic_system_verbose(self, parameter_s = ''):
480 """Set verbose printing of system calls.
480 """Set verbose printing of system calls.
481
481
482 If called without an argument, act as a toggle"""
482 If called without an argument, act as a toggle"""
483
483
484 if parameter_s:
484 if parameter_s:
485 val = bool(eval(parameter_s))
485 val = bool(eval(parameter_s))
486 else:
486 else:
487 val = None
487 val = None
488
488
489 self.shell.rc_set_toggle('system_verbose',val)
489 self.shell.rc_set_toggle('system_verbose',val)
490 print "System verbose printing is:",\
490 print "System verbose printing is:",\
491 ['OFF','ON'][self.shell.rc.system_verbose]
491 ['OFF','ON'][self.shell.rc.system_verbose]
492
492
493
493
494 def magic_page(self, parameter_s=''):
494 def magic_page(self, parameter_s=''):
495 """Pretty print the object and display it through a pager.
495 """Pretty print the object and display it through a pager.
496
496
497 %page [options] OBJECT
497 %page [options] OBJECT
498
498
499 If no object is given, use _ (last output).
499 If no object is given, use _ (last output).
500
500
501 Options:
501 Options:
502
502
503 -r: page str(object), don't pretty-print it."""
503 -r: page str(object), don't pretty-print it."""
504
504
505 # After a function contributed by Olivier Aubert, slightly modified.
505 # After a function contributed by Olivier Aubert, slightly modified.
506
506
507 # Process options/args
507 # Process options/args
508 opts,args = self.parse_options(parameter_s,'r')
508 opts,args = self.parse_options(parameter_s,'r')
509 raw = 'r' in opts
509 raw = 'r' in opts
510
510
511 oname = args and args or '_'
511 oname = args and args or '_'
512 info = self._ofind(oname)
512 info = self._ofind(oname)
513 if info['found']:
513 if info['found']:
514 txt = (raw and str or pformat)( info['obj'] )
514 txt = (raw and str or pformat)( info['obj'] )
515 page(txt)
515 page(txt)
516 else:
516 else:
517 print 'Object `%s` not found' % oname
517 print 'Object `%s` not found' % oname
518
518
519 def magic_profile(self, parameter_s=''):
519 def magic_profile(self, parameter_s=''):
520 """Print your currently active IPyhton profile."""
520 """Print your currently active IPyhton profile."""
521 if self.shell.rc.profile:
521 if self.shell.rc.profile:
522 printpl('Current IPython profile: $self.shell.rc.profile.')
522 printpl('Current IPython profile: $self.shell.rc.profile.')
523 else:
523 else:
524 print 'No profile active.'
524 print 'No profile active.'
525
525
526 def magic_pinfo(self, parameter_s='', namespaces=None):
526 def magic_pinfo(self, parameter_s='', namespaces=None):
527 """Provide detailed information about an object.
527 """Provide detailed information about an object.
528
528
529 '%pinfo object' is just a synonym for object? or ?object."""
529 '%pinfo object' is just a synonym for object? or ?object."""
530
530
531 #print 'pinfo par: <%s>' % parameter_s # dbg
531 #print 'pinfo par: <%s>' % parameter_s # dbg
532
532
533
533
534 # detail_level: 0 -> obj? , 1 -> obj??
534 # detail_level: 0 -> obj? , 1 -> obj??
535 detail_level = 0
535 detail_level = 0
536 # We need to detect if we got called as 'pinfo pinfo foo', which can
536 # We need to detect if we got called as 'pinfo pinfo foo', which can
537 # happen if the user types 'pinfo foo?' at the cmd line.
537 # happen if the user types 'pinfo foo?' at the cmd line.
538 pinfo,qmark1,oname,qmark2 = \
538 pinfo,qmark1,oname,qmark2 = \
539 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
539 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
540 if pinfo or qmark1 or qmark2:
540 if pinfo or qmark1 or qmark2:
541 detail_level = 1
541 detail_level = 1
542 if "*" in oname:
542 if "*" in oname:
543 self.magic_psearch(oname)
543 self.magic_psearch(oname)
544 else:
544 else:
545 self._inspect('pinfo', oname, detail_level=detail_level,
545 self._inspect('pinfo', oname, detail_level=detail_level,
546 namespaces=namespaces)
546 namespaces=namespaces)
547
547
548 def _inspect(self,meth,oname,namespaces=None,**kw):
548 def _inspect(self,meth,oname,namespaces=None,**kw):
549 """Generic interface to the inspector system.
549 """Generic interface to the inspector system.
550
550
551 This function is meant to be called by pdef, pdoc & friends."""
551 This function is meant to be called by pdef, pdoc & friends."""
552
552
553 #oname = oname.strip()
553 #oname = oname.strip()
554 #print '1- oname: <%r>' % oname # dbg
554 #print '1- oname: <%r>' % oname # dbg
555 try:
555 try:
556 oname = oname.strip().encode('ascii')
556 oname = oname.strip().encode('ascii')
557 #print '2- oname: <%r>' % oname # dbg
557 #print '2- oname: <%r>' % oname # dbg
558 except UnicodeEncodeError:
558 except UnicodeEncodeError:
559 print 'Python identifiers can only contain ascii characters.'
559 print 'Python identifiers can only contain ascii characters.'
560 return 'not found'
560 return 'not found'
561
561
562 info = Struct(self._ofind(oname, namespaces))
562 info = Struct(self._ofind(oname, namespaces))
563
563
564 if info.found:
564 if info.found:
565 try:
565 try:
566 IPython.generics.inspect_object(info.obj)
566 IPython.generics.inspect_object(info.obj)
567 return
567 return
568 except IPython.ipapi.TryNext:
568 except IPython.ipapi.TryNext:
569 pass
569 pass
570 # Get the docstring of the class property if it exists.
570 # Get the docstring of the class property if it exists.
571 path = oname.split('.')
571 path = oname.split('.')
572 root = '.'.join(path[:-1])
572 root = '.'.join(path[:-1])
573 if info.parent is not None:
573 if info.parent is not None:
574 try:
574 try:
575 target = getattr(info.parent, '__class__')
575 target = getattr(info.parent, '__class__')
576 # The object belongs to a class instance.
576 # The object belongs to a class instance.
577 try:
577 try:
578 target = getattr(target, path[-1])
578 target = getattr(target, path[-1])
579 # The class defines the object.
579 # The class defines the object.
580 if isinstance(target, property):
580 if isinstance(target, property):
581 oname = root + '.__class__.' + path[-1]
581 oname = root + '.__class__.' + path[-1]
582 info = Struct(self._ofind(oname))
582 info = Struct(self._ofind(oname))
583 except AttributeError: pass
583 except AttributeError: pass
584 except AttributeError: pass
584 except AttributeError: pass
585
585
586 pmethod = getattr(self.shell.inspector,meth)
586 pmethod = getattr(self.shell.inspector,meth)
587 formatter = info.ismagic and self.format_screen or None
587 formatter = info.ismagic and self.format_screen or None
588 if meth == 'pdoc':
588 if meth == 'pdoc':
589 pmethod(info.obj,oname,formatter)
589 pmethod(info.obj,oname,formatter)
590 elif meth == 'pinfo':
590 elif meth == 'pinfo':
591 pmethod(info.obj,oname,formatter,info,**kw)
591 pmethod(info.obj,oname,formatter,info,**kw)
592 else:
592 else:
593 pmethod(info.obj,oname)
593 pmethod(info.obj,oname)
594 else:
594 else:
595 print 'Object `%s` not found.' % oname
595 print 'Object `%s` not found.' % oname
596 return 'not found' # so callers can take other action
596 return 'not found' # so callers can take other action
597
597
598 def magic_psearch(self, parameter_s=''):
598 def magic_psearch(self, parameter_s=''):
599 """Search for object in namespaces by wildcard.
599 """Search for object in namespaces by wildcard.
600
600
601 %psearch [options] PATTERN [OBJECT TYPE]
601 %psearch [options] PATTERN [OBJECT TYPE]
602
602
603 Note: ? can be used as a synonym for %psearch, at the beginning or at
603 Note: ? can be used as a synonym for %psearch, at the beginning or at
604 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
604 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
605 rest of the command line must be unchanged (options come first), so
605 rest of the command line must be unchanged (options come first), so
606 for example the following forms are equivalent
606 for example the following forms are equivalent
607
607
608 %psearch -i a* function
608 %psearch -i a* function
609 -i a* function?
609 -i a* function?
610 ?-i a* function
610 ?-i a* function
611
611
612 Arguments:
612 Arguments:
613
613
614 PATTERN
614 PATTERN
615
615
616 where PATTERN is a string containing * as a wildcard similar to its
616 where PATTERN is a string containing * as a wildcard similar to its
617 use in a shell. The pattern is matched in all namespaces on the
617 use in a shell. The pattern is matched in all namespaces on the
618 search path. By default objects starting with a single _ are not
618 search path. By default objects starting with a single _ are not
619 matched, many IPython generated objects have a single
619 matched, many IPython generated objects have a single
620 underscore. The default is case insensitive matching. Matching is
620 underscore. The default is case insensitive matching. Matching is
621 also done on the attributes of objects and not only on the objects
621 also done on the attributes of objects and not only on the objects
622 in a module.
622 in a module.
623
623
624 [OBJECT TYPE]
624 [OBJECT TYPE]
625
625
626 Is the name of a python type from the types module. The name is
626 Is the name of a python type from the types module. The name is
627 given in lowercase without the ending type, ex. StringType is
627 given in lowercase without the ending type, ex. StringType is
628 written string. By adding a type here only objects matching the
628 written string. By adding a type here only objects matching the
629 given type are matched. Using all here makes the pattern match all
629 given type are matched. Using all here makes the pattern match all
630 types (this is the default).
630 types (this is the default).
631
631
632 Options:
632 Options:
633
633
634 -a: makes the pattern match even objects whose names start with a
634 -a: makes the pattern match even objects whose names start with a
635 single underscore. These names are normally ommitted from the
635 single underscore. These names are normally ommitted from the
636 search.
636 search.
637
637
638 -i/-c: make the pattern case insensitive/sensitive. If neither of
638 -i/-c: make the pattern case insensitive/sensitive. If neither of
639 these options is given, the default is read from your ipythonrc
639 these options is given, the default is read from your ipythonrc
640 file. The option name which sets this value is
640 file. The option name which sets this value is
641 'wildcards_case_sensitive'. If this option is not specified in your
641 'wildcards_case_sensitive'. If this option is not specified in your
642 ipythonrc file, IPython's internal default is to do a case sensitive
642 ipythonrc file, IPython's internal default is to do a case sensitive
643 search.
643 search.
644
644
645 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
645 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
646 specifiy can be searched in any of the following namespaces:
646 specifiy can be searched in any of the following namespaces:
647 'builtin', 'user', 'user_global','internal', 'alias', where
647 'builtin', 'user', 'user_global','internal', 'alias', where
648 'builtin' and 'user' are the search defaults. Note that you should
648 'builtin' and 'user' are the search defaults. Note that you should
649 not use quotes when specifying namespaces.
649 not use quotes when specifying namespaces.
650
650
651 'Builtin' contains the python module builtin, 'user' contains all
651 'Builtin' contains the python module builtin, 'user' contains all
652 user data, 'alias' only contain the shell aliases and no python
652 user data, 'alias' only contain the shell aliases and no python
653 objects, 'internal' contains objects used by IPython. The
653 objects, 'internal' contains objects used by IPython. The
654 'user_global' namespace is only used by embedded IPython instances,
654 'user_global' namespace is only used by embedded IPython instances,
655 and it contains module-level globals. You can add namespaces to the
655 and it contains module-level globals. You can add namespaces to the
656 search with -s or exclude them with -e (these options can be given
656 search with -s or exclude them with -e (these options can be given
657 more than once).
657 more than once).
658
658
659 Examples:
659 Examples:
660
660
661 %psearch a* -> objects beginning with an a
661 %psearch a* -> objects beginning with an a
662 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
662 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
663 %psearch a* function -> all functions beginning with an a
663 %psearch a* function -> all functions beginning with an a
664 %psearch re.e* -> objects beginning with an e in module re
664 %psearch re.e* -> objects beginning with an e in module re
665 %psearch r*.e* -> objects that start with e in modules starting in r
665 %psearch r*.e* -> objects that start with e in modules starting in r
666 %psearch r*.* string -> all strings in modules beginning with r
666 %psearch r*.* string -> all strings in modules beginning with r
667
667
668 Case sensitve search:
668 Case sensitve search:
669
669
670 %psearch -c a* list all object beginning with lower case a
670 %psearch -c a* list all object beginning with lower case a
671
671
672 Show objects beginning with a single _:
672 Show objects beginning with a single _:
673
673
674 %psearch -a _* list objects beginning with a single underscore"""
674 %psearch -a _* list objects beginning with a single underscore"""
675 try:
675 try:
676 parameter_s = parameter_s.encode('ascii')
676 parameter_s = parameter_s.encode('ascii')
677 except UnicodeEncodeError:
677 except UnicodeEncodeError:
678 print 'Python identifiers can only contain ascii characters.'
678 print 'Python identifiers can only contain ascii characters.'
679 return
679 return
680
680
681 # default namespaces to be searched
681 # default namespaces to be searched
682 def_search = ['user','builtin']
682 def_search = ['user','builtin']
683
683
684 # Process options/args
684 # Process options/args
685 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
685 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
686 opt = opts.get
686 opt = opts.get
687 shell = self.shell
687 shell = self.shell
688 psearch = shell.inspector.psearch
688 psearch = shell.inspector.psearch
689
689
690 # select case options
690 # select case options
691 if opts.has_key('i'):
691 if opts.has_key('i'):
692 ignore_case = True
692 ignore_case = True
693 elif opts.has_key('c'):
693 elif opts.has_key('c'):
694 ignore_case = False
694 ignore_case = False
695 else:
695 else:
696 ignore_case = not shell.rc.wildcards_case_sensitive
696 ignore_case = not shell.rc.wildcards_case_sensitive
697
697
698 # Build list of namespaces to search from user options
698 # Build list of namespaces to search from user options
699 def_search.extend(opt('s',[]))
699 def_search.extend(opt('s',[]))
700 ns_exclude = ns_exclude=opt('e',[])
700 ns_exclude = ns_exclude=opt('e',[])
701 ns_search = [nm for nm in def_search if nm not in ns_exclude]
701 ns_search = [nm for nm in def_search if nm not in ns_exclude]
702
702
703 # Call the actual search
703 # Call the actual search
704 try:
704 try:
705 psearch(args,shell.ns_table,ns_search,
705 psearch(args,shell.ns_table,ns_search,
706 show_all=opt('a'),ignore_case=ignore_case)
706 show_all=opt('a'),ignore_case=ignore_case)
707 except:
707 except:
708 shell.showtraceback()
708 shell.showtraceback()
709
709
710 def magic_who_ls(self, parameter_s=''):
710 def magic_who_ls(self, parameter_s=''):
711 """Return a sorted list of all interactive variables.
711 """Return a sorted list of all interactive variables.
712
712
713 If arguments are given, only variables of types matching these
713 If arguments are given, only variables of types matching these
714 arguments are returned."""
714 arguments are returned."""
715
715
716 user_ns = self.shell.user_ns
716 user_ns = self.shell.user_ns
717 internal_ns = self.shell.internal_ns
717 internal_ns = self.shell.internal_ns
718 user_config_ns = self.shell.user_config_ns
718 user_config_ns = self.shell.user_config_ns
719 out = []
719 out = []
720 typelist = parameter_s.split()
720 typelist = parameter_s.split()
721
721
722 for i in user_ns:
722 for i in user_ns:
723 if not (i.startswith('_') or i.startswith('_i')) \
723 if not (i.startswith('_') or i.startswith('_i')) \
724 and not (i in internal_ns or i in user_config_ns):
724 and not (i in internal_ns or i in user_config_ns):
725 if typelist:
725 if typelist:
726 if type(user_ns[i]).__name__ in typelist:
726 if type(user_ns[i]).__name__ in typelist:
727 out.append(i)
727 out.append(i)
728 else:
728 else:
729 out.append(i)
729 out.append(i)
730 out.sort()
730 out.sort()
731 return out
731 return out
732
732
733 def magic_who(self, parameter_s=''):
733 def magic_who(self, parameter_s=''):
734 """Print all interactive variables, with some minimal formatting.
734 """Print all interactive variables, with some minimal formatting.
735
735
736 If any arguments are given, only variables whose type matches one of
736 If any arguments are given, only variables whose type matches one of
737 these are printed. For example:
737 these are printed. For example:
738
738
739 %who function str
739 %who function str
740
740
741 will only list functions and strings, excluding all other types of
741 will only list functions and strings, excluding all other types of
742 variables. To find the proper type names, simply use type(var) at a
742 variables. To find the proper type names, simply use type(var) at a
743 command line to see how python prints type names. For example:
743 command line to see how python prints type names. For example:
744
744
745 In [1]: type('hello')\\
745 In [1]: type('hello')\\
746 Out[1]: <type 'str'>
746 Out[1]: <type 'str'>
747
747
748 indicates that the type name for strings is 'str'.
748 indicates that the type name for strings is 'str'.
749
749
750 %who always excludes executed names loaded through your configuration
750 %who always excludes executed names loaded through your configuration
751 file and things which are internal to IPython.
751 file and things which are internal to IPython.
752
752
753 This is deliberate, as typically you may load many modules and the
753 This is deliberate, as typically you may load many modules and the
754 purpose of %who is to show you only what you've manually defined."""
754 purpose of %who is to show you only what you've manually defined."""
755
755
756 varlist = self.magic_who_ls(parameter_s)
756 varlist = self.magic_who_ls(parameter_s)
757 if not varlist:
757 if not varlist:
758 if parameter_s:
758 if parameter_s:
759 print 'No variables match your requested type.'
759 print 'No variables match your requested type.'
760 else:
760 else:
761 print 'Interactive namespace is empty.'
761 print 'Interactive namespace is empty.'
762 return
762 return
763
763
764 # if we have variables, move on...
764 # if we have variables, move on...
765 count = 0
765 count = 0
766 for i in varlist:
766 for i in varlist:
767 print i+'\t',
767 print i+'\t',
768 count += 1
768 count += 1
769 if count > 8:
769 if count > 8:
770 count = 0
770 count = 0
771 print
771 print
772 print
772 print
773
773
774 def magic_whos(self, parameter_s=''):
774 def magic_whos(self, parameter_s=''):
775 """Like %who, but gives some extra information about each variable.
775 """Like %who, but gives some extra information about each variable.
776
776
777 The same type filtering of %who can be applied here.
777 The same type filtering of %who can be applied here.
778
778
779 For all variables, the type is printed. Additionally it prints:
779 For all variables, the type is printed. Additionally it prints:
780
780
781 - For {},[],(): their length.
781 - For {},[],(): their length.
782
782
783 - For numpy and Numeric arrays, a summary with shape, number of
783 - For numpy and Numeric arrays, a summary with shape, number of
784 elements, typecode and size in memory.
784 elements, typecode and size in memory.
785
785
786 - Everything else: a string representation, snipping their middle if
786 - Everything else: a string representation, snipping their middle if
787 too long."""
787 too long."""
788
788
789 varnames = self.magic_who_ls(parameter_s)
789 varnames = self.magic_who_ls(parameter_s)
790 if not varnames:
790 if not varnames:
791 if parameter_s:
791 if parameter_s:
792 print 'No variables match your requested type.'
792 print 'No variables match your requested type.'
793 else:
793 else:
794 print 'Interactive namespace is empty.'
794 print 'Interactive namespace is empty.'
795 return
795 return
796
796
797 # if we have variables, move on...
797 # if we have variables, move on...
798
798
799 # for these types, show len() instead of data:
799 # for these types, show len() instead of data:
800 seq_types = [types.DictType,types.ListType,types.TupleType]
800 seq_types = [types.DictType,types.ListType,types.TupleType]
801
801
802 # for numpy/Numeric arrays, display summary info
802 # for numpy/Numeric arrays, display summary info
803 try:
803 try:
804 import numpy
804 import numpy
805 except ImportError:
805 except ImportError:
806 ndarray_type = None
806 ndarray_type = None
807 else:
807 else:
808 ndarray_type = numpy.ndarray.__name__
808 ndarray_type = numpy.ndarray.__name__
809 try:
809 try:
810 import Numeric
810 import Numeric
811 except ImportError:
811 except ImportError:
812 array_type = None
812 array_type = None
813 else:
813 else:
814 array_type = Numeric.ArrayType.__name__
814 array_type = Numeric.ArrayType.__name__
815
815
816 # Find all variable names and types so we can figure out column sizes
816 # Find all variable names and types so we can figure out column sizes
817 def get_vars(i):
817 def get_vars(i):
818 return self.shell.user_ns[i]
818 return self.shell.user_ns[i]
819
819
820 # some types are well known and can be shorter
820 # some types are well known and can be shorter
821 abbrevs = {'IPython.macro.Macro' : 'Macro'}
821 abbrevs = {'IPython.macro.Macro' : 'Macro'}
822 def type_name(v):
822 def type_name(v):
823 tn = type(v).__name__
823 tn = type(v).__name__
824 return abbrevs.get(tn,tn)
824 return abbrevs.get(tn,tn)
825
825
826 varlist = map(get_vars,varnames)
826 varlist = map(get_vars,varnames)
827
827
828 typelist = []
828 typelist = []
829 for vv in varlist:
829 for vv in varlist:
830 tt = type_name(vv)
830 tt = type_name(vv)
831
831
832 if tt=='instance':
832 if tt=='instance':
833 typelist.append( abbrevs.get(str(vv.__class__),
833 typelist.append( abbrevs.get(str(vv.__class__),
834 str(vv.__class__)))
834 str(vv.__class__)))
835 else:
835 else:
836 typelist.append(tt)
836 typelist.append(tt)
837
837
838 # column labels and # of spaces as separator
838 # column labels and # of spaces as separator
839 varlabel = 'Variable'
839 varlabel = 'Variable'
840 typelabel = 'Type'
840 typelabel = 'Type'
841 datalabel = 'Data/Info'
841 datalabel = 'Data/Info'
842 colsep = 3
842 colsep = 3
843 # variable format strings
843 # variable format strings
844 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
844 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
845 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
845 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
846 aformat = "%s: %s elems, type `%s`, %s bytes"
846 aformat = "%s: %s elems, type `%s`, %s bytes"
847 # find the size of the columns to format the output nicely
847 # find the size of the columns to format the output nicely
848 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
848 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
849 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
849 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
850 # table header
850 # table header
851 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
851 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
852 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
852 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
853 # and the table itself
853 # and the table itself
854 kb = 1024
854 kb = 1024
855 Mb = 1048576 # kb**2
855 Mb = 1048576 # kb**2
856 for vname,var,vtype in zip(varnames,varlist,typelist):
856 for vname,var,vtype in zip(varnames,varlist,typelist):
857 print itpl(vformat),
857 print itpl(vformat),
858 if vtype in seq_types:
858 if vtype in seq_types:
859 print len(var)
859 print len(var)
860 elif vtype in [array_type,ndarray_type]:
860 elif vtype in [array_type,ndarray_type]:
861 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
861 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
862 if vtype==ndarray_type:
862 if vtype==ndarray_type:
863 # numpy
863 # numpy
864 vsize = var.size
864 vsize = var.size
865 vbytes = vsize*var.itemsize
865 vbytes = vsize*var.itemsize
866 vdtype = var.dtype
866 vdtype = var.dtype
867 else:
867 else:
868 # Numeric
868 # Numeric
869 vsize = Numeric.size(var)
869 vsize = Numeric.size(var)
870 vbytes = vsize*var.itemsize()
870 vbytes = vsize*var.itemsize()
871 vdtype = var.typecode()
871 vdtype = var.typecode()
872
872
873 if vbytes < 100000:
873 if vbytes < 100000:
874 print aformat % (vshape,vsize,vdtype,vbytes)
874 print aformat % (vshape,vsize,vdtype,vbytes)
875 else:
875 else:
876 print aformat % (vshape,vsize,vdtype,vbytes),
876 print aformat % (vshape,vsize,vdtype,vbytes),
877 if vbytes < Mb:
877 if vbytes < Mb:
878 print '(%s kb)' % (vbytes/kb,)
878 print '(%s kb)' % (vbytes/kb,)
879 else:
879 else:
880 print '(%s Mb)' % (vbytes/Mb,)
880 print '(%s Mb)' % (vbytes/Mb,)
881 else:
881 else:
882 try:
882 try:
883 vstr = str(var)
883 vstr = str(var)
884 except UnicodeEncodeError:
884 except UnicodeEncodeError:
885 vstr = unicode(var).encode(sys.getdefaultencoding(),
885 vstr = unicode(var).encode(sys.getdefaultencoding(),
886 'backslashreplace')
886 'backslashreplace')
887 vstr = vstr.replace('\n','\\n')
887 vstr = vstr.replace('\n','\\n')
888 if len(vstr) < 50:
888 if len(vstr) < 50:
889 print vstr
889 print vstr
890 else:
890 else:
891 printpl(vfmt_short)
891 printpl(vfmt_short)
892
892
893 def magic_reset(self, parameter_s=''):
893 def magic_reset(self, parameter_s=''):
894 """Resets the namespace by removing all names defined by the user.
894 """Resets the namespace by removing all names defined by the user.
895
895
896 Input/Output history are left around in case you need them."""
896 Input/Output history are left around in case you need them."""
897
897
898 ans = self.shell.ask_yes_no(
898 ans = self.shell.ask_yes_no(
899 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
899 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
900 if not ans:
900 if not ans:
901 print 'Nothing done.'
901 print 'Nothing done.'
902 return
902 return
903 user_ns = self.shell.user_ns
903 user_ns = self.shell.user_ns
904 for i in self.magic_who_ls():
904 for i in self.magic_who_ls():
905 del(user_ns[i])
905 del(user_ns[i])
906
906
907 def magic_logstart(self,parameter_s=''):
907 def magic_logstart(self,parameter_s=''):
908 """Start logging anywhere in a session.
908 """Start logging anywhere in a session.
909
909
910 %logstart [-o|-r|-t] [log_name [log_mode]]
910 %logstart [-o|-r|-t] [log_name [log_mode]]
911
911
912 If no name is given, it defaults to a file named 'ipython_log.py' in your
912 If no name is given, it defaults to a file named 'ipython_log.py' in your
913 current directory, in 'rotate' mode (see below).
913 current directory, in 'rotate' mode (see below).
914
914
915 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
915 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
916 history up to that point and then continues logging.
916 history up to that point and then continues logging.
917
917
918 %logstart takes a second optional parameter: logging mode. This can be one
918 %logstart takes a second optional parameter: logging mode. This can be one
919 of (note that the modes are given unquoted):\\
919 of (note that the modes are given unquoted):\\
920 append: well, that says it.\\
920 append: well, that says it.\\
921 backup: rename (if exists) to name~ and start name.\\
921 backup: rename (if exists) to name~ and start name.\\
922 global: single logfile in your home dir, appended to.\\
922 global: single logfile in your home dir, appended to.\\
923 over : overwrite existing log.\\
923 over : overwrite existing log.\\
924 rotate: create rotating logs name.1~, name.2~, etc.
924 rotate: create rotating logs name.1~, name.2~, etc.
925
925
926 Options:
926 Options:
927
927
928 -o: log also IPython's output. In this mode, all commands which
928 -o: log also IPython's output. In this mode, all commands which
929 generate an Out[NN] prompt are recorded to the logfile, right after
929 generate an Out[NN] prompt are recorded to the logfile, right after
930 their corresponding input line. The output lines are always
930 their corresponding input line. The output lines are always
931 prepended with a '#[Out]# ' marker, so that the log remains valid
931 prepended with a '#[Out]# ' marker, so that the log remains valid
932 Python code.
932 Python code.
933
933
934 Since this marker is always the same, filtering only the output from
934 Since this marker is always the same, filtering only the output from
935 a log is very easy, using for example a simple awk call:
935 a log is very easy, using for example a simple awk call:
936
936
937 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
937 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
938
938
939 -r: log 'raw' input. Normally, IPython's logs contain the processed
939 -r: log 'raw' input. Normally, IPython's logs contain the processed
940 input, so that user lines are logged in their final form, converted
940 input, so that user lines are logged in their final form, converted
941 into valid Python. For example, %Exit is logged as
941 into valid Python. For example, %Exit is logged as
942 '_ip.magic("Exit"). If the -r flag is given, all input is logged
942 '_ip.magic("Exit"). If the -r flag is given, all input is logged
943 exactly as typed, with no transformations applied.
943 exactly as typed, with no transformations applied.
944
944
945 -t: put timestamps before each input line logged (these are put in
945 -t: put timestamps before each input line logged (these are put in
946 comments)."""
946 comments)."""
947
947
948 opts,par = self.parse_options(parameter_s,'ort')
948 opts,par = self.parse_options(parameter_s,'ort')
949 log_output = 'o' in opts
949 log_output = 'o' in opts
950 log_raw_input = 'r' in opts
950 log_raw_input = 'r' in opts
951 timestamp = 't' in opts
951 timestamp = 't' in opts
952
952
953 rc = self.shell.rc
953 rc = self.shell.rc
954 logger = self.shell.logger
954 logger = self.shell.logger
955
955
956 # if no args are given, the defaults set in the logger constructor by
956 # if no args are given, the defaults set in the logger constructor by
957 # ipytohn remain valid
957 # ipytohn remain valid
958 if par:
958 if par:
959 try:
959 try:
960 logfname,logmode = par.split()
960 logfname,logmode = par.split()
961 except:
961 except:
962 logfname = par
962 logfname = par
963 logmode = 'backup'
963 logmode = 'backup'
964 else:
964 else:
965 logfname = logger.logfname
965 logfname = logger.logfname
966 logmode = logger.logmode
966 logmode = logger.logmode
967 # put logfname into rc struct as if it had been called on the command
967 # put logfname into rc struct as if it had been called on the command
968 # line, so it ends up saved in the log header Save it in case we need
968 # line, so it ends up saved in the log header Save it in case we need
969 # to restore it...
969 # to restore it...
970 old_logfile = rc.opts.get('logfile','')
970 old_logfile = rc.opts.get('logfile','')
971 if logfname:
971 if logfname:
972 logfname = os.path.expanduser(logfname)
972 logfname = os.path.expanduser(logfname)
973 rc.opts.logfile = logfname
973 rc.opts.logfile = logfname
974 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
974 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
975 try:
975 try:
976 started = logger.logstart(logfname,loghead,logmode,
976 started = logger.logstart(logfname,loghead,logmode,
977 log_output,timestamp,log_raw_input)
977 log_output,timestamp,log_raw_input)
978 except:
978 except:
979 rc.opts.logfile = old_logfile
979 rc.opts.logfile = old_logfile
980 warn("Couldn't start log: %s" % sys.exc_info()[1])
980 warn("Couldn't start log: %s" % sys.exc_info()[1])
981 else:
981 else:
982 # log input history up to this point, optionally interleaving
982 # log input history up to this point, optionally interleaving
983 # output if requested
983 # output if requested
984
984
985 if timestamp:
985 if timestamp:
986 # disable timestamping for the previous history, since we've
986 # disable timestamping for the previous history, since we've
987 # lost those already (no time machine here).
987 # lost those already (no time machine here).
988 logger.timestamp = False
988 logger.timestamp = False
989
989
990 if log_raw_input:
990 if log_raw_input:
991 input_hist = self.shell.input_hist_raw
991 input_hist = self.shell.input_hist_raw
992 else:
992 else:
993 input_hist = self.shell.input_hist
993 input_hist = self.shell.input_hist
994
994
995 if log_output:
995 if log_output:
996 log_write = logger.log_write
996 log_write = logger.log_write
997 output_hist = self.shell.output_hist
997 output_hist = self.shell.output_hist
998 for n in range(1,len(input_hist)-1):
998 for n in range(1,len(input_hist)-1):
999 log_write(input_hist[n].rstrip())
999 log_write(input_hist[n].rstrip())
1000 if n in output_hist:
1000 if n in output_hist:
1001 log_write(repr(output_hist[n]),'output')
1001 log_write(repr(output_hist[n]),'output')
1002 else:
1002 else:
1003 logger.log_write(input_hist[1:])
1003 logger.log_write(input_hist[1:])
1004 if timestamp:
1004 if timestamp:
1005 # re-enable timestamping
1005 # re-enable timestamping
1006 logger.timestamp = True
1006 logger.timestamp = True
1007
1007
1008 print ('Activating auto-logging. '
1008 print ('Activating auto-logging. '
1009 'Current session state plus future input saved.')
1009 'Current session state plus future input saved.')
1010 logger.logstate()
1010 logger.logstate()
1011
1011
1012 def magic_logoff(self,parameter_s=''):
1012 def magic_logoff(self,parameter_s=''):
1013 """Temporarily stop logging.
1013 """Temporarily stop logging.
1014
1014
1015 You must have previously started logging."""
1015 You must have previously started logging."""
1016 self.shell.logger.switch_log(0)
1016 self.shell.logger.switch_log(0)
1017
1017
1018 def magic_logon(self,parameter_s=''):
1018 def magic_logon(self,parameter_s=''):
1019 """Restart logging.
1019 """Restart logging.
1020
1020
1021 This function is for restarting logging which you've temporarily
1021 This function is for restarting logging which you've temporarily
1022 stopped with %logoff. For starting logging for the first time, you
1022 stopped with %logoff. For starting logging for the first time, you
1023 must use the %logstart function, which allows you to specify an
1023 must use the %logstart function, which allows you to specify an
1024 optional log filename."""
1024 optional log filename."""
1025
1025
1026 self.shell.logger.switch_log(1)
1026 self.shell.logger.switch_log(1)
1027
1027
1028 def magic_logstate(self,parameter_s=''):
1028 def magic_logstate(self,parameter_s=''):
1029 """Print the status of the logging system."""
1029 """Print the status of the logging system."""
1030
1030
1031 self.shell.logger.logstate()
1031 self.shell.logger.logstate()
1032
1032
1033 def magic_pdb(self, parameter_s=''):
1033 def magic_pdb(self, parameter_s=''):
1034 """Control the automatic calling of the pdb interactive debugger.
1034 """Control the automatic calling of the pdb interactive debugger.
1035
1035
1036 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1036 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1037 argument it works as a toggle.
1037 argument it works as a toggle.
1038
1038
1039 When an exception is triggered, IPython can optionally call the
1039 When an exception is triggered, IPython can optionally call the
1040 interactive pdb debugger after the traceback printout. %pdb toggles
1040 interactive pdb debugger after the traceback printout. %pdb toggles
1041 this feature on and off.
1041 this feature on and off.
1042
1042
1043 The initial state of this feature is set in your ipythonrc
1043 The initial state of this feature is set in your ipythonrc
1044 configuration file (the variable is called 'pdb').
1044 configuration file (the variable is called 'pdb').
1045
1045
1046 If you want to just activate the debugger AFTER an exception has fired,
1046 If you want to just activate the debugger AFTER an exception has fired,
1047 without having to type '%pdb on' and rerunning your code, you can use
1047 without having to type '%pdb on' and rerunning your code, you can use
1048 the %debug magic."""
1048 the %debug magic."""
1049
1049
1050 par = parameter_s.strip().lower()
1050 par = parameter_s.strip().lower()
1051
1051
1052 if par:
1052 if par:
1053 try:
1053 try:
1054 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1054 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1055 except KeyError:
1055 except KeyError:
1056 print ('Incorrect argument. Use on/1, off/0, '
1056 print ('Incorrect argument. Use on/1, off/0, '
1057 'or nothing for a toggle.')
1057 'or nothing for a toggle.')
1058 return
1058 return
1059 else:
1059 else:
1060 # toggle
1060 # toggle
1061 new_pdb = not self.shell.call_pdb
1061 new_pdb = not self.shell.call_pdb
1062
1062
1063 # set on the shell
1063 # set on the shell
1064 self.shell.call_pdb = new_pdb
1064 self.shell.call_pdb = new_pdb
1065 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1065 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1066
1066
1067 def magic_debug(self, parameter_s=''):
1067 def magic_debug(self, parameter_s=''):
1068 """Activate the interactive debugger in post-mortem mode.
1068 """Activate the interactive debugger in post-mortem mode.
1069
1069
1070 If an exception has just occurred, this lets you inspect its stack
1070 If an exception has just occurred, this lets you inspect its stack
1071 frames interactively. Note that this will always work only on the last
1071 frames interactively. Note that this will always work only on the last
1072 traceback that occurred, so you must call this quickly after an
1072 traceback that occurred, so you must call this quickly after an
1073 exception that you wish to inspect has fired, because if another one
1073 exception that you wish to inspect has fired, because if another one
1074 occurs, it clobbers the previous one.
1074 occurs, it clobbers the previous one.
1075
1075
1076 If you want IPython to automatically do this on every exception, see
1076 If you want IPython to automatically do this on every exception, see
1077 the %pdb magic for more details.
1077 the %pdb magic for more details.
1078 """
1078 """
1079
1079
1080 self.shell.debugger(force=True)
1080 self.shell.debugger(force=True)
1081
1081
1082 def magic_prun(self, parameter_s ='',user_mode=1,
1082 def magic_prun(self, parameter_s ='',user_mode=1,
1083 opts=None,arg_lst=None,prog_ns=None):
1083 opts=None,arg_lst=None,prog_ns=None):
1084
1084
1085 """Run a statement through the python code profiler.
1085 """Run a statement through the python code profiler.
1086
1086
1087 Usage:\\
1087 Usage:\\
1088 %prun [options] statement
1088 %prun [options] statement
1089
1089
1090 The given statement (which doesn't require quote marks) is run via the
1090 The given statement (which doesn't require quote marks) is run via the
1091 python profiler in a manner similar to the profile.run() function.
1091 python profiler in a manner similar to the profile.run() function.
1092 Namespaces are internally managed to work correctly; profile.run
1092 Namespaces are internally managed to work correctly; profile.run
1093 cannot be used in IPython because it makes certain assumptions about
1093 cannot be used in IPython because it makes certain assumptions about
1094 namespaces which do not hold under IPython.
1094 namespaces which do not hold under IPython.
1095
1095
1096 Options:
1096 Options:
1097
1097
1098 -l <limit>: you can place restrictions on what or how much of the
1098 -l <limit>: you can place restrictions on what or how much of the
1099 profile gets printed. The limit value can be:
1099 profile gets printed. The limit value can be:
1100
1100
1101 * A string: only information for function names containing this string
1101 * A string: only information for function names containing this string
1102 is printed.
1102 is printed.
1103
1103
1104 * An integer: only these many lines are printed.
1104 * An integer: only these many lines are printed.
1105
1105
1106 * A float (between 0 and 1): this fraction of the report is printed
1106 * A float (between 0 and 1): this fraction of the report is printed
1107 (for example, use a limit of 0.4 to see the topmost 40% only).
1107 (for example, use a limit of 0.4 to see the topmost 40% only).
1108
1108
1109 You can combine several limits with repeated use of the option. For
1109 You can combine several limits with repeated use of the option. For
1110 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1110 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1111 information about class constructors.
1111 information about class constructors.
1112
1112
1113 -r: return the pstats.Stats object generated by the profiling. This
1113 -r: return the pstats.Stats object generated by the profiling. This
1114 object has all the information about the profile in it, and you can
1114 object has all the information about the profile in it, and you can
1115 later use it for further analysis or in other functions.
1115 later use it for further analysis or in other functions.
1116
1116
1117 -s <key>: sort profile by given key. You can provide more than one key
1117 -s <key>: sort profile by given key. You can provide more than one key
1118 by using the option several times: '-s key1 -s key2 -s key3...'. The
1118 by using the option several times: '-s key1 -s key2 -s key3...'. The
1119 default sorting key is 'time'.
1119 default sorting key is 'time'.
1120
1120
1121 The following is copied verbatim from the profile documentation
1121 The following is copied verbatim from the profile documentation
1122 referenced below:
1122 referenced below:
1123
1123
1124 When more than one key is provided, additional keys are used as
1124 When more than one key is provided, additional keys are used as
1125 secondary criteria when the there is equality in all keys selected
1125 secondary criteria when the there is equality in all keys selected
1126 before them.
1126 before them.
1127
1127
1128 Abbreviations can be used for any key names, as long as the
1128 Abbreviations can be used for any key names, as long as the
1129 abbreviation is unambiguous. The following are the keys currently
1129 abbreviation is unambiguous. The following are the keys currently
1130 defined:
1130 defined:
1131
1131
1132 Valid Arg Meaning\\
1132 Valid Arg Meaning\\
1133 "calls" call count\\
1133 "calls" call count\\
1134 "cumulative" cumulative time\\
1134 "cumulative" cumulative time\\
1135 "file" file name\\
1135 "file" file name\\
1136 "module" file name\\
1136 "module" file name\\
1137 "pcalls" primitive call count\\
1137 "pcalls" primitive call count\\
1138 "line" line number\\
1138 "line" line number\\
1139 "name" function name\\
1139 "name" function name\\
1140 "nfl" name/file/line\\
1140 "nfl" name/file/line\\
1141 "stdname" standard name\\
1141 "stdname" standard name\\
1142 "time" internal time
1142 "time" internal time
1143
1143
1144 Note that all sorts on statistics are in descending order (placing
1144 Note that all sorts on statistics are in descending order (placing
1145 most time consuming items first), where as name, file, and line number
1145 most time consuming items first), where as name, file, and line number
1146 searches are in ascending order (i.e., alphabetical). The subtle
1146 searches are in ascending order (i.e., alphabetical). The subtle
1147 distinction between "nfl" and "stdname" is that the standard name is a
1147 distinction between "nfl" and "stdname" is that the standard name is a
1148 sort of the name as printed, which means that the embedded line
1148 sort of the name as printed, which means that the embedded line
1149 numbers get compared in an odd way. For example, lines 3, 20, and 40
1149 numbers get compared in an odd way. For example, lines 3, 20, and 40
1150 would (if the file names were the same) appear in the string order
1150 would (if the file names were the same) appear in the string order
1151 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1151 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1152 line numbers. In fact, sort_stats("nfl") is the same as
1152 line numbers. In fact, sort_stats("nfl") is the same as
1153 sort_stats("name", "file", "line").
1153 sort_stats("name", "file", "line").
1154
1154
1155 -T <filename>: save profile results as shown on screen to a text
1155 -T <filename>: save profile results as shown on screen to a text
1156 file. The profile is still shown on screen.
1156 file. The profile is still shown on screen.
1157
1157
1158 -D <filename>: save (via dump_stats) profile statistics to given
1158 -D <filename>: save (via dump_stats) profile statistics to given
1159 filename. This data is in a format understod by the pstats module, and
1159 filename. This data is in a format understod by the pstats module, and
1160 is generated by a call to the dump_stats() method of profile
1160 is generated by a call to the dump_stats() method of profile
1161 objects. The profile is still shown on screen.
1161 objects. The profile is still shown on screen.
1162
1162
1163 If you want to run complete programs under the profiler's control, use
1163 If you want to run complete programs under the profiler's control, use
1164 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1164 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1165 contains profiler specific options as described here.
1165 contains profiler specific options as described here.
1166
1166
1167 You can read the complete documentation for the profile module with:\\
1167 You can read the complete documentation for the profile module with:\\
1168 In [1]: import profile; profile.help() """
1168 In [1]: import profile; profile.help() """
1169
1169
1170 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1170 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1171 # protect user quote marks
1171 # protect user quote marks
1172 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1172 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1173
1173
1174 if user_mode: # regular user call
1174 if user_mode: # regular user call
1175 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1175 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1176 list_all=1)
1176 list_all=1)
1177 namespace = self.shell.user_ns
1177 namespace = self.shell.user_ns
1178 else: # called to run a program by %run -p
1178 else: # called to run a program by %run -p
1179 try:
1179 try:
1180 filename = get_py_filename(arg_lst[0])
1180 filename = get_py_filename(arg_lst[0])
1181 except IOError,msg:
1181 except IOError,msg:
1182 error(msg)
1182 error(msg)
1183 return
1183 return
1184
1184
1185 arg_str = 'execfile(filename,prog_ns)'
1185 arg_str = 'execfile(filename,prog_ns)'
1186 namespace = locals()
1186 namespace = locals()
1187
1187
1188 opts.merge(opts_def)
1188 opts.merge(opts_def)
1189
1189
1190 prof = profile.Profile()
1190 prof = profile.Profile()
1191 try:
1191 try:
1192 prof = prof.runctx(arg_str,namespace,namespace)
1192 prof = prof.runctx(arg_str,namespace,namespace)
1193 sys_exit = ''
1193 sys_exit = ''
1194 except SystemExit:
1194 except SystemExit:
1195 sys_exit = """*** SystemExit exception caught in code being profiled."""
1195 sys_exit = """*** SystemExit exception caught in code being profiled."""
1196
1196
1197 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1197 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1198
1198
1199 lims = opts.l
1199 lims = opts.l
1200 if lims:
1200 if lims:
1201 lims = [] # rebuild lims with ints/floats/strings
1201 lims = [] # rebuild lims with ints/floats/strings
1202 for lim in opts.l:
1202 for lim in opts.l:
1203 try:
1203 try:
1204 lims.append(int(lim))
1204 lims.append(int(lim))
1205 except ValueError:
1205 except ValueError:
1206 try:
1206 try:
1207 lims.append(float(lim))
1207 lims.append(float(lim))
1208 except ValueError:
1208 except ValueError:
1209 lims.append(lim)
1209 lims.append(lim)
1210
1210
1211 # Trap output.
1211 # Trap output.
1212 stdout_trap = StringIO()
1212 stdout_trap = StringIO()
1213
1213
1214 if hasattr(stats,'stream'):
1214 if hasattr(stats,'stream'):
1215 # In newer versions of python, the stats object has a 'stream'
1215 # In newer versions of python, the stats object has a 'stream'
1216 # attribute to write into.
1216 # attribute to write into.
1217 stats.stream = stdout_trap
1217 stats.stream = stdout_trap
1218 stats.print_stats(*lims)
1218 stats.print_stats(*lims)
1219 else:
1219 else:
1220 # For older versions, we manually redirect stdout during printing
1220 # For older versions, we manually redirect stdout during printing
1221 sys_stdout = sys.stdout
1221 sys_stdout = sys.stdout
1222 try:
1222 try:
1223 sys.stdout = stdout_trap
1223 sys.stdout = stdout_trap
1224 stats.print_stats(*lims)
1224 stats.print_stats(*lims)
1225 finally:
1225 finally:
1226 sys.stdout = sys_stdout
1226 sys.stdout = sys_stdout
1227
1227
1228 output = stdout_trap.getvalue()
1228 output = stdout_trap.getvalue()
1229 output = output.rstrip()
1229 output = output.rstrip()
1230
1230
1231 page(output,screen_lines=self.shell.rc.screen_length)
1231 page(output,screen_lines=self.shell.rc.screen_length)
1232 print sys_exit,
1232 print sys_exit,
1233
1233
1234 dump_file = opts.D[0]
1234 dump_file = opts.D[0]
1235 text_file = opts.T[0]
1235 text_file = opts.T[0]
1236 if dump_file:
1236 if dump_file:
1237 prof.dump_stats(dump_file)
1237 prof.dump_stats(dump_file)
1238 print '\n*** Profile stats marshalled to file',\
1238 print '\n*** Profile stats marshalled to file',\
1239 `dump_file`+'.',sys_exit
1239 `dump_file`+'.',sys_exit
1240 if text_file:
1240 if text_file:
1241 pfile = file(text_file,'w')
1241 pfile = file(text_file,'w')
1242 pfile.write(output)
1242 pfile.write(output)
1243 pfile.close()
1243 pfile.close()
1244 print '\n*** Profile printout saved to text file',\
1244 print '\n*** Profile printout saved to text file',\
1245 `text_file`+'.',sys_exit
1245 `text_file`+'.',sys_exit
1246
1246
1247 if opts.has_key('r'):
1247 if opts.has_key('r'):
1248 return stats
1248 return stats
1249 else:
1249 else:
1250 return None
1250 return None
1251
1251
1252 def magic_run(self, parameter_s ='',runner=None):
1252 def magic_run(self, parameter_s ='',runner=None):
1253 """Run the named file inside IPython as a program.
1253 """Run the named file inside IPython as a program.
1254
1254
1255 Usage:\\
1255 Usage:\\
1256 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1256 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1257
1257
1258 Parameters after the filename are passed as command-line arguments to
1258 Parameters after the filename are passed as command-line arguments to
1259 the program (put in sys.argv). Then, control returns to IPython's
1259 the program (put in sys.argv). Then, control returns to IPython's
1260 prompt.
1260 prompt.
1261
1261
1262 This is similar to running at a system prompt:\\
1262 This is similar to running at a system prompt:\\
1263 $ python file args\\
1263 $ python file args\\
1264 but with the advantage of giving you IPython's tracebacks, and of
1264 but with the advantage of giving you IPython's tracebacks, and of
1265 loading all variables into your interactive namespace for further use
1265 loading all variables into your interactive namespace for further use
1266 (unless -p is used, see below).
1266 (unless -p is used, see below).
1267
1267
1268 The file is executed in a namespace initially consisting only of
1268 The file is executed in a namespace initially consisting only of
1269 __name__=='__main__' and sys.argv constructed as indicated. It thus
1269 __name__=='__main__' and sys.argv constructed as indicated. It thus
1270 sees its environment as if it were being run as a stand-alone
1270 sees its environment as if it were being run as a stand-alone
1271 program. But after execution, the IPython interactive namespace gets
1271 program. But after execution, the IPython interactive namespace gets
1272 updated with all variables defined in the program (except for __name__
1272 updated with all variables defined in the program (except for __name__
1273 and sys.argv). This allows for very convenient loading of code for
1273 and sys.argv). This allows for very convenient loading of code for
1274 interactive work, while giving each program a 'clean sheet' to run in.
1274 interactive work, while giving each program a 'clean sheet' to run in.
1275
1275
1276 Options:
1276 Options:
1277
1277
1278 -n: __name__ is NOT set to '__main__', but to the running file's name
1278 -n: __name__ is NOT set to '__main__', but to the running file's name
1279 without extension (as python does under import). This allows running
1279 without extension (as python does under import). This allows running
1280 scripts and reloading the definitions in them without calling code
1280 scripts and reloading the definitions in them without calling code
1281 protected by an ' if __name__ == "__main__" ' clause.
1281 protected by an ' if __name__ == "__main__" ' clause.
1282
1282
1283 -i: run the file in IPython's namespace instead of an empty one. This
1283 -i: run the file in IPython's namespace instead of an empty one. This
1284 is useful if you are experimenting with code written in a text editor
1284 is useful if you are experimenting with code written in a text editor
1285 which depends on variables defined interactively.
1285 which depends on variables defined interactively.
1286
1286
1287 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1287 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1288 being run. This is particularly useful if IPython is being used to
1288 being run. This is particularly useful if IPython is being used to
1289 run unittests, which always exit with a sys.exit() call. In such
1289 run unittests, which always exit with a sys.exit() call. In such
1290 cases you are interested in the output of the test results, not in
1290 cases you are interested in the output of the test results, not in
1291 seeing a traceback of the unittest module.
1291 seeing a traceback of the unittest module.
1292
1292
1293 -t: print timing information at the end of the run. IPython will give
1293 -t: print timing information at the end of the run. IPython will give
1294 you an estimated CPU time consumption for your script, which under
1294 you an estimated CPU time consumption for your script, which under
1295 Unix uses the resource module to avoid the wraparound problems of
1295 Unix uses the resource module to avoid the wraparound problems of
1296 time.clock(). Under Unix, an estimate of time spent on system tasks
1296 time.clock(). Under Unix, an estimate of time spent on system tasks
1297 is also given (for Windows platforms this is reported as 0.0).
1297 is also given (for Windows platforms this is reported as 0.0).
1298
1298
1299 If -t is given, an additional -N<N> option can be given, where <N>
1299 If -t is given, an additional -N<N> option can be given, where <N>
1300 must be an integer indicating how many times you want the script to
1300 must be an integer indicating how many times you want the script to
1301 run. The final timing report will include total and per run results.
1301 run. The final timing report will include total and per run results.
1302
1302
1303 For example (testing the script uniq_stable.py):
1303 For example (testing the script uniq_stable.py):
1304
1304
1305 In [1]: run -t uniq_stable
1305 In [1]: run -t uniq_stable
1306
1306
1307 IPython CPU timings (estimated):\\
1307 IPython CPU timings (estimated):\\
1308 User : 0.19597 s.\\
1308 User : 0.19597 s.\\
1309 System: 0.0 s.\\
1309 System: 0.0 s.\\
1310
1310
1311 In [2]: run -t -N5 uniq_stable
1311 In [2]: run -t -N5 uniq_stable
1312
1312
1313 IPython CPU timings (estimated):\\
1313 IPython CPU timings (estimated):\\
1314 Total runs performed: 5\\
1314 Total runs performed: 5\\
1315 Times : Total Per run\\
1315 Times : Total Per run\\
1316 User : 0.910862 s, 0.1821724 s.\\
1316 User : 0.910862 s, 0.1821724 s.\\
1317 System: 0.0 s, 0.0 s.
1317 System: 0.0 s, 0.0 s.
1318
1318
1319 -d: run your program under the control of pdb, the Python debugger.
1319 -d: run your program under the control of pdb, the Python debugger.
1320 This allows you to execute your program step by step, watch variables,
1320 This allows you to execute your program step by step, watch variables,
1321 etc. Internally, what IPython does is similar to calling:
1321 etc. Internally, what IPython does is similar to calling:
1322
1322
1323 pdb.run('execfile("YOURFILENAME")')
1323 pdb.run('execfile("YOURFILENAME")')
1324
1324
1325 with a breakpoint set on line 1 of your file. You can change the line
1325 with a breakpoint set on line 1 of your file. You can change the line
1326 number for this automatic breakpoint to be <N> by using the -bN option
1326 number for this automatic breakpoint to be <N> by using the -bN option
1327 (where N must be an integer). For example:
1327 (where N must be an integer). For example:
1328
1328
1329 %run -d -b40 myscript
1329 %run -d -b40 myscript
1330
1330
1331 will set the first breakpoint at line 40 in myscript.py. Note that
1331 will set the first breakpoint at line 40 in myscript.py. Note that
1332 the first breakpoint must be set on a line which actually does
1332 the first breakpoint must be set on a line which actually does
1333 something (not a comment or docstring) for it to stop execution.
1333 something (not a comment or docstring) for it to stop execution.
1334
1334
1335 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1335 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1336 first enter 'c' (without qoutes) to start execution up to the first
1336 first enter 'c' (without qoutes) to start execution up to the first
1337 breakpoint.
1337 breakpoint.
1338
1338
1339 Entering 'help' gives information about the use of the debugger. You
1339 Entering 'help' gives information about the use of the debugger. You
1340 can easily see pdb's full documentation with "import pdb;pdb.help()"
1340 can easily see pdb's full documentation with "import pdb;pdb.help()"
1341 at a prompt.
1341 at a prompt.
1342
1342
1343 -p: run program under the control of the Python profiler module (which
1343 -p: run program under the control of the Python profiler module (which
1344 prints a detailed report of execution times, function calls, etc).
1344 prints a detailed report of execution times, function calls, etc).
1345
1345
1346 You can pass other options after -p which affect the behavior of the
1346 You can pass other options after -p which affect the behavior of the
1347 profiler itself. See the docs for %prun for details.
1347 profiler itself. See the docs for %prun for details.
1348
1348
1349 In this mode, the program's variables do NOT propagate back to the
1349 In this mode, the program's variables do NOT propagate back to the
1350 IPython interactive namespace (because they remain in the namespace
1350 IPython interactive namespace (because they remain in the namespace
1351 where the profiler executes them).
1351 where the profiler executes them).
1352
1352
1353 Internally this triggers a call to %prun, see its documentation for
1353 Internally this triggers a call to %prun, see its documentation for
1354 details on the options available specifically for profiling.
1354 details on the options available specifically for profiling.
1355
1355
1356 There is one special usage for which the text above doesn't apply:
1356 There is one special usage for which the text above doesn't apply:
1357 if the filename ends with .ipy, the file is run as ipython script,
1357 if the filename ends with .ipy, the file is run as ipython script,
1358 just as if the commands were written on IPython prompt.
1358 just as if the commands were written on IPython prompt.
1359 """
1359 """
1360
1360
1361 # get arguments and set sys.argv for program to be run.
1361 # get arguments and set sys.argv for program to be run.
1362 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1362 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1363 mode='list',list_all=1)
1363 mode='list',list_all=1)
1364
1364
1365 try:
1365 try:
1366 filename = get_py_filename(arg_lst[0])
1366 filename = get_py_filename(arg_lst[0])
1367 except IndexError:
1367 except IndexError:
1368 warn('you must provide at least a filename.')
1368 warn('you must provide at least a filename.')
1369 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1369 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1370 return
1370 return
1371 except IOError,msg:
1371 except IOError,msg:
1372 error(msg)
1372 error(msg)
1373 return
1373 return
1374
1374
1375 if filename.lower().endswith('.ipy'):
1375 if filename.lower().endswith('.ipy'):
1376 self.api.runlines(open(filename).read())
1376 self.api.runlines(open(filename).read())
1377 return
1377 return
1378
1378
1379 # Control the response to exit() calls made by the script being run
1379 # Control the response to exit() calls made by the script being run
1380 exit_ignore = opts.has_key('e')
1380 exit_ignore = opts.has_key('e')
1381
1381
1382 # Make sure that the running script gets a proper sys.argv as if it
1382 # Make sure that the running script gets a proper sys.argv as if it
1383 # were run from a system shell.
1383 # were run from a system shell.
1384 save_argv = sys.argv # save it for later restoring
1384 save_argv = sys.argv # save it for later restoring
1385 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1385 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1386
1386
1387 if opts.has_key('i'):
1387 if opts.has_key('i'):
1388 prog_ns = self.shell.user_ns
1388 prog_ns = self.shell.user_ns
1389 __name__save = self.shell.user_ns['__name__']
1389 __name__save = self.shell.user_ns['__name__']
1390 prog_ns['__name__'] = '__main__'
1390 prog_ns['__name__'] = '__main__'
1391 else:
1391 else:
1392 if opts.has_key('n'):
1392 if opts.has_key('n'):
1393 name = os.path.splitext(os.path.basename(filename))[0]
1393 name = os.path.splitext(os.path.basename(filename))[0]
1394 else:
1394 else:
1395 name = '__main__'
1395 name = '__main__'
1396 prog_ns = {'__name__':name}
1396 prog_ns = {'__name__':name}
1397
1397
1398 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1398 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1399 # set the __file__ global in the script's namespace
1399 # set the __file__ global in the script's namespace
1400 prog_ns['__file__'] = filename
1400 prog_ns['__file__'] = filename
1401
1401
1402 # pickle fix. See iplib for an explanation. But we need to make sure
1402 # pickle fix. See iplib for an explanation. But we need to make sure
1403 # that, if we overwrite __main__, we replace it at the end
1403 # that, if we overwrite __main__, we replace it at the end
1404 if prog_ns['__name__'] == '__main__':
1404 if prog_ns['__name__'] == '__main__':
1405 restore_main = sys.modules['__main__']
1405 restore_main = sys.modules['__main__']
1406 else:
1406 else:
1407 restore_main = False
1407 restore_main = False
1408
1408
1409 sys.modules[prog_ns['__name__']] = FakeModule(prog_ns)
1409 sys.modules[prog_ns['__name__']] = FakeModule(prog_ns)
1410
1410
1411 stats = None
1411 stats = None
1412 try:
1412 try:
1413 if self.shell.has_readline:
1413 if self.shell.has_readline:
1414 self.shell.savehist()
1414 self.shell.savehist()
1415
1415
1416 if opts.has_key('p'):
1416 if opts.has_key('p'):
1417 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1417 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1418 else:
1418 else:
1419 if opts.has_key('d'):
1419 if opts.has_key('d'):
1420 deb = Debugger.Pdb(self.shell.rc.colors)
1420 deb = Debugger.Pdb(self.shell.rc.colors)
1421 # reset Breakpoint state, which is moronically kept
1421 # reset Breakpoint state, which is moronically kept
1422 # in a class
1422 # in a class
1423 bdb.Breakpoint.next = 1
1423 bdb.Breakpoint.next = 1
1424 bdb.Breakpoint.bplist = {}
1424 bdb.Breakpoint.bplist = {}
1425 bdb.Breakpoint.bpbynumber = [None]
1425 bdb.Breakpoint.bpbynumber = [None]
1426 # Set an initial breakpoint to stop execution
1426 # Set an initial breakpoint to stop execution
1427 maxtries = 10
1427 maxtries = 10
1428 bp = int(opts.get('b',[1])[0])
1428 bp = int(opts.get('b',[1])[0])
1429 checkline = deb.checkline(filename,bp)
1429 checkline = deb.checkline(filename,bp)
1430 if not checkline:
1430 if not checkline:
1431 for bp in range(bp+1,bp+maxtries+1):
1431 for bp in range(bp+1,bp+maxtries+1):
1432 if deb.checkline(filename,bp):
1432 if deb.checkline(filename,bp):
1433 break
1433 break
1434 else:
1434 else:
1435 msg = ("\nI failed to find a valid line to set "
1435 msg = ("\nI failed to find a valid line to set "
1436 "a breakpoint\n"
1436 "a breakpoint\n"
1437 "after trying up to line: %s.\n"
1437 "after trying up to line: %s.\n"
1438 "Please set a valid breakpoint manually "
1438 "Please set a valid breakpoint manually "
1439 "with the -b option." % bp)
1439 "with the -b option." % bp)
1440 error(msg)
1440 error(msg)
1441 return
1441 return
1442 # if we find a good linenumber, set the breakpoint
1442 # if we find a good linenumber, set the breakpoint
1443 deb.do_break('%s:%s' % (filename,bp))
1443 deb.do_break('%s:%s' % (filename,bp))
1444 # Start file run
1444 # Start file run
1445 print "NOTE: Enter 'c' at the",
1445 print "NOTE: Enter 'c' at the",
1446 print "%s prompt to start your script." % deb.prompt
1446 print "%s prompt to start your script." % deb.prompt
1447 try:
1447 try:
1448 deb.run('execfile("%s")' % filename,prog_ns)
1448 deb.run('execfile("%s")' % filename,prog_ns)
1449
1449
1450 except:
1450 except:
1451 etype, value, tb = sys.exc_info()
1451 etype, value, tb = sys.exc_info()
1452 # Skip three frames in the traceback: the %run one,
1452 # Skip three frames in the traceback: the %run one,
1453 # one inside bdb.py, and the command-line typed by the
1453 # one inside bdb.py, and the command-line typed by the
1454 # user (run by exec in pdb itself).
1454 # user (run by exec in pdb itself).
1455 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1455 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1456 else:
1456 else:
1457 if runner is None:
1457 if runner is None:
1458 runner = self.shell.safe_execfile
1458 runner = self.shell.safe_execfile
1459 if opts.has_key('t'):
1459 if opts.has_key('t'):
1460 try:
1460 try:
1461 nruns = int(opts['N'][0])
1461 nruns = int(opts['N'][0])
1462 if nruns < 1:
1462 if nruns < 1:
1463 error('Number of runs must be >=1')
1463 error('Number of runs must be >=1')
1464 return
1464 return
1465 except (KeyError):
1465 except (KeyError):
1466 nruns = 1
1466 nruns = 1
1467 if nruns == 1:
1467 if nruns == 1:
1468 t0 = clock2()
1468 t0 = clock2()
1469 runner(filename,prog_ns,prog_ns,
1469 runner(filename,prog_ns,prog_ns,
1470 exit_ignore=exit_ignore)
1470 exit_ignore=exit_ignore)
1471 t1 = clock2()
1471 t1 = clock2()
1472 t_usr = t1[0]-t0[0]
1472 t_usr = t1[0]-t0[0]
1473 t_sys = t1[1]-t1[1]
1473 t_sys = t1[1]-t1[1]
1474 print "\nIPython CPU timings (estimated):"
1474 print "\nIPython CPU timings (estimated):"
1475 print " User : %10s s." % t_usr
1475 print " User : %10s s." % t_usr
1476 print " System: %10s s." % t_sys
1476 print " System: %10s s." % t_sys
1477 else:
1477 else:
1478 runs = range(nruns)
1478 runs = range(nruns)
1479 t0 = clock2()
1479 t0 = clock2()
1480 for nr in runs:
1480 for nr in runs:
1481 runner(filename,prog_ns,prog_ns,
1481 runner(filename,prog_ns,prog_ns,
1482 exit_ignore=exit_ignore)
1482 exit_ignore=exit_ignore)
1483 t1 = clock2()
1483 t1 = clock2()
1484 t_usr = t1[0]-t0[0]
1484 t_usr = t1[0]-t0[0]
1485 t_sys = t1[1]-t1[1]
1485 t_sys = t1[1]-t1[1]
1486 print "\nIPython CPU timings (estimated):"
1486 print "\nIPython CPU timings (estimated):"
1487 print "Total runs performed:",nruns
1487 print "Total runs performed:",nruns
1488 print " Times : %10s %10s" % ('Total','Per run')
1488 print " Times : %10s %10s" % ('Total','Per run')
1489 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1489 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1490 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1490 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1491
1491
1492 else:
1492 else:
1493 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1493 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1494 if opts.has_key('i'):
1494 if opts.has_key('i'):
1495 self.shell.user_ns['__name__'] = __name__save
1495 self.shell.user_ns['__name__'] = __name__save
1496 else:
1496 else:
1497 # update IPython interactive namespace
1497 # update IPython interactive namespace
1498 del prog_ns['__name__']
1498 del prog_ns['__name__']
1499 self.shell.user_ns.update(prog_ns)
1499 self.shell.user_ns.update(prog_ns)
1500 finally:
1500 finally:
1501 sys.argv = save_argv
1501 sys.argv = save_argv
1502 if restore_main:
1502 if restore_main:
1503 sys.modules['__main__'] = restore_main
1503 sys.modules['__main__'] = restore_main
1504 self.shell.reloadhist()
1504 self.shell.reloadhist()
1505
1505
1506 return stats
1506 return stats
1507
1507
1508 def magic_runlog(self, parameter_s =''):
1508 def magic_runlog(self, parameter_s =''):
1509 """Run files as logs.
1509 """Run files as logs.
1510
1510
1511 Usage:\\
1511 Usage:\\
1512 %runlog file1 file2 ...
1512 %runlog file1 file2 ...
1513
1513
1514 Run the named files (treating them as log files) in sequence inside
1514 Run the named files (treating them as log files) in sequence inside
1515 the interpreter, and return to the prompt. This is much slower than
1515 the interpreter, and return to the prompt. This is much slower than
1516 %run because each line is executed in a try/except block, but it
1516 %run because each line is executed in a try/except block, but it
1517 allows running files with syntax errors in them.
1517 allows running files with syntax errors in them.
1518
1518
1519 Normally IPython will guess when a file is one of its own logfiles, so
1519 Normally IPython will guess when a file is one of its own logfiles, so
1520 you can typically use %run even for logs. This shorthand allows you to
1520 you can typically use %run even for logs. This shorthand allows you to
1521 force any file to be treated as a log file."""
1521 force any file to be treated as a log file."""
1522
1522
1523 for f in parameter_s.split():
1523 for f in parameter_s.split():
1524 self.shell.safe_execfile(f,self.shell.user_ns,
1524 self.shell.safe_execfile(f,self.shell.user_ns,
1525 self.shell.user_ns,islog=1)
1525 self.shell.user_ns,islog=1)
1526
1526
1527 def magic_timeit(self, parameter_s =''):
1527 def magic_timeit(self, parameter_s =''):
1528 """Time execution of a Python statement or expression
1528 """Time execution of a Python statement or expression
1529
1529
1530 Usage:\\
1530 Usage:\\
1531 %timeit [-n<N> -r<R> [-t|-c]] statement
1531 %timeit [-n<N> -r<R> [-t|-c]] statement
1532
1532
1533 Time execution of a Python statement or expression using the timeit
1533 Time execution of a Python statement or expression using the timeit
1534 module.
1534 module.
1535
1535
1536 Options:
1536 Options:
1537 -n<N>: execute the given statement <N> times in a loop. If this value
1537 -n<N>: execute the given statement <N> times in a loop. If this value
1538 is not given, a fitting value is chosen.
1538 is not given, a fitting value is chosen.
1539
1539
1540 -r<R>: repeat the loop iteration <R> times and take the best result.
1540 -r<R>: repeat the loop iteration <R> times and take the best result.
1541 Default: 3
1541 Default: 3
1542
1542
1543 -t: use time.time to measure the time, which is the default on Unix.
1543 -t: use time.time to measure the time, which is the default on Unix.
1544 This function measures wall time.
1544 This function measures wall time.
1545
1545
1546 -c: use time.clock to measure the time, which is the default on
1546 -c: use time.clock to measure the time, which is the default on
1547 Windows and measures wall time. On Unix, resource.getrusage is used
1547 Windows and measures wall time. On Unix, resource.getrusage is used
1548 instead and returns the CPU user time.
1548 instead and returns the CPU user time.
1549
1549
1550 -p<P>: use a precision of <P> digits to display the timing result.
1550 -p<P>: use a precision of <P> digits to display the timing result.
1551 Default: 3
1551 Default: 3
1552
1552
1553
1553
1554 Examples:\\
1554 Examples:\\
1555 In [1]: %timeit pass
1555 In [1]: %timeit pass
1556 10000000 loops, best of 3: 53.3 ns per loop
1556 10000000 loops, best of 3: 53.3 ns per loop
1557
1557
1558 In [2]: u = None
1558 In [2]: u = None
1559
1559
1560 In [3]: %timeit u is None
1560 In [3]: %timeit u is None
1561 10000000 loops, best of 3: 184 ns per loop
1561 10000000 loops, best of 3: 184 ns per loop
1562
1562
1563 In [4]: %timeit -r 4 u == None
1563 In [4]: %timeit -r 4 u == None
1564 1000000 loops, best of 4: 242 ns per loop
1564 1000000 loops, best of 4: 242 ns per loop
1565
1565
1566 In [5]: import time
1566 In [5]: import time
1567
1567
1568 In [6]: %timeit -n1 time.sleep(2)
1568 In [6]: %timeit -n1 time.sleep(2)
1569 1 loops, best of 3: 2 s per loop
1569 1 loops, best of 3: 2 s per loop
1570
1570
1571
1571
1572 The times reported by %timeit will be slightly higher than those
1572 The times reported by %timeit will be slightly higher than those
1573 reported by the timeit.py script when variables are accessed. This is
1573 reported by the timeit.py script when variables are accessed. This is
1574 due to the fact that %timeit executes the statement in the namespace
1574 due to the fact that %timeit executes the statement in the namespace
1575 of the shell, compared with timeit.py, which uses a single setup
1575 of the shell, compared with timeit.py, which uses a single setup
1576 statement to import function or create variables. Generally, the bias
1576 statement to import function or create variables. Generally, the bias
1577 does not matter as long as results from timeit.py are not mixed with
1577 does not matter as long as results from timeit.py are not mixed with
1578 those from %timeit."""
1578 those from %timeit."""
1579
1579
1580 import timeit
1580 import timeit
1581 import math
1581 import math
1582
1582
1583 units = ["s", "ms", "\xc2\xb5s", "ns"]
1583 units = ["s", "ms", "\xc2\xb5s", "ns"]
1584 scaling = [1, 1e3, 1e6, 1e9]
1584 scaling = [1, 1e3, 1e6, 1e9]
1585
1585
1586 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1586 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1587 posix=False)
1587 posix=False)
1588 if stmt == "":
1588 if stmt == "":
1589 return
1589 return
1590 timefunc = timeit.default_timer
1590 timefunc = timeit.default_timer
1591 number = int(getattr(opts, "n", 0))
1591 number = int(getattr(opts, "n", 0))
1592 repeat = int(getattr(opts, "r", timeit.default_repeat))
1592 repeat = int(getattr(opts, "r", timeit.default_repeat))
1593 precision = int(getattr(opts, "p", 3))
1593 precision = int(getattr(opts, "p", 3))
1594 if hasattr(opts, "t"):
1594 if hasattr(opts, "t"):
1595 timefunc = time.time
1595 timefunc = time.time
1596 if hasattr(opts, "c"):
1596 if hasattr(opts, "c"):
1597 timefunc = clock
1597 timefunc = clock
1598
1598
1599 timer = timeit.Timer(timer=timefunc)
1599 timer = timeit.Timer(timer=timefunc)
1600 # this code has tight coupling to the inner workings of timeit.Timer,
1600 # this code has tight coupling to the inner workings of timeit.Timer,
1601 # but is there a better way to achieve that the code stmt has access
1601 # but is there a better way to achieve that the code stmt has access
1602 # to the shell namespace?
1602 # to the shell namespace?
1603
1603
1604 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1604 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1605 'setup': "pass"}
1605 'setup': "pass"}
1606 code = compile(src, "<magic-timeit>", "exec")
1606 code = compile(src, "<magic-timeit>", "exec")
1607 ns = {}
1607 ns = {}
1608 exec code in self.shell.user_ns, ns
1608 exec code in self.shell.user_ns, ns
1609 timer.inner = ns["inner"]
1609 timer.inner = ns["inner"]
1610
1610
1611 if number == 0:
1611 if number == 0:
1612 # determine number so that 0.2 <= total time < 2.0
1612 # determine number so that 0.2 <= total time < 2.0
1613 number = 1
1613 number = 1
1614 for i in range(1, 10):
1614 for i in range(1, 10):
1615 number *= 10
1615 number *= 10
1616 if timer.timeit(number) >= 0.2:
1616 if timer.timeit(number) >= 0.2:
1617 break
1617 break
1618
1618
1619 best = min(timer.repeat(repeat, number)) / number
1619 best = min(timer.repeat(repeat, number)) / number
1620
1620
1621 if best > 0.0:
1621 if best > 0.0:
1622 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1622 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1623 else:
1623 else:
1624 order = 3
1624 order = 3
1625 print "%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1625 print "%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1626 precision,
1626 precision,
1627 best * scaling[order],
1627 best * scaling[order],
1628 units[order])
1628 units[order])
1629
1629
1630 def magic_time(self,parameter_s = ''):
1630 def magic_time(self,parameter_s = ''):
1631 """Time execution of a Python statement or expression.
1631 """Time execution of a Python statement or expression.
1632
1632
1633 The CPU and wall clock times are printed, and the value of the
1633 The CPU and wall clock times are printed, and the value of the
1634 expression (if any) is returned. Note that under Win32, system time
1634 expression (if any) is returned. Note that under Win32, system time
1635 is always reported as 0, since it can not be measured.
1635 is always reported as 0, since it can not be measured.
1636
1636
1637 This function provides very basic timing functionality. In Python
1637 This function provides very basic timing functionality. In Python
1638 2.3, the timeit module offers more control and sophistication, so this
1638 2.3, the timeit module offers more control and sophistication, so this
1639 could be rewritten to use it (patches welcome).
1639 could be rewritten to use it (patches welcome).
1640
1640
1641 Some examples:
1641 Some examples:
1642
1642
1643 In [1]: time 2**128
1643 In [1]: time 2**128
1644 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1644 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1645 Wall time: 0.00
1645 Wall time: 0.00
1646 Out[1]: 340282366920938463463374607431768211456L
1646 Out[1]: 340282366920938463463374607431768211456L
1647
1647
1648 In [2]: n = 1000000
1648 In [2]: n = 1000000
1649
1649
1650 In [3]: time sum(range(n))
1650 In [3]: time sum(range(n))
1651 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1651 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1652 Wall time: 1.37
1652 Wall time: 1.37
1653 Out[3]: 499999500000L
1653 Out[3]: 499999500000L
1654
1654
1655 In [4]: time print 'hello world'
1655 In [4]: time print 'hello world'
1656 hello world
1656 hello world
1657 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1657 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1658 Wall time: 0.00
1658 Wall time: 0.00
1659 """
1659 """
1660
1660
1661 # fail immediately if the given expression can't be compiled
1661 # fail immediately if the given expression can't be compiled
1662 try:
1662 try:
1663 mode = 'eval'
1663 mode = 'eval'
1664 code = compile(parameter_s,'<timed eval>',mode)
1664 code = compile(parameter_s,'<timed eval>',mode)
1665 except SyntaxError:
1665 except SyntaxError:
1666 mode = 'exec'
1666 mode = 'exec'
1667 code = compile(parameter_s,'<timed exec>',mode)
1667 code = compile(parameter_s,'<timed exec>',mode)
1668 # skew measurement as little as possible
1668 # skew measurement as little as possible
1669 glob = self.shell.user_ns
1669 glob = self.shell.user_ns
1670 clk = clock2
1670 clk = clock2
1671 wtime = time.time
1671 wtime = time.time
1672 # time execution
1672 # time execution
1673 wall_st = wtime()
1673 wall_st = wtime()
1674 if mode=='eval':
1674 if mode=='eval':
1675 st = clk()
1675 st = clk()
1676 out = eval(code,glob)
1676 out = eval(code,glob)
1677 end = clk()
1677 end = clk()
1678 else:
1678 else:
1679 st = clk()
1679 st = clk()
1680 exec code in glob
1680 exec code in glob
1681 end = clk()
1681 end = clk()
1682 out = None
1682 out = None
1683 wall_end = wtime()
1683 wall_end = wtime()
1684 # Compute actual times and report
1684 # Compute actual times and report
1685 wall_time = wall_end-wall_st
1685 wall_time = wall_end-wall_st
1686 cpu_user = end[0]-st[0]
1686 cpu_user = end[0]-st[0]
1687 cpu_sys = end[1]-st[1]
1687 cpu_sys = end[1]-st[1]
1688 cpu_tot = cpu_user+cpu_sys
1688 cpu_tot = cpu_user+cpu_sys
1689 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1689 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1690 (cpu_user,cpu_sys,cpu_tot)
1690 (cpu_user,cpu_sys,cpu_tot)
1691 print "Wall time: %.2f" % wall_time
1691 print "Wall time: %.2f" % wall_time
1692 return out
1692 return out
1693
1693
1694 def magic_macro(self,parameter_s = ''):
1694 def magic_macro(self,parameter_s = ''):
1695 """Define a set of input lines as a macro for future re-execution.
1695 """Define a set of input lines as a macro for future re-execution.
1696
1696
1697 Usage:\\
1697 Usage:\\
1698 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1698 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1699
1699
1700 Options:
1700 Options:
1701
1701
1702 -r: use 'raw' input. By default, the 'processed' history is used,
1702 -r: use 'raw' input. By default, the 'processed' history is used,
1703 so that magics are loaded in their transformed version to valid
1703 so that magics are loaded in their transformed version to valid
1704 Python. If this option is given, the raw input as typed as the
1704 Python. If this option is given, the raw input as typed as the
1705 command line is used instead.
1705 command line is used instead.
1706
1706
1707 This will define a global variable called `name` which is a string
1707 This will define a global variable called `name` which is a string
1708 made of joining the slices and lines you specify (n1,n2,... numbers
1708 made of joining the slices and lines you specify (n1,n2,... numbers
1709 above) from your input history into a single string. This variable
1709 above) from your input history into a single string. This variable
1710 acts like an automatic function which re-executes those lines as if
1710 acts like an automatic function which re-executes those lines as if
1711 you had typed them. You just type 'name' at the prompt and the code
1711 you had typed them. You just type 'name' at the prompt and the code
1712 executes.
1712 executes.
1713
1713
1714 The notation for indicating number ranges is: n1-n2 means 'use line
1714 The notation for indicating number ranges is: n1-n2 means 'use line
1715 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1715 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1716 using the lines numbered 5,6 and 7.
1716 using the lines numbered 5,6 and 7.
1717
1717
1718 Note: as a 'hidden' feature, you can also use traditional python slice
1718 Note: as a 'hidden' feature, you can also use traditional python slice
1719 notation, where N:M means numbers N through M-1.
1719 notation, where N:M means numbers N through M-1.
1720
1720
1721 For example, if your history contains (%hist prints it):
1721 For example, if your history contains (%hist prints it):
1722
1722
1723 44: x=1\\
1723 44: x=1\\
1724 45: y=3\\
1724 45: y=3\\
1725 46: z=x+y\\
1725 46: z=x+y\\
1726 47: print x\\
1726 47: print x\\
1727 48: a=5\\
1727 48: a=5\\
1728 49: print 'x',x,'y',y\\
1728 49: print 'x',x,'y',y\\
1729
1729
1730 you can create a macro with lines 44 through 47 (included) and line 49
1730 you can create a macro with lines 44 through 47 (included) and line 49
1731 called my_macro with:
1731 called my_macro with:
1732
1732
1733 In [51]: %macro my_macro 44-47 49
1733 In [51]: %macro my_macro 44-47 49
1734
1734
1735 Now, typing `my_macro` (without quotes) will re-execute all this code
1735 Now, typing `my_macro` (without quotes) will re-execute all this code
1736 in one pass.
1736 in one pass.
1737
1737
1738 You don't need to give the line-numbers in order, and any given line
1738 You don't need to give the line-numbers in order, and any given line
1739 number can appear multiple times. You can assemble macros with any
1739 number can appear multiple times. You can assemble macros with any
1740 lines from your input history in any order.
1740 lines from your input history in any order.
1741
1741
1742 The macro is a simple object which holds its value in an attribute,
1742 The macro is a simple object which holds its value in an attribute,
1743 but IPython's display system checks for macros and executes them as
1743 but IPython's display system checks for macros and executes them as
1744 code instead of printing them when you type their name.
1744 code instead of printing them when you type their name.
1745
1745
1746 You can view a macro's contents by explicitly printing it with:
1746 You can view a macro's contents by explicitly printing it with:
1747
1747
1748 'print macro_name'.
1748 'print macro_name'.
1749
1749
1750 For one-off cases which DON'T contain magic function calls in them you
1750 For one-off cases which DON'T contain magic function calls in them you
1751 can obtain similar results by explicitly executing slices from your
1751 can obtain similar results by explicitly executing slices from your
1752 input history with:
1752 input history with:
1753
1753
1754 In [60]: exec In[44:48]+In[49]"""
1754 In [60]: exec In[44:48]+In[49]"""
1755
1755
1756 opts,args = self.parse_options(parameter_s,'r',mode='list')
1756 opts,args = self.parse_options(parameter_s,'r',mode='list')
1757 if not args:
1757 if not args:
1758 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1758 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1759 macs.sort()
1759 macs.sort()
1760 return macs
1760 return macs
1761 name,ranges = args[0], args[1:]
1761 name,ranges = args[0], args[1:]
1762 #print 'rng',ranges # dbg
1762 #print 'rng',ranges # dbg
1763 lines = self.extract_input_slices(ranges,opts.has_key('r'))
1763 lines = self.extract_input_slices(ranges,opts.has_key('r'))
1764 macro = Macro(lines)
1764 macro = Macro(lines)
1765 self.shell.user_ns.update({name:macro})
1765 self.shell.user_ns.update({name:macro})
1766 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1766 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1767 print 'Macro contents:'
1767 print 'Macro contents:'
1768 print macro,
1768 print macro,
1769
1769
1770 def magic_save(self,parameter_s = ''):
1770 def magic_save(self,parameter_s = ''):
1771 """Save a set of lines to a given filename.
1771 """Save a set of lines to a given filename.
1772
1772
1773 Usage:\\
1773 Usage:\\
1774 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
1774 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
1775
1775
1776 Options:
1776 Options:
1777
1777
1778 -r: use 'raw' input. By default, the 'processed' history is used,
1778 -r: use 'raw' input. By default, the 'processed' history is used,
1779 so that magics are loaded in their transformed version to valid
1779 so that magics are loaded in their transformed version to valid
1780 Python. If this option is given, the raw input as typed as the
1780 Python. If this option is given, the raw input as typed as the
1781 command line is used instead.
1781 command line is used instead.
1782
1782
1783 This function uses the same syntax as %macro for line extraction, but
1783 This function uses the same syntax as %macro for line extraction, but
1784 instead of creating a macro it saves the resulting string to the
1784 instead of creating a macro it saves the resulting string to the
1785 filename you specify.
1785 filename you specify.
1786
1786
1787 It adds a '.py' extension to the file if you don't do so yourself, and
1787 It adds a '.py' extension to the file if you don't do so yourself, and
1788 it asks for confirmation before overwriting existing files."""
1788 it asks for confirmation before overwriting existing files."""
1789
1789
1790 opts,args = self.parse_options(parameter_s,'r',mode='list')
1790 opts,args = self.parse_options(parameter_s,'r',mode='list')
1791 fname,ranges = args[0], args[1:]
1791 fname,ranges = args[0], args[1:]
1792 if not fname.endswith('.py'):
1792 if not fname.endswith('.py'):
1793 fname += '.py'
1793 fname += '.py'
1794 if os.path.isfile(fname):
1794 if os.path.isfile(fname):
1795 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
1795 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
1796 if ans.lower() not in ['y','yes']:
1796 if ans.lower() not in ['y','yes']:
1797 print 'Operation cancelled.'
1797 print 'Operation cancelled.'
1798 return
1798 return
1799 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
1799 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
1800 f = file(fname,'w')
1800 f = file(fname,'w')
1801 f.write(cmds)
1801 f.write(cmds)
1802 f.close()
1802 f.close()
1803 print 'The following commands were written to file `%s`:' % fname
1803 print 'The following commands were written to file `%s`:' % fname
1804 print cmds
1804 print cmds
1805
1805
1806 def _edit_macro(self,mname,macro):
1806 def _edit_macro(self,mname,macro):
1807 """open an editor with the macro data in a file"""
1807 """open an editor with the macro data in a file"""
1808 filename = self.shell.mktempfile(macro.value)
1808 filename = self.shell.mktempfile(macro.value)
1809 self.shell.hooks.editor(filename)
1809 self.shell.hooks.editor(filename)
1810
1810
1811 # and make a new macro object, to replace the old one
1811 # and make a new macro object, to replace the old one
1812 mfile = open(filename)
1812 mfile = open(filename)
1813 mvalue = mfile.read()
1813 mvalue = mfile.read()
1814 mfile.close()
1814 mfile.close()
1815 self.shell.user_ns[mname] = Macro(mvalue)
1815 self.shell.user_ns[mname] = Macro(mvalue)
1816
1816
1817 def magic_ed(self,parameter_s=''):
1817 def magic_ed(self,parameter_s=''):
1818 """Alias to %edit."""
1818 """Alias to %edit."""
1819 return self.magic_edit(parameter_s)
1819 return self.magic_edit(parameter_s)
1820
1820
1821 def magic_edit(self,parameter_s='',last_call=['','']):
1821 def magic_edit(self,parameter_s='',last_call=['','']):
1822 """Bring up an editor and execute the resulting code.
1822 """Bring up an editor and execute the resulting code.
1823
1823
1824 Usage:
1824 Usage:
1825 %edit [options] [args]
1825 %edit [options] [args]
1826
1826
1827 %edit runs IPython's editor hook. The default version of this hook is
1827 %edit runs IPython's editor hook. The default version of this hook is
1828 set to call the __IPYTHON__.rc.editor command. This is read from your
1828 set to call the __IPYTHON__.rc.editor command. This is read from your
1829 environment variable $EDITOR. If this isn't found, it will default to
1829 environment variable $EDITOR. If this isn't found, it will default to
1830 vi under Linux/Unix and to notepad under Windows. See the end of this
1830 vi under Linux/Unix and to notepad under Windows. See the end of this
1831 docstring for how to change the editor hook.
1831 docstring for how to change the editor hook.
1832
1832
1833 You can also set the value of this editor via the command line option
1833 You can also set the value of this editor via the command line option
1834 '-editor' or in your ipythonrc file. This is useful if you wish to use
1834 '-editor' or in your ipythonrc file. This is useful if you wish to use
1835 specifically for IPython an editor different from your typical default
1835 specifically for IPython an editor different from your typical default
1836 (and for Windows users who typically don't set environment variables).
1836 (and for Windows users who typically don't set environment variables).
1837
1837
1838 This command allows you to conveniently edit multi-line code right in
1838 This command allows you to conveniently edit multi-line code right in
1839 your IPython session.
1839 your IPython session.
1840
1840
1841 If called without arguments, %edit opens up an empty editor with a
1841 If called without arguments, %edit opens up an empty editor with a
1842 temporary file and will execute the contents of this file when you
1842 temporary file and will execute the contents of this file when you
1843 close it (don't forget to save it!).
1843 close it (don't forget to save it!).
1844
1844
1845
1845
1846 Options:
1846 Options:
1847
1847
1848 -n <number>: open the editor at a specified line number. By default,
1848 -n <number>: open the editor at a specified line number. By default,
1849 the IPython editor hook uses the unix syntax 'editor +N filename', but
1849 the IPython editor hook uses the unix syntax 'editor +N filename', but
1850 you can configure this by providing your own modified hook if your
1850 you can configure this by providing your own modified hook if your
1851 favorite editor supports line-number specifications with a different
1851 favorite editor supports line-number specifications with a different
1852 syntax.
1852 syntax.
1853
1853
1854 -p: this will call the editor with the same data as the previous time
1854 -p: this will call the editor with the same data as the previous time
1855 it was used, regardless of how long ago (in your current session) it
1855 it was used, regardless of how long ago (in your current session) it
1856 was.
1856 was.
1857
1857
1858 -r: use 'raw' input. This option only applies to input taken from the
1858 -r: use 'raw' input. This option only applies to input taken from the
1859 user's history. By default, the 'processed' history is used, so that
1859 user's history. By default, the 'processed' history is used, so that
1860 magics are loaded in their transformed version to valid Python. If
1860 magics are loaded in their transformed version to valid Python. If
1861 this option is given, the raw input as typed as the command line is
1861 this option is given, the raw input as typed as the command line is
1862 used instead. When you exit the editor, it will be executed by
1862 used instead. When you exit the editor, it will be executed by
1863 IPython's own processor.
1863 IPython's own processor.
1864
1864
1865 -x: do not execute the edited code immediately upon exit. This is
1865 -x: do not execute the edited code immediately upon exit. This is
1866 mainly useful if you are editing programs which need to be called with
1866 mainly useful if you are editing programs which need to be called with
1867 command line arguments, which you can then do using %run.
1867 command line arguments, which you can then do using %run.
1868
1868
1869
1869
1870 Arguments:
1870 Arguments:
1871
1871
1872 If arguments are given, the following possibilites exist:
1872 If arguments are given, the following possibilites exist:
1873
1873
1874 - The arguments are numbers or pairs of colon-separated numbers (like
1874 - The arguments are numbers or pairs of colon-separated numbers (like
1875 1 4:8 9). These are interpreted as lines of previous input to be
1875 1 4:8 9). These are interpreted as lines of previous input to be
1876 loaded into the editor. The syntax is the same of the %macro command.
1876 loaded into the editor. The syntax is the same of the %macro command.
1877
1877
1878 - If the argument doesn't start with a number, it is evaluated as a
1878 - If the argument doesn't start with a number, it is evaluated as a
1879 variable and its contents loaded into the editor. You can thus edit
1879 variable and its contents loaded into the editor. You can thus edit
1880 any string which contains python code (including the result of
1880 any string which contains python code (including the result of
1881 previous edits).
1881 previous edits).
1882
1882
1883 - If the argument is the name of an object (other than a string),
1883 - If the argument is the name of an object (other than a string),
1884 IPython will try to locate the file where it was defined and open the
1884 IPython will try to locate the file where it was defined and open the
1885 editor at the point where it is defined. You can use `%edit function`
1885 editor at the point where it is defined. You can use `%edit function`
1886 to load an editor exactly at the point where 'function' is defined,
1886 to load an editor exactly at the point where 'function' is defined,
1887 edit it and have the file be executed automatically.
1887 edit it and have the file be executed automatically.
1888
1888
1889 If the object is a macro (see %macro for details), this opens up your
1889 If the object is a macro (see %macro for details), this opens up your
1890 specified editor with a temporary file containing the macro's data.
1890 specified editor with a temporary file containing the macro's data.
1891 Upon exit, the macro is reloaded with the contents of the file.
1891 Upon exit, the macro is reloaded with the contents of the file.
1892
1892
1893 Note: opening at an exact line is only supported under Unix, and some
1893 Note: opening at an exact line is only supported under Unix, and some
1894 editors (like kedit and gedit up to Gnome 2.8) do not understand the
1894 editors (like kedit and gedit up to Gnome 2.8) do not understand the
1895 '+NUMBER' parameter necessary for this feature. Good editors like
1895 '+NUMBER' parameter necessary for this feature. Good editors like
1896 (X)Emacs, vi, jed, pico and joe all do.
1896 (X)Emacs, vi, jed, pico and joe all do.
1897
1897
1898 - If the argument is not found as a variable, IPython will look for a
1898 - If the argument is not found as a variable, IPython will look for a
1899 file with that name (adding .py if necessary) and load it into the
1899 file with that name (adding .py if necessary) and load it into the
1900 editor. It will execute its contents with execfile() when you exit,
1900 editor. It will execute its contents with execfile() when you exit,
1901 loading any code in the file into your interactive namespace.
1901 loading any code in the file into your interactive namespace.
1902
1902
1903 After executing your code, %edit will return as output the code you
1903 After executing your code, %edit will return as output the code you
1904 typed in the editor (except when it was an existing file). This way
1904 typed in the editor (except when it was an existing file). This way
1905 you can reload the code in further invocations of %edit as a variable,
1905 you can reload the code in further invocations of %edit as a variable,
1906 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
1906 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
1907 the output.
1907 the output.
1908
1908
1909 Note that %edit is also available through the alias %ed.
1909 Note that %edit is also available through the alias %ed.
1910
1910
1911 This is an example of creating a simple function inside the editor and
1911 This is an example of creating a simple function inside the editor and
1912 then modifying it. First, start up the editor:
1912 then modifying it. First, start up the editor:
1913
1913
1914 In [1]: ed\\
1914 In [1]: ed\\
1915 Editing... done. Executing edited code...\\
1915 Editing... done. Executing edited code...\\
1916 Out[1]: 'def foo():\\n print "foo() was defined in an editing session"\\n'
1916 Out[1]: 'def foo():\\n print "foo() was defined in an editing session"\\n'
1917
1917
1918 We can then call the function foo():
1918 We can then call the function foo():
1919
1919
1920 In [2]: foo()\\
1920 In [2]: foo()\\
1921 foo() was defined in an editing session
1921 foo() was defined in an editing session
1922
1922
1923 Now we edit foo. IPython automatically loads the editor with the
1923 Now we edit foo. IPython automatically loads the editor with the
1924 (temporary) file where foo() was previously defined:
1924 (temporary) file where foo() was previously defined:
1925
1925
1926 In [3]: ed foo\\
1926 In [3]: ed foo\\
1927 Editing... done. Executing edited code...
1927 Editing... done. Executing edited code...
1928
1928
1929 And if we call foo() again we get the modified version:
1929 And if we call foo() again we get the modified version:
1930
1930
1931 In [4]: foo()\\
1931 In [4]: foo()\\
1932 foo() has now been changed!
1932 foo() has now been changed!
1933
1933
1934 Here is an example of how to edit a code snippet successive
1934 Here is an example of how to edit a code snippet successive
1935 times. First we call the editor:
1935 times. First we call the editor:
1936
1936
1937 In [8]: ed\\
1937 In [8]: ed\\
1938 Editing... done. Executing edited code...\\
1938 Editing... done. Executing edited code...\\
1939 hello\\
1939 hello\\
1940 Out[8]: "print 'hello'\\n"
1940 Out[8]: "print 'hello'\\n"
1941
1941
1942 Now we call it again with the previous output (stored in _):
1942 Now we call it again with the previous output (stored in _):
1943
1943
1944 In [9]: ed _\\
1944 In [9]: ed _\\
1945 Editing... done. Executing edited code...\\
1945 Editing... done. Executing edited code...\\
1946 hello world\\
1946 hello world\\
1947 Out[9]: "print 'hello world'\\n"
1947 Out[9]: "print 'hello world'\\n"
1948
1948
1949 Now we call it with the output #8 (stored in _8, also as Out[8]):
1949 Now we call it with the output #8 (stored in _8, also as Out[8]):
1950
1950
1951 In [10]: ed _8\\
1951 In [10]: ed _8\\
1952 Editing... done. Executing edited code...\\
1952 Editing... done. Executing edited code...\\
1953 hello again\\
1953 hello again\\
1954 Out[10]: "print 'hello again'\\n"
1954 Out[10]: "print 'hello again'\\n"
1955
1955
1956
1956
1957 Changing the default editor hook:
1957 Changing the default editor hook:
1958
1958
1959 If you wish to write your own editor hook, you can put it in a
1959 If you wish to write your own editor hook, you can put it in a
1960 configuration file which you load at startup time. The default hook
1960 configuration file which you load at startup time. The default hook
1961 is defined in the IPython.hooks module, and you can use that as a
1961 is defined in the IPython.hooks module, and you can use that as a
1962 starting example for further modifications. That file also has
1962 starting example for further modifications. That file also has
1963 general instructions on how to set a new hook for use once you've
1963 general instructions on how to set a new hook for use once you've
1964 defined it."""
1964 defined it."""
1965
1965
1966 # FIXME: This function has become a convoluted mess. It needs a
1966 # FIXME: This function has become a convoluted mess. It needs a
1967 # ground-up rewrite with clean, simple logic.
1967 # ground-up rewrite with clean, simple logic.
1968
1968
1969 def make_filename(arg):
1969 def make_filename(arg):
1970 "Make a filename from the given args"
1970 "Make a filename from the given args"
1971 try:
1971 try:
1972 filename = get_py_filename(arg)
1972 filename = get_py_filename(arg)
1973 except IOError:
1973 except IOError:
1974 if args.endswith('.py'):
1974 if args.endswith('.py'):
1975 filename = arg
1975 filename = arg
1976 else:
1976 else:
1977 filename = None
1977 filename = None
1978 return filename
1978 return filename
1979
1979
1980 # custom exceptions
1980 # custom exceptions
1981 class DataIsObject(Exception): pass
1981 class DataIsObject(Exception): pass
1982
1982
1983 opts,args = self.parse_options(parameter_s,'prxn:')
1983 opts,args = self.parse_options(parameter_s,'prxn:')
1984 # Set a few locals from the options for convenience:
1984 # Set a few locals from the options for convenience:
1985 opts_p = opts.has_key('p')
1985 opts_p = opts.has_key('p')
1986 opts_r = opts.has_key('r')
1986 opts_r = opts.has_key('r')
1987
1987
1988 # Default line number value
1988 # Default line number value
1989 lineno = opts.get('n',None)
1989 lineno = opts.get('n',None)
1990
1990
1991 if opts_p:
1991 if opts_p:
1992 args = '_%s' % last_call[0]
1992 args = '_%s' % last_call[0]
1993 if not self.shell.user_ns.has_key(args):
1993 if not self.shell.user_ns.has_key(args):
1994 args = last_call[1]
1994 args = last_call[1]
1995
1995
1996 # use last_call to remember the state of the previous call, but don't
1996 # use last_call to remember the state of the previous call, but don't
1997 # let it be clobbered by successive '-p' calls.
1997 # let it be clobbered by successive '-p' calls.
1998 try:
1998 try:
1999 last_call[0] = self.shell.outputcache.prompt_count
1999 last_call[0] = self.shell.outputcache.prompt_count
2000 if not opts_p:
2000 if not opts_p:
2001 last_call[1] = parameter_s
2001 last_call[1] = parameter_s
2002 except:
2002 except:
2003 pass
2003 pass
2004
2004
2005 # by default this is done with temp files, except when the given
2005 # by default this is done with temp files, except when the given
2006 # arg is a filename
2006 # arg is a filename
2007 use_temp = 1
2007 use_temp = 1
2008
2008
2009 if re.match(r'\d',args):
2009 if re.match(r'\d',args):
2010 # Mode where user specifies ranges of lines, like in %macro.
2010 # Mode where user specifies ranges of lines, like in %macro.
2011 # This means that you can't edit files whose names begin with
2011 # This means that you can't edit files whose names begin with
2012 # numbers this way. Tough.
2012 # numbers this way. Tough.
2013 ranges = args.split()
2013 ranges = args.split()
2014 data = ''.join(self.extract_input_slices(ranges,opts_r))
2014 data = ''.join(self.extract_input_slices(ranges,opts_r))
2015 elif args.endswith('.py'):
2015 elif args.endswith('.py'):
2016 filename = make_filename(args)
2016 filename = make_filename(args)
2017 data = ''
2017 data = ''
2018 use_temp = 0
2018 use_temp = 0
2019 elif args:
2019 elif args:
2020 try:
2020 try:
2021 # Load the parameter given as a variable. If not a string,
2021 # Load the parameter given as a variable. If not a string,
2022 # process it as an object instead (below)
2022 # process it as an object instead (below)
2023
2023
2024 #print '*** args',args,'type',type(args) # dbg
2024 #print '*** args',args,'type',type(args) # dbg
2025 data = eval(args,self.shell.user_ns)
2025 data = eval(args,self.shell.user_ns)
2026 if not type(data) in StringTypes:
2026 if not type(data) in StringTypes:
2027 raise DataIsObject
2027 raise DataIsObject
2028
2028
2029 except (NameError,SyntaxError):
2029 except (NameError,SyntaxError):
2030 # given argument is not a variable, try as a filename
2030 # given argument is not a variable, try as a filename
2031 filename = make_filename(args)
2031 filename = make_filename(args)
2032 if filename is None:
2032 if filename is None:
2033 warn("Argument given (%s) can't be found as a variable "
2033 warn("Argument given (%s) can't be found as a variable "
2034 "or as a filename." % args)
2034 "or as a filename." % args)
2035 return
2035 return
2036
2036
2037 data = ''
2037 data = ''
2038 use_temp = 0
2038 use_temp = 0
2039 except DataIsObject:
2039 except DataIsObject:
2040
2040
2041 # macros have a special edit function
2041 # macros have a special edit function
2042 if isinstance(data,Macro):
2042 if isinstance(data,Macro):
2043 self._edit_macro(args,data)
2043 self._edit_macro(args,data)
2044 return
2044 return
2045
2045
2046 # For objects, try to edit the file where they are defined
2046 # For objects, try to edit the file where they are defined
2047 try:
2047 try:
2048 filename = inspect.getabsfile(data)
2048 filename = inspect.getabsfile(data)
2049 datafile = 1
2049 datafile = 1
2050 except TypeError:
2050 except TypeError:
2051 filename = make_filename(args)
2051 filename = make_filename(args)
2052 datafile = 1
2052 datafile = 1
2053 warn('Could not find file where `%s` is defined.\n'
2053 warn('Could not find file where `%s` is defined.\n'
2054 'Opening a file named `%s`' % (args,filename))
2054 'Opening a file named `%s`' % (args,filename))
2055 # Now, make sure we can actually read the source (if it was in
2055 # Now, make sure we can actually read the source (if it was in
2056 # a temp file it's gone by now).
2056 # a temp file it's gone by now).
2057 if datafile:
2057 if datafile:
2058 try:
2058 try:
2059 if lineno is None:
2059 if lineno is None:
2060 lineno = inspect.getsourcelines(data)[1]
2060 lineno = inspect.getsourcelines(data)[1]
2061 except IOError:
2061 except IOError:
2062 filename = make_filename(args)
2062 filename = make_filename(args)
2063 if filename is None:
2063 if filename is None:
2064 warn('The file `%s` where `%s` was defined cannot '
2064 warn('The file `%s` where `%s` was defined cannot '
2065 'be read.' % (filename,data))
2065 'be read.' % (filename,data))
2066 return
2066 return
2067 use_temp = 0
2067 use_temp = 0
2068 else:
2068 else:
2069 data = ''
2069 data = ''
2070
2070
2071 if use_temp:
2071 if use_temp:
2072 filename = self.shell.mktempfile(data)
2072 filename = self.shell.mktempfile(data)
2073 print 'IPython will make a temporary file named:',filename
2073 print 'IPython will make a temporary file named:',filename
2074
2074
2075 # do actual editing here
2075 # do actual editing here
2076 print 'Editing...',
2076 print 'Editing...',
2077 sys.stdout.flush()
2077 sys.stdout.flush()
2078 self.shell.hooks.editor(filename,lineno)
2078 self.shell.hooks.editor(filename,lineno)
2079 if opts.has_key('x'): # -x prevents actual execution
2079 if opts.has_key('x'): # -x prevents actual execution
2080 print
2080 print
2081 else:
2081 else:
2082 print 'done. Executing edited code...'
2082 print 'done. Executing edited code...'
2083 if opts_r:
2083 if opts_r:
2084 self.shell.runlines(file_read(filename))
2084 self.shell.runlines(file_read(filename))
2085 else:
2085 else:
2086 self.shell.safe_execfile(filename,self.shell.user_ns,
2086 self.shell.safe_execfile(filename,self.shell.user_ns,
2087 self.shell.user_ns)
2087 self.shell.user_ns)
2088 if use_temp:
2088 if use_temp:
2089 try:
2089 try:
2090 return open(filename).read()
2090 return open(filename).read()
2091 except IOError,msg:
2091 except IOError,msg:
2092 if msg.filename == filename:
2092 if msg.filename == filename:
2093 warn('File not found. Did you forget to save?')
2093 warn('File not found. Did you forget to save?')
2094 return
2094 return
2095 else:
2095 else:
2096 self.shell.showtraceback()
2096 self.shell.showtraceback()
2097
2097
2098 def magic_xmode(self,parameter_s = ''):
2098 def magic_xmode(self,parameter_s = ''):
2099 """Switch modes for the exception handlers.
2099 """Switch modes for the exception handlers.
2100
2100
2101 Valid modes: Plain, Context and Verbose.
2101 Valid modes: Plain, Context and Verbose.
2102
2102
2103 If called without arguments, acts as a toggle."""
2103 If called without arguments, acts as a toggle."""
2104
2104
2105 def xmode_switch_err(name):
2105 def xmode_switch_err(name):
2106 warn('Error changing %s exception modes.\n%s' %
2106 warn('Error changing %s exception modes.\n%s' %
2107 (name,sys.exc_info()[1]))
2107 (name,sys.exc_info()[1]))
2108
2108
2109 shell = self.shell
2109 shell = self.shell
2110 new_mode = parameter_s.strip().capitalize()
2110 new_mode = parameter_s.strip().capitalize()
2111 try:
2111 try:
2112 shell.InteractiveTB.set_mode(mode=new_mode)
2112 shell.InteractiveTB.set_mode(mode=new_mode)
2113 print 'Exception reporting mode:',shell.InteractiveTB.mode
2113 print 'Exception reporting mode:',shell.InteractiveTB.mode
2114 except:
2114 except:
2115 xmode_switch_err('user')
2115 xmode_switch_err('user')
2116
2116
2117 # threaded shells use a special handler in sys.excepthook
2117 # threaded shells use a special handler in sys.excepthook
2118 if shell.isthreaded:
2118 if shell.isthreaded:
2119 try:
2119 try:
2120 shell.sys_excepthook.set_mode(mode=new_mode)
2120 shell.sys_excepthook.set_mode(mode=new_mode)
2121 except:
2121 except:
2122 xmode_switch_err('threaded')
2122 xmode_switch_err('threaded')
2123
2123
2124 def magic_colors(self,parameter_s = ''):
2124 def magic_colors(self,parameter_s = ''):
2125 """Switch color scheme for prompts, info system and exception handlers.
2125 """Switch color scheme for prompts, info system and exception handlers.
2126
2126
2127 Currently implemented schemes: NoColor, Linux, LightBG.
2127 Currently implemented schemes: NoColor, Linux, LightBG.
2128
2128
2129 Color scheme names are not case-sensitive."""
2129 Color scheme names are not case-sensitive."""
2130
2130
2131 def color_switch_err(name):
2131 def color_switch_err(name):
2132 warn('Error changing %s color schemes.\n%s' %
2132 warn('Error changing %s color schemes.\n%s' %
2133 (name,sys.exc_info()[1]))
2133 (name,sys.exc_info()[1]))
2134
2134
2135
2135
2136 new_scheme = parameter_s.strip()
2136 new_scheme = parameter_s.strip()
2137 if not new_scheme:
2137 if not new_scheme:
2138 print 'You must specify a color scheme.'
2138 print 'You must specify a color scheme.'
2139 return
2139 return
2140 import IPython.rlineimpl as readline
2140 import IPython.rlineimpl as readline
2141 if not readline.have_readline and sys.platform == "win32":
2141 if not readline.have_readline and sys.platform == "win32":
2142 msg = """\
2142 msg = """\
2143 Proper color support under MS Windows requires the pyreadline library.
2143 Proper color support under MS Windows requires the pyreadline library.
2144 You can find it at:
2144 You can find it at:
2145 http://ipython.scipy.org/moin/PyReadline/Intro
2145 http://ipython.scipy.org/moin/PyReadline/Intro
2146 Gary's readline needs the ctypes module, from:
2146 Gary's readline needs the ctypes module, from:
2147 http://starship.python.net/crew/theller/ctypes
2147 http://starship.python.net/crew/theller/ctypes
2148 (Note that ctypes is already part of Python versions 2.5 and newer).
2148 (Note that ctypes is already part of Python versions 2.5 and newer).
2149
2149
2150 Defaulting color scheme to 'NoColor'"""
2150 Defaulting color scheme to 'NoColor'"""
2151 new_scheme = 'NoColor'
2151 new_scheme = 'NoColor'
2152 warn(msg)
2152 warn(msg)
2153 # local shortcut
2153 # local shortcut
2154 shell = self.shell
2154 shell = self.shell
2155
2155
2156 # Set prompt colors
2156 # Set prompt colors
2157 try:
2157 try:
2158 shell.outputcache.set_colors(new_scheme)
2158 shell.outputcache.set_colors(new_scheme)
2159 except:
2159 except:
2160 color_switch_err('prompt')
2160 color_switch_err('prompt')
2161 else:
2161 else:
2162 shell.rc.colors = \
2162 shell.rc.colors = \
2163 shell.outputcache.color_table.active_scheme_name
2163 shell.outputcache.color_table.active_scheme_name
2164 # Set exception colors
2164 # Set exception colors
2165 try:
2165 try:
2166 shell.InteractiveTB.set_colors(scheme = new_scheme)
2166 shell.InteractiveTB.set_colors(scheme = new_scheme)
2167 shell.SyntaxTB.set_colors(scheme = new_scheme)
2167 shell.SyntaxTB.set_colors(scheme = new_scheme)
2168 except:
2168 except:
2169 color_switch_err('exception')
2169 color_switch_err('exception')
2170
2170
2171 # threaded shells use a verbose traceback in sys.excepthook
2171 # threaded shells use a verbose traceback in sys.excepthook
2172 if shell.isthreaded:
2172 if shell.isthreaded:
2173 try:
2173 try:
2174 shell.sys_excepthook.set_colors(scheme=new_scheme)
2174 shell.sys_excepthook.set_colors(scheme=new_scheme)
2175 except:
2175 except:
2176 color_switch_err('system exception handler')
2176 color_switch_err('system exception handler')
2177
2177
2178 # Set info (for 'object?') colors
2178 # Set info (for 'object?') colors
2179 if shell.rc.color_info:
2179 if shell.rc.color_info:
2180 try:
2180 try:
2181 shell.inspector.set_active_scheme(new_scheme)
2181 shell.inspector.set_active_scheme(new_scheme)
2182 except:
2182 except:
2183 color_switch_err('object inspector')
2183 color_switch_err('object inspector')
2184 else:
2184 else:
2185 shell.inspector.set_active_scheme('NoColor')
2185 shell.inspector.set_active_scheme('NoColor')
2186
2186
2187 def magic_color_info(self,parameter_s = ''):
2187 def magic_color_info(self,parameter_s = ''):
2188 """Toggle color_info.
2188 """Toggle color_info.
2189
2189
2190 The color_info configuration parameter controls whether colors are
2190 The color_info configuration parameter controls whether colors are
2191 used for displaying object details (by things like %psource, %pfile or
2191 used for displaying object details (by things like %psource, %pfile or
2192 the '?' system). This function toggles this value with each call.
2192 the '?' system). This function toggles this value with each call.
2193
2193
2194 Note that unless you have a fairly recent pager (less works better
2194 Note that unless you have a fairly recent pager (less works better
2195 than more) in your system, using colored object information displays
2195 than more) in your system, using colored object information displays
2196 will not work properly. Test it and see."""
2196 will not work properly. Test it and see."""
2197
2197
2198 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2198 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2199 self.magic_colors(self.shell.rc.colors)
2199 self.magic_colors(self.shell.rc.colors)
2200 print 'Object introspection functions have now coloring:',
2200 print 'Object introspection functions have now coloring:',
2201 print ['OFF','ON'][self.shell.rc.color_info]
2201 print ['OFF','ON'][self.shell.rc.color_info]
2202
2202
2203 def magic_Pprint(self, parameter_s=''):
2203 def magic_Pprint(self, parameter_s=''):
2204 """Toggle pretty printing on/off."""
2204 """Toggle pretty printing on/off."""
2205
2205
2206 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2206 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2207 print 'Pretty printing has been turned', \
2207 print 'Pretty printing has been turned', \
2208 ['OFF','ON'][self.shell.rc.pprint]
2208 ['OFF','ON'][self.shell.rc.pprint]
2209
2209
2210 def magic_exit(self, parameter_s=''):
2210 def magic_exit(self, parameter_s=''):
2211 """Exit IPython, confirming if configured to do so.
2211 """Exit IPython, confirming if configured to do so.
2212
2212
2213 You can configure whether IPython asks for confirmation upon exit by
2213 You can configure whether IPython asks for confirmation upon exit by
2214 setting the confirm_exit flag in the ipythonrc file."""
2214 setting the confirm_exit flag in the ipythonrc file."""
2215
2215
2216 self.shell.exit()
2216 self.shell.exit()
2217
2217
2218 def magic_quit(self, parameter_s=''):
2218 def magic_quit(self, parameter_s=''):
2219 """Exit IPython, confirming if configured to do so (like %exit)"""
2219 """Exit IPython, confirming if configured to do so (like %exit)"""
2220
2220
2221 self.shell.exit()
2221 self.shell.exit()
2222
2222
2223 def magic_Exit(self, parameter_s=''):
2223 def magic_Exit(self, parameter_s=''):
2224 """Exit IPython without confirmation."""
2224 """Exit IPython without confirmation."""
2225
2225
2226 self.shell.exit_now = True
2226 self.shell.exit_now = True
2227
2227
2228 #......................................................................
2228 #......................................................................
2229 # Functions to implement unix shell-type things
2229 # Functions to implement unix shell-type things
2230
2230
2231 def magic_alias(self, parameter_s = ''):
2231 def magic_alias(self, parameter_s = ''):
2232 """Define an alias for a system command.
2232 """Define an alias for a system command.
2233
2233
2234 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2234 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2235
2235
2236 Then, typing 'alias_name params' will execute the system command 'cmd
2236 Then, typing 'alias_name params' will execute the system command 'cmd
2237 params' (from your underlying operating system).
2237 params' (from your underlying operating system).
2238
2238
2239 Aliases have lower precedence than magic functions and Python normal
2239 Aliases have lower precedence than magic functions and Python normal
2240 variables, so if 'foo' is both a Python variable and an alias, the
2240 variables, so if 'foo' is both a Python variable and an alias, the
2241 alias can not be executed until 'del foo' removes the Python variable.
2241 alias can not be executed until 'del foo' removes the Python variable.
2242
2242
2243 You can use the %l specifier in an alias definition to represent the
2243 You can use the %l specifier in an alias definition to represent the
2244 whole line when the alias is called. For example:
2244 whole line when the alias is called. For example:
2245
2245
2246 In [2]: alias all echo "Input in brackets: <%l>"\\
2246 In [2]: alias all echo "Input in brackets: <%l>"\\
2247 In [3]: all hello world\\
2247 In [3]: all hello world\\
2248 Input in brackets: <hello world>
2248 Input in brackets: <hello world>
2249
2249
2250 You can also define aliases with parameters using %s specifiers (one
2250 You can also define aliases with parameters using %s specifiers (one
2251 per parameter):
2251 per parameter):
2252
2252
2253 In [1]: alias parts echo first %s second %s\\
2253 In [1]: alias parts echo first %s second %s\\
2254 In [2]: %parts A B\\
2254 In [2]: %parts A B\\
2255 first A second B\\
2255 first A second B\\
2256 In [3]: %parts A\\
2256 In [3]: %parts A\\
2257 Incorrect number of arguments: 2 expected.\\
2257 Incorrect number of arguments: 2 expected.\\
2258 parts is an alias to: 'echo first %s second %s'
2258 parts is an alias to: 'echo first %s second %s'
2259
2259
2260 Note that %l and %s are mutually exclusive. You can only use one or
2260 Note that %l and %s are mutually exclusive. You can only use one or
2261 the other in your aliases.
2261 the other in your aliases.
2262
2262
2263 Aliases expand Python variables just like system calls using ! or !!
2263 Aliases expand Python variables just like system calls using ! or !!
2264 do: all expressions prefixed with '$' get expanded. For details of
2264 do: all expressions prefixed with '$' get expanded. For details of
2265 the semantic rules, see PEP-215:
2265 the semantic rules, see PEP-215:
2266 http://www.python.org/peps/pep-0215.html. This is the library used by
2266 http://www.python.org/peps/pep-0215.html. This is the library used by
2267 IPython for variable expansion. If you want to access a true shell
2267 IPython for variable expansion. If you want to access a true shell
2268 variable, an extra $ is necessary to prevent its expansion by IPython:
2268 variable, an extra $ is necessary to prevent its expansion by IPython:
2269
2269
2270 In [6]: alias show echo\\
2270 In [6]: alias show echo\\
2271 In [7]: PATH='A Python string'\\
2271 In [7]: PATH='A Python string'\\
2272 In [8]: show $PATH\\
2272 In [8]: show $PATH\\
2273 A Python string\\
2273 A Python string\\
2274 In [9]: show $$PATH\\
2274 In [9]: show $$PATH\\
2275 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2275 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2276
2276
2277 You can use the alias facility to acess all of $PATH. See the %rehash
2277 You can use the alias facility to acess all of $PATH. See the %rehash
2278 and %rehashx functions, which automatically create aliases for the
2278 and %rehashx functions, which automatically create aliases for the
2279 contents of your $PATH.
2279 contents of your $PATH.
2280
2280
2281 If called with no parameters, %alias prints the current alias table."""
2281 If called with no parameters, %alias prints the current alias table."""
2282
2282
2283 par = parameter_s.strip()
2283 par = parameter_s.strip()
2284 if not par:
2284 if not par:
2285 stored = self.db.get('stored_aliases', {} )
2285 stored = self.db.get('stored_aliases', {} )
2286 atab = self.shell.alias_table
2286 atab = self.shell.alias_table
2287 aliases = atab.keys()
2287 aliases = atab.keys()
2288 aliases.sort()
2288 aliases.sort()
2289 res = []
2289 res = []
2290 showlast = []
2290 showlast = []
2291 for alias in aliases:
2291 for alias in aliases:
2292 tgt = atab[alias][1]
2292 try:
2293 tgt = atab[alias][1]
2294 except TypeError:
2295 # unsubscriptable? probably a callable
2296 tgt = atab[alias]
2293 # 'interesting' aliases
2297 # 'interesting' aliases
2294 if (alias in stored or
2298 if (alias in stored or
2295 alias.lower() != os.path.splitext(tgt)[0].lower() or
2299 alias.lower() != os.path.splitext(tgt)[0].lower() or
2296 ' ' in tgt):
2300 ' ' in tgt):
2297 showlast.append((alias, tgt))
2301 showlast.append((alias, tgt))
2298 else:
2302 else:
2299 res.append((alias, tgt ))
2303 res.append((alias, tgt ))
2300
2304
2301 # show most interesting aliases last
2305 # show most interesting aliases last
2302 res.extend(showlast)
2306 res.extend(showlast)
2303 print "Total number of aliases:",len(aliases)
2307 print "Total number of aliases:",len(aliases)
2304 return res
2308 return res
2305 try:
2309 try:
2306 alias,cmd = par.split(None,1)
2310 alias,cmd = par.split(None,1)
2307 except:
2311 except:
2308 print OInspect.getdoc(self.magic_alias)
2312 print OInspect.getdoc(self.magic_alias)
2309 else:
2313 else:
2310 nargs = cmd.count('%s')
2314 nargs = cmd.count('%s')
2311 if nargs>0 and cmd.find('%l')>=0:
2315 if nargs>0 and cmd.find('%l')>=0:
2312 error('The %s and %l specifiers are mutually exclusive '
2316 error('The %s and %l specifiers are mutually exclusive '
2313 'in alias definitions.')
2317 'in alias definitions.')
2314 else: # all looks OK
2318 else: # all looks OK
2315 self.shell.alias_table[alias] = (nargs,cmd)
2319 self.shell.alias_table[alias] = (nargs,cmd)
2316 self.shell.alias_table_validate(verbose=0)
2320 self.shell.alias_table_validate(verbose=0)
2317 # end magic_alias
2321 # end magic_alias
2318
2322
2319 def magic_unalias(self, parameter_s = ''):
2323 def magic_unalias(self, parameter_s = ''):
2320 """Remove an alias"""
2324 """Remove an alias"""
2321
2325
2322 aname = parameter_s.strip()
2326 aname = parameter_s.strip()
2323 if aname in self.shell.alias_table:
2327 if aname in self.shell.alias_table:
2324 del self.shell.alias_table[aname]
2328 del self.shell.alias_table[aname]
2325 stored = self.db.get('stored_aliases', {} )
2329 stored = self.db.get('stored_aliases', {} )
2326 if aname in stored:
2330 if aname in stored:
2327 print "Removing %stored alias",aname
2331 print "Removing %stored alias",aname
2328 del stored[aname]
2332 del stored[aname]
2329 self.db['stored_aliases'] = stored
2333 self.db['stored_aliases'] = stored
2330
2334
2331
2335
2332 def magic_rehashx(self, parameter_s = ''):
2336 def magic_rehashx(self, parameter_s = ''):
2333 """Update the alias table with all executable files in $PATH.
2337 """Update the alias table with all executable files in $PATH.
2334
2338
2335 This version explicitly checks that every entry in $PATH is a file
2339 This version explicitly checks that every entry in $PATH is a file
2336 with execute access (os.X_OK), so it is much slower than %rehash.
2340 with execute access (os.X_OK), so it is much slower than %rehash.
2337
2341
2338 Under Windows, it checks executability as a match agains a
2342 Under Windows, it checks executability as a match agains a
2339 '|'-separated string of extensions, stored in the IPython config
2343 '|'-separated string of extensions, stored in the IPython config
2340 variable win_exec_ext. This defaults to 'exe|com|bat'.
2344 variable win_exec_ext. This defaults to 'exe|com|bat'.
2341
2345
2342 This function also resets the root module cache of module completer,
2346 This function also resets the root module cache of module completer,
2343 used on slow filesystems.
2347 used on slow filesystems.
2344 """
2348 """
2345
2349
2346
2350
2347 ip = self.api
2351 ip = self.api
2348
2352
2349 # for the benefit of module completer in ipy_completers.py
2353 # for the benefit of module completer in ipy_completers.py
2350 del ip.db['rootmodules']
2354 del ip.db['rootmodules']
2351
2355
2352 path = [os.path.abspath(os.path.expanduser(p)) for p in
2356 path = [os.path.abspath(os.path.expanduser(p)) for p in
2353 os.environ.get('PATH','').split(os.pathsep)]
2357 os.environ.get('PATH','').split(os.pathsep)]
2354 path = filter(os.path.isdir,path)
2358 path = filter(os.path.isdir,path)
2355
2359
2356 alias_table = self.shell.alias_table
2360 alias_table = self.shell.alias_table
2357 syscmdlist = []
2361 syscmdlist = []
2358 if os.name == 'posix':
2362 if os.name == 'posix':
2359 isexec = lambda fname:os.path.isfile(fname) and \
2363 isexec = lambda fname:os.path.isfile(fname) and \
2360 os.access(fname,os.X_OK)
2364 os.access(fname,os.X_OK)
2361 else:
2365 else:
2362
2366
2363 try:
2367 try:
2364 winext = os.environ['pathext'].replace(';','|').replace('.','')
2368 winext = os.environ['pathext'].replace(';','|').replace('.','')
2365 except KeyError:
2369 except KeyError:
2366 winext = 'exe|com|bat|py'
2370 winext = 'exe|com|bat|py'
2367 if 'py' not in winext:
2371 if 'py' not in winext:
2368 winext += '|py'
2372 winext += '|py'
2369 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2373 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2370 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2374 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2371 savedir = os.getcwd()
2375 savedir = os.getcwd()
2372 try:
2376 try:
2373 # write the whole loop for posix/Windows so we don't have an if in
2377 # write the whole loop for posix/Windows so we don't have an if in
2374 # the innermost part
2378 # the innermost part
2375 if os.name == 'posix':
2379 if os.name == 'posix':
2376 for pdir in path:
2380 for pdir in path:
2377 os.chdir(pdir)
2381 os.chdir(pdir)
2378 for ff in os.listdir(pdir):
2382 for ff in os.listdir(pdir):
2379 if isexec(ff) and ff not in self.shell.no_alias:
2383 if isexec(ff) and ff not in self.shell.no_alias:
2380 # each entry in the alias table must be (N,name),
2384 # each entry in the alias table must be (N,name),
2381 # where N is the number of positional arguments of the
2385 # where N is the number of positional arguments of the
2382 # alias.
2386 # alias.
2383 alias_table[ff] = (0,ff)
2387 alias_table[ff] = (0,ff)
2384 syscmdlist.append(ff)
2388 syscmdlist.append(ff)
2385 else:
2389 else:
2386 for pdir in path:
2390 for pdir in path:
2387 os.chdir(pdir)
2391 os.chdir(pdir)
2388 for ff in os.listdir(pdir):
2392 for ff in os.listdir(pdir):
2389 base, ext = os.path.splitext(ff)
2393 base, ext = os.path.splitext(ff)
2390 if isexec(ff) and base not in self.shell.no_alias:
2394 if isexec(ff) and base not in self.shell.no_alias:
2391 if ext.lower() == '.exe':
2395 if ext.lower() == '.exe':
2392 ff = base
2396 ff = base
2393 alias_table[base.lower()] = (0,ff)
2397 alias_table[base.lower()] = (0,ff)
2394 syscmdlist.append(ff)
2398 syscmdlist.append(ff)
2395 # Make sure the alias table doesn't contain keywords or builtins
2399 # Make sure the alias table doesn't contain keywords or builtins
2396 self.shell.alias_table_validate()
2400 self.shell.alias_table_validate()
2397 # Call again init_auto_alias() so we get 'rm -i' and other
2401 # Call again init_auto_alias() so we get 'rm -i' and other
2398 # modified aliases since %rehashx will probably clobber them
2402 # modified aliases since %rehashx will probably clobber them
2399
2403
2400 # no, we don't want them. if %rehashx clobbers them, good,
2404 # no, we don't want them. if %rehashx clobbers them, good,
2401 # we'll probably get better versions
2405 # we'll probably get better versions
2402 # self.shell.init_auto_alias()
2406 # self.shell.init_auto_alias()
2403 db = ip.db
2407 db = ip.db
2404 db['syscmdlist'] = syscmdlist
2408 db['syscmdlist'] = syscmdlist
2405 finally:
2409 finally:
2406 os.chdir(savedir)
2410 os.chdir(savedir)
2407
2411
2408 def magic_pwd(self, parameter_s = ''):
2412 def magic_pwd(self, parameter_s = ''):
2409 """Return the current working directory path."""
2413 """Return the current working directory path."""
2410 return os.getcwd()
2414 return os.getcwd()
2411
2415
2412 def magic_cd(self, parameter_s=''):
2416 def magic_cd(self, parameter_s=''):
2413 """Change the current working directory.
2417 """Change the current working directory.
2414
2418
2415 This command automatically maintains an internal list of directories
2419 This command automatically maintains an internal list of directories
2416 you visit during your IPython session, in the variable _dh. The
2420 you visit during your IPython session, in the variable _dh. The
2417 command %dhist shows this history nicely formatted. You can also
2421 command %dhist shows this history nicely formatted. You can also
2418 do 'cd -<tab>' to see directory history conveniently.
2422 do 'cd -<tab>' to see directory history conveniently.
2419
2423
2420 Usage:
2424 Usage:
2421
2425
2422 cd 'dir': changes to directory 'dir'.
2426 cd 'dir': changes to directory 'dir'.
2423
2427
2424 cd -: changes to the last visited directory.
2428 cd -: changes to the last visited directory.
2425
2429
2426 cd -<n>: changes to the n-th directory in the directory history.
2430 cd -<n>: changes to the n-th directory in the directory history.
2427
2431
2428 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2432 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2429 (note: cd <bookmark_name> is enough if there is no
2433 (note: cd <bookmark_name> is enough if there is no
2430 directory <bookmark_name>, but a bookmark with the name exists.)
2434 directory <bookmark_name>, but a bookmark with the name exists.)
2431 'cd -b <tab>' allows you to tab-complete bookmark names.
2435 'cd -b <tab>' allows you to tab-complete bookmark names.
2432
2436
2433 Options:
2437 Options:
2434
2438
2435 -q: quiet. Do not print the working directory after the cd command is
2439 -q: quiet. Do not print the working directory after the cd command is
2436 executed. By default IPython's cd command does print this directory,
2440 executed. By default IPython's cd command does print this directory,
2437 since the default prompts do not display path information.
2441 since the default prompts do not display path information.
2438
2442
2439 Note that !cd doesn't work for this purpose because the shell where
2443 Note that !cd doesn't work for this purpose because the shell where
2440 !command runs is immediately discarded after executing 'command'."""
2444 !command runs is immediately discarded after executing 'command'."""
2441
2445
2442 parameter_s = parameter_s.strip()
2446 parameter_s = parameter_s.strip()
2443 #bkms = self.shell.persist.get("bookmarks",{})
2447 #bkms = self.shell.persist.get("bookmarks",{})
2444
2448
2445 numcd = re.match(r'(-)(\d+)$',parameter_s)
2449 numcd = re.match(r'(-)(\d+)$',parameter_s)
2446 # jump in directory history by number
2450 # jump in directory history by number
2447 if numcd:
2451 if numcd:
2448 nn = int(numcd.group(2))
2452 nn = int(numcd.group(2))
2449 try:
2453 try:
2450 ps = self.shell.user_ns['_dh'][nn]
2454 ps = self.shell.user_ns['_dh'][nn]
2451 except IndexError:
2455 except IndexError:
2452 print 'The requested directory does not exist in history.'
2456 print 'The requested directory does not exist in history.'
2453 return
2457 return
2454 else:
2458 else:
2455 opts = {}
2459 opts = {}
2456 else:
2460 else:
2457 #turn all non-space-escaping backslashes to slashes,
2461 #turn all non-space-escaping backslashes to slashes,
2458 # for c:\windows\directory\names\
2462 # for c:\windows\directory\names\
2459 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2463 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2460 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2464 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2461 # jump to previous
2465 # jump to previous
2462 if ps == '-':
2466 if ps == '-':
2463 try:
2467 try:
2464 ps = self.shell.user_ns['_dh'][-2]
2468 ps = self.shell.user_ns['_dh'][-2]
2465 except IndexError:
2469 except IndexError:
2466 print 'No previous directory to change to.'
2470 print 'No previous directory to change to.'
2467 return
2471 return
2468 # jump to bookmark if needed
2472 # jump to bookmark if needed
2469 else:
2473 else:
2470 if not os.path.isdir(ps) or opts.has_key('b'):
2474 if not os.path.isdir(ps) or opts.has_key('b'):
2471 bkms = self.db.get('bookmarks', {})
2475 bkms = self.db.get('bookmarks', {})
2472
2476
2473 if bkms.has_key(ps):
2477 if bkms.has_key(ps):
2474 target = bkms[ps]
2478 target = bkms[ps]
2475 print '(bookmark:%s) -> %s' % (ps,target)
2479 print '(bookmark:%s) -> %s' % (ps,target)
2476 ps = target
2480 ps = target
2477 else:
2481 else:
2478 if opts.has_key('b'):
2482 if opts.has_key('b'):
2479 error("Bookmark '%s' not found. "
2483 error("Bookmark '%s' not found. "
2480 "Use '%%bookmark -l' to see your bookmarks." % ps)
2484 "Use '%%bookmark -l' to see your bookmarks." % ps)
2481 return
2485 return
2482
2486
2483 # at this point ps should point to the target dir
2487 # at this point ps should point to the target dir
2484 if ps:
2488 if ps:
2485 try:
2489 try:
2486 os.chdir(os.path.expanduser(ps))
2490 os.chdir(os.path.expanduser(ps))
2487 if self.shell.rc.term_title:
2491 if self.shell.rc.term_title:
2488 #print 'set term title:',self.shell.rc.term_title # dbg
2492 #print 'set term title:',self.shell.rc.term_title # dbg
2489 ttitle = ("IPy:" + (
2493 ttitle = ("IPy:" + (
2490 os.getcwd() == '/' and '/' or \
2494 os.getcwd() == '/' and '/' or \
2491 os.path.basename(os.getcwd())))
2495 os.path.basename(os.getcwd())))
2492 platutils.set_term_title(ttitle)
2496 platutils.set_term_title(ttitle)
2493 except OSError:
2497 except OSError:
2494 print sys.exc_info()[1]
2498 print sys.exc_info()[1]
2495 else:
2499 else:
2496 cwd = os.getcwd()
2500 cwd = os.getcwd()
2497 dhist = self.shell.user_ns['_dh']
2501 dhist = self.shell.user_ns['_dh']
2498 dhist.append(cwd)
2502 dhist.append(cwd)
2499 self.db['dhist'] = compress_dhist(dhist)[-100:]
2503 self.db['dhist'] = compress_dhist(dhist)[-100:]
2500
2504
2501 else:
2505 else:
2502 os.chdir(self.shell.home_dir)
2506 os.chdir(self.shell.home_dir)
2503 if self.shell.rc.term_title:
2507 if self.shell.rc.term_title:
2504 platutils.set_term_title("IPy:~")
2508 platutils.set_term_title("IPy:~")
2505 cwd = os.getcwd()
2509 cwd = os.getcwd()
2506 dhist = self.shell.user_ns['_dh']
2510 dhist = self.shell.user_ns['_dh']
2507 dhist.append(cwd)
2511 dhist.append(cwd)
2508 self.db['dhist'] = compress_dhist(dhist)[-100:]
2512 self.db['dhist'] = compress_dhist(dhist)[-100:]
2509 if not 'q' in opts:
2513 if not 'q' in opts:
2510 print self.shell.user_ns['_dh'][-1]
2514 print self.shell.user_ns['_dh'][-1]
2511
2515
2512
2516
2513 def magic_env(self, parameter_s=''):
2517 def magic_env(self, parameter_s=''):
2514 """List environment variables."""
2518 """List environment variables."""
2515
2519
2516 return os.environ.data
2520 return os.environ.data
2517
2521
2518 def magic_pushd(self, parameter_s=''):
2522 def magic_pushd(self, parameter_s=''):
2519 """Place the current dir on stack and change directory.
2523 """Place the current dir on stack and change directory.
2520
2524
2521 Usage:\\
2525 Usage:\\
2522 %pushd ['dirname']
2526 %pushd ['dirname']
2523
2527
2524 %pushd with no arguments does a %pushd to your home directory.
2528 %pushd with no arguments does a %pushd to your home directory.
2525 """
2529 """
2526 if parameter_s == '': parameter_s = '~'
2530 if parameter_s == '': parameter_s = '~'
2527 dir_s = self.shell.dir_stack
2531 dir_s = self.shell.dir_stack
2528 if len(dir_s)>0 and os.path.expanduser(parameter_s) != \
2532 if len(dir_s)>0 and os.path.expanduser(parameter_s) != \
2529 os.path.expanduser(self.shell.dir_stack[0]):
2533 os.path.expanduser(self.shell.dir_stack[0]):
2530 try:
2534 try:
2531 self.magic_cd(parameter_s)
2535 self.magic_cd(parameter_s)
2532 dir_s.insert(0,os.getcwd().replace(self.home_dir,'~'))
2536 dir_s.insert(0,os.getcwd().replace(self.home_dir,'~'))
2533 self.magic_dirs()
2537 self.magic_dirs()
2534 except:
2538 except:
2535 print 'Invalid directory'
2539 print 'Invalid directory'
2536 else:
2540 else:
2537 print 'You are already there!'
2541 print 'You are already there!'
2538
2542
2539 def magic_popd(self, parameter_s=''):
2543 def magic_popd(self, parameter_s=''):
2540 """Change to directory popped off the top of the stack.
2544 """Change to directory popped off the top of the stack.
2541 """
2545 """
2542 if len (self.shell.dir_stack) > 1:
2546 if len (self.shell.dir_stack) > 1:
2543 self.shell.dir_stack.pop(0)
2547 self.shell.dir_stack.pop(0)
2544 self.magic_cd(self.shell.dir_stack[0])
2548 self.magic_cd(self.shell.dir_stack[0])
2545 print self.shell.dir_stack[0]
2549 print self.shell.dir_stack[0]
2546 else:
2550 else:
2547 print "You can't remove the starting directory from the stack:",\
2551 print "You can't remove the starting directory from the stack:",\
2548 self.shell.dir_stack
2552 self.shell.dir_stack
2549
2553
2550 def magic_dirs(self, parameter_s=''):
2554 def magic_dirs(self, parameter_s=''):
2551 """Return the current directory stack."""
2555 """Return the current directory stack."""
2552
2556
2553 return self.shell.dir_stack[:]
2557 return self.shell.dir_stack[:]
2554
2558
2555 def magic_sc(self, parameter_s=''):
2559 def magic_sc(self, parameter_s=''):
2556 """Shell capture - execute a shell command and capture its output.
2560 """Shell capture - execute a shell command and capture its output.
2557
2561
2558 DEPRECATED. Suboptimal, retained for backwards compatibility.
2562 DEPRECATED. Suboptimal, retained for backwards compatibility.
2559
2563
2560 You should use the form 'var = !command' instead. Example:
2564 You should use the form 'var = !command' instead. Example:
2561
2565
2562 "%sc -l myfiles = ls ~" should now be written as
2566 "%sc -l myfiles = ls ~" should now be written as
2563
2567
2564 "myfiles = !ls ~"
2568 "myfiles = !ls ~"
2565
2569
2566 myfiles.s, myfiles.l and myfiles.n still apply as documented
2570 myfiles.s, myfiles.l and myfiles.n still apply as documented
2567 below.
2571 below.
2568
2572
2569 --
2573 --
2570 %sc [options] varname=command
2574 %sc [options] varname=command
2571
2575
2572 IPython will run the given command using commands.getoutput(), and
2576 IPython will run the given command using commands.getoutput(), and
2573 will then update the user's interactive namespace with a variable
2577 will then update the user's interactive namespace with a variable
2574 called varname, containing the value of the call. Your command can
2578 called varname, containing the value of the call. Your command can
2575 contain shell wildcards, pipes, etc.
2579 contain shell wildcards, pipes, etc.
2576
2580
2577 The '=' sign in the syntax is mandatory, and the variable name you
2581 The '=' sign in the syntax is mandatory, and the variable name you
2578 supply must follow Python's standard conventions for valid names.
2582 supply must follow Python's standard conventions for valid names.
2579
2583
2580 (A special format without variable name exists for internal use)
2584 (A special format without variable name exists for internal use)
2581
2585
2582 Options:
2586 Options:
2583
2587
2584 -l: list output. Split the output on newlines into a list before
2588 -l: list output. Split the output on newlines into a list before
2585 assigning it to the given variable. By default the output is stored
2589 assigning it to the given variable. By default the output is stored
2586 as a single string.
2590 as a single string.
2587
2591
2588 -v: verbose. Print the contents of the variable.
2592 -v: verbose. Print the contents of the variable.
2589
2593
2590 In most cases you should not need to split as a list, because the
2594 In most cases you should not need to split as a list, because the
2591 returned value is a special type of string which can automatically
2595 returned value is a special type of string which can automatically
2592 provide its contents either as a list (split on newlines) or as a
2596 provide its contents either as a list (split on newlines) or as a
2593 space-separated string. These are convenient, respectively, either
2597 space-separated string. These are convenient, respectively, either
2594 for sequential processing or to be passed to a shell command.
2598 for sequential processing or to be passed to a shell command.
2595
2599
2596 For example:
2600 For example:
2597
2601
2598 # Capture into variable a
2602 # Capture into variable a
2599 In [9]: sc a=ls *py
2603 In [9]: sc a=ls *py
2600
2604
2601 # a is a string with embedded newlines
2605 # a is a string with embedded newlines
2602 In [10]: a
2606 In [10]: a
2603 Out[10]: 'setup.py\nwin32_manual_post_install.py'
2607 Out[10]: 'setup.py\nwin32_manual_post_install.py'
2604
2608
2605 # which can be seen as a list:
2609 # which can be seen as a list:
2606 In [11]: a.l
2610 In [11]: a.l
2607 Out[11]: ['setup.py', 'win32_manual_post_install.py']
2611 Out[11]: ['setup.py', 'win32_manual_post_install.py']
2608
2612
2609 # or as a whitespace-separated string:
2613 # or as a whitespace-separated string:
2610 In [12]: a.s
2614 In [12]: a.s
2611 Out[12]: 'setup.py win32_manual_post_install.py'
2615 Out[12]: 'setup.py win32_manual_post_install.py'
2612
2616
2613 # a.s is useful to pass as a single command line:
2617 # a.s is useful to pass as a single command line:
2614 In [13]: !wc -l $a.s
2618 In [13]: !wc -l $a.s
2615 146 setup.py
2619 146 setup.py
2616 130 win32_manual_post_install.py
2620 130 win32_manual_post_install.py
2617 276 total
2621 276 total
2618
2622
2619 # while the list form is useful to loop over:
2623 # while the list form is useful to loop over:
2620 In [14]: for f in a.l:
2624 In [14]: for f in a.l:
2621 ....: !wc -l $f
2625 ....: !wc -l $f
2622 ....:
2626 ....:
2623 146 setup.py
2627 146 setup.py
2624 130 win32_manual_post_install.py
2628 130 win32_manual_post_install.py
2625
2629
2626 Similiarly, the lists returned by the -l option are also special, in
2630 Similiarly, the lists returned by the -l option are also special, in
2627 the sense that you can equally invoke the .s attribute on them to
2631 the sense that you can equally invoke the .s attribute on them to
2628 automatically get a whitespace-separated string from their contents:
2632 automatically get a whitespace-separated string from their contents:
2629
2633
2630 In [1]: sc -l b=ls *py
2634 In [1]: sc -l b=ls *py
2631
2635
2632 In [2]: b
2636 In [2]: b
2633 Out[2]: ['setup.py', 'win32_manual_post_install.py']
2637 Out[2]: ['setup.py', 'win32_manual_post_install.py']
2634
2638
2635 In [3]: b.s
2639 In [3]: b.s
2636 Out[3]: 'setup.py win32_manual_post_install.py'
2640 Out[3]: 'setup.py win32_manual_post_install.py'
2637
2641
2638 In summary, both the lists and strings used for ouptut capture have
2642 In summary, both the lists and strings used for ouptut capture have
2639 the following special attributes:
2643 the following special attributes:
2640
2644
2641 .l (or .list) : value as list.
2645 .l (or .list) : value as list.
2642 .n (or .nlstr): value as newline-separated string.
2646 .n (or .nlstr): value as newline-separated string.
2643 .s (or .spstr): value as space-separated string.
2647 .s (or .spstr): value as space-separated string.
2644 """
2648 """
2645
2649
2646 opts,args = self.parse_options(parameter_s,'lv')
2650 opts,args = self.parse_options(parameter_s,'lv')
2647 # Try to get a variable name and command to run
2651 # Try to get a variable name and command to run
2648 try:
2652 try:
2649 # the variable name must be obtained from the parse_options
2653 # the variable name must be obtained from the parse_options
2650 # output, which uses shlex.split to strip options out.
2654 # output, which uses shlex.split to strip options out.
2651 var,_ = args.split('=',1)
2655 var,_ = args.split('=',1)
2652 var = var.strip()
2656 var = var.strip()
2653 # But the the command has to be extracted from the original input
2657 # But the the command has to be extracted from the original input
2654 # parameter_s, not on what parse_options returns, to avoid the
2658 # parameter_s, not on what parse_options returns, to avoid the
2655 # quote stripping which shlex.split performs on it.
2659 # quote stripping which shlex.split performs on it.
2656 _,cmd = parameter_s.split('=',1)
2660 _,cmd = parameter_s.split('=',1)
2657 except ValueError:
2661 except ValueError:
2658 var,cmd = '',''
2662 var,cmd = '',''
2659 # If all looks ok, proceed
2663 # If all looks ok, proceed
2660 out,err = self.shell.getoutputerror(cmd)
2664 out,err = self.shell.getoutputerror(cmd)
2661 if err:
2665 if err:
2662 print >> Term.cerr,err
2666 print >> Term.cerr,err
2663 if opts.has_key('l'):
2667 if opts.has_key('l'):
2664 out = SList(out.split('\n'))
2668 out = SList(out.split('\n'))
2665 else:
2669 else:
2666 out = LSString(out)
2670 out = LSString(out)
2667 if opts.has_key('v'):
2671 if opts.has_key('v'):
2668 print '%s ==\n%s' % (var,pformat(out))
2672 print '%s ==\n%s' % (var,pformat(out))
2669 if var:
2673 if var:
2670 self.shell.user_ns.update({var:out})
2674 self.shell.user_ns.update({var:out})
2671 else:
2675 else:
2672 return out
2676 return out
2673
2677
2674 def magic_sx(self, parameter_s=''):
2678 def magic_sx(self, parameter_s=''):
2675 """Shell execute - run a shell command and capture its output.
2679 """Shell execute - run a shell command and capture its output.
2676
2680
2677 %sx command
2681 %sx command
2678
2682
2679 IPython will run the given command using commands.getoutput(), and
2683 IPython will run the given command using commands.getoutput(), and
2680 return the result formatted as a list (split on '\\n'). Since the
2684 return the result formatted as a list (split on '\\n'). Since the
2681 output is _returned_, it will be stored in ipython's regular output
2685 output is _returned_, it will be stored in ipython's regular output
2682 cache Out[N] and in the '_N' automatic variables.
2686 cache Out[N] and in the '_N' automatic variables.
2683
2687
2684 Notes:
2688 Notes:
2685
2689
2686 1) If an input line begins with '!!', then %sx is automatically
2690 1) If an input line begins with '!!', then %sx is automatically
2687 invoked. That is, while:
2691 invoked. That is, while:
2688 !ls
2692 !ls
2689 causes ipython to simply issue system('ls'), typing
2693 causes ipython to simply issue system('ls'), typing
2690 !!ls
2694 !!ls
2691 is a shorthand equivalent to:
2695 is a shorthand equivalent to:
2692 %sx ls
2696 %sx ls
2693
2697
2694 2) %sx differs from %sc in that %sx automatically splits into a list,
2698 2) %sx differs from %sc in that %sx automatically splits into a list,
2695 like '%sc -l'. The reason for this is to make it as easy as possible
2699 like '%sc -l'. The reason for this is to make it as easy as possible
2696 to process line-oriented shell output via further python commands.
2700 to process line-oriented shell output via further python commands.
2697 %sc is meant to provide much finer control, but requires more
2701 %sc is meant to provide much finer control, but requires more
2698 typing.
2702 typing.
2699
2703
2700 3) Just like %sc -l, this is a list with special attributes:
2704 3) Just like %sc -l, this is a list with special attributes:
2701
2705
2702 .l (or .list) : value as list.
2706 .l (or .list) : value as list.
2703 .n (or .nlstr): value as newline-separated string.
2707 .n (or .nlstr): value as newline-separated string.
2704 .s (or .spstr): value as whitespace-separated string.
2708 .s (or .spstr): value as whitespace-separated string.
2705
2709
2706 This is very useful when trying to use such lists as arguments to
2710 This is very useful when trying to use such lists as arguments to
2707 system commands."""
2711 system commands."""
2708
2712
2709 if parameter_s:
2713 if parameter_s:
2710 out,err = self.shell.getoutputerror(parameter_s)
2714 out,err = self.shell.getoutputerror(parameter_s)
2711 if err:
2715 if err:
2712 print >> Term.cerr,err
2716 print >> Term.cerr,err
2713 return SList(out.split('\n'))
2717 return SList(out.split('\n'))
2714
2718
2715 def magic_bg(self, parameter_s=''):
2719 def magic_bg(self, parameter_s=''):
2716 """Run a job in the background, in a separate thread.
2720 """Run a job in the background, in a separate thread.
2717
2721
2718 For example,
2722 For example,
2719
2723
2720 %bg myfunc(x,y,z=1)
2724 %bg myfunc(x,y,z=1)
2721
2725
2722 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
2726 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
2723 execution starts, a message will be printed indicating the job
2727 execution starts, a message will be printed indicating the job
2724 number. If your job number is 5, you can use
2728 number. If your job number is 5, you can use
2725
2729
2726 myvar = jobs.result(5) or myvar = jobs[5].result
2730 myvar = jobs.result(5) or myvar = jobs[5].result
2727
2731
2728 to assign this result to variable 'myvar'.
2732 to assign this result to variable 'myvar'.
2729
2733
2730 IPython has a job manager, accessible via the 'jobs' object. You can
2734 IPython has a job manager, accessible via the 'jobs' object. You can
2731 type jobs? to get more information about it, and use jobs.<TAB> to see
2735 type jobs? to get more information about it, and use jobs.<TAB> to see
2732 its attributes. All attributes not starting with an underscore are
2736 its attributes. All attributes not starting with an underscore are
2733 meant for public use.
2737 meant for public use.
2734
2738
2735 In particular, look at the jobs.new() method, which is used to create
2739 In particular, look at the jobs.new() method, which is used to create
2736 new jobs. This magic %bg function is just a convenience wrapper
2740 new jobs. This magic %bg function is just a convenience wrapper
2737 around jobs.new(), for expression-based jobs. If you want to create a
2741 around jobs.new(), for expression-based jobs. If you want to create a
2738 new job with an explicit function object and arguments, you must call
2742 new job with an explicit function object and arguments, you must call
2739 jobs.new() directly.
2743 jobs.new() directly.
2740
2744
2741 The jobs.new docstring also describes in detail several important
2745 The jobs.new docstring also describes in detail several important
2742 caveats associated with a thread-based model for background job
2746 caveats associated with a thread-based model for background job
2743 execution. Type jobs.new? for details.
2747 execution. Type jobs.new? for details.
2744
2748
2745 You can check the status of all jobs with jobs.status().
2749 You can check the status of all jobs with jobs.status().
2746
2750
2747 The jobs variable is set by IPython into the Python builtin namespace.
2751 The jobs variable is set by IPython into the Python builtin namespace.
2748 If you ever declare a variable named 'jobs', you will shadow this
2752 If you ever declare a variable named 'jobs', you will shadow this
2749 name. You can either delete your global jobs variable to regain
2753 name. You can either delete your global jobs variable to regain
2750 access to the job manager, or make a new name and assign it manually
2754 access to the job manager, or make a new name and assign it manually
2751 to the manager (stored in IPython's namespace). For example, to
2755 to the manager (stored in IPython's namespace). For example, to
2752 assign the job manager to the Jobs name, use:
2756 assign the job manager to the Jobs name, use:
2753
2757
2754 Jobs = __builtins__.jobs"""
2758 Jobs = __builtins__.jobs"""
2755
2759
2756 self.shell.jobs.new(parameter_s,self.shell.user_ns)
2760 self.shell.jobs.new(parameter_s,self.shell.user_ns)
2757
2761
2758
2762
2759 def magic_bookmark(self, parameter_s=''):
2763 def magic_bookmark(self, parameter_s=''):
2760 """Manage IPython's bookmark system.
2764 """Manage IPython's bookmark system.
2761
2765
2762 %bookmark <name> - set bookmark to current dir
2766 %bookmark <name> - set bookmark to current dir
2763 %bookmark <name> <dir> - set bookmark to <dir>
2767 %bookmark <name> <dir> - set bookmark to <dir>
2764 %bookmark -l - list all bookmarks
2768 %bookmark -l - list all bookmarks
2765 %bookmark -d <name> - remove bookmark
2769 %bookmark -d <name> - remove bookmark
2766 %bookmark -r - remove all bookmarks
2770 %bookmark -r - remove all bookmarks
2767
2771
2768 You can later on access a bookmarked folder with:
2772 You can later on access a bookmarked folder with:
2769 %cd -b <name>
2773 %cd -b <name>
2770 or simply '%cd <name>' if there is no directory called <name> AND
2774 or simply '%cd <name>' if there is no directory called <name> AND
2771 there is such a bookmark defined.
2775 there is such a bookmark defined.
2772
2776
2773 Your bookmarks persist through IPython sessions, but they are
2777 Your bookmarks persist through IPython sessions, but they are
2774 associated with each profile."""
2778 associated with each profile."""
2775
2779
2776 opts,args = self.parse_options(parameter_s,'drl',mode='list')
2780 opts,args = self.parse_options(parameter_s,'drl',mode='list')
2777 if len(args) > 2:
2781 if len(args) > 2:
2778 error('You can only give at most two arguments')
2782 error('You can only give at most two arguments')
2779 return
2783 return
2780
2784
2781 bkms = self.db.get('bookmarks',{})
2785 bkms = self.db.get('bookmarks',{})
2782
2786
2783 if opts.has_key('d'):
2787 if opts.has_key('d'):
2784 try:
2788 try:
2785 todel = args[0]
2789 todel = args[0]
2786 except IndexError:
2790 except IndexError:
2787 error('You must provide a bookmark to delete')
2791 error('You must provide a bookmark to delete')
2788 else:
2792 else:
2789 try:
2793 try:
2790 del bkms[todel]
2794 del bkms[todel]
2791 except:
2795 except:
2792 error("Can't delete bookmark '%s'" % todel)
2796 error("Can't delete bookmark '%s'" % todel)
2793 elif opts.has_key('r'):
2797 elif opts.has_key('r'):
2794 bkms = {}
2798 bkms = {}
2795 elif opts.has_key('l'):
2799 elif opts.has_key('l'):
2796 bks = bkms.keys()
2800 bks = bkms.keys()
2797 bks.sort()
2801 bks.sort()
2798 if bks:
2802 if bks:
2799 size = max(map(len,bks))
2803 size = max(map(len,bks))
2800 else:
2804 else:
2801 size = 0
2805 size = 0
2802 fmt = '%-'+str(size)+'s -> %s'
2806 fmt = '%-'+str(size)+'s -> %s'
2803 print 'Current bookmarks:'
2807 print 'Current bookmarks:'
2804 for bk in bks:
2808 for bk in bks:
2805 print fmt % (bk,bkms[bk])
2809 print fmt % (bk,bkms[bk])
2806 else:
2810 else:
2807 if not args:
2811 if not args:
2808 error("You must specify the bookmark name")
2812 error("You must specify the bookmark name")
2809 elif len(args)==1:
2813 elif len(args)==1:
2810 bkms[args[0]] = os.getcwd()
2814 bkms[args[0]] = os.getcwd()
2811 elif len(args)==2:
2815 elif len(args)==2:
2812 bkms[args[0]] = args[1]
2816 bkms[args[0]] = args[1]
2813 self.db['bookmarks'] = bkms
2817 self.db['bookmarks'] = bkms
2814
2818
2815 def magic_pycat(self, parameter_s=''):
2819 def magic_pycat(self, parameter_s=''):
2816 """Show a syntax-highlighted file through a pager.
2820 """Show a syntax-highlighted file through a pager.
2817
2821
2818 This magic is similar to the cat utility, but it will assume the file
2822 This magic is similar to the cat utility, but it will assume the file
2819 to be Python source and will show it with syntax highlighting. """
2823 to be Python source and will show it with syntax highlighting. """
2820
2824
2821 try:
2825 try:
2822 filename = get_py_filename(parameter_s)
2826 filename = get_py_filename(parameter_s)
2823 cont = file_read(filename)
2827 cont = file_read(filename)
2824 except IOError:
2828 except IOError:
2825 try:
2829 try:
2826 cont = eval(parameter_s,self.user_ns)
2830 cont = eval(parameter_s,self.user_ns)
2827 except NameError:
2831 except NameError:
2828 cont = None
2832 cont = None
2829 if cont is None:
2833 if cont is None:
2830 print "Error: no such file or variable"
2834 print "Error: no such file or variable"
2831 return
2835 return
2832
2836
2833 page(self.shell.pycolorize(cont),
2837 page(self.shell.pycolorize(cont),
2834 screen_lines=self.shell.rc.screen_length)
2838 screen_lines=self.shell.rc.screen_length)
2835
2839
2836 def magic_cpaste(self, parameter_s=''):
2840 def magic_cpaste(self, parameter_s=''):
2837 """Allows you to paste & execute a pre-formatted code block from clipboard
2841 """Allows you to paste & execute a pre-formatted code block from clipboard
2838
2842
2839 You must terminate the block with '--' (two minus-signs) alone on the
2843 You must terminate the block with '--' (two minus-signs) alone on the
2840 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
2844 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
2841 is the new sentinel for this operation)
2845 is the new sentinel for this operation)
2842
2846
2843 The block is dedented prior to execution to enable execution of method
2847 The block is dedented prior to execution to enable execution of method
2844 definitions. '>' and '+' characters at the beginning of a line are
2848 definitions. '>' and '+' characters at the beginning of a line are
2845 ignored, to allow pasting directly from e-mails or diff files. The
2849 ignored, to allow pasting directly from e-mails or diff files. The
2846 executed block is also assigned to variable named 'pasted_block' for
2850 executed block is also assigned to variable named 'pasted_block' for
2847 later editing with '%edit pasted_block'.
2851 later editing with '%edit pasted_block'.
2848
2852
2849 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
2853 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
2850 This assigns the pasted block to variable 'foo' as string, without
2854 This assigns the pasted block to variable 'foo' as string, without
2851 dedenting or executing it.
2855 dedenting or executing it.
2852
2856
2853 Do not be alarmed by garbled output on Windows (it's a readline bug).
2857 Do not be alarmed by garbled output on Windows (it's a readline bug).
2854 Just press enter and type -- (and press enter again) and the block
2858 Just press enter and type -- (and press enter again) and the block
2855 will be what was just pasted.
2859 will be what was just pasted.
2856
2860
2857 IPython statements (magics, shell escapes) are not supported (yet).
2861 IPython statements (magics, shell escapes) are not supported (yet).
2858 """
2862 """
2859 opts,args = self.parse_options(parameter_s,'s:',mode='string')
2863 opts,args = self.parse_options(parameter_s,'s:',mode='string')
2860 par = args.strip()
2864 par = args.strip()
2861 sentinel = opts.get('s','--')
2865 sentinel = opts.get('s','--')
2862
2866
2863 from IPython import iplib
2867 from IPython import iplib
2864 lines = []
2868 lines = []
2865 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
2869 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
2866 while 1:
2870 while 1:
2867 l = iplib.raw_input_original(':')
2871 l = iplib.raw_input_original(':')
2868 if l ==sentinel:
2872 if l ==sentinel:
2869 break
2873 break
2870 lines.append(l.lstrip('>').lstrip('+'))
2874 lines.append(l.lstrip('>').lstrip('+'))
2871 block = "\n".join(lines) + '\n'
2875 block = "\n".join(lines) + '\n'
2872 #print "block:\n",block
2876 #print "block:\n",block
2873 if not par:
2877 if not par:
2874 b = textwrap.dedent(block)
2878 b = textwrap.dedent(block)
2875 exec b in self.user_ns
2879 exec b in self.user_ns
2876 self.user_ns['pasted_block'] = b
2880 self.user_ns['pasted_block'] = b
2877 else:
2881 else:
2878 self.user_ns[par] = block
2882 self.user_ns[par] = block
2879 print "Block assigned to '%s'" % par
2883 print "Block assigned to '%s'" % par
2880
2884
2881 def magic_quickref(self,arg):
2885 def magic_quickref(self,arg):
2882 """ Show a quick reference sheet """
2886 """ Show a quick reference sheet """
2883 import IPython.usage
2887 import IPython.usage
2884 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
2888 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
2885
2889
2886 page(qr)
2890 page(qr)
2887
2891
2888 def magic_upgrade(self,arg):
2892 def magic_upgrade(self,arg):
2889 """ Upgrade your IPython installation
2893 """ Upgrade your IPython installation
2890
2894
2891 This will copy the config files that don't yet exist in your
2895 This will copy the config files that don't yet exist in your
2892 ipython dir from the system config dir. Use this after upgrading
2896 ipython dir from the system config dir. Use this after upgrading
2893 IPython if you don't wish to delete your .ipython dir.
2897 IPython if you don't wish to delete your .ipython dir.
2894
2898
2895 Call with -nolegacy to get rid of ipythonrc* files (recommended for
2899 Call with -nolegacy to get rid of ipythonrc* files (recommended for
2896 new users)
2900 new users)
2897
2901
2898 """
2902 """
2899 ip = self.getapi()
2903 ip = self.getapi()
2900 ipinstallation = path(IPython.__file__).dirname()
2904 ipinstallation = path(IPython.__file__).dirname()
2901 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
2905 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
2902 src_config = ipinstallation / 'UserConfig'
2906 src_config = ipinstallation / 'UserConfig'
2903 userdir = path(ip.options.ipythondir)
2907 userdir = path(ip.options.ipythondir)
2904 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
2908 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
2905 print ">",cmd
2909 print ">",cmd
2906 shell(cmd)
2910 shell(cmd)
2907 if arg == '-nolegacy':
2911 if arg == '-nolegacy':
2908 legacy = userdir.files('ipythonrc*')
2912 legacy = userdir.files('ipythonrc*')
2909 print "Nuking legacy files:",legacy
2913 print "Nuking legacy files:",legacy
2910
2914
2911 [p.remove() for p in legacy]
2915 [p.remove() for p in legacy]
2912 suffix = (sys.platform == 'win32' and '.ini' or '')
2916 suffix = (sys.platform == 'win32' and '.ini' or '')
2913 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
2917 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
2914
2918
2915
2919
2916 def magic_doctest_mode(self,parameter_s=''):
2920 def magic_doctest_mode(self,parameter_s=''):
2917 """Toggle doctest mode on and off.
2921 """Toggle doctest mode on and off.
2918
2922
2919 This mode allows you to toggle the prompt behavior between normal
2923 This mode allows you to toggle the prompt behavior between normal
2920 IPython prompts and ones that are as similar to the default IPython
2924 IPython prompts and ones that are as similar to the default IPython
2921 interpreter as possible.
2925 interpreter as possible.
2922
2926
2923 It also supports the pasting of code snippets that have leading '>>>'
2927 It also supports the pasting of code snippets that have leading '>>>'
2924 and '...' prompts in them. This means that you can paste doctests from
2928 and '...' prompts in them. This means that you can paste doctests from
2925 files or docstrings (even if they have leading whitespace), and the
2929 files or docstrings (even if they have leading whitespace), and the
2926 code will execute correctly. You can then use '%history -tn' to see
2930 code will execute correctly. You can then use '%history -tn' to see
2927 the translated history without line numbers; this will give you the
2931 the translated history without line numbers; this will give you the
2928 input after removal of all the leading prompts and whitespace, which
2932 input after removal of all the leading prompts and whitespace, which
2929 can be pasted back into an editor.
2933 can be pasted back into an editor.
2930
2934
2931 With these features, you can switch into this mode easily whenever you
2935 With these features, you can switch into this mode easily whenever you
2932 need to do testing and changes to doctests, without having to leave
2936 need to do testing and changes to doctests, without having to leave
2933 your existing IPython session.
2937 your existing IPython session.
2934 """
2938 """
2935
2939
2936 # XXX - Fix this to have cleaner activate/deactivate calls.
2940 # XXX - Fix this to have cleaner activate/deactivate calls.
2937 from IPython.Extensions import InterpreterPasteInput as ipaste
2941 from IPython.Extensions import InterpreterPasteInput as ipaste
2938 from IPython.ipstruct import Struct
2942 from IPython.ipstruct import Struct
2939
2943
2940 # Shorthands
2944 # Shorthands
2941 shell = self.shell
2945 shell = self.shell
2942 oc = shell.outputcache
2946 oc = shell.outputcache
2943 rc = shell.rc
2947 rc = shell.rc
2944 meta = shell.meta
2948 meta = shell.meta
2945 # dstore is a data store kept in the instance metadata bag to track any
2949 # dstore is a data store kept in the instance metadata bag to track any
2946 # changes we make, so we can undo them later.
2950 # changes we make, so we can undo them later.
2947 dstore = meta.setdefault('doctest_mode',Struct())
2951 dstore = meta.setdefault('doctest_mode',Struct())
2948 save_dstore = dstore.setdefault
2952 save_dstore = dstore.setdefault
2949
2953
2950 # save a few values we'll need to recover later
2954 # save a few values we'll need to recover later
2951 mode = save_dstore('mode',False)
2955 mode = save_dstore('mode',False)
2952 save_dstore('rc_pprint',rc.pprint)
2956 save_dstore('rc_pprint',rc.pprint)
2953 save_dstore('xmode',shell.InteractiveTB.mode)
2957 save_dstore('xmode',shell.InteractiveTB.mode)
2954 save_dstore('rc_separate_in',rc.separate_in)
2958 save_dstore('rc_separate_in',rc.separate_in)
2955 save_dstore('rc_separate_out',rc.separate_out)
2959 save_dstore('rc_separate_out',rc.separate_out)
2956 save_dstore('rc_separate_out2',rc.separate_out2)
2960 save_dstore('rc_separate_out2',rc.separate_out2)
2957 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
2961 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
2958
2962
2959 if mode == False:
2963 if mode == False:
2960 # turn on
2964 # turn on
2961 ipaste.activate_prefilter()
2965 ipaste.activate_prefilter()
2962
2966
2963 oc.prompt1.p_template = '>>> '
2967 oc.prompt1.p_template = '>>> '
2964 oc.prompt2.p_template = '... '
2968 oc.prompt2.p_template = '... '
2965 oc.prompt_out.p_template = ''
2969 oc.prompt_out.p_template = ''
2966
2970
2967 oc.prompt1.sep = '\n'
2971 oc.prompt1.sep = '\n'
2968 oc.output_sep = ''
2972 oc.output_sep = ''
2969 oc.output_sep2 = ''
2973 oc.output_sep2 = ''
2970
2974
2971 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2975 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2972 oc.prompt_out.pad_left = False
2976 oc.prompt_out.pad_left = False
2973
2977
2974 rc.pprint = False
2978 rc.pprint = False
2975
2979
2976 shell.magic_xmode('Plain')
2980 shell.magic_xmode('Plain')
2977
2981
2978 else:
2982 else:
2979 # turn off
2983 # turn off
2980 ipaste.deactivate_prefilter()
2984 ipaste.deactivate_prefilter()
2981
2985
2982 oc.prompt1.p_template = rc.prompt_in1
2986 oc.prompt1.p_template = rc.prompt_in1
2983 oc.prompt2.p_template = rc.prompt_in2
2987 oc.prompt2.p_template = rc.prompt_in2
2984 oc.prompt_out.p_template = rc.prompt_out
2988 oc.prompt_out.p_template = rc.prompt_out
2985
2989
2986 oc.prompt1.sep = dstore.rc_separate_in
2990 oc.prompt1.sep = dstore.rc_separate_in
2987 oc.output_sep = dstore.rc_separate_out
2991 oc.output_sep = dstore.rc_separate_out
2988 oc.output_sep2 = dstore.rc_separate_out2
2992 oc.output_sep2 = dstore.rc_separate_out2
2989
2993
2990 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2994 oc.prompt1.pad_left = oc.prompt2.pad_left = \
2991 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
2995 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
2992
2996
2993 rc.pprint = dstore.rc_pprint
2997 rc.pprint = dstore.rc_pprint
2994
2998
2995 shell.magic_xmode(dstore.xmode)
2999 shell.magic_xmode(dstore.xmode)
2996
3000
2997 # Store new mode and inform
3001 # Store new mode and inform
2998 dstore.mode = bool(1-int(mode))
3002 dstore.mode = bool(1-int(mode))
2999 print 'Doctest mode is:',
3003 print 'Doctest mode is:',
3000 print ['OFF','ON'][dstore.mode]
3004 print ['OFF','ON'][dstore.mode]
3001
3005
3002 # end Magic
3006 # end Magic
@@ -1,484 +1,483 b''
1 ''' IPython customization API
1 ''' IPython customization API
2
2
3 Your one-stop module for configuring & extending ipython
3 Your one-stop module for configuring & extending ipython
4
4
5 The API will probably break when ipython 1.0 is released, but so
5 The API will probably break when ipython 1.0 is released, but so
6 will the other configuration method (rc files).
6 will the other configuration method (rc files).
7
7
8 All names prefixed by underscores are for internal use, not part
8 All names prefixed by underscores are for internal use, not part
9 of the public api.
9 of the public api.
10
10
11 Below is an example that you can just put to a module and import from ipython.
11 Below is an example that you can just put to a module and import from ipython.
12
12
13 A good practice is to install the config script below as e.g.
13 A good practice is to install the config script below as e.g.
14
14
15 ~/.ipython/my_private_conf.py
15 ~/.ipython/my_private_conf.py
16
16
17 And do
17 And do
18
18
19 import_mod my_private_conf
19 import_mod my_private_conf
20
20
21 in ~/.ipython/ipythonrc
21 in ~/.ipython/ipythonrc
22
22
23 That way the module is imported at startup and you can have all your
23 That way the module is imported at startup and you can have all your
24 personal configuration (as opposed to boilerplate ipythonrc-PROFILENAME
24 personal configuration (as opposed to boilerplate ipythonrc-PROFILENAME
25 stuff) in there.
25 stuff) in there.
26
26
27 -----------------------------------------------
27 -----------------------------------------------
28 import IPython.ipapi
28 import IPython.ipapi
29 ip = IPython.ipapi.get()
29 ip = IPython.ipapi.get()
30
30
31 def ankka_f(self, arg):
31 def ankka_f(self, arg):
32 print "Ankka",self,"says uppercase:",arg.upper()
32 print "Ankka",self,"says uppercase:",arg.upper()
33
33
34 ip.expose_magic("ankka",ankka_f)
34 ip.expose_magic("ankka",ankka_f)
35
35
36 ip.magic('alias sayhi echo "Testing, hi ok"')
36 ip.magic('alias sayhi echo "Testing, hi ok"')
37 ip.magic('alias helloworld echo "Hello world"')
37 ip.magic('alias helloworld echo "Hello world"')
38 ip.system('pwd')
38 ip.system('pwd')
39
39
40 ip.ex('import re')
40 ip.ex('import re')
41 ip.ex("""
41 ip.ex("""
42 def funcci(a,b):
42 def funcci(a,b):
43 print a+b
43 print a+b
44 print funcci(3,4)
44 print funcci(3,4)
45 """)
45 """)
46 ip.ex("funcci(348,9)")
46 ip.ex("funcci(348,9)")
47
47
48 def jed_editor(self,filename, linenum=None):
48 def jed_editor(self,filename, linenum=None):
49 print "Calling my own editor, jed ... via hook!"
49 print "Calling my own editor, jed ... via hook!"
50 import os
50 import os
51 if linenum is None: linenum = 0
51 if linenum is None: linenum = 0
52 os.system('jed +%d %s' % (linenum, filename))
52 os.system('jed +%d %s' % (linenum, filename))
53 print "exiting jed"
53 print "exiting jed"
54
54
55 ip.set_hook('editor',jed_editor)
55 ip.set_hook('editor',jed_editor)
56
56
57 o = ip.options
57 o = ip.options
58 o.autocall = 2 # FULL autocall mode
58 o.autocall = 2 # FULL autocall mode
59
59
60 print "done!"
60 print "done!"
61 '''
61 '''
62
62
63 # stdlib imports
63 # stdlib imports
64 import __builtin__
64 import __builtin__
65 import sys
65 import sys
66
66
67 # our own
67 # our own
68 #from IPython.genutils import warn,error
68 #from IPython.genutils import warn,error
69
69
70 class TryNext(Exception):
70 class TryNext(Exception):
71 """Try next hook exception.
71 """Try next hook exception.
72
72
73 Raise this in your hook function to indicate that the next hook handler
73 Raise this in your hook function to indicate that the next hook handler
74 should be used to handle the operation. If you pass arguments to the
74 should be used to handle the operation. If you pass arguments to the
75 constructor those arguments will be used by the next hook instead of the
75 constructor those arguments will be used by the next hook instead of the
76 original ones.
76 original ones.
77 """
77 """
78
78
79 def __init__(self, *args, **kwargs):
79 def __init__(self, *args, **kwargs):
80 self.args = args
80 self.args = args
81 self.kwargs = kwargs
81 self.kwargs = kwargs
82
82
83 class IPyAutocall:
83 class IPyAutocall:
84 """ Instances of this class are always autocalled
84 """ Instances of this class are always autocalled
85
85
86 This happens regardless of 'autocall' variable state. Use this to
86 This happens regardless of 'autocall' variable state. Use this to
87 develop macro-like mechanisms.
87 develop macro-like mechanisms.
88 """
88 """
89
89
90 def set_ip(self,ip):
90 def set_ip(self,ip):
91 """ Will be used to set _ip point to current ipython instance b/f call
91 """ Will be used to set _ip point to current ipython instance b/f call
92
92
93 Override this method if you don't want this to happen.
93 Override this method if you don't want this to happen.
94
94
95 """
95 """
96 self._ip = ip
96 self._ip = ip
97
97
98
98
99 # contains the most recently instantiated IPApi
99 # contains the most recently instantiated IPApi
100
100
101 class IPythonNotRunning:
101 class IPythonNotRunning:
102 """Dummy do-nothing class.
102 """Dummy do-nothing class.
103
103
104 Instances of this class return a dummy attribute on all accesses, which
104 Instances of this class return a dummy attribute on all accesses, which
105 can be called and warns. This makes it easier to write scripts which use
105 can be called and warns. This makes it easier to write scripts which use
106 the ipapi.get() object for informational purposes to operate both with and
106 the ipapi.get() object for informational purposes to operate both with and
107 without ipython. Obviously code which uses the ipython object for
107 without ipython. Obviously code which uses the ipython object for
108 computations will not work, but this allows a wider range of code to
108 computations will not work, but this allows a wider range of code to
109 transparently work whether ipython is being used or not."""
109 transparently work whether ipython is being used or not."""
110
110
111 def __init__(self,warn=True):
111 def __init__(self,warn=True):
112 if warn:
112 if warn:
113 self.dummy = self._dummy_warn
113 self.dummy = self._dummy_warn
114 else:
114 else:
115 self.dummy = self._dummy_silent
115 self.dummy = self._dummy_silent
116
116
117 def __str__(self):
117 def __str__(self):
118 return "<IPythonNotRunning>"
118 return "<IPythonNotRunning>"
119
119
120 __repr__ = __str__
120 __repr__ = __str__
121
121
122 def __getattr__(self,name):
122 def __getattr__(self,name):
123 return self.dummy
123 return self.dummy
124
124
125 def _dummy_warn(self,*args,**kw):
125 def _dummy_warn(self,*args,**kw):
126 """Dummy function, which doesn't do anything but warn."""
126 """Dummy function, which doesn't do anything but warn."""
127
127
128 print ("IPython is not running, this is a dummy no-op function")
128 print ("IPython is not running, this is a dummy no-op function")
129
129
130 def _dummy_silent(self,*args,**kw):
130 def _dummy_silent(self,*args,**kw):
131 """Dummy function, which doesn't do anything and emits no warnings."""
131 """Dummy function, which doesn't do anything and emits no warnings."""
132 pass
132 pass
133
133
134 _recent = None
134 _recent = None
135
135
136
136
137 def get(allow_dummy=False,dummy_warn=True):
137 def get(allow_dummy=False,dummy_warn=True):
138 """Get an IPApi object.
138 """Get an IPApi object.
139
139
140 If allow_dummy is true, returns an instance of IPythonNotRunning
140 If allow_dummy is true, returns an instance of IPythonNotRunning
141 instead of None if not running under IPython.
141 instead of None if not running under IPython.
142
142
143 If dummy_warn is false, the dummy instance will be completely silent.
143 If dummy_warn is false, the dummy instance will be completely silent.
144
144
145 Running this should be the first thing you do when writing extensions that
145 Running this should be the first thing you do when writing extensions that
146 can be imported as normal modules. You can then direct all the
146 can be imported as normal modules. You can then direct all the
147 configuration operations against the returned object.
147 configuration operations against the returned object.
148 """
148 """
149 global _recent
149 global _recent
150 if allow_dummy and not _recent:
150 if allow_dummy and not _recent:
151 _recent = IPythonNotRunning(dummy_warn)
151 _recent = IPythonNotRunning(dummy_warn)
152 return _recent
152 return _recent
153
153
154 class IPApi:
154 class IPApi:
155 """ The actual API class for configuring IPython
155 """ The actual API class for configuring IPython
156
156
157 You should do all of the IPython configuration by getting an IPApi object
157 You should do all of the IPython configuration by getting an IPApi object
158 with IPython.ipapi.get() and using the attributes and methods of the
158 with IPython.ipapi.get() and using the attributes and methods of the
159 returned object."""
159 returned object."""
160
160
161 def __init__(self,ip):
161 def __init__(self,ip):
162
162
163 # All attributes exposed here are considered to be the public API of
163 # All attributes exposed here are considered to be the public API of
164 # IPython. As needs dictate, some of these may be wrapped as
164 # IPython. As needs dictate, some of these may be wrapped as
165 # properties.
165 # properties.
166
166
167 self.magic = ip.ipmagic
167 self.magic = ip.ipmagic
168
168
169 self.system = ip.system
169 self.system = ip.system
170
170
171 self.set_hook = ip.set_hook
171 self.set_hook = ip.set_hook
172
172
173 self.set_custom_exc = ip.set_custom_exc
173 self.set_custom_exc = ip.set_custom_exc
174
174
175 self.user_ns = ip.user_ns
175 self.user_ns = ip.user_ns
176
176
177 self.set_crash_handler = ip.set_crash_handler
177 self.set_crash_handler = ip.set_crash_handler
178
178
179 # Session-specific data store, which can be used to store
179 # Session-specific data store, which can be used to store
180 # data that should persist through the ipython session.
180 # data that should persist through the ipython session.
181 self.meta = ip.meta
181 self.meta = ip.meta
182
182
183 # The ipython instance provided
183 # The ipython instance provided
184 self.IP = ip
184 self.IP = ip
185
185
186 self.extensions = {}
186 self.extensions = {}
187 global _recent
187 global _recent
188 _recent = self
188 _recent = self
189
189
190 # Use a property for some things which are added to the instance very
190 # Use a property for some things which are added to the instance very
191 # late. I don't have time right now to disentangle the initialization
191 # late. I don't have time right now to disentangle the initialization
192 # order issues, so a property lets us delay item extraction while
192 # order issues, so a property lets us delay item extraction while
193 # providing a normal attribute API.
193 # providing a normal attribute API.
194 def get_db(self):
194 def get_db(self):
195 """A handle to persistent dict-like database (a PickleShareDB object)"""
195 """A handle to persistent dict-like database (a PickleShareDB object)"""
196 return self.IP.db
196 return self.IP.db
197
197
198 db = property(get_db,None,None,get_db.__doc__)
198 db = property(get_db,None,None,get_db.__doc__)
199
199
200 def get_options(self):
200 def get_options(self):
201 """All configurable variables."""
201 """All configurable variables."""
202
202
203 # catch typos by disabling new attribute creation. If new attr creation
203 # catch typos by disabling new attribute creation. If new attr creation
204 # is in fact wanted (e.g. when exposing new options), do allow_new_attr(True)
204 # is in fact wanted (e.g. when exposing new options), do allow_new_attr(True)
205 # for the received rc struct.
205 # for the received rc struct.
206
206
207 self.IP.rc.allow_new_attr(False)
207 self.IP.rc.allow_new_attr(False)
208 return self.IP.rc
208 return self.IP.rc
209
209
210 options = property(get_options,None,None,get_options.__doc__)
210 options = property(get_options,None,None,get_options.__doc__)
211
211
212 def expose_magic(self,magicname, func):
212 def expose_magic(self,magicname, func):
213 ''' Expose own function as magic function for ipython
213 ''' Expose own function as magic function for ipython
214
214
215 def foo_impl(self,parameter_s=''):
215 def foo_impl(self,parameter_s=''):
216 """My very own magic!. (Use docstrings, IPython reads them)."""
216 """My very own magic!. (Use docstrings, IPython reads them)."""
217 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
217 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
218 print 'The self object is:',self
218 print 'The self object is:',self
219
219
220 ipapi.expose_magic("foo",foo_impl)
220 ipapi.expose_magic("foo",foo_impl)
221 '''
221 '''
222
222
223 import new
223 import new
224 im = new.instancemethod(func,self.IP, self.IP.__class__)
224 im = new.instancemethod(func,self.IP, self.IP.__class__)
225 setattr(self.IP, "magic_" + magicname, im)
225 setattr(self.IP, "magic_" + magicname, im)
226
226
227 def ex(self,cmd):
227 def ex(self,cmd):
228 """ Execute a normal python statement in user namespace """
228 """ Execute a normal python statement in user namespace """
229 exec cmd in self.user_ns
229 exec cmd in self.user_ns
230
230
231 def ev(self,expr):
231 def ev(self,expr):
232 """ Evaluate python expression expr in user namespace
232 """ Evaluate python expression expr in user namespace
233
233
234 Returns the result of evaluation"""
234 Returns the result of evaluation"""
235 return eval(expr,self.user_ns)
235 return eval(expr,self.user_ns)
236
236
237 def runlines(self,lines):
237 def runlines(self,lines):
238 """ Run the specified lines in interpreter, honoring ipython directives.
238 """ Run the specified lines in interpreter, honoring ipython directives.
239
239
240 This allows %magic and !shell escape notations.
240 This allows %magic and !shell escape notations.
241
241
242 Takes either all lines in one string or list of lines.
242 Takes either all lines in one string or list of lines.
243 """
243 """
244 if isinstance(lines,basestring):
244 if isinstance(lines,basestring):
245 self.IP.runlines(lines)
245 self.IP.runlines(lines)
246 else:
246 else:
247 self.IP.runlines('\n'.join(lines))
247 self.IP.runlines('\n'.join(lines))
248
248
249 def to_user_ns(self,vars, interactive = True):
249 def to_user_ns(self,vars, interactive = True):
250 """Inject a group of variables into the IPython user namespace.
250 """Inject a group of variables into the IPython user namespace.
251
251
252 Inputs:
252 Inputs:
253
253
254 - vars: string with variable names separated by whitespace, or a
254 - vars: string with variable names separated by whitespace, or a
255 dict with name/value pairs.
255 dict with name/value pairs.
256
256
257 - interactive: if True (default), the var will be listed with
257 - interactive: if True (default), the var will be listed with
258 %whos et. al.
258 %whos et. al.
259
259
260 This utility routine is meant to ease interactive debugging work,
260 This utility routine is meant to ease interactive debugging work,
261 where you want to easily propagate some internal variable in your code
261 where you want to easily propagate some internal variable in your code
262 up to the interactive namespace for further exploration.
262 up to the interactive namespace for further exploration.
263
263
264 When you run code via %run, globals in your script become visible at
264 When you run code via %run, globals in your script become visible at
265 the interactive prompt, but this doesn't happen for locals inside your
265 the interactive prompt, but this doesn't happen for locals inside your
266 own functions and methods. Yet when debugging, it is common to want
266 own functions and methods. Yet when debugging, it is common to want
267 to explore some internal variables further at the interactive propmt.
267 to explore some internal variables further at the interactive propmt.
268
268
269 Examples:
269 Examples:
270
270
271 To use this, you first must obtain a handle on the ipython object as
271 To use this, you first must obtain a handle on the ipython object as
272 indicated above, via:
272 indicated above, via:
273
273
274 import IPython.ipapi
274 import IPython.ipapi
275 ip = IPython.ipapi.get()
275 ip = IPython.ipapi.get()
276
276
277 Once this is done, inside a routine foo() where you want to expose
277 Once this is done, inside a routine foo() where you want to expose
278 variables x and y, you do the following:
278 variables x and y, you do the following:
279
279
280 def foo():
280 def foo():
281 ...
281 ...
282 x = your_computation()
282 x = your_computation()
283 y = something_else()
283 y = something_else()
284
284
285 # This pushes x and y to the interactive prompt immediately, even
285 # This pushes x and y to the interactive prompt immediately, even
286 # if this routine crashes on the next line after:
286 # if this routine crashes on the next line after:
287 ip.to_user_ns('x y')
287 ip.to_user_ns('x y')
288 ...
288 ...
289
289
290 # To expose *ALL* the local variables from the function, use:
290 # To expose *ALL* the local variables from the function, use:
291 ip.to_user_ns(locals())
291 ip.to_user_ns(locals())
292
292
293 ...
293 ...
294 # return
294 # return
295
295
296
296
297 If you need to rename variables, the dict input makes it easy. For
297 If you need to rename variables, the dict input makes it easy. For
298 example, this call exposes variables 'foo' as 'x' and 'bar' as 'y'
298 example, this call exposes variables 'foo' as 'x' and 'bar' as 'y'
299 in IPython user namespace:
299 in IPython user namespace:
300
300
301 ip.to_user_ns(dict(x=foo,y=bar))
301 ip.to_user_ns(dict(x=foo,y=bar))
302 """
302 """
303
303
304 # print 'vars given:',vars # dbg
304 # print 'vars given:',vars # dbg
305
305
306 # We need a dict of name/value pairs to do namespace updates.
306 # We need a dict of name/value pairs to do namespace updates.
307 if isinstance(vars,dict):
307 if isinstance(vars,dict):
308 # If a dict was given, no need to change anything.
308 # If a dict was given, no need to change anything.
309 vdict = vars
309 vdict = vars
310 elif isinstance(vars,basestring):
310 elif isinstance(vars,basestring):
311 # If a string with names was given, get the caller's frame to
311 # If a string with names was given, get the caller's frame to
312 # evaluate the given names in
312 # evaluate the given names in
313 cf = sys._getframe(1)
313 cf = sys._getframe(1)
314 vdict = {}
314 vdict = {}
315 for name in vars.split():
315 for name in vars.split():
316 try:
316 try:
317 vdict[name] = eval(name,cf.f_globals,cf.f_locals)
317 vdict[name] = eval(name,cf.f_globals,cf.f_locals)
318 except:
318 except:
319 print ('could not get var. %s from %s' %
319 print ('could not get var. %s from %s' %
320 (name,cf.f_code.co_name))
320 (name,cf.f_code.co_name))
321 else:
321 else:
322 raise ValueError('vars must be a string or a dict')
322 raise ValueError('vars must be a string or a dict')
323
323
324 # Propagate variables to user namespace
324 # Propagate variables to user namespace
325 self.user_ns.update(vdict)
325 self.user_ns.update(vdict)
326
326
327 # And configure interactive visibility
327 # And configure interactive visibility
328 config_ns = self.IP.user_config_ns
328 config_ns = self.IP.user_config_ns
329 if interactive:
329 if interactive:
330 for name,val in vdict.iteritems():
330 for name,val in vdict.iteritems():
331 config_ns.pop(name,None)
331 config_ns.pop(name,None)
332 else:
332 else:
333 for name,val in vdict.iteritems():
333 for name,val in vdict.iteritems():
334 config_ns[name] = val
334 config_ns[name] = val
335
335
336
336
337 def expand_alias(self,line):
337 def expand_alias(self,line):
338 """ Expand an alias in the command line
338 """ Expand an alias in the command line
339
339
340 Returns the provided command line, possibly with the first word
340 Returns the provided command line, possibly with the first word
341 (command) translated according to alias expansion rules.
341 (command) translated according to alias expansion rules.
342
342
343 [ipython]|16> _ip.expand_aliases("np myfile.txt")
343 [ipython]|16> _ip.expand_aliases("np myfile.txt")
344 <16> 'q:/opt/np/notepad++.exe myfile.txt'
344 <16> 'q:/opt/np/notepad++.exe myfile.txt'
345 """
345 """
346
346
347 pre,fn,rest = self.IP.split_user_input(line)
347 pre,fn,rest = self.IP.split_user_input(line)
348 res = pre + self.IP.expand_aliases(fn,rest)
348 res = pre + self.IP.expand_aliases(fn,rest)
349 return res
349 return res
350
350
351 def defalias(self, name, cmd):
351 def defalias(self, name, cmd):
352 """ Define a new alias
352 """ Define a new alias
353
353
354 _ip.defalias('bb','bldmake bldfiles')
354 _ip.defalias('bb','bldmake bldfiles')
355
355
356 Creates a new alias named 'bb' in ipython user namespace
356 Creates a new alias named 'bb' in ipython user namespace
357 """
357 """
358
358
359 if callable(cmd):
359 if callable(cmd):
360 self.IP.alias_table[name] = cmd
360 self.IP.alias_table[name] = cmd
361 import IPython.shadowns
361 import IPython.shadowns
362 setattr(IPython.shadowns, name,cmd)
362 setattr(IPython.shadowns, name,cmd)
363 return
363 return
364
364
365
365 if isinstance(cmd,basestring):
366 nargs = cmd.count('%s')
366 nargs = cmd.count('%s')
367 if nargs>0 and cmd.find('%l')>=0:
367 if nargs>0 and cmd.find('%l')>=0:
368 raise Exception('The %s and %l specifiers are mutually exclusive '
368 raise Exception('The %s and %l specifiers are mutually exclusive '
369 'in alias definitions.')
369 'in alias definitions.')
370
370
371 else: # all looks OK
372 self.IP.alias_table[name] = (nargs,cmd)
371 self.IP.alias_table[name] = (nargs,cmd)
373
372
374 def defmacro(self, *args):
373 def defmacro(self, *args):
375 """ Define a new macro
374 """ Define a new macro
376
375
377 2 forms of calling:
376 2 forms of calling:
378
377
379 mac = _ip.defmacro('print "hello"\nprint "world"')
378 mac = _ip.defmacro('print "hello"\nprint "world"')
380
379
381 (doesn't put the created macro on user namespace)
380 (doesn't put the created macro on user namespace)
382
381
383 _ip.defmacro('build', 'bldmake bldfiles\nabld build winscw udeb')
382 _ip.defmacro('build', 'bldmake bldfiles\nabld build winscw udeb')
384
383
385 (creates a macro named 'build' in user namespace)
384 (creates a macro named 'build' in user namespace)
386 """
385 """
387
386
388 import IPython.macro
387 import IPython.macro
389
388
390 if len(args) == 1:
389 if len(args) == 1:
391 return IPython.macro.Macro(args[0])
390 return IPython.macro.Macro(args[0])
392 elif len(args) == 2:
391 elif len(args) == 2:
393 self.user_ns[args[0]] = IPython.macro.Macro(args[1])
392 self.user_ns[args[0]] = IPython.macro.Macro(args[1])
394 else:
393 else:
395 return Exception("_ip.defmacro must be called with 1 or 2 arguments")
394 return Exception("_ip.defmacro must be called with 1 or 2 arguments")
396
395
397 def set_next_input(self, s):
396 def set_next_input(self, s):
398 """ Sets the 'default' input string for the next command line.
397 """ Sets the 'default' input string for the next command line.
399
398
400 Requires readline.
399 Requires readline.
401
400
402 Example:
401 Example:
403
402
404 [D:\ipython]|1> _ip.set_next_input("Hello Word")
403 [D:\ipython]|1> _ip.set_next_input("Hello Word")
405 [D:\ipython]|2> Hello Word_ # cursor is here
404 [D:\ipython]|2> Hello Word_ # cursor is here
406 """
405 """
407
406
408 self.IP.rl_next_input = s
407 self.IP.rl_next_input = s
409
408
410 def load(self, mod):
409 def load(self, mod):
411 if mod in self.extensions:
410 if mod in self.extensions:
412 # just to make sure we don't init it twice
411 # just to make sure we don't init it twice
413 # note that if you 'load' a module that has already been
412 # note that if you 'load' a module that has already been
414 # imported, init_ipython gets run anyway
413 # imported, init_ipython gets run anyway
415
414
416 return self.extensions[mod]
415 return self.extensions[mod]
417 __import__(mod)
416 __import__(mod)
418 m = sys.modules[mod]
417 m = sys.modules[mod]
419 if hasattr(m,'init_ipython'):
418 if hasattr(m,'init_ipython'):
420 m.init_ipython(self)
419 m.init_ipython(self)
421 self.extensions[mod] = m
420 self.extensions[mod] = m
422 return m
421 return m
423
422
424
423
425 def launch_new_instance(user_ns = None):
424 def launch_new_instance(user_ns = None):
426 """ Make and start a new ipython instance.
425 """ Make and start a new ipython instance.
427
426
428 This can be called even without having an already initialized
427 This can be called even without having an already initialized
429 ipython session running.
428 ipython session running.
430
429
431 This is also used as the egg entry point for the 'ipython' script.
430 This is also used as the egg entry point for the 'ipython' script.
432
431
433 """
432 """
434 ses = make_session(user_ns)
433 ses = make_session(user_ns)
435 ses.mainloop()
434 ses.mainloop()
436
435
437
436
438 def make_user_ns(user_ns = None):
437 def make_user_ns(user_ns = None):
439 """Return a valid user interactive namespace.
438 """Return a valid user interactive namespace.
440
439
441 This builds a dict with the minimal information needed to operate as a
440 This builds a dict with the minimal information needed to operate as a
442 valid IPython user namespace, which you can pass to the various embedding
441 valid IPython user namespace, which you can pass to the various embedding
443 classes in ipython.
442 classes in ipython.
444 """
443 """
445
444
446 if user_ns is None:
445 if user_ns is None:
447 # Set __name__ to __main__ to better match the behavior of the
446 # Set __name__ to __main__ to better match the behavior of the
448 # normal interpreter.
447 # normal interpreter.
449 user_ns = {'__name__' :'__main__',
448 user_ns = {'__name__' :'__main__',
450 '__builtins__' : __builtin__,
449 '__builtins__' : __builtin__,
451 }
450 }
452 else:
451 else:
453 user_ns.setdefault('__name__','__main__')
452 user_ns.setdefault('__name__','__main__')
454 user_ns.setdefault('__builtins__',__builtin__)
453 user_ns.setdefault('__builtins__',__builtin__)
455
454
456 return user_ns
455 return user_ns
457
456
458
457
459 def make_user_global_ns(ns = None):
458 def make_user_global_ns(ns = None):
460 """Return a valid user global namespace.
459 """Return a valid user global namespace.
461
460
462 Similar to make_user_ns(), but global namespaces are really only needed in
461 Similar to make_user_ns(), but global namespaces are really only needed in
463 embedded applications, where there is a distinction between the user's
462 embedded applications, where there is a distinction between the user's
464 interactive namespace and the global one where ipython is running."""
463 interactive namespace and the global one where ipython is running."""
465
464
466 if ns is None: ns = {}
465 if ns is None: ns = {}
467 return ns
466 return ns
468
467
469
468
470 def make_session(user_ns = None):
469 def make_session(user_ns = None):
471 """Makes, but does not launch an IPython session.
470 """Makes, but does not launch an IPython session.
472
471
473 Later on you can call obj.mainloop() on the returned object.
472 Later on you can call obj.mainloop() on the returned object.
474
473
475 Inputs:
474 Inputs:
476
475
477 - user_ns(None): a dict to be used as the user's namespace with initial
476 - user_ns(None): a dict to be used as the user's namespace with initial
478 data.
477 data.
479
478
480 WARNING: This should *not* be run when a session exists already."""
479 WARNING: This should *not* be run when a session exists already."""
481
480
482 import IPython.Shell
481 import IPython.Shell
483 return IPython.Shell.start(user_ns)
482 return IPython.Shell.start(user_ns)
484
483
@@ -1,2512 +1,2515 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.3 or newer.
5 Requires Python 2.3 or newer.
6
6
7 This file contains all the classes and helper functions specific to IPython.
7 This file contains all the classes and helper functions specific to IPython.
8
8
9 $Id: iplib.py 2631 2007-08-15 07:07:36Z fperez $
9 $Id: iplib.py 2637 2007-08-17 16:18:05Z vivainio $
10 """
10 """
11
11
12 #*****************************************************************************
12 #*****************************************************************************
13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
14 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
15 #
15 #
16 # Distributed under the terms of the BSD License. The full license is in
16 # Distributed under the terms of the BSD License. The full license is in
17 # the file COPYING, distributed as part of this software.
17 # the file COPYING, distributed as part of this software.
18 #
18 #
19 # Note: this code originally subclassed code.InteractiveConsole from the
19 # Note: this code originally subclassed code.InteractiveConsole from the
20 # Python standard library. Over time, all of that class has been copied
20 # Python standard library. Over time, all of that class has been copied
21 # verbatim here for modifications which could not be accomplished by
21 # verbatim here for modifications which could not be accomplished by
22 # subclassing. At this point, there are no dependencies at all on the code
22 # subclassing. At this point, there are no dependencies at all on the code
23 # module anymore (it is not even imported). The Python License (sec. 2)
23 # module anymore (it is not even imported). The Python License (sec. 2)
24 # allows for this, but it's always nice to acknowledge credit where credit is
24 # allows for this, but it's always nice to acknowledge credit where credit is
25 # due.
25 # due.
26 #*****************************************************************************
26 #*****************************************************************************
27
27
28 #****************************************************************************
28 #****************************************************************************
29 # Modules and globals
29 # Modules and globals
30
30
31 from IPython import Release
31 from IPython import Release
32 __author__ = '%s <%s>\n%s <%s>' % \
32 __author__ = '%s <%s>\n%s <%s>' % \
33 ( Release.authors['Janko'] + Release.authors['Fernando'] )
33 ( Release.authors['Janko'] + Release.authors['Fernando'] )
34 __license__ = Release.license
34 __license__ = Release.license
35 __version__ = Release.version
35 __version__ = Release.version
36
36
37 # Python standard modules
37 # Python standard modules
38 import __main__
38 import __main__
39 import __builtin__
39 import __builtin__
40 import StringIO
40 import StringIO
41 import bdb
41 import bdb
42 import cPickle as pickle
42 import cPickle as pickle
43 import codeop
43 import codeop
44 import doctest
44 import doctest
45 import exceptions
45 import exceptions
46 import glob
46 import glob
47 import inspect
47 import inspect
48 import keyword
48 import keyword
49 import new
49 import new
50 import os
50 import os
51 import pydoc
51 import pydoc
52 import re
52 import re
53 import shutil
53 import shutil
54 import string
54 import string
55 import sys
55 import sys
56 import tempfile
56 import tempfile
57 import traceback
57 import traceback
58 import types
58 import types
59 import pickleshare
59 import pickleshare
60 from sets import Set
60 from sets import Set
61 from pprint import pprint, pformat
61 from pprint import pprint, pformat
62
62
63 # IPython's own modules
63 # IPython's own modules
64 #import IPython
64 #import IPython
65 from IPython import Debugger,OInspect,PyColorize,ultraTB
65 from IPython import Debugger,OInspect,PyColorize,ultraTB
66 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
66 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
67 from IPython.FakeModule import FakeModule
67 from IPython.FakeModule import FakeModule
68 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
68 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
69 from IPython.Logger import Logger
69 from IPython.Logger import Logger
70 from IPython.Magic import Magic
70 from IPython.Magic import Magic
71 from IPython.Prompts import CachedOutput
71 from IPython.Prompts import CachedOutput
72 from IPython.ipstruct import Struct
72 from IPython.ipstruct import Struct
73 from IPython.background_jobs import BackgroundJobManager
73 from IPython.background_jobs import BackgroundJobManager
74 from IPython.usage import cmd_line_usage,interactive_usage
74 from IPython.usage import cmd_line_usage,interactive_usage
75 from IPython.genutils import *
75 from IPython.genutils import *
76 from IPython.strdispatch import StrDispatch
76 from IPython.strdispatch import StrDispatch
77 import IPython.ipapi
77 import IPython.ipapi
78 import IPython.history
78 import IPython.history
79 import IPython.prefilter as prefilter
79 import IPython.prefilter as prefilter
80 import IPython.shadowns
80 import IPython.shadowns
81 # Globals
81 # Globals
82
82
83 # store the builtin raw_input globally, and use this always, in case user code
83 # store the builtin raw_input globally, and use this always, in case user code
84 # overwrites it (like wx.py.PyShell does)
84 # overwrites it (like wx.py.PyShell does)
85 raw_input_original = raw_input
85 raw_input_original = raw_input
86
86
87 # compiled regexps for autoindent management
87 # compiled regexps for autoindent management
88 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
88 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
89
89
90
90
91 #****************************************************************************
91 #****************************************************************************
92 # Some utility function definitions
92 # Some utility function definitions
93
93
94 ini_spaces_re = re.compile(r'^(\s+)')
94 ini_spaces_re = re.compile(r'^(\s+)')
95
95
96 def num_ini_spaces(strng):
96 def num_ini_spaces(strng):
97 """Return the number of initial spaces in a string"""
97 """Return the number of initial spaces in a string"""
98
98
99 ini_spaces = ini_spaces_re.match(strng)
99 ini_spaces = ini_spaces_re.match(strng)
100 if ini_spaces:
100 if ini_spaces:
101 return ini_spaces.end()
101 return ini_spaces.end()
102 else:
102 else:
103 return 0
103 return 0
104
104
105 def softspace(file, newvalue):
105 def softspace(file, newvalue):
106 """Copied from code.py, to remove the dependency"""
106 """Copied from code.py, to remove the dependency"""
107
107
108 oldvalue = 0
108 oldvalue = 0
109 try:
109 try:
110 oldvalue = file.softspace
110 oldvalue = file.softspace
111 except AttributeError:
111 except AttributeError:
112 pass
112 pass
113 try:
113 try:
114 file.softspace = newvalue
114 file.softspace = newvalue
115 except (AttributeError, TypeError):
115 except (AttributeError, TypeError):
116 # "attribute-less object" or "read-only attributes"
116 # "attribute-less object" or "read-only attributes"
117 pass
117 pass
118 return oldvalue
118 return oldvalue
119
119
120
120
121 #****************************************************************************
121 #****************************************************************************
122 # Local use exceptions
122 # Local use exceptions
123 class SpaceInInput(exceptions.Exception): pass
123 class SpaceInInput(exceptions.Exception): pass
124
124
125
125
126 #****************************************************************************
126 #****************************************************************************
127 # Local use classes
127 # Local use classes
128 class Bunch: pass
128 class Bunch: pass
129
129
130 class Undefined: pass
130 class Undefined: pass
131
131
132 class Quitter(object):
132 class Quitter(object):
133 """Simple class to handle exit, similar to Python 2.5's.
133 """Simple class to handle exit, similar to Python 2.5's.
134
134
135 It handles exiting in an ipython-safe manner, which the one in Python 2.5
135 It handles exiting in an ipython-safe manner, which the one in Python 2.5
136 doesn't do (obviously, since it doesn't know about ipython)."""
136 doesn't do (obviously, since it doesn't know about ipython)."""
137
137
138 def __init__(self,shell,name):
138 def __init__(self,shell,name):
139 self.shell = shell
139 self.shell = shell
140 self.name = name
140 self.name = name
141
141
142 def __repr__(self):
142 def __repr__(self):
143 return 'Type %s() to exit.' % self.name
143 return 'Type %s() to exit.' % self.name
144 __str__ = __repr__
144 __str__ = __repr__
145
145
146 def __call__(self):
146 def __call__(self):
147 self.shell.exit()
147 self.shell.exit()
148
148
149 class InputList(list):
149 class InputList(list):
150 """Class to store user input.
150 """Class to store user input.
151
151
152 It's basically a list, but slices return a string instead of a list, thus
152 It's basically a list, but slices return a string instead of a list, thus
153 allowing things like (assuming 'In' is an instance):
153 allowing things like (assuming 'In' is an instance):
154
154
155 exec In[4:7]
155 exec In[4:7]
156
156
157 or
157 or
158
158
159 exec In[5:9] + In[14] + In[21:25]"""
159 exec In[5:9] + In[14] + In[21:25]"""
160
160
161 def __getslice__(self,i,j):
161 def __getslice__(self,i,j):
162 return ''.join(list.__getslice__(self,i,j))
162 return ''.join(list.__getslice__(self,i,j))
163
163
164 class SyntaxTB(ultraTB.ListTB):
164 class SyntaxTB(ultraTB.ListTB):
165 """Extension which holds some state: the last exception value"""
165 """Extension which holds some state: the last exception value"""
166
166
167 def __init__(self,color_scheme = 'NoColor'):
167 def __init__(self,color_scheme = 'NoColor'):
168 ultraTB.ListTB.__init__(self,color_scheme)
168 ultraTB.ListTB.__init__(self,color_scheme)
169 self.last_syntax_error = None
169 self.last_syntax_error = None
170
170
171 def __call__(self, etype, value, elist):
171 def __call__(self, etype, value, elist):
172 self.last_syntax_error = value
172 self.last_syntax_error = value
173 ultraTB.ListTB.__call__(self,etype,value,elist)
173 ultraTB.ListTB.__call__(self,etype,value,elist)
174
174
175 def clear_err_state(self):
175 def clear_err_state(self):
176 """Return the current error state and clear it"""
176 """Return the current error state and clear it"""
177 e = self.last_syntax_error
177 e = self.last_syntax_error
178 self.last_syntax_error = None
178 self.last_syntax_error = None
179 return e
179 return e
180
180
181 #****************************************************************************
181 #****************************************************************************
182 # Main IPython class
182 # Main IPython class
183
183
184 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
184 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
185 # until a full rewrite is made. I've cleaned all cross-class uses of
185 # until a full rewrite is made. I've cleaned all cross-class uses of
186 # attributes and methods, but too much user code out there relies on the
186 # attributes and methods, but too much user code out there relies on the
187 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
187 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
188 #
188 #
189 # But at least now, all the pieces have been separated and we could, in
189 # But at least now, all the pieces have been separated and we could, in
190 # principle, stop using the mixin. This will ease the transition to the
190 # principle, stop using the mixin. This will ease the transition to the
191 # chainsaw branch.
191 # chainsaw branch.
192
192
193 # For reference, the following is the list of 'self.foo' uses in the Magic
193 # For reference, the following is the list of 'self.foo' uses in the Magic
194 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
194 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
195 # class, to prevent clashes.
195 # class, to prevent clashes.
196
196
197 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
197 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
198 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
198 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
199 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
199 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
200 # 'self.value']
200 # 'self.value']
201
201
202 class InteractiveShell(object,Magic):
202 class InteractiveShell(object,Magic):
203 """An enhanced console for Python."""
203 """An enhanced console for Python."""
204
204
205 # class attribute to indicate whether the class supports threads or not.
205 # class attribute to indicate whether the class supports threads or not.
206 # Subclasses with thread support should override this as needed.
206 # Subclasses with thread support should override this as needed.
207 isthreaded = False
207 isthreaded = False
208
208
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
210 user_ns = None,user_global_ns=None,banner2='',
210 user_ns = None,user_global_ns=None,banner2='',
211 custom_exceptions=((),None),embedded=False):
211 custom_exceptions=((),None),embedded=False):
212
212
213 # log system
213 # log system
214 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
214 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
215
215
216 # some minimal strict typechecks. For some core data structures, I
216 # some minimal strict typechecks. For some core data structures, I
217 # want actual basic python types, not just anything that looks like
217 # want actual basic python types, not just anything that looks like
218 # one. This is especially true for namespaces.
218 # one. This is especially true for namespaces.
219 for ns in (user_ns,user_global_ns):
219 for ns in (user_ns,user_global_ns):
220 if ns is not None and type(ns) != types.DictType:
220 if ns is not None and type(ns) != types.DictType:
221 raise TypeError,'namespace must be a dictionary'
221 raise TypeError,'namespace must be a dictionary'
222
222
223 # Job manager (for jobs run as background threads)
223 # Job manager (for jobs run as background threads)
224 self.jobs = BackgroundJobManager()
224 self.jobs = BackgroundJobManager()
225
225
226 # Store the actual shell's name
226 # Store the actual shell's name
227 self.name = name
227 self.name = name
228
228
229 # We need to know whether the instance is meant for embedding, since
229 # We need to know whether the instance is meant for embedding, since
230 # global/local namespaces need to be handled differently in that case
230 # global/local namespaces need to be handled differently in that case
231 self.embedded = embedded
231 self.embedded = embedded
232 if embedded:
232 if embedded:
233 # Control variable so users can, from within the embedded instance,
233 # Control variable so users can, from within the embedded instance,
234 # permanently deactivate it.
234 # permanently deactivate it.
235 self.embedded_active = True
235 self.embedded_active = True
236
236
237 # command compiler
237 # command compiler
238 self.compile = codeop.CommandCompiler()
238 self.compile = codeop.CommandCompiler()
239
239
240 # User input buffer
240 # User input buffer
241 self.buffer = []
241 self.buffer = []
242
242
243 # Default name given in compilation of code
243 # Default name given in compilation of code
244 self.filename = '<ipython console>'
244 self.filename = '<ipython console>'
245
245
246 # Install our own quitter instead of the builtins. For python2.3-2.4,
246 # Install our own quitter instead of the builtins. For python2.3-2.4,
247 # this brings in behavior like 2.5, and for 2.5 it's identical.
247 # this brings in behavior like 2.5, and for 2.5 it's identical.
248 __builtin__.exit = Quitter(self,'exit')
248 __builtin__.exit = Quitter(self,'exit')
249 __builtin__.quit = Quitter(self,'quit')
249 __builtin__.quit = Quitter(self,'quit')
250
250
251 # Make an empty namespace, which extension writers can rely on both
251 # Make an empty namespace, which extension writers can rely on both
252 # existing and NEVER being used by ipython itself. This gives them a
252 # existing and NEVER being used by ipython itself. This gives them a
253 # convenient location for storing additional information and state
253 # convenient location for storing additional information and state
254 # their extensions may require, without fear of collisions with other
254 # their extensions may require, without fear of collisions with other
255 # ipython names that may develop later.
255 # ipython names that may develop later.
256 self.meta = Struct()
256 self.meta = Struct()
257
257
258 # Create the namespace where the user will operate. user_ns is
258 # Create the namespace where the user will operate. user_ns is
259 # normally the only one used, and it is passed to the exec calls as
259 # normally the only one used, and it is passed to the exec calls as
260 # the locals argument. But we do carry a user_global_ns namespace
260 # the locals argument. But we do carry a user_global_ns namespace
261 # given as the exec 'globals' argument, This is useful in embedding
261 # given as the exec 'globals' argument, This is useful in embedding
262 # situations where the ipython shell opens in a context where the
262 # situations where the ipython shell opens in a context where the
263 # distinction between locals and globals is meaningful.
263 # distinction between locals and globals is meaningful.
264
264
265 # FIXME. For some strange reason, __builtins__ is showing up at user
265 # FIXME. For some strange reason, __builtins__ is showing up at user
266 # level as a dict instead of a module. This is a manual fix, but I
266 # level as a dict instead of a module. This is a manual fix, but I
267 # should really track down where the problem is coming from. Alex
267 # should really track down where the problem is coming from. Alex
268 # Schmolck reported this problem first.
268 # Schmolck reported this problem first.
269
269
270 # A useful post by Alex Martelli on this topic:
270 # A useful post by Alex Martelli on this topic:
271 # Re: inconsistent value from __builtins__
271 # Re: inconsistent value from __builtins__
272 # Von: Alex Martelli <aleaxit@yahoo.com>
272 # Von: Alex Martelli <aleaxit@yahoo.com>
273 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
273 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
274 # Gruppen: comp.lang.python
274 # Gruppen: comp.lang.python
275
275
276 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
276 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
277 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
277 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
278 # > <type 'dict'>
278 # > <type 'dict'>
279 # > >>> print type(__builtins__)
279 # > >>> print type(__builtins__)
280 # > <type 'module'>
280 # > <type 'module'>
281 # > Is this difference in return value intentional?
281 # > Is this difference in return value intentional?
282
282
283 # Well, it's documented that '__builtins__' can be either a dictionary
283 # Well, it's documented that '__builtins__' can be either a dictionary
284 # or a module, and it's been that way for a long time. Whether it's
284 # or a module, and it's been that way for a long time. Whether it's
285 # intentional (or sensible), I don't know. In any case, the idea is
285 # intentional (or sensible), I don't know. In any case, the idea is
286 # that if you need to access the built-in namespace directly, you
286 # that if you need to access the built-in namespace directly, you
287 # should start with "import __builtin__" (note, no 's') which will
287 # should start with "import __builtin__" (note, no 's') which will
288 # definitely give you a module. Yeah, it's somewhat confusing:-(.
288 # definitely give you a module. Yeah, it's somewhat confusing:-(.
289
289
290 # These routines return properly built dicts as needed by the rest of
290 # These routines return properly built dicts as needed by the rest of
291 # the code, and can also be used by extension writers to generate
291 # the code, and can also be used by extension writers to generate
292 # properly initialized namespaces.
292 # properly initialized namespaces.
293 user_ns = IPython.ipapi.make_user_ns(user_ns)
293 user_ns = IPython.ipapi.make_user_ns(user_ns)
294 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
294 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
295
295
296 # Assign namespaces
296 # Assign namespaces
297 # This is the namespace where all normal user variables live
297 # This is the namespace where all normal user variables live
298 self.user_ns = user_ns
298 self.user_ns = user_ns
299 # Embedded instances require a separate namespace for globals.
299 # Embedded instances require a separate namespace for globals.
300 # Normally this one is unused by non-embedded instances.
300 # Normally this one is unused by non-embedded instances.
301 self.user_global_ns = user_global_ns
301 self.user_global_ns = user_global_ns
302 # A namespace to keep track of internal data structures to prevent
302 # A namespace to keep track of internal data structures to prevent
303 # them from cluttering user-visible stuff. Will be updated later
303 # them from cluttering user-visible stuff. Will be updated later
304 self.internal_ns = {}
304 self.internal_ns = {}
305
305
306 # Namespace of system aliases. Each entry in the alias
306 # Namespace of system aliases. Each entry in the alias
307 # table must be a 2-tuple of the form (N,name), where N is the number
307 # table must be a 2-tuple of the form (N,name), where N is the number
308 # of positional arguments of the alias.
308 # of positional arguments of the alias.
309 self.alias_table = {}
309 self.alias_table = {}
310
310
311 # A table holding all the namespaces IPython deals with, so that
311 # A table holding all the namespaces IPython deals with, so that
312 # introspection facilities can search easily.
312 # introspection facilities can search easily.
313 self.ns_table = {'user':user_ns,
313 self.ns_table = {'user':user_ns,
314 'user_global':user_global_ns,
314 'user_global':user_global_ns,
315 'alias':self.alias_table,
315 'alias':self.alias_table,
316 'internal':self.internal_ns,
316 'internal':self.internal_ns,
317 'builtin':__builtin__.__dict__
317 'builtin':__builtin__.__dict__
318 }
318 }
319
319
320 # The user namespace MUST have a pointer to the shell itself.
320 # The user namespace MUST have a pointer to the shell itself.
321 self.user_ns[name] = self
321 self.user_ns[name] = self
322
322
323 # We need to insert into sys.modules something that looks like a
323 # We need to insert into sys.modules something that looks like a
324 # module but which accesses the IPython namespace, for shelve and
324 # module but which accesses the IPython namespace, for shelve and
325 # pickle to work interactively. Normally they rely on getting
325 # pickle to work interactively. Normally they rely on getting
326 # everything out of __main__, but for embedding purposes each IPython
326 # everything out of __main__, but for embedding purposes each IPython
327 # instance has its own private namespace, so we can't go shoving
327 # instance has its own private namespace, so we can't go shoving
328 # everything into __main__.
328 # everything into __main__.
329
329
330 # note, however, that we should only do this for non-embedded
330 # note, however, that we should only do this for non-embedded
331 # ipythons, which really mimic the __main__.__dict__ with their own
331 # ipythons, which really mimic the __main__.__dict__ with their own
332 # namespace. Embedded instances, on the other hand, should not do
332 # namespace. Embedded instances, on the other hand, should not do
333 # this because they need to manage the user local/global namespaces
333 # this because they need to manage the user local/global namespaces
334 # only, but they live within a 'normal' __main__ (meaning, they
334 # only, but they live within a 'normal' __main__ (meaning, they
335 # shouldn't overtake the execution environment of the script they're
335 # shouldn't overtake the execution environment of the script they're
336 # embedded in).
336 # embedded in).
337
337
338 if not embedded:
338 if not embedded:
339 try:
339 try:
340 main_name = self.user_ns['__name__']
340 main_name = self.user_ns['__name__']
341 except KeyError:
341 except KeyError:
342 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
342 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
343 else:
343 else:
344 #print "pickle hack in place" # dbg
344 #print "pickle hack in place" # dbg
345 #print 'main_name:',main_name # dbg
345 #print 'main_name:',main_name # dbg
346 sys.modules[main_name] = FakeModule(self.user_ns)
346 sys.modules[main_name] = FakeModule(self.user_ns)
347
347
348 # List of input with multi-line handling.
348 # List of input with multi-line handling.
349 # Fill its zero entry, user counter starts at 1
349 # Fill its zero entry, user counter starts at 1
350 self.input_hist = InputList(['\n'])
350 self.input_hist = InputList(['\n'])
351 # This one will hold the 'raw' input history, without any
351 # This one will hold the 'raw' input history, without any
352 # pre-processing. This will allow users to retrieve the input just as
352 # pre-processing. This will allow users to retrieve the input just as
353 # it was exactly typed in by the user, with %hist -r.
353 # it was exactly typed in by the user, with %hist -r.
354 self.input_hist_raw = InputList(['\n'])
354 self.input_hist_raw = InputList(['\n'])
355
355
356 # list of visited directories
356 # list of visited directories
357 try:
357 try:
358 self.dir_hist = [os.getcwd()]
358 self.dir_hist = [os.getcwd()]
359 except OSError:
359 except OSError:
360 self.dir_hist = []
360 self.dir_hist = []
361
361
362 # dict of output history
362 # dict of output history
363 self.output_hist = {}
363 self.output_hist = {}
364
364
365 # Get system encoding at startup time. Certain terminals (like Emacs
365 # Get system encoding at startup time. Certain terminals (like Emacs
366 # under Win32 have it set to None, and we need to have a known valid
366 # under Win32 have it set to None, and we need to have a known valid
367 # encoding to use in the raw_input() method
367 # encoding to use in the raw_input() method
368 self.stdin_encoding = sys.stdin.encoding or 'ascii'
368 self.stdin_encoding = sys.stdin.encoding or 'ascii'
369
369
370 # dict of things NOT to alias (keywords, builtins and some magics)
370 # dict of things NOT to alias (keywords, builtins and some magics)
371 no_alias = {}
371 no_alias = {}
372 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
372 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
373 for key in keyword.kwlist + no_alias_magics:
373 for key in keyword.kwlist + no_alias_magics:
374 no_alias[key] = 1
374 no_alias[key] = 1
375 no_alias.update(__builtin__.__dict__)
375 no_alias.update(__builtin__.__dict__)
376 self.no_alias = no_alias
376 self.no_alias = no_alias
377
377
378 # make global variables for user access to these
378 # make global variables for user access to these
379 self.user_ns['_ih'] = self.input_hist
379 self.user_ns['_ih'] = self.input_hist
380 self.user_ns['_oh'] = self.output_hist
380 self.user_ns['_oh'] = self.output_hist
381 self.user_ns['_dh'] = self.dir_hist
381 self.user_ns['_dh'] = self.dir_hist
382
382
383 # user aliases to input and output histories
383 # user aliases to input and output histories
384 self.user_ns['In'] = self.input_hist
384 self.user_ns['In'] = self.input_hist
385 self.user_ns['Out'] = self.output_hist
385 self.user_ns['Out'] = self.output_hist
386
386
387 self.user_ns['_sh'] = IPython.shadowns
387 self.user_ns['_sh'] = IPython.shadowns
388 # Object variable to store code object waiting execution. This is
388 # Object variable to store code object waiting execution. This is
389 # used mainly by the multithreaded shells, but it can come in handy in
389 # used mainly by the multithreaded shells, but it can come in handy in
390 # other situations. No need to use a Queue here, since it's a single
390 # other situations. No need to use a Queue here, since it's a single
391 # item which gets cleared once run.
391 # item which gets cleared once run.
392 self.code_to_run = None
392 self.code_to_run = None
393
393
394 # escapes for automatic behavior on the command line
394 # escapes for automatic behavior on the command line
395 self.ESC_SHELL = '!'
395 self.ESC_SHELL = '!'
396 self.ESC_SH_CAP = '!!'
396 self.ESC_SH_CAP = '!!'
397 self.ESC_HELP = '?'
397 self.ESC_HELP = '?'
398 self.ESC_MAGIC = '%'
398 self.ESC_MAGIC = '%'
399 self.ESC_QUOTE = ','
399 self.ESC_QUOTE = ','
400 self.ESC_QUOTE2 = ';'
400 self.ESC_QUOTE2 = ';'
401 self.ESC_PAREN = '/'
401 self.ESC_PAREN = '/'
402
402
403 # And their associated handlers
403 # And their associated handlers
404 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
404 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
405 self.ESC_QUOTE : self.handle_auto,
405 self.ESC_QUOTE : self.handle_auto,
406 self.ESC_QUOTE2 : self.handle_auto,
406 self.ESC_QUOTE2 : self.handle_auto,
407 self.ESC_MAGIC : self.handle_magic,
407 self.ESC_MAGIC : self.handle_magic,
408 self.ESC_HELP : self.handle_help,
408 self.ESC_HELP : self.handle_help,
409 self.ESC_SHELL : self.handle_shell_escape,
409 self.ESC_SHELL : self.handle_shell_escape,
410 self.ESC_SH_CAP : self.handle_shell_escape,
410 self.ESC_SH_CAP : self.handle_shell_escape,
411 }
411 }
412
412
413 # class initializations
413 # class initializations
414 Magic.__init__(self,self)
414 Magic.__init__(self,self)
415
415
416 # Python source parser/formatter for syntax highlighting
416 # Python source parser/formatter for syntax highlighting
417 pyformat = PyColorize.Parser().format
417 pyformat = PyColorize.Parser().format
418 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
418 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
419
419
420 # hooks holds pointers used for user-side customizations
420 # hooks holds pointers used for user-side customizations
421 self.hooks = Struct()
421 self.hooks = Struct()
422
422
423 self.strdispatchers = {}
423 self.strdispatchers = {}
424
424
425 # Set all default hooks, defined in the IPython.hooks module.
425 # Set all default hooks, defined in the IPython.hooks module.
426 hooks = IPython.hooks
426 hooks = IPython.hooks
427 for hook_name in hooks.__all__:
427 for hook_name in hooks.__all__:
428 # default hooks have priority 100, i.e. low; user hooks should have
428 # default hooks have priority 100, i.e. low; user hooks should have
429 # 0-100 priority
429 # 0-100 priority
430 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
430 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
431 #print "bound hook",hook_name
431 #print "bound hook",hook_name
432
432
433 # Flag to mark unconditional exit
433 # Flag to mark unconditional exit
434 self.exit_now = False
434 self.exit_now = False
435
435
436 self.usage_min = """\
436 self.usage_min = """\
437 An enhanced console for Python.
437 An enhanced console for Python.
438 Some of its features are:
438 Some of its features are:
439 - Readline support if the readline library is present.
439 - Readline support if the readline library is present.
440 - Tab completion in the local namespace.
440 - Tab completion in the local namespace.
441 - Logging of input, see command-line options.
441 - Logging of input, see command-line options.
442 - System shell escape via ! , eg !ls.
442 - System shell escape via ! , eg !ls.
443 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
443 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
444 - Keeps track of locally defined variables via %who, %whos.
444 - Keeps track of locally defined variables via %who, %whos.
445 - Show object information with a ? eg ?x or x? (use ?? for more info).
445 - Show object information with a ? eg ?x or x? (use ?? for more info).
446 """
446 """
447 if usage: self.usage = usage
447 if usage: self.usage = usage
448 else: self.usage = self.usage_min
448 else: self.usage = self.usage_min
449
449
450 # Storage
450 # Storage
451 self.rc = rc # This will hold all configuration information
451 self.rc = rc # This will hold all configuration information
452 self.pager = 'less'
452 self.pager = 'less'
453 # temporary files used for various purposes. Deleted at exit.
453 # temporary files used for various purposes. Deleted at exit.
454 self.tempfiles = []
454 self.tempfiles = []
455
455
456 # Keep track of readline usage (later set by init_readline)
456 # Keep track of readline usage (later set by init_readline)
457 self.has_readline = False
457 self.has_readline = False
458
458
459 # template for logfile headers. It gets resolved at runtime by the
459 # template for logfile headers. It gets resolved at runtime by the
460 # logstart method.
460 # logstart method.
461 self.loghead_tpl = \
461 self.loghead_tpl = \
462 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
462 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
463 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
463 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
464 #log# opts = %s
464 #log# opts = %s
465 #log# args = %s
465 #log# args = %s
466 #log# It is safe to make manual edits below here.
466 #log# It is safe to make manual edits below here.
467 #log#-----------------------------------------------------------------------
467 #log#-----------------------------------------------------------------------
468 """
468 """
469 # for pushd/popd management
469 # for pushd/popd management
470 try:
470 try:
471 self.home_dir = get_home_dir()
471 self.home_dir = get_home_dir()
472 except HomeDirError,msg:
472 except HomeDirError,msg:
473 fatal(msg)
473 fatal(msg)
474
474
475 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
475 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
476
476
477 # Functions to call the underlying shell.
477 # Functions to call the underlying shell.
478
478
479 # The first is similar to os.system, but it doesn't return a value,
479 # The first is similar to os.system, but it doesn't return a value,
480 # and it allows interpolation of variables in the user's namespace.
480 # and it allows interpolation of variables in the user's namespace.
481 self.system = lambda cmd: \
481 self.system = lambda cmd: \
482 shell(self.var_expand(cmd,depth=2),
482 shell(self.var_expand(cmd,depth=2),
483 header=self.rc.system_header,
483 header=self.rc.system_header,
484 verbose=self.rc.system_verbose)
484 verbose=self.rc.system_verbose)
485
485
486 # These are for getoutput and getoutputerror:
486 # These are for getoutput and getoutputerror:
487 self.getoutput = lambda cmd: \
487 self.getoutput = lambda cmd: \
488 getoutput(self.var_expand(cmd,depth=2),
488 getoutput(self.var_expand(cmd,depth=2),
489 header=self.rc.system_header,
489 header=self.rc.system_header,
490 verbose=self.rc.system_verbose)
490 verbose=self.rc.system_verbose)
491
491
492 self.getoutputerror = lambda cmd: \
492 self.getoutputerror = lambda cmd: \
493 getoutputerror(self.var_expand(cmd,depth=2),
493 getoutputerror(self.var_expand(cmd,depth=2),
494 header=self.rc.system_header,
494 header=self.rc.system_header,
495 verbose=self.rc.system_verbose)
495 verbose=self.rc.system_verbose)
496
496
497
497
498 # keep track of where we started running (mainly for crash post-mortem)
498 # keep track of where we started running (mainly for crash post-mortem)
499 self.starting_dir = os.getcwd()
499 self.starting_dir = os.getcwd()
500
500
501 # Various switches which can be set
501 # Various switches which can be set
502 self.CACHELENGTH = 5000 # this is cheap, it's just text
502 self.CACHELENGTH = 5000 # this is cheap, it's just text
503 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
503 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
504 self.banner2 = banner2
504 self.banner2 = banner2
505
505
506 # TraceBack handlers:
506 # TraceBack handlers:
507
507
508 # Syntax error handler.
508 # Syntax error handler.
509 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
509 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
510
510
511 # The interactive one is initialized with an offset, meaning we always
511 # The interactive one is initialized with an offset, meaning we always
512 # want to remove the topmost item in the traceback, which is our own
512 # want to remove the topmost item in the traceback, which is our own
513 # internal code. Valid modes: ['Plain','Context','Verbose']
513 # internal code. Valid modes: ['Plain','Context','Verbose']
514 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
514 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
515 color_scheme='NoColor',
515 color_scheme='NoColor',
516 tb_offset = 1)
516 tb_offset = 1)
517
517
518 # IPython itself shouldn't crash. This will produce a detailed
518 # IPython itself shouldn't crash. This will produce a detailed
519 # post-mortem if it does. But we only install the crash handler for
519 # post-mortem if it does. But we only install the crash handler for
520 # non-threaded shells, the threaded ones use a normal verbose reporter
520 # non-threaded shells, the threaded ones use a normal verbose reporter
521 # and lose the crash handler. This is because exceptions in the main
521 # and lose the crash handler. This is because exceptions in the main
522 # thread (such as in GUI code) propagate directly to sys.excepthook,
522 # thread (such as in GUI code) propagate directly to sys.excepthook,
523 # and there's no point in printing crash dumps for every user exception.
523 # and there's no point in printing crash dumps for every user exception.
524 if self.isthreaded:
524 if self.isthreaded:
525 ipCrashHandler = ultraTB.FormattedTB()
525 ipCrashHandler = ultraTB.FormattedTB()
526 else:
526 else:
527 from IPython import CrashHandler
527 from IPython import CrashHandler
528 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
528 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
529 self.set_crash_handler(ipCrashHandler)
529 self.set_crash_handler(ipCrashHandler)
530
530
531 # and add any custom exception handlers the user may have specified
531 # and add any custom exception handlers the user may have specified
532 self.set_custom_exc(*custom_exceptions)
532 self.set_custom_exc(*custom_exceptions)
533
533
534 # indentation management
534 # indentation management
535 self.autoindent = False
535 self.autoindent = False
536 self.indent_current_nsp = 0
536 self.indent_current_nsp = 0
537
537
538 # Make some aliases automatically
538 # Make some aliases automatically
539 # Prepare list of shell aliases to auto-define
539 # Prepare list of shell aliases to auto-define
540 if os.name == 'posix':
540 if os.name == 'posix':
541 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
541 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
542 'mv mv -i','rm rm -i','cp cp -i',
542 'mv mv -i','rm rm -i','cp cp -i',
543 'cat cat','less less','clear clear',
543 'cat cat','less less','clear clear',
544 # a better ls
544 # a better ls
545 'ls ls -F',
545 'ls ls -F',
546 # long ls
546 # long ls
547 'll ls -lF')
547 'll ls -lF')
548 # Extra ls aliases with color, which need special treatment on BSD
548 # Extra ls aliases with color, which need special treatment on BSD
549 # variants
549 # variants
550 ls_extra = ( # color ls
550 ls_extra = ( # color ls
551 'lc ls -F -o --color',
551 'lc ls -F -o --color',
552 # ls normal files only
552 # ls normal files only
553 'lf ls -F -o --color %l | grep ^-',
553 'lf ls -F -o --color %l | grep ^-',
554 # ls symbolic links
554 # ls symbolic links
555 'lk ls -F -o --color %l | grep ^l',
555 'lk ls -F -o --color %l | grep ^l',
556 # directories or links to directories,
556 # directories or links to directories,
557 'ldir ls -F -o --color %l | grep /$',
557 'ldir ls -F -o --color %l | grep /$',
558 # things which are executable
558 # things which are executable
559 'lx ls -F -o --color %l | grep ^-..x',
559 'lx ls -F -o --color %l | grep ^-..x',
560 )
560 )
561 # The BSDs don't ship GNU ls, so they don't understand the
561 # The BSDs don't ship GNU ls, so they don't understand the
562 # --color switch out of the box
562 # --color switch out of the box
563 if 'bsd' in sys.platform:
563 if 'bsd' in sys.platform:
564 ls_extra = ( # ls normal files only
564 ls_extra = ( # ls normal files only
565 'lf ls -lF | grep ^-',
565 'lf ls -lF | grep ^-',
566 # ls symbolic links
566 # ls symbolic links
567 'lk ls -lF | grep ^l',
567 'lk ls -lF | grep ^l',
568 # directories or links to directories,
568 # directories or links to directories,
569 'ldir ls -lF | grep /$',
569 'ldir ls -lF | grep /$',
570 # things which are executable
570 # things which are executable
571 'lx ls -lF | grep ^-..x',
571 'lx ls -lF | grep ^-..x',
572 )
572 )
573 auto_alias = auto_alias + ls_extra
573 auto_alias = auto_alias + ls_extra
574 elif os.name in ['nt','dos']:
574 elif os.name in ['nt','dos']:
575 auto_alias = ('dir dir /on', 'ls dir /on',
575 auto_alias = ('dir dir /on', 'ls dir /on',
576 'ddir dir /ad /on', 'ldir dir /ad /on',
576 'ddir dir /ad /on', 'ldir dir /ad /on',
577 'mkdir mkdir','rmdir rmdir','echo echo',
577 'mkdir mkdir','rmdir rmdir','echo echo',
578 'ren ren','cls cls','copy copy')
578 'ren ren','cls cls','copy copy')
579 else:
579 else:
580 auto_alias = ()
580 auto_alias = ()
581 self.auto_alias = [s.split(None,1) for s in auto_alias]
581 self.auto_alias = [s.split(None,1) for s in auto_alias]
582 # Call the actual (public) initializer
582 # Call the actual (public) initializer
583 self.init_auto_alias()
583 self.init_auto_alias()
584
584
585 # Produce a public API instance
585 # Produce a public API instance
586 self.api = IPython.ipapi.IPApi(self)
586 self.api = IPython.ipapi.IPApi(self)
587
587
588 # track which builtins we add, so we can clean up later
588 # track which builtins we add, so we can clean up later
589 self.builtins_added = {}
589 self.builtins_added = {}
590 # This method will add the necessary builtins for operation, but
590 # This method will add the necessary builtins for operation, but
591 # tracking what it did via the builtins_added dict.
591 # tracking what it did via the builtins_added dict.
592 self.add_builtins()
592 self.add_builtins()
593
593
594 # end __init__
594 # end __init__
595
595
596 def var_expand(self,cmd,depth=0):
596 def var_expand(self,cmd,depth=0):
597 """Expand python variables in a string.
597 """Expand python variables in a string.
598
598
599 The depth argument indicates how many frames above the caller should
599 The depth argument indicates how many frames above the caller should
600 be walked to look for the local namespace where to expand variables.
600 be walked to look for the local namespace where to expand variables.
601
601
602 The global namespace for expansion is always the user's interactive
602 The global namespace for expansion is always the user's interactive
603 namespace.
603 namespace.
604 """
604 """
605
605
606 return str(ItplNS(cmd.replace('#','\#'),
606 return str(ItplNS(cmd.replace('#','\#'),
607 self.user_ns, # globals
607 self.user_ns, # globals
608 # Skip our own frame in searching for locals:
608 # Skip our own frame in searching for locals:
609 sys._getframe(depth+1).f_locals # locals
609 sys._getframe(depth+1).f_locals # locals
610 ))
610 ))
611
611
612 def pre_config_initialization(self):
612 def pre_config_initialization(self):
613 """Pre-configuration init method
613 """Pre-configuration init method
614
614
615 This is called before the configuration files are processed to
615 This is called before the configuration files are processed to
616 prepare the services the config files might need.
616 prepare the services the config files might need.
617
617
618 self.rc already has reasonable default values at this point.
618 self.rc already has reasonable default values at this point.
619 """
619 """
620 rc = self.rc
620 rc = self.rc
621 try:
621 try:
622 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
622 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
623 except exceptions.UnicodeDecodeError:
623 except exceptions.UnicodeDecodeError:
624 print "Your ipythondir can't be decoded to unicode!"
624 print "Your ipythondir can't be decoded to unicode!"
625 print "Please set HOME environment variable to something that"
625 print "Please set HOME environment variable to something that"
626 print r"only has ASCII characters, e.g. c:\home"
626 print r"only has ASCII characters, e.g. c:\home"
627 print "Now it is",rc.ipythondir
627 print "Now it is",rc.ipythondir
628 sys.exit()
628 sys.exit()
629 self.shadowhist = IPython.history.ShadowHist(self.db)
629 self.shadowhist = IPython.history.ShadowHist(self.db)
630
630
631
631
632 def post_config_initialization(self):
632 def post_config_initialization(self):
633 """Post configuration init method
633 """Post configuration init method
634
634
635 This is called after the configuration files have been processed to
635 This is called after the configuration files have been processed to
636 'finalize' the initialization."""
636 'finalize' the initialization."""
637
637
638 rc = self.rc
638 rc = self.rc
639
639
640 # Object inspector
640 # Object inspector
641 self.inspector = OInspect.Inspector(OInspect.InspectColors,
641 self.inspector = OInspect.Inspector(OInspect.InspectColors,
642 PyColorize.ANSICodeColors,
642 PyColorize.ANSICodeColors,
643 'NoColor',
643 'NoColor',
644 rc.object_info_string_level)
644 rc.object_info_string_level)
645
645
646 self.rl_next_input = None
646 self.rl_next_input = None
647 self.rl_do_indent = False
647 self.rl_do_indent = False
648 # Load readline proper
648 # Load readline proper
649 if rc.readline:
649 if rc.readline:
650 self.init_readline()
650 self.init_readline()
651
651
652
652
653 # local shortcut, this is used a LOT
653 # local shortcut, this is used a LOT
654 self.log = self.logger.log
654 self.log = self.logger.log
655
655
656 # Initialize cache, set in/out prompts and printing system
656 # Initialize cache, set in/out prompts and printing system
657 self.outputcache = CachedOutput(self,
657 self.outputcache = CachedOutput(self,
658 rc.cache_size,
658 rc.cache_size,
659 rc.pprint,
659 rc.pprint,
660 input_sep = rc.separate_in,
660 input_sep = rc.separate_in,
661 output_sep = rc.separate_out,
661 output_sep = rc.separate_out,
662 output_sep2 = rc.separate_out2,
662 output_sep2 = rc.separate_out2,
663 ps1 = rc.prompt_in1,
663 ps1 = rc.prompt_in1,
664 ps2 = rc.prompt_in2,
664 ps2 = rc.prompt_in2,
665 ps_out = rc.prompt_out,
665 ps_out = rc.prompt_out,
666 pad_left = rc.prompts_pad_left)
666 pad_left = rc.prompts_pad_left)
667
667
668 # user may have over-ridden the default print hook:
668 # user may have over-ridden the default print hook:
669 try:
669 try:
670 self.outputcache.__class__.display = self.hooks.display
670 self.outputcache.__class__.display = self.hooks.display
671 except AttributeError:
671 except AttributeError:
672 pass
672 pass
673
673
674 # I don't like assigning globally to sys, because it means when
674 # I don't like assigning globally to sys, because it means when
675 # embedding instances, each embedded instance overrides the previous
675 # embedding instances, each embedded instance overrides the previous
676 # choice. But sys.displayhook seems to be called internally by exec,
676 # choice. But sys.displayhook seems to be called internally by exec,
677 # so I don't see a way around it. We first save the original and then
677 # so I don't see a way around it. We first save the original and then
678 # overwrite it.
678 # overwrite it.
679 self.sys_displayhook = sys.displayhook
679 self.sys_displayhook = sys.displayhook
680 sys.displayhook = self.outputcache
680 sys.displayhook = self.outputcache
681
681
682 # Monkeypatch doctest so that its core test runner method is protected
682 # Monkeypatch doctest so that its core test runner method is protected
683 # from IPython's modified displayhook. Doctest expects the default
683 # from IPython's modified displayhook. Doctest expects the default
684 # displayhook behavior deep down, so our modification breaks it
684 # displayhook behavior deep down, so our modification breaks it
685 # completely. For this reason, a hard monkeypatch seems like a
685 # completely. For this reason, a hard monkeypatch seems like a
686 # reasonable solution rather than asking users to manually use a
686 # reasonable solution rather than asking users to manually use a
687 # different doctest runner when under IPython.
687 # different doctest runner when under IPython.
688 doctest.DocTestRunner.run = dhook_wrap(doctest.DocTestRunner.run)
688 doctest.DocTestRunner.run = dhook_wrap(doctest.DocTestRunner.run)
689
689
690 # Set user colors (don't do it in the constructor above so that it
690 # Set user colors (don't do it in the constructor above so that it
691 # doesn't crash if colors option is invalid)
691 # doesn't crash if colors option is invalid)
692 self.magic_colors(rc.colors)
692 self.magic_colors(rc.colors)
693
693
694 # Set calling of pdb on exceptions
694 # Set calling of pdb on exceptions
695 self.call_pdb = rc.pdb
695 self.call_pdb = rc.pdb
696
696
697 # Load user aliases
697 # Load user aliases
698 for alias in rc.alias:
698 for alias in rc.alias:
699 self.magic_alias(alias)
699 self.magic_alias(alias)
700 self.hooks.late_startup_hook()
700 self.hooks.late_startup_hook()
701
701
702 batchrun = False
702 batchrun = False
703 for batchfile in [path(arg) for arg in self.rc.args
703 for batchfile in [path(arg) for arg in self.rc.args
704 if arg.lower().endswith('.ipy')]:
704 if arg.lower().endswith('.ipy')]:
705 if not batchfile.isfile():
705 if not batchfile.isfile():
706 print "No such batch file:", batchfile
706 print "No such batch file:", batchfile
707 continue
707 continue
708 self.api.runlines(batchfile.text())
708 self.api.runlines(batchfile.text())
709 batchrun = True
709 batchrun = True
710 if batchrun:
710 if batchrun:
711 self.exit_now = True
711 self.exit_now = True
712
712
713 def add_builtins(self):
713 def add_builtins(self):
714 """Store ipython references into the builtin namespace.
714 """Store ipython references into the builtin namespace.
715
715
716 Some parts of ipython operate via builtins injected here, which hold a
716 Some parts of ipython operate via builtins injected here, which hold a
717 reference to IPython itself."""
717 reference to IPython itself."""
718
718
719 # TODO: deprecate all except _ip; 'jobs' should be installed
719 # TODO: deprecate all except _ip; 'jobs' should be installed
720 # by an extension and the rest are under _ip, ipalias is redundant
720 # by an extension and the rest are under _ip, ipalias is redundant
721 builtins_new = dict(__IPYTHON__ = self,
721 builtins_new = dict(__IPYTHON__ = self,
722 ip_set_hook = self.set_hook,
722 ip_set_hook = self.set_hook,
723 jobs = self.jobs,
723 jobs = self.jobs,
724 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
724 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
725 ipalias = wrap_deprecated(self.ipalias),
725 ipalias = wrap_deprecated(self.ipalias),
726 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
726 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
727 _ip = self.api
727 _ip = self.api
728 )
728 )
729 for biname,bival in builtins_new.items():
729 for biname,bival in builtins_new.items():
730 try:
730 try:
731 # store the orignal value so we can restore it
731 # store the orignal value so we can restore it
732 self.builtins_added[biname] = __builtin__.__dict__[biname]
732 self.builtins_added[biname] = __builtin__.__dict__[biname]
733 except KeyError:
733 except KeyError:
734 # or mark that it wasn't defined, and we'll just delete it at
734 # or mark that it wasn't defined, and we'll just delete it at
735 # cleanup
735 # cleanup
736 self.builtins_added[biname] = Undefined
736 self.builtins_added[biname] = Undefined
737 __builtin__.__dict__[biname] = bival
737 __builtin__.__dict__[biname] = bival
738
738
739 # Keep in the builtins a flag for when IPython is active. We set it
739 # Keep in the builtins a flag for when IPython is active. We set it
740 # with setdefault so that multiple nested IPythons don't clobber one
740 # with setdefault so that multiple nested IPythons don't clobber one
741 # another. Each will increase its value by one upon being activated,
741 # another. Each will increase its value by one upon being activated,
742 # which also gives us a way to determine the nesting level.
742 # which also gives us a way to determine the nesting level.
743 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
743 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
744
744
745 def clean_builtins(self):
745 def clean_builtins(self):
746 """Remove any builtins which might have been added by add_builtins, or
746 """Remove any builtins which might have been added by add_builtins, or
747 restore overwritten ones to their previous values."""
747 restore overwritten ones to their previous values."""
748 for biname,bival in self.builtins_added.items():
748 for biname,bival in self.builtins_added.items():
749 if bival is Undefined:
749 if bival is Undefined:
750 del __builtin__.__dict__[biname]
750 del __builtin__.__dict__[biname]
751 else:
751 else:
752 __builtin__.__dict__[biname] = bival
752 __builtin__.__dict__[biname] = bival
753 self.builtins_added.clear()
753 self.builtins_added.clear()
754
754
755 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
755 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
756 """set_hook(name,hook) -> sets an internal IPython hook.
756 """set_hook(name,hook) -> sets an internal IPython hook.
757
757
758 IPython exposes some of its internal API as user-modifiable hooks. By
758 IPython exposes some of its internal API as user-modifiable hooks. By
759 adding your function to one of these hooks, you can modify IPython's
759 adding your function to one of these hooks, you can modify IPython's
760 behavior to call at runtime your own routines."""
760 behavior to call at runtime your own routines."""
761
761
762 # At some point in the future, this should validate the hook before it
762 # At some point in the future, this should validate the hook before it
763 # accepts it. Probably at least check that the hook takes the number
763 # accepts it. Probably at least check that the hook takes the number
764 # of args it's supposed to.
764 # of args it's supposed to.
765
765
766 f = new.instancemethod(hook,self,self.__class__)
766 f = new.instancemethod(hook,self,self.__class__)
767
767
768 # check if the hook is for strdispatcher first
768 # check if the hook is for strdispatcher first
769 if str_key is not None:
769 if str_key is not None:
770 sdp = self.strdispatchers.get(name, StrDispatch())
770 sdp = self.strdispatchers.get(name, StrDispatch())
771 sdp.add_s(str_key, f, priority )
771 sdp.add_s(str_key, f, priority )
772 self.strdispatchers[name] = sdp
772 self.strdispatchers[name] = sdp
773 return
773 return
774 if re_key is not None:
774 if re_key is not None:
775 sdp = self.strdispatchers.get(name, StrDispatch())
775 sdp = self.strdispatchers.get(name, StrDispatch())
776 sdp.add_re(re.compile(re_key), f, priority )
776 sdp.add_re(re.compile(re_key), f, priority )
777 self.strdispatchers[name] = sdp
777 self.strdispatchers[name] = sdp
778 return
778 return
779
779
780 dp = getattr(self.hooks, name, None)
780 dp = getattr(self.hooks, name, None)
781 if name not in IPython.hooks.__all__:
781 if name not in IPython.hooks.__all__:
782 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
782 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
783 if not dp:
783 if not dp:
784 dp = IPython.hooks.CommandChainDispatcher()
784 dp = IPython.hooks.CommandChainDispatcher()
785
785
786 try:
786 try:
787 dp.add(f,priority)
787 dp.add(f,priority)
788 except AttributeError:
788 except AttributeError:
789 # it was not commandchain, plain old func - replace
789 # it was not commandchain, plain old func - replace
790 dp = f
790 dp = f
791
791
792 setattr(self.hooks,name, dp)
792 setattr(self.hooks,name, dp)
793
793
794
794
795 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
795 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
796
796
797 def set_crash_handler(self,crashHandler):
797 def set_crash_handler(self,crashHandler):
798 """Set the IPython crash handler.
798 """Set the IPython crash handler.
799
799
800 This must be a callable with a signature suitable for use as
800 This must be a callable with a signature suitable for use as
801 sys.excepthook."""
801 sys.excepthook."""
802
802
803 # Install the given crash handler as the Python exception hook
803 # Install the given crash handler as the Python exception hook
804 sys.excepthook = crashHandler
804 sys.excepthook = crashHandler
805
805
806 # The instance will store a pointer to this, so that runtime code
806 # The instance will store a pointer to this, so that runtime code
807 # (such as magics) can access it. This is because during the
807 # (such as magics) can access it. This is because during the
808 # read-eval loop, it gets temporarily overwritten (to deal with GUI
808 # read-eval loop, it gets temporarily overwritten (to deal with GUI
809 # frameworks).
809 # frameworks).
810 self.sys_excepthook = sys.excepthook
810 self.sys_excepthook = sys.excepthook
811
811
812
812
813 def set_custom_exc(self,exc_tuple,handler):
813 def set_custom_exc(self,exc_tuple,handler):
814 """set_custom_exc(exc_tuple,handler)
814 """set_custom_exc(exc_tuple,handler)
815
815
816 Set a custom exception handler, which will be called if any of the
816 Set a custom exception handler, which will be called if any of the
817 exceptions in exc_tuple occur in the mainloop (specifically, in the
817 exceptions in exc_tuple occur in the mainloop (specifically, in the
818 runcode() method.
818 runcode() method.
819
819
820 Inputs:
820 Inputs:
821
821
822 - exc_tuple: a *tuple* of valid exceptions to call the defined
822 - exc_tuple: a *tuple* of valid exceptions to call the defined
823 handler for. It is very important that you use a tuple, and NOT A
823 handler for. It is very important that you use a tuple, and NOT A
824 LIST here, because of the way Python's except statement works. If
824 LIST here, because of the way Python's except statement works. If
825 you only want to trap a single exception, use a singleton tuple:
825 you only want to trap a single exception, use a singleton tuple:
826
826
827 exc_tuple == (MyCustomException,)
827 exc_tuple == (MyCustomException,)
828
828
829 - handler: this must be defined as a function with the following
829 - handler: this must be defined as a function with the following
830 basic interface: def my_handler(self,etype,value,tb).
830 basic interface: def my_handler(self,etype,value,tb).
831
831
832 This will be made into an instance method (via new.instancemethod)
832 This will be made into an instance method (via new.instancemethod)
833 of IPython itself, and it will be called if any of the exceptions
833 of IPython itself, and it will be called if any of the exceptions
834 listed in the exc_tuple are caught. If the handler is None, an
834 listed in the exc_tuple are caught. If the handler is None, an
835 internal basic one is used, which just prints basic info.
835 internal basic one is used, which just prints basic info.
836
836
837 WARNING: by putting in your own exception handler into IPython's main
837 WARNING: by putting in your own exception handler into IPython's main
838 execution loop, you run a very good chance of nasty crashes. This
838 execution loop, you run a very good chance of nasty crashes. This
839 facility should only be used if you really know what you are doing."""
839 facility should only be used if you really know what you are doing."""
840
840
841 assert type(exc_tuple)==type(()) , \
841 assert type(exc_tuple)==type(()) , \
842 "The custom exceptions must be given AS A TUPLE."
842 "The custom exceptions must be given AS A TUPLE."
843
843
844 def dummy_handler(self,etype,value,tb):
844 def dummy_handler(self,etype,value,tb):
845 print '*** Simple custom exception handler ***'
845 print '*** Simple custom exception handler ***'
846 print 'Exception type :',etype
846 print 'Exception type :',etype
847 print 'Exception value:',value
847 print 'Exception value:',value
848 print 'Traceback :',tb
848 print 'Traceback :',tb
849 print 'Source code :','\n'.join(self.buffer)
849 print 'Source code :','\n'.join(self.buffer)
850
850
851 if handler is None: handler = dummy_handler
851 if handler is None: handler = dummy_handler
852
852
853 self.CustomTB = new.instancemethod(handler,self,self.__class__)
853 self.CustomTB = new.instancemethod(handler,self,self.__class__)
854 self.custom_exceptions = exc_tuple
854 self.custom_exceptions = exc_tuple
855
855
856 def set_custom_completer(self,completer,pos=0):
856 def set_custom_completer(self,completer,pos=0):
857 """set_custom_completer(completer,pos=0)
857 """set_custom_completer(completer,pos=0)
858
858
859 Adds a new custom completer function.
859 Adds a new custom completer function.
860
860
861 The position argument (defaults to 0) is the index in the completers
861 The position argument (defaults to 0) is the index in the completers
862 list where you want the completer to be inserted."""
862 list where you want the completer to be inserted."""
863
863
864 newcomp = new.instancemethod(completer,self.Completer,
864 newcomp = new.instancemethod(completer,self.Completer,
865 self.Completer.__class__)
865 self.Completer.__class__)
866 self.Completer.matchers.insert(pos,newcomp)
866 self.Completer.matchers.insert(pos,newcomp)
867
867
868 def set_completer(self):
868 def set_completer(self):
869 """reset readline's completer to be our own."""
869 """reset readline's completer to be our own."""
870 self.readline.set_completer(self.Completer.complete)
870 self.readline.set_completer(self.Completer.complete)
871
871
872 def _get_call_pdb(self):
872 def _get_call_pdb(self):
873 return self._call_pdb
873 return self._call_pdb
874
874
875 def _set_call_pdb(self,val):
875 def _set_call_pdb(self,val):
876
876
877 if val not in (0,1,False,True):
877 if val not in (0,1,False,True):
878 raise ValueError,'new call_pdb value must be boolean'
878 raise ValueError,'new call_pdb value must be boolean'
879
879
880 # store value in instance
880 # store value in instance
881 self._call_pdb = val
881 self._call_pdb = val
882
882
883 # notify the actual exception handlers
883 # notify the actual exception handlers
884 self.InteractiveTB.call_pdb = val
884 self.InteractiveTB.call_pdb = val
885 if self.isthreaded:
885 if self.isthreaded:
886 try:
886 try:
887 self.sys_excepthook.call_pdb = val
887 self.sys_excepthook.call_pdb = val
888 except:
888 except:
889 warn('Failed to activate pdb for threaded exception handler')
889 warn('Failed to activate pdb for threaded exception handler')
890
890
891 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
891 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
892 'Control auto-activation of pdb at exceptions')
892 'Control auto-activation of pdb at exceptions')
893
893
894
894
895 # These special functions get installed in the builtin namespace, to
895 # These special functions get installed in the builtin namespace, to
896 # provide programmatic (pure python) access to magics, aliases and system
896 # provide programmatic (pure python) access to magics, aliases and system
897 # calls. This is important for logging, user scripting, and more.
897 # calls. This is important for logging, user scripting, and more.
898
898
899 # We are basically exposing, via normal python functions, the three
899 # We are basically exposing, via normal python functions, the three
900 # mechanisms in which ipython offers special call modes (magics for
900 # mechanisms in which ipython offers special call modes (magics for
901 # internal control, aliases for direct system access via pre-selected
901 # internal control, aliases for direct system access via pre-selected
902 # names, and !cmd for calling arbitrary system commands).
902 # names, and !cmd for calling arbitrary system commands).
903
903
904 def ipmagic(self,arg_s):
904 def ipmagic(self,arg_s):
905 """Call a magic function by name.
905 """Call a magic function by name.
906
906
907 Input: a string containing the name of the magic function to call and any
907 Input: a string containing the name of the magic function to call and any
908 additional arguments to be passed to the magic.
908 additional arguments to be passed to the magic.
909
909
910 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
910 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
911 prompt:
911 prompt:
912
912
913 In[1]: %name -opt foo bar
913 In[1]: %name -opt foo bar
914
914
915 To call a magic without arguments, simply use ipmagic('name').
915 To call a magic without arguments, simply use ipmagic('name').
916
916
917 This provides a proper Python function to call IPython's magics in any
917 This provides a proper Python function to call IPython's magics in any
918 valid Python code you can type at the interpreter, including loops and
918 valid Python code you can type at the interpreter, including loops and
919 compound statements. It is added by IPython to the Python builtin
919 compound statements. It is added by IPython to the Python builtin
920 namespace upon initialization."""
920 namespace upon initialization."""
921
921
922 args = arg_s.split(' ',1)
922 args = arg_s.split(' ',1)
923 magic_name = args[0]
923 magic_name = args[0]
924 magic_name = magic_name.lstrip(self.ESC_MAGIC)
924 magic_name = magic_name.lstrip(self.ESC_MAGIC)
925
925
926 try:
926 try:
927 magic_args = args[1]
927 magic_args = args[1]
928 except IndexError:
928 except IndexError:
929 magic_args = ''
929 magic_args = ''
930 fn = getattr(self,'magic_'+magic_name,None)
930 fn = getattr(self,'magic_'+magic_name,None)
931 if fn is None:
931 if fn is None:
932 error("Magic function `%s` not found." % magic_name)
932 error("Magic function `%s` not found." % magic_name)
933 else:
933 else:
934 magic_args = self.var_expand(magic_args,1)
934 magic_args = self.var_expand(magic_args,1)
935 return fn(magic_args)
935 return fn(magic_args)
936
936
937 def ipalias(self,arg_s):
937 def ipalias(self,arg_s):
938 """Call an alias by name.
938 """Call an alias by name.
939
939
940 Input: a string containing the name of the alias to call and any
940 Input: a string containing the name of the alias to call and any
941 additional arguments to be passed to the magic.
941 additional arguments to be passed to the magic.
942
942
943 ipalias('name -opt foo bar') is equivalent to typing at the ipython
943 ipalias('name -opt foo bar') is equivalent to typing at the ipython
944 prompt:
944 prompt:
945
945
946 In[1]: name -opt foo bar
946 In[1]: name -opt foo bar
947
947
948 To call an alias without arguments, simply use ipalias('name').
948 To call an alias without arguments, simply use ipalias('name').
949
949
950 This provides a proper Python function to call IPython's aliases in any
950 This provides a proper Python function to call IPython's aliases in any
951 valid Python code you can type at the interpreter, including loops and
951 valid Python code you can type at the interpreter, including loops and
952 compound statements. It is added by IPython to the Python builtin
952 compound statements. It is added by IPython to the Python builtin
953 namespace upon initialization."""
953 namespace upon initialization."""
954
954
955 args = arg_s.split(' ',1)
955 args = arg_s.split(' ',1)
956 alias_name = args[0]
956 alias_name = args[0]
957 try:
957 try:
958 alias_args = args[1]
958 alias_args = args[1]
959 except IndexError:
959 except IndexError:
960 alias_args = ''
960 alias_args = ''
961 if alias_name in self.alias_table:
961 if alias_name in self.alias_table:
962 self.call_alias(alias_name,alias_args)
962 self.call_alias(alias_name,alias_args)
963 else:
963 else:
964 error("Alias `%s` not found." % alias_name)
964 error("Alias `%s` not found." % alias_name)
965
965
966 def ipsystem(self,arg_s):
966 def ipsystem(self,arg_s):
967 """Make a system call, using IPython."""
967 """Make a system call, using IPython."""
968
968
969 self.system(arg_s)
969 self.system(arg_s)
970
970
971 def complete(self,text):
971 def complete(self,text):
972 """Return a sorted list of all possible completions on text.
972 """Return a sorted list of all possible completions on text.
973
973
974 Inputs:
974 Inputs:
975
975
976 - text: a string of text to be completed on.
976 - text: a string of text to be completed on.
977
977
978 This is a wrapper around the completion mechanism, similar to what
978 This is a wrapper around the completion mechanism, similar to what
979 readline does at the command line when the TAB key is hit. By
979 readline does at the command line when the TAB key is hit. By
980 exposing it as a method, it can be used by other non-readline
980 exposing it as a method, it can be used by other non-readline
981 environments (such as GUIs) for text completion.
981 environments (such as GUIs) for text completion.
982
982
983 Simple usage example:
983 Simple usage example:
984
984
985 In [1]: x = 'hello'
985 In [1]: x = 'hello'
986
986
987 In [2]: __IP.complete('x.l')
987 In [2]: __IP.complete('x.l')
988 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
988 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
989
989
990 complete = self.Completer.complete
990 complete = self.Completer.complete
991 state = 0
991 state = 0
992 # use a dict so we get unique keys, since ipyhton's multiple
992 # use a dict so we get unique keys, since ipyhton's multiple
993 # completers can return duplicates. When we make 2.4 a requirement,
993 # completers can return duplicates. When we make 2.4 a requirement,
994 # start using sets instead, which are faster.
994 # start using sets instead, which are faster.
995 comps = {}
995 comps = {}
996 while True:
996 while True:
997 newcomp = complete(text,state,line_buffer=text)
997 newcomp = complete(text,state,line_buffer=text)
998 if newcomp is None:
998 if newcomp is None:
999 break
999 break
1000 comps[newcomp] = 1
1000 comps[newcomp] = 1
1001 state += 1
1001 state += 1
1002 outcomps = comps.keys()
1002 outcomps = comps.keys()
1003 outcomps.sort()
1003 outcomps.sort()
1004 return outcomps
1004 return outcomps
1005
1005
1006 def set_completer_frame(self, frame=None):
1006 def set_completer_frame(self, frame=None):
1007 if frame:
1007 if frame:
1008 self.Completer.namespace = frame.f_locals
1008 self.Completer.namespace = frame.f_locals
1009 self.Completer.global_namespace = frame.f_globals
1009 self.Completer.global_namespace = frame.f_globals
1010 else:
1010 else:
1011 self.Completer.namespace = self.user_ns
1011 self.Completer.namespace = self.user_ns
1012 self.Completer.global_namespace = self.user_global_ns
1012 self.Completer.global_namespace = self.user_global_ns
1013
1013
1014 def init_auto_alias(self):
1014 def init_auto_alias(self):
1015 """Define some aliases automatically.
1015 """Define some aliases automatically.
1016
1016
1017 These are ALL parameter-less aliases"""
1017 These are ALL parameter-less aliases"""
1018
1018
1019 for alias,cmd in self.auto_alias:
1019 for alias,cmd in self.auto_alias:
1020 self.alias_table[alias] = (0,cmd)
1020 self.alias_table[alias] = (0,cmd)
1021
1021
1022 def alias_table_validate(self,verbose=0):
1022 def alias_table_validate(self,verbose=0):
1023 """Update information about the alias table.
1023 """Update information about the alias table.
1024
1024
1025 In particular, make sure no Python keywords/builtins are in it."""
1025 In particular, make sure no Python keywords/builtins are in it."""
1026
1026
1027 no_alias = self.no_alias
1027 no_alias = self.no_alias
1028 for k in self.alias_table.keys():
1028 for k in self.alias_table.keys():
1029 if k in no_alias:
1029 if k in no_alias:
1030 del self.alias_table[k]
1030 del self.alias_table[k]
1031 if verbose:
1031 if verbose:
1032 print ("Deleting alias <%s>, it's a Python "
1032 print ("Deleting alias <%s>, it's a Python "
1033 "keyword or builtin." % k)
1033 "keyword or builtin." % k)
1034
1034
1035 def set_autoindent(self,value=None):
1035 def set_autoindent(self,value=None):
1036 """Set the autoindent flag, checking for readline support.
1036 """Set the autoindent flag, checking for readline support.
1037
1037
1038 If called with no arguments, it acts as a toggle."""
1038 If called with no arguments, it acts as a toggle."""
1039
1039
1040 if not self.has_readline:
1040 if not self.has_readline:
1041 if os.name == 'posix':
1041 if os.name == 'posix':
1042 warn("The auto-indent feature requires the readline library")
1042 warn("The auto-indent feature requires the readline library")
1043 self.autoindent = 0
1043 self.autoindent = 0
1044 return
1044 return
1045 if value is None:
1045 if value is None:
1046 self.autoindent = not self.autoindent
1046 self.autoindent = not self.autoindent
1047 else:
1047 else:
1048 self.autoindent = value
1048 self.autoindent = value
1049
1049
1050 def rc_set_toggle(self,rc_field,value=None):
1050 def rc_set_toggle(self,rc_field,value=None):
1051 """Set or toggle a field in IPython's rc config. structure.
1051 """Set or toggle a field in IPython's rc config. structure.
1052
1052
1053 If called with no arguments, it acts as a toggle.
1053 If called with no arguments, it acts as a toggle.
1054
1054
1055 If called with a non-existent field, the resulting AttributeError
1055 If called with a non-existent field, the resulting AttributeError
1056 exception will propagate out."""
1056 exception will propagate out."""
1057
1057
1058 rc_val = getattr(self.rc,rc_field)
1058 rc_val = getattr(self.rc,rc_field)
1059 if value is None:
1059 if value is None:
1060 value = not rc_val
1060 value = not rc_val
1061 setattr(self.rc,rc_field,value)
1061 setattr(self.rc,rc_field,value)
1062
1062
1063 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1063 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1064 """Install the user configuration directory.
1064 """Install the user configuration directory.
1065
1065
1066 Can be called when running for the first time or to upgrade the user's
1066 Can be called when running for the first time or to upgrade the user's
1067 .ipython/ directory with the mode parameter. Valid modes are 'install'
1067 .ipython/ directory with the mode parameter. Valid modes are 'install'
1068 and 'upgrade'."""
1068 and 'upgrade'."""
1069
1069
1070 def wait():
1070 def wait():
1071 try:
1071 try:
1072 raw_input("Please press <RETURN> to start IPython.")
1072 raw_input("Please press <RETURN> to start IPython.")
1073 except EOFError:
1073 except EOFError:
1074 print >> Term.cout
1074 print >> Term.cout
1075 print '*'*70
1075 print '*'*70
1076
1076
1077 cwd = os.getcwd() # remember where we started
1077 cwd = os.getcwd() # remember where we started
1078 glb = glob.glob
1078 glb = glob.glob
1079 print '*'*70
1079 print '*'*70
1080 if mode == 'install':
1080 if mode == 'install':
1081 print \
1081 print \
1082 """Welcome to IPython. I will try to create a personal configuration directory
1082 """Welcome to IPython. I will try to create a personal configuration directory
1083 where you can customize many aspects of IPython's functionality in:\n"""
1083 where you can customize many aspects of IPython's functionality in:\n"""
1084 else:
1084 else:
1085 print 'I am going to upgrade your configuration in:'
1085 print 'I am going to upgrade your configuration in:'
1086
1086
1087 print ipythondir
1087 print ipythondir
1088
1088
1089 rcdirend = os.path.join('IPython','UserConfig')
1089 rcdirend = os.path.join('IPython','UserConfig')
1090 cfg = lambda d: os.path.join(d,rcdirend)
1090 cfg = lambda d: os.path.join(d,rcdirend)
1091 try:
1091 try:
1092 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1092 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1093 except IOError:
1093 except IOError:
1094 warning = """
1094 warning = """
1095 Installation error. IPython's directory was not found.
1095 Installation error. IPython's directory was not found.
1096
1096
1097 Check the following:
1097 Check the following:
1098
1098
1099 The ipython/IPython directory should be in a directory belonging to your
1099 The ipython/IPython directory should be in a directory belonging to your
1100 PYTHONPATH environment variable (that is, it should be in a directory
1100 PYTHONPATH environment variable (that is, it should be in a directory
1101 belonging to sys.path). You can copy it explicitly there or just link to it.
1101 belonging to sys.path). You can copy it explicitly there or just link to it.
1102
1102
1103 IPython will proceed with builtin defaults.
1103 IPython will proceed with builtin defaults.
1104 """
1104 """
1105 warn(warning)
1105 warn(warning)
1106 wait()
1106 wait()
1107 return
1107 return
1108
1108
1109 if mode == 'install':
1109 if mode == 'install':
1110 try:
1110 try:
1111 shutil.copytree(rcdir,ipythondir)
1111 shutil.copytree(rcdir,ipythondir)
1112 os.chdir(ipythondir)
1112 os.chdir(ipythondir)
1113 rc_files = glb("ipythonrc*")
1113 rc_files = glb("ipythonrc*")
1114 for rc_file in rc_files:
1114 for rc_file in rc_files:
1115 os.rename(rc_file,rc_file+rc_suffix)
1115 os.rename(rc_file,rc_file+rc_suffix)
1116 except:
1116 except:
1117 warning = """
1117 warning = """
1118
1118
1119 There was a problem with the installation:
1119 There was a problem with the installation:
1120 %s
1120 %s
1121 Try to correct it or contact the developers if you think it's a bug.
1121 Try to correct it or contact the developers if you think it's a bug.
1122 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1122 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1123 warn(warning)
1123 warn(warning)
1124 wait()
1124 wait()
1125 return
1125 return
1126
1126
1127 elif mode == 'upgrade':
1127 elif mode == 'upgrade':
1128 try:
1128 try:
1129 os.chdir(ipythondir)
1129 os.chdir(ipythondir)
1130 except:
1130 except:
1131 print """
1131 print """
1132 Can not upgrade: changing to directory %s failed. Details:
1132 Can not upgrade: changing to directory %s failed. Details:
1133 %s
1133 %s
1134 """ % (ipythondir,sys.exc_info()[1])
1134 """ % (ipythondir,sys.exc_info()[1])
1135 wait()
1135 wait()
1136 return
1136 return
1137 else:
1137 else:
1138 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1138 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1139 for new_full_path in sources:
1139 for new_full_path in sources:
1140 new_filename = os.path.basename(new_full_path)
1140 new_filename = os.path.basename(new_full_path)
1141 if new_filename.startswith('ipythonrc'):
1141 if new_filename.startswith('ipythonrc'):
1142 new_filename = new_filename + rc_suffix
1142 new_filename = new_filename + rc_suffix
1143 # The config directory should only contain files, skip any
1143 # The config directory should only contain files, skip any
1144 # directories which may be there (like CVS)
1144 # directories which may be there (like CVS)
1145 if os.path.isdir(new_full_path):
1145 if os.path.isdir(new_full_path):
1146 continue
1146 continue
1147 if os.path.exists(new_filename):
1147 if os.path.exists(new_filename):
1148 old_file = new_filename+'.old'
1148 old_file = new_filename+'.old'
1149 if os.path.exists(old_file):
1149 if os.path.exists(old_file):
1150 os.remove(old_file)
1150 os.remove(old_file)
1151 os.rename(new_filename,old_file)
1151 os.rename(new_filename,old_file)
1152 shutil.copy(new_full_path,new_filename)
1152 shutil.copy(new_full_path,new_filename)
1153 else:
1153 else:
1154 raise ValueError,'unrecognized mode for install:',`mode`
1154 raise ValueError,'unrecognized mode for install:',`mode`
1155
1155
1156 # Fix line-endings to those native to each platform in the config
1156 # Fix line-endings to those native to each platform in the config
1157 # directory.
1157 # directory.
1158 try:
1158 try:
1159 os.chdir(ipythondir)
1159 os.chdir(ipythondir)
1160 except:
1160 except:
1161 print """
1161 print """
1162 Problem: changing to directory %s failed.
1162 Problem: changing to directory %s failed.
1163 Details:
1163 Details:
1164 %s
1164 %s
1165
1165
1166 Some configuration files may have incorrect line endings. This should not
1166 Some configuration files may have incorrect line endings. This should not
1167 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1167 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1168 wait()
1168 wait()
1169 else:
1169 else:
1170 for fname in glb('ipythonrc*'):
1170 for fname in glb('ipythonrc*'):
1171 try:
1171 try:
1172 native_line_ends(fname,backup=0)
1172 native_line_ends(fname,backup=0)
1173 except IOError:
1173 except IOError:
1174 pass
1174 pass
1175
1175
1176 if mode == 'install':
1176 if mode == 'install':
1177 print """
1177 print """
1178 Successful installation!
1178 Successful installation!
1179
1179
1180 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1180 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1181 IPython manual (there are both HTML and PDF versions supplied with the
1181 IPython manual (there are both HTML and PDF versions supplied with the
1182 distribution) to make sure that your system environment is properly configured
1182 distribution) to make sure that your system environment is properly configured
1183 to take advantage of IPython's features.
1183 to take advantage of IPython's features.
1184
1184
1185 Important note: the configuration system has changed! The old system is
1185 Important note: the configuration system has changed! The old system is
1186 still in place, but its setting may be partly overridden by the settings in
1186 still in place, but its setting may be partly overridden by the settings in
1187 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1187 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1188 if some of the new settings bother you.
1188 if some of the new settings bother you.
1189
1189
1190 """
1190 """
1191 else:
1191 else:
1192 print """
1192 print """
1193 Successful upgrade!
1193 Successful upgrade!
1194
1194
1195 All files in your directory:
1195 All files in your directory:
1196 %(ipythondir)s
1196 %(ipythondir)s
1197 which would have been overwritten by the upgrade were backed up with a .old
1197 which would have been overwritten by the upgrade were backed up with a .old
1198 extension. If you had made particular customizations in those files you may
1198 extension. If you had made particular customizations in those files you may
1199 want to merge them back into the new files.""" % locals()
1199 want to merge them back into the new files.""" % locals()
1200 wait()
1200 wait()
1201 os.chdir(cwd)
1201 os.chdir(cwd)
1202 # end user_setup()
1202 # end user_setup()
1203
1203
1204 def atexit_operations(self):
1204 def atexit_operations(self):
1205 """This will be executed at the time of exit.
1205 """This will be executed at the time of exit.
1206
1206
1207 Saving of persistent data should be performed here. """
1207 Saving of persistent data should be performed here. """
1208
1208
1209 #print '*** IPython exit cleanup ***' # dbg
1209 #print '*** IPython exit cleanup ***' # dbg
1210 # input history
1210 # input history
1211 self.savehist()
1211 self.savehist()
1212
1212
1213 # Cleanup all tempfiles left around
1213 # Cleanup all tempfiles left around
1214 for tfile in self.tempfiles:
1214 for tfile in self.tempfiles:
1215 try:
1215 try:
1216 os.unlink(tfile)
1216 os.unlink(tfile)
1217 except OSError:
1217 except OSError:
1218 pass
1218 pass
1219
1219
1220 self.hooks.shutdown_hook()
1220 self.hooks.shutdown_hook()
1221
1221
1222 def savehist(self):
1222 def savehist(self):
1223 """Save input history to a file (via readline library)."""
1223 """Save input history to a file (via readline library)."""
1224 try:
1224 try:
1225 self.readline.write_history_file(self.histfile)
1225 self.readline.write_history_file(self.histfile)
1226 except:
1226 except:
1227 print 'Unable to save IPython command history to file: ' + \
1227 print 'Unable to save IPython command history to file: ' + \
1228 `self.histfile`
1228 `self.histfile`
1229
1229
1230 def reloadhist(self):
1230 def reloadhist(self):
1231 """Reload the input history from disk file."""
1231 """Reload the input history from disk file."""
1232
1232
1233 if self.has_readline:
1233 if self.has_readline:
1234 self.readline.clear_history()
1234 self.readline.clear_history()
1235 self.readline.read_history_file(self.shell.histfile)
1235 self.readline.read_history_file(self.shell.histfile)
1236
1236
1237 def history_saving_wrapper(self, func):
1237 def history_saving_wrapper(self, func):
1238 """ Wrap func for readline history saving
1238 """ Wrap func for readline history saving
1239
1239
1240 Convert func into callable that saves & restores
1240 Convert func into callable that saves & restores
1241 history around the call """
1241 history around the call """
1242
1242
1243 if not self.has_readline:
1243 if not self.has_readline:
1244 return func
1244 return func
1245
1245
1246 def wrapper():
1246 def wrapper():
1247 self.savehist()
1247 self.savehist()
1248 try:
1248 try:
1249 func()
1249 func()
1250 finally:
1250 finally:
1251 readline.read_history_file(self.histfile)
1251 readline.read_history_file(self.histfile)
1252 return wrapper
1252 return wrapper
1253
1253
1254
1254
1255 def pre_readline(self):
1255 def pre_readline(self):
1256 """readline hook to be used at the start of each line.
1256 """readline hook to be used at the start of each line.
1257
1257
1258 Currently it handles auto-indent only."""
1258 Currently it handles auto-indent only."""
1259
1259
1260 #debugx('self.indent_current_nsp','pre_readline:')
1260 #debugx('self.indent_current_nsp','pre_readline:')
1261
1261
1262 if self.rl_do_indent:
1262 if self.rl_do_indent:
1263 self.readline.insert_text(self.indent_current_str())
1263 self.readline.insert_text(self.indent_current_str())
1264 if self.rl_next_input is not None:
1264 if self.rl_next_input is not None:
1265 self.readline.insert_text(self.rl_next_input)
1265 self.readline.insert_text(self.rl_next_input)
1266 self.rl_next_input = None
1266 self.rl_next_input = None
1267
1267
1268 def init_readline(self):
1268 def init_readline(self):
1269 """Command history completion/saving/reloading."""
1269 """Command history completion/saving/reloading."""
1270
1270
1271 import IPython.rlineimpl as readline
1271 import IPython.rlineimpl as readline
1272 if not readline.have_readline:
1272 if not readline.have_readline:
1273 self.has_readline = 0
1273 self.has_readline = 0
1274 self.readline = None
1274 self.readline = None
1275 # no point in bugging windows users with this every time:
1275 # no point in bugging windows users with this every time:
1276 warn('Readline services not available on this platform.')
1276 warn('Readline services not available on this platform.')
1277 else:
1277 else:
1278 sys.modules['readline'] = readline
1278 sys.modules['readline'] = readline
1279 import atexit
1279 import atexit
1280 from IPython.completer import IPCompleter
1280 from IPython.completer import IPCompleter
1281 self.Completer = IPCompleter(self,
1281 self.Completer = IPCompleter(self,
1282 self.user_ns,
1282 self.user_ns,
1283 self.user_global_ns,
1283 self.user_global_ns,
1284 self.rc.readline_omit__names,
1284 self.rc.readline_omit__names,
1285 self.alias_table)
1285 self.alias_table)
1286 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1286 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1287 self.strdispatchers['complete_command'] = sdisp
1287 self.strdispatchers['complete_command'] = sdisp
1288 self.Completer.custom_completers = sdisp
1288 self.Completer.custom_completers = sdisp
1289 # Platform-specific configuration
1289 # Platform-specific configuration
1290 if os.name == 'nt':
1290 if os.name == 'nt':
1291 self.readline_startup_hook = readline.set_pre_input_hook
1291 self.readline_startup_hook = readline.set_pre_input_hook
1292 else:
1292 else:
1293 self.readline_startup_hook = readline.set_startup_hook
1293 self.readline_startup_hook = readline.set_startup_hook
1294
1294
1295 # Load user's initrc file (readline config)
1295 # Load user's initrc file (readline config)
1296 inputrc_name = os.environ.get('INPUTRC')
1296 inputrc_name = os.environ.get('INPUTRC')
1297 if inputrc_name is None:
1297 if inputrc_name is None:
1298 home_dir = get_home_dir()
1298 home_dir = get_home_dir()
1299 if home_dir is not None:
1299 if home_dir is not None:
1300 inputrc_name = os.path.join(home_dir,'.inputrc')
1300 inputrc_name = os.path.join(home_dir,'.inputrc')
1301 if os.path.isfile(inputrc_name):
1301 if os.path.isfile(inputrc_name):
1302 try:
1302 try:
1303 readline.read_init_file(inputrc_name)
1303 readline.read_init_file(inputrc_name)
1304 except:
1304 except:
1305 warn('Problems reading readline initialization file <%s>'
1305 warn('Problems reading readline initialization file <%s>'
1306 % inputrc_name)
1306 % inputrc_name)
1307
1307
1308 self.has_readline = 1
1308 self.has_readline = 1
1309 self.readline = readline
1309 self.readline = readline
1310 # save this in sys so embedded copies can restore it properly
1310 # save this in sys so embedded copies can restore it properly
1311 sys.ipcompleter = self.Completer.complete
1311 sys.ipcompleter = self.Completer.complete
1312 self.set_completer()
1312 self.set_completer()
1313
1313
1314 # Configure readline according to user's prefs
1314 # Configure readline according to user's prefs
1315 for rlcommand in self.rc.readline_parse_and_bind:
1315 for rlcommand in self.rc.readline_parse_and_bind:
1316 readline.parse_and_bind(rlcommand)
1316 readline.parse_and_bind(rlcommand)
1317
1317
1318 # remove some chars from the delimiters list
1318 # remove some chars from the delimiters list
1319 delims = readline.get_completer_delims()
1319 delims = readline.get_completer_delims()
1320 delims = delims.translate(string._idmap,
1320 delims = delims.translate(string._idmap,
1321 self.rc.readline_remove_delims)
1321 self.rc.readline_remove_delims)
1322 readline.set_completer_delims(delims)
1322 readline.set_completer_delims(delims)
1323 # otherwise we end up with a monster history after a while:
1323 # otherwise we end up with a monster history after a while:
1324 readline.set_history_length(1000)
1324 readline.set_history_length(1000)
1325 try:
1325 try:
1326 #print '*** Reading readline history' # dbg
1326 #print '*** Reading readline history' # dbg
1327 readline.read_history_file(self.histfile)
1327 readline.read_history_file(self.histfile)
1328 except IOError:
1328 except IOError:
1329 pass # It doesn't exist yet.
1329 pass # It doesn't exist yet.
1330
1330
1331 atexit.register(self.atexit_operations)
1331 atexit.register(self.atexit_operations)
1332 del atexit
1332 del atexit
1333
1333
1334 # Configure auto-indent for all platforms
1334 # Configure auto-indent for all platforms
1335 self.set_autoindent(self.rc.autoindent)
1335 self.set_autoindent(self.rc.autoindent)
1336
1336
1337 def ask_yes_no(self,prompt,default=True):
1337 def ask_yes_no(self,prompt,default=True):
1338 if self.rc.quiet:
1338 if self.rc.quiet:
1339 return True
1339 return True
1340 return ask_yes_no(prompt,default)
1340 return ask_yes_no(prompt,default)
1341
1341
1342 def _should_recompile(self,e):
1342 def _should_recompile(self,e):
1343 """Utility routine for edit_syntax_error"""
1343 """Utility routine for edit_syntax_error"""
1344
1344
1345 if e.filename in ('<ipython console>','<input>','<string>',
1345 if e.filename in ('<ipython console>','<input>','<string>',
1346 '<console>','<BackgroundJob compilation>',
1346 '<console>','<BackgroundJob compilation>',
1347 None):
1347 None):
1348
1348
1349 return False
1349 return False
1350 try:
1350 try:
1351 if (self.rc.autoedit_syntax and
1351 if (self.rc.autoedit_syntax and
1352 not self.ask_yes_no('Return to editor to correct syntax error? '
1352 not self.ask_yes_no('Return to editor to correct syntax error? '
1353 '[Y/n] ','y')):
1353 '[Y/n] ','y')):
1354 return False
1354 return False
1355 except EOFError:
1355 except EOFError:
1356 return False
1356 return False
1357
1357
1358 def int0(x):
1358 def int0(x):
1359 try:
1359 try:
1360 return int(x)
1360 return int(x)
1361 except TypeError:
1361 except TypeError:
1362 return 0
1362 return 0
1363 # always pass integer line and offset values to editor hook
1363 # always pass integer line and offset values to editor hook
1364 self.hooks.fix_error_editor(e.filename,
1364 self.hooks.fix_error_editor(e.filename,
1365 int0(e.lineno),int0(e.offset),e.msg)
1365 int0(e.lineno),int0(e.offset),e.msg)
1366 return True
1366 return True
1367
1367
1368 def edit_syntax_error(self):
1368 def edit_syntax_error(self):
1369 """The bottom half of the syntax error handler called in the main loop.
1369 """The bottom half of the syntax error handler called in the main loop.
1370
1370
1371 Loop until syntax error is fixed or user cancels.
1371 Loop until syntax error is fixed or user cancels.
1372 """
1372 """
1373
1373
1374 while self.SyntaxTB.last_syntax_error:
1374 while self.SyntaxTB.last_syntax_error:
1375 # copy and clear last_syntax_error
1375 # copy and clear last_syntax_error
1376 err = self.SyntaxTB.clear_err_state()
1376 err = self.SyntaxTB.clear_err_state()
1377 if not self._should_recompile(err):
1377 if not self._should_recompile(err):
1378 return
1378 return
1379 try:
1379 try:
1380 # may set last_syntax_error again if a SyntaxError is raised
1380 # may set last_syntax_error again if a SyntaxError is raised
1381 self.safe_execfile(err.filename,self.user_ns)
1381 self.safe_execfile(err.filename,self.user_ns)
1382 except:
1382 except:
1383 self.showtraceback()
1383 self.showtraceback()
1384 else:
1384 else:
1385 try:
1385 try:
1386 f = file(err.filename)
1386 f = file(err.filename)
1387 try:
1387 try:
1388 sys.displayhook(f.read())
1388 sys.displayhook(f.read())
1389 finally:
1389 finally:
1390 f.close()
1390 f.close()
1391 except:
1391 except:
1392 self.showtraceback()
1392 self.showtraceback()
1393
1393
1394 def showsyntaxerror(self, filename=None):
1394 def showsyntaxerror(self, filename=None):
1395 """Display the syntax error that just occurred.
1395 """Display the syntax error that just occurred.
1396
1396
1397 This doesn't display a stack trace because there isn't one.
1397 This doesn't display a stack trace because there isn't one.
1398
1398
1399 If a filename is given, it is stuffed in the exception instead
1399 If a filename is given, it is stuffed in the exception instead
1400 of what was there before (because Python's parser always uses
1400 of what was there before (because Python's parser always uses
1401 "<string>" when reading from a string).
1401 "<string>" when reading from a string).
1402 """
1402 """
1403 etype, value, last_traceback = sys.exc_info()
1403 etype, value, last_traceback = sys.exc_info()
1404
1404
1405 # See note about these variables in showtraceback() below
1405 # See note about these variables in showtraceback() below
1406 sys.last_type = etype
1406 sys.last_type = etype
1407 sys.last_value = value
1407 sys.last_value = value
1408 sys.last_traceback = last_traceback
1408 sys.last_traceback = last_traceback
1409
1409
1410 if filename and etype is SyntaxError:
1410 if filename and etype is SyntaxError:
1411 # Work hard to stuff the correct filename in the exception
1411 # Work hard to stuff the correct filename in the exception
1412 try:
1412 try:
1413 msg, (dummy_filename, lineno, offset, line) = value
1413 msg, (dummy_filename, lineno, offset, line) = value
1414 except:
1414 except:
1415 # Not the format we expect; leave it alone
1415 # Not the format we expect; leave it alone
1416 pass
1416 pass
1417 else:
1417 else:
1418 # Stuff in the right filename
1418 # Stuff in the right filename
1419 try:
1419 try:
1420 # Assume SyntaxError is a class exception
1420 # Assume SyntaxError is a class exception
1421 value = SyntaxError(msg, (filename, lineno, offset, line))
1421 value = SyntaxError(msg, (filename, lineno, offset, line))
1422 except:
1422 except:
1423 # If that failed, assume SyntaxError is a string
1423 # If that failed, assume SyntaxError is a string
1424 value = msg, (filename, lineno, offset, line)
1424 value = msg, (filename, lineno, offset, line)
1425 self.SyntaxTB(etype,value,[])
1425 self.SyntaxTB(etype,value,[])
1426
1426
1427 def debugger(self,force=False):
1427 def debugger(self,force=False):
1428 """Call the pydb/pdb debugger.
1428 """Call the pydb/pdb debugger.
1429
1429
1430 Keywords:
1430 Keywords:
1431
1431
1432 - force(False): by default, this routine checks the instance call_pdb
1432 - force(False): by default, this routine checks the instance call_pdb
1433 flag and does not actually invoke the debugger if the flag is false.
1433 flag and does not actually invoke the debugger if the flag is false.
1434 The 'force' option forces the debugger to activate even if the flag
1434 The 'force' option forces the debugger to activate even if the flag
1435 is false.
1435 is false.
1436 """
1436 """
1437
1437
1438 if not (force or self.call_pdb):
1438 if not (force or self.call_pdb):
1439 return
1439 return
1440
1440
1441 if not hasattr(sys,'last_traceback'):
1441 if not hasattr(sys,'last_traceback'):
1442 error('No traceback has been produced, nothing to debug.')
1442 error('No traceback has been produced, nothing to debug.')
1443 return
1443 return
1444
1444
1445 # use pydb if available
1445 # use pydb if available
1446 if Debugger.has_pydb:
1446 if Debugger.has_pydb:
1447 from pydb import pm
1447 from pydb import pm
1448 else:
1448 else:
1449 # fallback to our internal debugger
1449 # fallback to our internal debugger
1450 pm = lambda : self.InteractiveTB.debugger(force=True)
1450 pm = lambda : self.InteractiveTB.debugger(force=True)
1451 self.history_saving_wrapper(pm)()
1451 self.history_saving_wrapper(pm)()
1452
1452
1453 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1453 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1454 """Display the exception that just occurred.
1454 """Display the exception that just occurred.
1455
1455
1456 If nothing is known about the exception, this is the method which
1456 If nothing is known about the exception, this is the method which
1457 should be used throughout the code for presenting user tracebacks,
1457 should be used throughout the code for presenting user tracebacks,
1458 rather than directly invoking the InteractiveTB object.
1458 rather than directly invoking the InteractiveTB object.
1459
1459
1460 A specific showsyntaxerror() also exists, but this method can take
1460 A specific showsyntaxerror() also exists, but this method can take
1461 care of calling it if needed, so unless you are explicitly catching a
1461 care of calling it if needed, so unless you are explicitly catching a
1462 SyntaxError exception, don't try to analyze the stack manually and
1462 SyntaxError exception, don't try to analyze the stack manually and
1463 simply call this method."""
1463 simply call this method."""
1464
1464
1465
1465
1466 # Though this won't be called by syntax errors in the input line,
1466 # Though this won't be called by syntax errors in the input line,
1467 # there may be SyntaxError cases whith imported code.
1467 # there may be SyntaxError cases whith imported code.
1468
1468
1469
1469
1470 if exc_tuple is None:
1470 if exc_tuple is None:
1471 etype, value, tb = sys.exc_info()
1471 etype, value, tb = sys.exc_info()
1472 else:
1472 else:
1473 etype, value, tb = exc_tuple
1473 etype, value, tb = exc_tuple
1474
1474
1475 if etype is SyntaxError:
1475 if etype is SyntaxError:
1476 self.showsyntaxerror(filename)
1476 self.showsyntaxerror(filename)
1477 else:
1477 else:
1478 # WARNING: these variables are somewhat deprecated and not
1478 # WARNING: these variables are somewhat deprecated and not
1479 # necessarily safe to use in a threaded environment, but tools
1479 # necessarily safe to use in a threaded environment, but tools
1480 # like pdb depend on their existence, so let's set them. If we
1480 # like pdb depend on their existence, so let's set them. If we
1481 # find problems in the field, we'll need to revisit their use.
1481 # find problems in the field, we'll need to revisit their use.
1482 sys.last_type = etype
1482 sys.last_type = etype
1483 sys.last_value = value
1483 sys.last_value = value
1484 sys.last_traceback = tb
1484 sys.last_traceback = tb
1485
1485
1486 if etype in self.custom_exceptions:
1486 if etype in self.custom_exceptions:
1487 self.CustomTB(etype,value,tb)
1487 self.CustomTB(etype,value,tb)
1488 else:
1488 else:
1489 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1489 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1490 if self.InteractiveTB.call_pdb and self.has_readline:
1490 if self.InteractiveTB.call_pdb and self.has_readline:
1491 # pdb mucks up readline, fix it back
1491 # pdb mucks up readline, fix it back
1492 self.set_completer()
1492 self.set_completer()
1493
1493
1494
1494
1495 def mainloop(self,banner=None):
1495 def mainloop(self,banner=None):
1496 """Creates the local namespace and starts the mainloop.
1496 """Creates the local namespace and starts the mainloop.
1497
1497
1498 If an optional banner argument is given, it will override the
1498 If an optional banner argument is given, it will override the
1499 internally created default banner."""
1499 internally created default banner."""
1500
1500
1501 if self.rc.c: # Emulate Python's -c option
1501 if self.rc.c: # Emulate Python's -c option
1502 self.exec_init_cmd()
1502 self.exec_init_cmd()
1503 if banner is None:
1503 if banner is None:
1504 if not self.rc.banner:
1504 if not self.rc.banner:
1505 banner = ''
1505 banner = ''
1506 # banner is string? Use it directly!
1506 # banner is string? Use it directly!
1507 elif isinstance(self.rc.banner,basestring):
1507 elif isinstance(self.rc.banner,basestring):
1508 banner = self.rc.banner
1508 banner = self.rc.banner
1509 else:
1509 else:
1510 banner = self.BANNER+self.banner2
1510 banner = self.BANNER+self.banner2
1511
1511
1512 self.interact(banner)
1512 self.interact(banner)
1513
1513
1514 def exec_init_cmd(self):
1514 def exec_init_cmd(self):
1515 """Execute a command given at the command line.
1515 """Execute a command given at the command line.
1516
1516
1517 This emulates Python's -c option."""
1517 This emulates Python's -c option."""
1518
1518
1519 #sys.argv = ['-c']
1519 #sys.argv = ['-c']
1520 self.push(self.prefilter(self.rc.c, False))
1520 self.push(self.prefilter(self.rc.c, False))
1521 self.exit_now = True
1521 self.exit_now = True
1522
1522
1523 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1523 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1524 """Embeds IPython into a running python program.
1524 """Embeds IPython into a running python program.
1525
1525
1526 Input:
1526 Input:
1527
1527
1528 - header: An optional header message can be specified.
1528 - header: An optional header message can be specified.
1529
1529
1530 - local_ns, global_ns: working namespaces. If given as None, the
1530 - local_ns, global_ns: working namespaces. If given as None, the
1531 IPython-initialized one is updated with __main__.__dict__, so that
1531 IPython-initialized one is updated with __main__.__dict__, so that
1532 program variables become visible but user-specific configuration
1532 program variables become visible but user-specific configuration
1533 remains possible.
1533 remains possible.
1534
1534
1535 - stack_depth: specifies how many levels in the stack to go to
1535 - stack_depth: specifies how many levels in the stack to go to
1536 looking for namespaces (when local_ns and global_ns are None). This
1536 looking for namespaces (when local_ns and global_ns are None). This
1537 allows an intermediate caller to make sure that this function gets
1537 allows an intermediate caller to make sure that this function gets
1538 the namespace from the intended level in the stack. By default (0)
1538 the namespace from the intended level in the stack. By default (0)
1539 it will get its locals and globals from the immediate caller.
1539 it will get its locals and globals from the immediate caller.
1540
1540
1541 Warning: it's possible to use this in a program which is being run by
1541 Warning: it's possible to use this in a program which is being run by
1542 IPython itself (via %run), but some funny things will happen (a few
1542 IPython itself (via %run), but some funny things will happen (a few
1543 globals get overwritten). In the future this will be cleaned up, as
1543 globals get overwritten). In the future this will be cleaned up, as
1544 there is no fundamental reason why it can't work perfectly."""
1544 there is no fundamental reason why it can't work perfectly."""
1545
1545
1546 # Get locals and globals from caller
1546 # Get locals and globals from caller
1547 if local_ns is None or global_ns is None:
1547 if local_ns is None or global_ns is None:
1548 call_frame = sys._getframe(stack_depth).f_back
1548 call_frame = sys._getframe(stack_depth).f_back
1549
1549
1550 if local_ns is None:
1550 if local_ns is None:
1551 local_ns = call_frame.f_locals
1551 local_ns = call_frame.f_locals
1552 if global_ns is None:
1552 if global_ns is None:
1553 global_ns = call_frame.f_globals
1553 global_ns = call_frame.f_globals
1554
1554
1555 # Update namespaces and fire up interpreter
1555 # Update namespaces and fire up interpreter
1556
1556
1557 # The global one is easy, we can just throw it in
1557 # The global one is easy, we can just throw it in
1558 self.user_global_ns = global_ns
1558 self.user_global_ns = global_ns
1559
1559
1560 # but the user/local one is tricky: ipython needs it to store internal
1560 # but the user/local one is tricky: ipython needs it to store internal
1561 # data, but we also need the locals. We'll copy locals in the user
1561 # data, but we also need the locals. We'll copy locals in the user
1562 # one, but will track what got copied so we can delete them at exit.
1562 # one, but will track what got copied so we can delete them at exit.
1563 # This is so that a later embedded call doesn't see locals from a
1563 # This is so that a later embedded call doesn't see locals from a
1564 # previous call (which most likely existed in a separate scope).
1564 # previous call (which most likely existed in a separate scope).
1565 local_varnames = local_ns.keys()
1565 local_varnames = local_ns.keys()
1566 self.user_ns.update(local_ns)
1566 self.user_ns.update(local_ns)
1567
1567
1568 # Patch for global embedding to make sure that things don't overwrite
1568 # Patch for global embedding to make sure that things don't overwrite
1569 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1569 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1570 # FIXME. Test this a bit more carefully (the if.. is new)
1570 # FIXME. Test this a bit more carefully (the if.. is new)
1571 if local_ns is None and global_ns is None:
1571 if local_ns is None and global_ns is None:
1572 self.user_global_ns.update(__main__.__dict__)
1572 self.user_global_ns.update(__main__.__dict__)
1573
1573
1574 # make sure the tab-completer has the correct frame information, so it
1574 # make sure the tab-completer has the correct frame information, so it
1575 # actually completes using the frame's locals/globals
1575 # actually completes using the frame's locals/globals
1576 self.set_completer_frame()
1576 self.set_completer_frame()
1577
1577
1578 # before activating the interactive mode, we need to make sure that
1578 # before activating the interactive mode, we need to make sure that
1579 # all names in the builtin namespace needed by ipython point to
1579 # all names in the builtin namespace needed by ipython point to
1580 # ourselves, and not to other instances.
1580 # ourselves, and not to other instances.
1581 self.add_builtins()
1581 self.add_builtins()
1582
1582
1583 self.interact(header)
1583 self.interact(header)
1584
1584
1585 # now, purge out the user namespace from anything we might have added
1585 # now, purge out the user namespace from anything we might have added
1586 # from the caller's local namespace
1586 # from the caller's local namespace
1587 delvar = self.user_ns.pop
1587 delvar = self.user_ns.pop
1588 for var in local_varnames:
1588 for var in local_varnames:
1589 delvar(var,None)
1589 delvar(var,None)
1590 # and clean builtins we may have overridden
1590 # and clean builtins we may have overridden
1591 self.clean_builtins()
1591 self.clean_builtins()
1592
1592
1593 def interact(self, banner=None):
1593 def interact(self, banner=None):
1594 """Closely emulate the interactive Python console.
1594 """Closely emulate the interactive Python console.
1595
1595
1596 The optional banner argument specify the banner to print
1596 The optional banner argument specify the banner to print
1597 before the first interaction; by default it prints a banner
1597 before the first interaction; by default it prints a banner
1598 similar to the one printed by the real Python interpreter,
1598 similar to the one printed by the real Python interpreter,
1599 followed by the current class name in parentheses (so as not
1599 followed by the current class name in parentheses (so as not
1600 to confuse this with the real interpreter -- since it's so
1600 to confuse this with the real interpreter -- since it's so
1601 close!).
1601 close!).
1602
1602
1603 """
1603 """
1604
1604
1605 if self.exit_now:
1605 if self.exit_now:
1606 # batch run -> do not interact
1606 # batch run -> do not interact
1607 return
1607 return
1608 cprt = 'Type "copyright", "credits" or "license" for more information.'
1608 cprt = 'Type "copyright", "credits" or "license" for more information.'
1609 if banner is None:
1609 if banner is None:
1610 self.write("Python %s on %s\n%s\n(%s)\n" %
1610 self.write("Python %s on %s\n%s\n(%s)\n" %
1611 (sys.version, sys.platform, cprt,
1611 (sys.version, sys.platform, cprt,
1612 self.__class__.__name__))
1612 self.__class__.__name__))
1613 else:
1613 else:
1614 self.write(banner)
1614 self.write(banner)
1615
1615
1616 more = 0
1616 more = 0
1617
1617
1618 # Mark activity in the builtins
1618 # Mark activity in the builtins
1619 __builtin__.__dict__['__IPYTHON__active'] += 1
1619 __builtin__.__dict__['__IPYTHON__active'] += 1
1620
1620
1621 if readline.have_readline:
1621 if readline.have_readline:
1622 self.readline_startup_hook(self.pre_readline)
1622 self.readline_startup_hook(self.pre_readline)
1623 # exit_now is set by a call to %Exit or %Quit
1623 # exit_now is set by a call to %Exit or %Quit
1624
1624
1625 while not self.exit_now:
1625 while not self.exit_now:
1626 if more:
1626 if more:
1627 prompt = self.hooks.generate_prompt(True)
1627 prompt = self.hooks.generate_prompt(True)
1628 if self.autoindent:
1628 if self.autoindent:
1629 self.rl_do_indent = True
1629 self.rl_do_indent = True
1630
1630
1631 else:
1631 else:
1632 prompt = self.hooks.generate_prompt(False)
1632 prompt = self.hooks.generate_prompt(False)
1633 try:
1633 try:
1634 line = self.raw_input(prompt,more)
1634 line = self.raw_input(prompt,more)
1635 if self.exit_now:
1635 if self.exit_now:
1636 # quick exit on sys.std[in|out] close
1636 # quick exit on sys.std[in|out] close
1637 break
1637 break
1638 if self.autoindent:
1638 if self.autoindent:
1639 self.rl_do_indent = False
1639 self.rl_do_indent = False
1640
1640
1641 except KeyboardInterrupt:
1641 except KeyboardInterrupt:
1642 self.write('\nKeyboardInterrupt\n')
1642 self.write('\nKeyboardInterrupt\n')
1643 self.resetbuffer()
1643 self.resetbuffer()
1644 # keep cache in sync with the prompt counter:
1644 # keep cache in sync with the prompt counter:
1645 self.outputcache.prompt_count -= 1
1645 self.outputcache.prompt_count -= 1
1646
1646
1647 if self.autoindent:
1647 if self.autoindent:
1648 self.indent_current_nsp = 0
1648 self.indent_current_nsp = 0
1649 more = 0
1649 more = 0
1650 except EOFError:
1650 except EOFError:
1651 if self.autoindent:
1651 if self.autoindent:
1652 self.rl_do_indent = False
1652 self.rl_do_indent = False
1653 self.readline_startup_hook(None)
1653 self.readline_startup_hook(None)
1654 self.write('\n')
1654 self.write('\n')
1655 self.exit()
1655 self.exit()
1656 except bdb.BdbQuit:
1656 except bdb.BdbQuit:
1657 warn('The Python debugger has exited with a BdbQuit exception.\n'
1657 warn('The Python debugger has exited with a BdbQuit exception.\n'
1658 'Because of how pdb handles the stack, it is impossible\n'
1658 'Because of how pdb handles the stack, it is impossible\n'
1659 'for IPython to properly format this particular exception.\n'
1659 'for IPython to properly format this particular exception.\n'
1660 'IPython will resume normal operation.')
1660 'IPython will resume normal operation.')
1661 except:
1661 except:
1662 # exceptions here are VERY RARE, but they can be triggered
1662 # exceptions here are VERY RARE, but they can be triggered
1663 # asynchronously by signal handlers, for example.
1663 # asynchronously by signal handlers, for example.
1664 self.showtraceback()
1664 self.showtraceback()
1665 else:
1665 else:
1666 more = self.push(line)
1666 more = self.push(line)
1667 if (self.SyntaxTB.last_syntax_error and
1667 if (self.SyntaxTB.last_syntax_error and
1668 self.rc.autoedit_syntax):
1668 self.rc.autoedit_syntax):
1669 self.edit_syntax_error()
1669 self.edit_syntax_error()
1670
1670
1671 # We are off again...
1671 # We are off again...
1672 __builtin__.__dict__['__IPYTHON__active'] -= 1
1672 __builtin__.__dict__['__IPYTHON__active'] -= 1
1673
1673
1674 def excepthook(self, etype, value, tb):
1674 def excepthook(self, etype, value, tb):
1675 """One more defense for GUI apps that call sys.excepthook.
1675 """One more defense for GUI apps that call sys.excepthook.
1676
1676
1677 GUI frameworks like wxPython trap exceptions and call
1677 GUI frameworks like wxPython trap exceptions and call
1678 sys.excepthook themselves. I guess this is a feature that
1678 sys.excepthook themselves. I guess this is a feature that
1679 enables them to keep running after exceptions that would
1679 enables them to keep running after exceptions that would
1680 otherwise kill their mainloop. This is a bother for IPython
1680 otherwise kill their mainloop. This is a bother for IPython
1681 which excepts to catch all of the program exceptions with a try:
1681 which excepts to catch all of the program exceptions with a try:
1682 except: statement.
1682 except: statement.
1683
1683
1684 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1684 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1685 any app directly invokes sys.excepthook, it will look to the user like
1685 any app directly invokes sys.excepthook, it will look to the user like
1686 IPython crashed. In order to work around this, we can disable the
1686 IPython crashed. In order to work around this, we can disable the
1687 CrashHandler and replace it with this excepthook instead, which prints a
1687 CrashHandler and replace it with this excepthook instead, which prints a
1688 regular traceback using our InteractiveTB. In this fashion, apps which
1688 regular traceback using our InteractiveTB. In this fashion, apps which
1689 call sys.excepthook will generate a regular-looking exception from
1689 call sys.excepthook will generate a regular-looking exception from
1690 IPython, and the CrashHandler will only be triggered by real IPython
1690 IPython, and the CrashHandler will only be triggered by real IPython
1691 crashes.
1691 crashes.
1692
1692
1693 This hook should be used sparingly, only in places which are not likely
1693 This hook should be used sparingly, only in places which are not likely
1694 to be true IPython errors.
1694 to be true IPython errors.
1695 """
1695 """
1696 self.showtraceback((etype,value,tb),tb_offset=0)
1696 self.showtraceback((etype,value,tb),tb_offset=0)
1697
1697
1698 def expand_aliases(self,fn,rest):
1698 def expand_aliases(self,fn,rest):
1699 """ Expand multiple levels of aliases:
1699 """ Expand multiple levels of aliases:
1700
1700
1701 if:
1701 if:
1702
1702
1703 alias foo bar /tmp
1703 alias foo bar /tmp
1704 alias baz foo
1704 alias baz foo
1705
1705
1706 then:
1706 then:
1707
1707
1708 baz huhhahhei -> bar /tmp huhhahhei
1708 baz huhhahhei -> bar /tmp huhhahhei
1709
1709
1710 """
1710 """
1711 line = fn + " " + rest
1711 line = fn + " " + rest
1712
1712
1713 done = Set()
1713 done = Set()
1714 while 1:
1714 while 1:
1715 pre,fn,rest = prefilter.splitUserInput(line,
1715 pre,fn,rest = prefilter.splitUserInput(line,
1716 prefilter.shell_line_split)
1716 prefilter.shell_line_split)
1717 if fn in self.alias_table:
1717 if fn in self.alias_table:
1718 if fn in done:
1718 if fn in done:
1719 warn("Cyclic alias definition, repeated '%s'" % fn)
1719 warn("Cyclic alias definition, repeated '%s'" % fn)
1720 return ""
1720 return ""
1721 done.add(fn)
1721 done.add(fn)
1722
1722
1723 l2 = self.transform_alias(fn,rest)
1723 l2 = self.transform_alias(fn,rest)
1724 # dir -> dir
1724 # dir -> dir
1725 # print "alias",line, "->",l2 #dbg
1725 # print "alias",line, "->",l2 #dbg
1726 if l2 == line:
1726 if l2 == line:
1727 break
1727 break
1728 # ls -> ls -F should not recurse forever
1728 # ls -> ls -F should not recurse forever
1729 if l2.split(None,1)[0] == line.split(None,1)[0]:
1729 if l2.split(None,1)[0] == line.split(None,1)[0]:
1730 line = l2
1730 line = l2
1731 break
1731 break
1732
1732
1733 line=l2
1733 line=l2
1734
1734
1735
1735
1736 # print "al expand to",line #dbg
1736 # print "al expand to",line #dbg
1737 else:
1737 else:
1738 break
1738 break
1739
1739
1740 return line
1740 return line
1741
1741
1742 def transform_alias(self, alias,rest=''):
1742 def transform_alias(self, alias,rest=''):
1743 """ Transform alias to system command string.
1743 """ Transform alias to system command string.
1744 """
1744 """
1745 nargs,cmd = self.alias_table[alias]
1745 trg = self.alias_table[alias]
1746
1747 nargs,cmd = trg
1748 # print trg #dbg
1746 if ' ' in cmd and os.path.isfile(cmd):
1749 if ' ' in cmd and os.path.isfile(cmd):
1747 cmd = '"%s"' % cmd
1750 cmd = '"%s"' % cmd
1748
1751
1749 # Expand the %l special to be the user's input line
1752 # Expand the %l special to be the user's input line
1750 if cmd.find('%l') >= 0:
1753 if cmd.find('%l') >= 0:
1751 cmd = cmd.replace('%l',rest)
1754 cmd = cmd.replace('%l',rest)
1752 rest = ''
1755 rest = ''
1753 if nargs==0:
1756 if nargs==0:
1754 # Simple, argument-less aliases
1757 # Simple, argument-less aliases
1755 cmd = '%s %s' % (cmd,rest)
1758 cmd = '%s %s' % (cmd,rest)
1756 else:
1759 else:
1757 # Handle aliases with positional arguments
1760 # Handle aliases with positional arguments
1758 args = rest.split(None,nargs)
1761 args = rest.split(None,nargs)
1759 if len(args)< nargs:
1762 if len(args)< nargs:
1760 error('Alias <%s> requires %s arguments, %s given.' %
1763 error('Alias <%s> requires %s arguments, %s given.' %
1761 (alias,nargs,len(args)))
1764 (alias,nargs,len(args)))
1762 return None
1765 return None
1763 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1766 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1764 # Now call the macro, evaluating in the user's namespace
1767 # Now call the macro, evaluating in the user's namespace
1765 #print 'new command: <%r>' % cmd # dbg
1768 #print 'new command: <%r>' % cmd # dbg
1766 return cmd
1769 return cmd
1767
1770
1768 def call_alias(self,alias,rest=''):
1771 def call_alias(self,alias,rest=''):
1769 """Call an alias given its name and the rest of the line.
1772 """Call an alias given its name and the rest of the line.
1770
1773
1771 This is only used to provide backwards compatibility for users of
1774 This is only used to provide backwards compatibility for users of
1772 ipalias(), use of which is not recommended for anymore."""
1775 ipalias(), use of which is not recommended for anymore."""
1773
1776
1774 # Now call the macro, evaluating in the user's namespace
1777 # Now call the macro, evaluating in the user's namespace
1775 cmd = self.transform_alias(alias, rest)
1778 cmd = self.transform_alias(alias, rest)
1776 try:
1779 try:
1777 self.system(cmd)
1780 self.system(cmd)
1778 except:
1781 except:
1779 self.showtraceback()
1782 self.showtraceback()
1780
1783
1781 def indent_current_str(self):
1784 def indent_current_str(self):
1782 """return the current level of indentation as a string"""
1785 """return the current level of indentation as a string"""
1783 return self.indent_current_nsp * ' '
1786 return self.indent_current_nsp * ' '
1784
1787
1785 def autoindent_update(self,line):
1788 def autoindent_update(self,line):
1786 """Keep track of the indent level."""
1789 """Keep track of the indent level."""
1787
1790
1788 #debugx('line')
1791 #debugx('line')
1789 #debugx('self.indent_current_nsp')
1792 #debugx('self.indent_current_nsp')
1790 if self.autoindent:
1793 if self.autoindent:
1791 if line:
1794 if line:
1792 inisp = num_ini_spaces(line)
1795 inisp = num_ini_spaces(line)
1793 if inisp < self.indent_current_nsp:
1796 if inisp < self.indent_current_nsp:
1794 self.indent_current_nsp = inisp
1797 self.indent_current_nsp = inisp
1795
1798
1796 if line[-1] == ':':
1799 if line[-1] == ':':
1797 self.indent_current_nsp += 4
1800 self.indent_current_nsp += 4
1798 elif dedent_re.match(line):
1801 elif dedent_re.match(line):
1799 self.indent_current_nsp -= 4
1802 self.indent_current_nsp -= 4
1800 else:
1803 else:
1801 self.indent_current_nsp = 0
1804 self.indent_current_nsp = 0
1802 def runlines(self,lines):
1805 def runlines(self,lines):
1803 """Run a string of one or more lines of source.
1806 """Run a string of one or more lines of source.
1804
1807
1805 This method is capable of running a string containing multiple source
1808 This method is capable of running a string containing multiple source
1806 lines, as if they had been entered at the IPython prompt. Since it
1809 lines, as if they had been entered at the IPython prompt. Since it
1807 exposes IPython's processing machinery, the given strings can contain
1810 exposes IPython's processing machinery, the given strings can contain
1808 magic calls (%magic), special shell access (!cmd), etc."""
1811 magic calls (%magic), special shell access (!cmd), etc."""
1809
1812
1810 # We must start with a clean buffer, in case this is run from an
1813 # We must start with a clean buffer, in case this is run from an
1811 # interactive IPython session (via a magic, for example).
1814 # interactive IPython session (via a magic, for example).
1812 self.resetbuffer()
1815 self.resetbuffer()
1813 lines = lines.split('\n')
1816 lines = lines.split('\n')
1814 more = 0
1817 more = 0
1815
1818
1816 for line in lines:
1819 for line in lines:
1817 # skip blank lines so we don't mess up the prompt counter, but do
1820 # skip blank lines so we don't mess up the prompt counter, but do
1818 # NOT skip even a blank line if we are in a code block (more is
1821 # NOT skip even a blank line if we are in a code block (more is
1819 # true)
1822 # true)
1820
1823
1821
1824
1822 if line or more:
1825 if line or more:
1823 # push to raw history, so hist line numbers stay in sync
1826 # push to raw history, so hist line numbers stay in sync
1824 self.input_hist_raw.append("# " + line + "\n")
1827 self.input_hist_raw.append("# " + line + "\n")
1825 more = self.push(self.prefilter(line,more))
1828 more = self.push(self.prefilter(line,more))
1826 # IPython's runsource returns None if there was an error
1829 # IPython's runsource returns None if there was an error
1827 # compiling the code. This allows us to stop processing right
1830 # compiling the code. This allows us to stop processing right
1828 # away, so the user gets the error message at the right place.
1831 # away, so the user gets the error message at the right place.
1829 if more is None:
1832 if more is None:
1830 break
1833 break
1831 else:
1834 else:
1832 self.input_hist_raw.append("\n")
1835 self.input_hist_raw.append("\n")
1833 # final newline in case the input didn't have it, so that the code
1836 # final newline in case the input didn't have it, so that the code
1834 # actually does get executed
1837 # actually does get executed
1835 if more:
1838 if more:
1836 self.push('\n')
1839 self.push('\n')
1837
1840
1838 def runsource(self, source, filename='<input>', symbol='single'):
1841 def runsource(self, source, filename='<input>', symbol='single'):
1839 """Compile and run some source in the interpreter.
1842 """Compile and run some source in the interpreter.
1840
1843
1841 Arguments are as for compile_command().
1844 Arguments are as for compile_command().
1842
1845
1843 One several things can happen:
1846 One several things can happen:
1844
1847
1845 1) The input is incorrect; compile_command() raised an
1848 1) The input is incorrect; compile_command() raised an
1846 exception (SyntaxError or OverflowError). A syntax traceback
1849 exception (SyntaxError or OverflowError). A syntax traceback
1847 will be printed by calling the showsyntaxerror() method.
1850 will be printed by calling the showsyntaxerror() method.
1848
1851
1849 2) The input is incomplete, and more input is required;
1852 2) The input is incomplete, and more input is required;
1850 compile_command() returned None. Nothing happens.
1853 compile_command() returned None. Nothing happens.
1851
1854
1852 3) The input is complete; compile_command() returned a code
1855 3) The input is complete; compile_command() returned a code
1853 object. The code is executed by calling self.runcode() (which
1856 object. The code is executed by calling self.runcode() (which
1854 also handles run-time exceptions, except for SystemExit).
1857 also handles run-time exceptions, except for SystemExit).
1855
1858
1856 The return value is:
1859 The return value is:
1857
1860
1858 - True in case 2
1861 - True in case 2
1859
1862
1860 - False in the other cases, unless an exception is raised, where
1863 - False in the other cases, unless an exception is raised, where
1861 None is returned instead. This can be used by external callers to
1864 None is returned instead. This can be used by external callers to
1862 know whether to continue feeding input or not.
1865 know whether to continue feeding input or not.
1863
1866
1864 The return value can be used to decide whether to use sys.ps1 or
1867 The return value can be used to decide whether to use sys.ps1 or
1865 sys.ps2 to prompt the next line."""
1868 sys.ps2 to prompt the next line."""
1866
1869
1867 # if the source code has leading blanks, add 'if 1:\n' to it
1870 # if the source code has leading blanks, add 'if 1:\n' to it
1868 # this allows execution of indented pasted code. It is tempting
1871 # this allows execution of indented pasted code. It is tempting
1869 # to add '\n' at the end of source to run commands like ' a=1'
1872 # to add '\n' at the end of source to run commands like ' a=1'
1870 # directly, but this fails for more complicated scenarios
1873 # directly, but this fails for more complicated scenarios
1871 if source[:1] in [' ', '\t']:
1874 if source[:1] in [' ', '\t']:
1872 source = 'if 1:\n%s' % source
1875 source = 'if 1:\n%s' % source
1873
1876
1874 try:
1877 try:
1875 code = self.compile(source,filename,symbol)
1878 code = self.compile(source,filename,symbol)
1876 except (OverflowError, SyntaxError, ValueError):
1879 except (OverflowError, SyntaxError, ValueError):
1877 # Case 1
1880 # Case 1
1878 self.showsyntaxerror(filename)
1881 self.showsyntaxerror(filename)
1879 return None
1882 return None
1880
1883
1881 if code is None:
1884 if code is None:
1882 # Case 2
1885 # Case 2
1883 return True
1886 return True
1884
1887
1885 # Case 3
1888 # Case 3
1886 # We store the code object so that threaded shells and
1889 # We store the code object so that threaded shells and
1887 # custom exception handlers can access all this info if needed.
1890 # custom exception handlers can access all this info if needed.
1888 # The source corresponding to this can be obtained from the
1891 # The source corresponding to this can be obtained from the
1889 # buffer attribute as '\n'.join(self.buffer).
1892 # buffer attribute as '\n'.join(self.buffer).
1890 self.code_to_run = code
1893 self.code_to_run = code
1891 # now actually execute the code object
1894 # now actually execute the code object
1892 if self.runcode(code) == 0:
1895 if self.runcode(code) == 0:
1893 return False
1896 return False
1894 else:
1897 else:
1895 return None
1898 return None
1896
1899
1897 def runcode(self,code_obj):
1900 def runcode(self,code_obj):
1898 """Execute a code object.
1901 """Execute a code object.
1899
1902
1900 When an exception occurs, self.showtraceback() is called to display a
1903 When an exception occurs, self.showtraceback() is called to display a
1901 traceback.
1904 traceback.
1902
1905
1903 Return value: a flag indicating whether the code to be run completed
1906 Return value: a flag indicating whether the code to be run completed
1904 successfully:
1907 successfully:
1905
1908
1906 - 0: successful execution.
1909 - 0: successful execution.
1907 - 1: an error occurred.
1910 - 1: an error occurred.
1908 """
1911 """
1909
1912
1910 # Set our own excepthook in case the user code tries to call it
1913 # Set our own excepthook in case the user code tries to call it
1911 # directly, so that the IPython crash handler doesn't get triggered
1914 # directly, so that the IPython crash handler doesn't get triggered
1912 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1915 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1913
1916
1914 # we save the original sys.excepthook in the instance, in case config
1917 # we save the original sys.excepthook in the instance, in case config
1915 # code (such as magics) needs access to it.
1918 # code (such as magics) needs access to it.
1916 self.sys_excepthook = old_excepthook
1919 self.sys_excepthook = old_excepthook
1917 outflag = 1 # happens in more places, so it's easier as default
1920 outflag = 1 # happens in more places, so it's easier as default
1918 try:
1921 try:
1919 try:
1922 try:
1920 # Embedded instances require separate global/local namespaces
1923 # Embedded instances require separate global/local namespaces
1921 # so they can see both the surrounding (local) namespace and
1924 # so they can see both the surrounding (local) namespace and
1922 # the module-level globals when called inside another function.
1925 # the module-level globals when called inside another function.
1923 if self.embedded:
1926 if self.embedded:
1924 exec code_obj in self.user_global_ns, self.user_ns
1927 exec code_obj in self.user_global_ns, self.user_ns
1925 # Normal (non-embedded) instances should only have a single
1928 # Normal (non-embedded) instances should only have a single
1926 # namespace for user code execution, otherwise functions won't
1929 # namespace for user code execution, otherwise functions won't
1927 # see interactive top-level globals.
1930 # see interactive top-level globals.
1928 else:
1931 else:
1929 exec code_obj in self.user_ns
1932 exec code_obj in self.user_ns
1930 finally:
1933 finally:
1931 # Reset our crash handler in place
1934 # Reset our crash handler in place
1932 sys.excepthook = old_excepthook
1935 sys.excepthook = old_excepthook
1933 except SystemExit:
1936 except SystemExit:
1934 self.resetbuffer()
1937 self.resetbuffer()
1935 self.showtraceback()
1938 self.showtraceback()
1936 warn("Type %exit or %quit to exit IPython "
1939 warn("Type %exit or %quit to exit IPython "
1937 "(%Exit or %Quit do so unconditionally).",level=1)
1940 "(%Exit or %Quit do so unconditionally).",level=1)
1938 except self.custom_exceptions:
1941 except self.custom_exceptions:
1939 etype,value,tb = sys.exc_info()
1942 etype,value,tb = sys.exc_info()
1940 self.CustomTB(etype,value,tb)
1943 self.CustomTB(etype,value,tb)
1941 except:
1944 except:
1942 self.showtraceback()
1945 self.showtraceback()
1943 else:
1946 else:
1944 outflag = 0
1947 outflag = 0
1945 if softspace(sys.stdout, 0):
1948 if softspace(sys.stdout, 0):
1946 print
1949 print
1947 # Flush out code object which has been run (and source)
1950 # Flush out code object which has been run (and source)
1948 self.code_to_run = None
1951 self.code_to_run = None
1949 return outflag
1952 return outflag
1950
1953
1951 def push(self, line):
1954 def push(self, line):
1952 """Push a line to the interpreter.
1955 """Push a line to the interpreter.
1953
1956
1954 The line should not have a trailing newline; it may have
1957 The line should not have a trailing newline; it may have
1955 internal newlines. The line is appended to a buffer and the
1958 internal newlines. The line is appended to a buffer and the
1956 interpreter's runsource() method is called with the
1959 interpreter's runsource() method is called with the
1957 concatenated contents of the buffer as source. If this
1960 concatenated contents of the buffer as source. If this
1958 indicates that the command was executed or invalid, the buffer
1961 indicates that the command was executed or invalid, the buffer
1959 is reset; otherwise, the command is incomplete, and the buffer
1962 is reset; otherwise, the command is incomplete, and the buffer
1960 is left as it was after the line was appended. The return
1963 is left as it was after the line was appended. The return
1961 value is 1 if more input is required, 0 if the line was dealt
1964 value is 1 if more input is required, 0 if the line was dealt
1962 with in some way (this is the same as runsource()).
1965 with in some way (this is the same as runsource()).
1963 """
1966 """
1964
1967
1965 # autoindent management should be done here, and not in the
1968 # autoindent management should be done here, and not in the
1966 # interactive loop, since that one is only seen by keyboard input. We
1969 # interactive loop, since that one is only seen by keyboard input. We
1967 # need this done correctly even for code run via runlines (which uses
1970 # need this done correctly even for code run via runlines (which uses
1968 # push).
1971 # push).
1969
1972
1970 #print 'push line: <%s>' % line # dbg
1973 #print 'push line: <%s>' % line # dbg
1971 for subline in line.splitlines():
1974 for subline in line.splitlines():
1972 self.autoindent_update(subline)
1975 self.autoindent_update(subline)
1973 self.buffer.append(line)
1976 self.buffer.append(line)
1974 more = self.runsource('\n'.join(self.buffer), self.filename)
1977 more = self.runsource('\n'.join(self.buffer), self.filename)
1975 if not more:
1978 if not more:
1976 self.resetbuffer()
1979 self.resetbuffer()
1977 return more
1980 return more
1978
1981
1979 def split_user_input(self, line):
1982 def split_user_input(self, line):
1980 # This is really a hold-over to support ipapi and some extensions
1983 # This is really a hold-over to support ipapi and some extensions
1981 return prefilter.splitUserInput(line)
1984 return prefilter.splitUserInput(line)
1982
1985
1983 def resetbuffer(self):
1986 def resetbuffer(self):
1984 """Reset the input buffer."""
1987 """Reset the input buffer."""
1985 self.buffer[:] = []
1988 self.buffer[:] = []
1986
1989
1987 def raw_input(self,prompt='',continue_prompt=False):
1990 def raw_input(self,prompt='',continue_prompt=False):
1988 """Write a prompt and read a line.
1991 """Write a prompt and read a line.
1989
1992
1990 The returned line does not include the trailing newline.
1993 The returned line does not include the trailing newline.
1991 When the user enters the EOF key sequence, EOFError is raised.
1994 When the user enters the EOF key sequence, EOFError is raised.
1992
1995
1993 Optional inputs:
1996 Optional inputs:
1994
1997
1995 - prompt(''): a string to be printed to prompt the user.
1998 - prompt(''): a string to be printed to prompt the user.
1996
1999
1997 - continue_prompt(False): whether this line is the first one or a
2000 - continue_prompt(False): whether this line is the first one or a
1998 continuation in a sequence of inputs.
2001 continuation in a sequence of inputs.
1999 """
2002 """
2000
2003
2001 # Code run by the user may have modified the readline completer state.
2004 # Code run by the user may have modified the readline completer state.
2002 # We must ensure that our completer is back in place.
2005 # We must ensure that our completer is back in place.
2003 if self.has_readline:
2006 if self.has_readline:
2004 self.set_completer()
2007 self.set_completer()
2005
2008
2006 try:
2009 try:
2007 line = raw_input_original(prompt).decode(self.stdin_encoding)
2010 line = raw_input_original(prompt).decode(self.stdin_encoding)
2008 except ValueError:
2011 except ValueError:
2009 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2012 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2010 " or sys.stdout.close()!\nExiting IPython!")
2013 " or sys.stdout.close()!\nExiting IPython!")
2011 self.exit_now = True
2014 self.exit_now = True
2012 return ""
2015 return ""
2013
2016
2014 # Try to be reasonably smart about not re-indenting pasted input more
2017 # Try to be reasonably smart about not re-indenting pasted input more
2015 # than necessary. We do this by trimming out the auto-indent initial
2018 # than necessary. We do this by trimming out the auto-indent initial
2016 # spaces, if the user's actual input started itself with whitespace.
2019 # spaces, if the user's actual input started itself with whitespace.
2017 #debugx('self.buffer[-1]')
2020 #debugx('self.buffer[-1]')
2018
2021
2019 if self.autoindent:
2022 if self.autoindent:
2020 if num_ini_spaces(line) > self.indent_current_nsp:
2023 if num_ini_spaces(line) > self.indent_current_nsp:
2021 line = line[self.indent_current_nsp:]
2024 line = line[self.indent_current_nsp:]
2022 self.indent_current_nsp = 0
2025 self.indent_current_nsp = 0
2023
2026
2024 # store the unfiltered input before the user has any chance to modify
2027 # store the unfiltered input before the user has any chance to modify
2025 # it.
2028 # it.
2026 if line.strip():
2029 if line.strip():
2027 if continue_prompt:
2030 if continue_prompt:
2028 self.input_hist_raw[-1] += '%s\n' % line
2031 self.input_hist_raw[-1] += '%s\n' % line
2029 if self.has_readline: # and some config option is set?
2032 if self.has_readline: # and some config option is set?
2030 try:
2033 try:
2031 histlen = self.readline.get_current_history_length()
2034 histlen = self.readline.get_current_history_length()
2032 newhist = self.input_hist_raw[-1].rstrip()
2035 newhist = self.input_hist_raw[-1].rstrip()
2033 self.readline.remove_history_item(histlen-1)
2036 self.readline.remove_history_item(histlen-1)
2034 self.readline.replace_history_item(histlen-2,newhist)
2037 self.readline.replace_history_item(histlen-2,newhist)
2035 except AttributeError:
2038 except AttributeError:
2036 pass # re{move,place}_history_item are new in 2.4.
2039 pass # re{move,place}_history_item are new in 2.4.
2037 else:
2040 else:
2038 self.input_hist_raw.append('%s\n' % line)
2041 self.input_hist_raw.append('%s\n' % line)
2039 # only entries starting at first column go to shadow history
2042 # only entries starting at first column go to shadow history
2040 if line.lstrip() == line:
2043 if line.lstrip() == line:
2041 self.shadowhist.add(line.strip())
2044 self.shadowhist.add(line.strip())
2042 else:
2045 else:
2043 self.input_hist_raw.append('\n')
2046 self.input_hist_raw.append('\n')
2044 try:
2047 try:
2045 lineout = self.prefilter(line,continue_prompt)
2048 lineout = self.prefilter(line,continue_prompt)
2046 except:
2049 except:
2047 # blanket except, in case a user-defined prefilter crashes, so it
2050 # blanket except, in case a user-defined prefilter crashes, so it
2048 # can't take all of ipython with it.
2051 # can't take all of ipython with it.
2049 self.showtraceback()
2052 self.showtraceback()
2050 return ''
2053 return ''
2051 else:
2054 else:
2052 return lineout
2055 return lineout
2053
2056
2054 def _prefilter(self, line, continue_prompt):
2057 def _prefilter(self, line, continue_prompt):
2055 """Calls different preprocessors, depending on the form of line."""
2058 """Calls different preprocessors, depending on the form of line."""
2056
2059
2057 # All handlers *must* return a value, even if it's blank ('').
2060 # All handlers *must* return a value, even if it's blank ('').
2058
2061
2059 # Lines are NOT logged here. Handlers should process the line as
2062 # Lines are NOT logged here. Handlers should process the line as
2060 # needed, update the cache AND log it (so that the input cache array
2063 # needed, update the cache AND log it (so that the input cache array
2061 # stays synced).
2064 # stays synced).
2062
2065
2063 #.....................................................................
2066 #.....................................................................
2064 # Code begins
2067 # Code begins
2065
2068
2066 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2069 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2067
2070
2068 # save the line away in case we crash, so the post-mortem handler can
2071 # save the line away in case we crash, so the post-mortem handler can
2069 # record it
2072 # record it
2070 self._last_input_line = line
2073 self._last_input_line = line
2071
2074
2072 #print '***line: <%s>' % line # dbg
2075 #print '***line: <%s>' % line # dbg
2073
2076
2074 if not line:
2077 if not line:
2075 # Return immediately on purely empty lines, so that if the user
2078 # Return immediately on purely empty lines, so that if the user
2076 # previously typed some whitespace that started a continuation
2079 # previously typed some whitespace that started a continuation
2077 # prompt, he can break out of that loop with just an empty line.
2080 # prompt, he can break out of that loop with just an empty line.
2078 # This is how the default python prompt works.
2081 # This is how the default python prompt works.
2079
2082
2080 # Only return if the accumulated input buffer was just whitespace!
2083 # Only return if the accumulated input buffer was just whitespace!
2081 if ''.join(self.buffer).isspace():
2084 if ''.join(self.buffer).isspace():
2082 self.buffer[:] = []
2085 self.buffer[:] = []
2083 return ''
2086 return ''
2084
2087
2085 line_info = prefilter.LineInfo(line, continue_prompt)
2088 line_info = prefilter.LineInfo(line, continue_prompt)
2086
2089
2087 # the input history needs to track even empty lines
2090 # the input history needs to track even empty lines
2088 stripped = line.strip()
2091 stripped = line.strip()
2089
2092
2090 if not stripped:
2093 if not stripped:
2091 if not continue_prompt:
2094 if not continue_prompt:
2092 self.outputcache.prompt_count -= 1
2095 self.outputcache.prompt_count -= 1
2093 return self.handle_normal(line_info)
2096 return self.handle_normal(line_info)
2094
2097
2095 # print '***cont',continue_prompt # dbg
2098 # print '***cont',continue_prompt # dbg
2096 # special handlers are only allowed for single line statements
2099 # special handlers are only allowed for single line statements
2097 if continue_prompt and not self.rc.multi_line_specials:
2100 if continue_prompt and not self.rc.multi_line_specials:
2098 return self.handle_normal(line_info)
2101 return self.handle_normal(line_info)
2099
2102
2100
2103
2101 # See whether any pre-existing handler can take care of it
2104 # See whether any pre-existing handler can take care of it
2102 rewritten = self.hooks.input_prefilter(stripped)
2105 rewritten = self.hooks.input_prefilter(stripped)
2103 if rewritten != stripped: # ok, some prefilter did something
2106 if rewritten != stripped: # ok, some prefilter did something
2104 rewritten = line_info.pre + rewritten # add indentation
2107 rewritten = line_info.pre + rewritten # add indentation
2105 return self.handle_normal(prefilter.LineInfo(rewritten,
2108 return self.handle_normal(prefilter.LineInfo(rewritten,
2106 continue_prompt))
2109 continue_prompt))
2107
2110
2108 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2111 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2109
2112
2110 return prefilter.prefilter(line_info, self)
2113 return prefilter.prefilter(line_info, self)
2111
2114
2112
2115
2113 def _prefilter_dumb(self, line, continue_prompt):
2116 def _prefilter_dumb(self, line, continue_prompt):
2114 """simple prefilter function, for debugging"""
2117 """simple prefilter function, for debugging"""
2115 return self.handle_normal(line,continue_prompt)
2118 return self.handle_normal(line,continue_prompt)
2116
2119
2117
2120
2118 def multiline_prefilter(self, line, continue_prompt):
2121 def multiline_prefilter(self, line, continue_prompt):
2119 """ Run _prefilter for each line of input
2122 """ Run _prefilter for each line of input
2120
2123
2121 Covers cases where there are multiple lines in the user entry,
2124 Covers cases where there are multiple lines in the user entry,
2122 which is the case when the user goes back to a multiline history
2125 which is the case when the user goes back to a multiline history
2123 entry and presses enter.
2126 entry and presses enter.
2124
2127
2125 """
2128 """
2126 out = []
2129 out = []
2127 for l in line.rstrip('\n').split('\n'):
2130 for l in line.rstrip('\n').split('\n'):
2128 out.append(self._prefilter(l, continue_prompt))
2131 out.append(self._prefilter(l, continue_prompt))
2129 return '\n'.join(out)
2132 return '\n'.join(out)
2130
2133
2131 # Set the default prefilter() function (this can be user-overridden)
2134 # Set the default prefilter() function (this can be user-overridden)
2132 prefilter = multiline_prefilter
2135 prefilter = multiline_prefilter
2133
2136
2134 def handle_normal(self,line_info):
2137 def handle_normal(self,line_info):
2135 """Handle normal input lines. Use as a template for handlers."""
2138 """Handle normal input lines. Use as a template for handlers."""
2136
2139
2137 # With autoindent on, we need some way to exit the input loop, and I
2140 # With autoindent on, we need some way to exit the input loop, and I
2138 # don't want to force the user to have to backspace all the way to
2141 # don't want to force the user to have to backspace all the way to
2139 # clear the line. The rule will be in this case, that either two
2142 # clear the line. The rule will be in this case, that either two
2140 # lines of pure whitespace in a row, or a line of pure whitespace but
2143 # lines of pure whitespace in a row, or a line of pure whitespace but
2141 # of a size different to the indent level, will exit the input loop.
2144 # of a size different to the indent level, will exit the input loop.
2142 line = line_info.line
2145 line = line_info.line
2143 continue_prompt = line_info.continue_prompt
2146 continue_prompt = line_info.continue_prompt
2144
2147
2145 if (continue_prompt and self.autoindent and line.isspace() and
2148 if (continue_prompt and self.autoindent and line.isspace() and
2146 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2149 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2147 (self.buffer[-1]).isspace() )):
2150 (self.buffer[-1]).isspace() )):
2148 line = ''
2151 line = ''
2149
2152
2150 self.log(line,line,continue_prompt)
2153 self.log(line,line,continue_prompt)
2151 return line
2154 return line
2152
2155
2153 def handle_alias(self,line_info):
2156 def handle_alias(self,line_info):
2154 """Handle alias input lines. """
2157 """Handle alias input lines. """
2155 tgt = self.alias_table[line_info.iFun]
2158 tgt = self.alias_table[line_info.iFun]
2156 # print "=>",tgt #dbg
2159 # print "=>",tgt #dbg
2157 if callable(tgt):
2160 if callable(tgt):
2158 line_out = "_sh." + line_info.iFun + '(r"""' + line_info.line + '""")'
2161 line_out = "_sh." + line_info.iFun + '(r"""' + line_info.line + '""")'
2159 else:
2162 else:
2160 transformed = self.expand_aliases(line_info.iFun,line_info.theRest)
2163 transformed = self.expand_aliases(line_info.iFun,line_info.theRest)
2161
2164
2162 # pre is needed, because it carries the leading whitespace. Otherwise
2165 # pre is needed, because it carries the leading whitespace. Otherwise
2163 # aliases won't work in indented sections.
2166 # aliases won't work in indented sections.
2164 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2167 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2165 make_quoted_expr( transformed ))
2168 make_quoted_expr( transformed ))
2166
2169
2167 self.log(line_info.line,line_out,line_info.continue_prompt)
2170 self.log(line_info.line,line_out,line_info.continue_prompt)
2168 #print 'line out:',line_out # dbg
2171 #print 'line out:',line_out # dbg
2169 return line_out
2172 return line_out
2170
2173
2171 def handle_shell_escape(self, line_info):
2174 def handle_shell_escape(self, line_info):
2172 """Execute the line in a shell, empty return value"""
2175 """Execute the line in a shell, empty return value"""
2173 #print 'line in :', `line` # dbg
2176 #print 'line in :', `line` # dbg
2174 line = line_info.line
2177 line = line_info.line
2175 if line.lstrip().startswith('!!'):
2178 if line.lstrip().startswith('!!'):
2176 # rewrite LineInfo's line, iFun and theRest to properly hold the
2179 # rewrite LineInfo's line, iFun and theRest to properly hold the
2177 # call to %sx and the actual command to be executed, so
2180 # call to %sx and the actual command to be executed, so
2178 # handle_magic can work correctly. Note that this works even if
2181 # handle_magic can work correctly. Note that this works even if
2179 # the line is indented, so it handles multi_line_specials
2182 # the line is indented, so it handles multi_line_specials
2180 # properly.
2183 # properly.
2181 new_rest = line.lstrip()[2:]
2184 new_rest = line.lstrip()[2:]
2182 line_info.line = '%ssx %s' % (self.ESC_MAGIC,new_rest)
2185 line_info.line = '%ssx %s' % (self.ESC_MAGIC,new_rest)
2183 line_info.iFun = 'sx'
2186 line_info.iFun = 'sx'
2184 line_info.theRest = new_rest
2187 line_info.theRest = new_rest
2185 return self.handle_magic(line_info)
2188 return self.handle_magic(line_info)
2186 else:
2189 else:
2187 cmd = line.lstrip().lstrip('!')
2190 cmd = line.lstrip().lstrip('!')
2188 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2191 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2189 make_quoted_expr(cmd))
2192 make_quoted_expr(cmd))
2190 # update cache/log and return
2193 # update cache/log and return
2191 self.log(line,line_out,line_info.continue_prompt)
2194 self.log(line,line_out,line_info.continue_prompt)
2192 return line_out
2195 return line_out
2193
2196
2194 def handle_magic(self, line_info):
2197 def handle_magic(self, line_info):
2195 """Execute magic functions."""
2198 """Execute magic functions."""
2196 iFun = line_info.iFun
2199 iFun = line_info.iFun
2197 theRest = line_info.theRest
2200 theRest = line_info.theRest
2198 cmd = '%s_ip.magic(%s)' % (line_info.preWhitespace,
2201 cmd = '%s_ip.magic(%s)' % (line_info.preWhitespace,
2199 make_quoted_expr(iFun + " " + theRest))
2202 make_quoted_expr(iFun + " " + theRest))
2200 self.log(line_info.line,cmd,line_info.continue_prompt)
2203 self.log(line_info.line,cmd,line_info.continue_prompt)
2201 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2204 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2202 return cmd
2205 return cmd
2203
2206
2204 def handle_auto(self, line_info):
2207 def handle_auto(self, line_info):
2205 """Hande lines which can be auto-executed, quoting if requested."""
2208 """Hande lines which can be auto-executed, quoting if requested."""
2206
2209
2207 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2210 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2208 line = line_info.line
2211 line = line_info.line
2209 iFun = line_info.iFun
2212 iFun = line_info.iFun
2210 theRest = line_info.theRest
2213 theRest = line_info.theRest
2211 pre = line_info.pre
2214 pre = line_info.pre
2212 continue_prompt = line_info.continue_prompt
2215 continue_prompt = line_info.continue_prompt
2213 obj = line_info.ofind(self)['obj']
2216 obj = line_info.ofind(self)['obj']
2214
2217
2215 # This should only be active for single-line input!
2218 # This should only be active for single-line input!
2216 if continue_prompt:
2219 if continue_prompt:
2217 self.log(line,line,continue_prompt)
2220 self.log(line,line,continue_prompt)
2218 return line
2221 return line
2219
2222
2220 force_auto = isinstance(obj, IPython.ipapi.IPyAutocall)
2223 force_auto = isinstance(obj, IPython.ipapi.IPyAutocall)
2221 auto_rewrite = True
2224 auto_rewrite = True
2222
2225
2223 if pre == self.ESC_QUOTE:
2226 if pre == self.ESC_QUOTE:
2224 # Auto-quote splitting on whitespace
2227 # Auto-quote splitting on whitespace
2225 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2228 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2226 elif pre == self.ESC_QUOTE2:
2229 elif pre == self.ESC_QUOTE2:
2227 # Auto-quote whole string
2230 # Auto-quote whole string
2228 newcmd = '%s("%s")' % (iFun,theRest)
2231 newcmd = '%s("%s")' % (iFun,theRest)
2229 elif pre == self.ESC_PAREN:
2232 elif pre == self.ESC_PAREN:
2230 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2233 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2231 else:
2234 else:
2232 # Auto-paren.
2235 # Auto-paren.
2233 # We only apply it to argument-less calls if the autocall
2236 # We only apply it to argument-less calls if the autocall
2234 # parameter is set to 2. We only need to check that autocall is <
2237 # parameter is set to 2. We only need to check that autocall is <
2235 # 2, since this function isn't called unless it's at least 1.
2238 # 2, since this function isn't called unless it's at least 1.
2236 if not theRest and (self.rc.autocall < 2) and not force_auto:
2239 if not theRest and (self.rc.autocall < 2) and not force_auto:
2237 newcmd = '%s %s' % (iFun,theRest)
2240 newcmd = '%s %s' % (iFun,theRest)
2238 auto_rewrite = False
2241 auto_rewrite = False
2239 else:
2242 else:
2240 if not force_auto and theRest.startswith('['):
2243 if not force_auto and theRest.startswith('['):
2241 if hasattr(obj,'__getitem__'):
2244 if hasattr(obj,'__getitem__'):
2242 # Don't autocall in this case: item access for an object
2245 # Don't autocall in this case: item access for an object
2243 # which is BOTH callable and implements __getitem__.
2246 # which is BOTH callable and implements __getitem__.
2244 newcmd = '%s %s' % (iFun,theRest)
2247 newcmd = '%s %s' % (iFun,theRest)
2245 auto_rewrite = False
2248 auto_rewrite = False
2246 else:
2249 else:
2247 # if the object doesn't support [] access, go ahead and
2250 # if the object doesn't support [] access, go ahead and
2248 # autocall
2251 # autocall
2249 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2252 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2250 elif theRest.endswith(';'):
2253 elif theRest.endswith(';'):
2251 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2254 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2252 else:
2255 else:
2253 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2256 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2254
2257
2255 if auto_rewrite:
2258 if auto_rewrite:
2256 rw = self.outputcache.prompt1.auto_rewrite() + newcmd
2259 rw = self.outputcache.prompt1.auto_rewrite() + newcmd
2257
2260
2258 try:
2261 try:
2259 # plain ascii works better w/ pyreadline, on some machines, so
2262 # plain ascii works better w/ pyreadline, on some machines, so
2260 # we use it and only print uncolored rewrite if we have unicode
2263 # we use it and only print uncolored rewrite if we have unicode
2261 rw = str(rw)
2264 rw = str(rw)
2262 print >>Term.cout, rw
2265 print >>Term.cout, rw
2263 except UnicodeEncodeError:
2266 except UnicodeEncodeError:
2264 print "-------------->" + newcmd
2267 print "-------------->" + newcmd
2265
2268
2266 # log what is now valid Python, not the actual user input (without the
2269 # log what is now valid Python, not the actual user input (without the
2267 # final newline)
2270 # final newline)
2268 self.log(line,newcmd,continue_prompt)
2271 self.log(line,newcmd,continue_prompt)
2269 return newcmd
2272 return newcmd
2270
2273
2271 def handle_help(self, line_info):
2274 def handle_help(self, line_info):
2272 """Try to get some help for the object.
2275 """Try to get some help for the object.
2273
2276
2274 obj? or ?obj -> basic information.
2277 obj? or ?obj -> basic information.
2275 obj?? or ??obj -> more details.
2278 obj?? or ??obj -> more details.
2276 """
2279 """
2277
2280
2278 line = line_info.line
2281 line = line_info.line
2279 # We need to make sure that we don't process lines which would be
2282 # We need to make sure that we don't process lines which would be
2280 # otherwise valid python, such as "x=1 # what?"
2283 # otherwise valid python, such as "x=1 # what?"
2281 try:
2284 try:
2282 codeop.compile_command(line)
2285 codeop.compile_command(line)
2283 except SyntaxError:
2286 except SyntaxError:
2284 # We should only handle as help stuff which is NOT valid syntax
2287 # We should only handle as help stuff which is NOT valid syntax
2285 if line[0]==self.ESC_HELP:
2288 if line[0]==self.ESC_HELP:
2286 line = line[1:]
2289 line = line[1:]
2287 elif line[-1]==self.ESC_HELP:
2290 elif line[-1]==self.ESC_HELP:
2288 line = line[:-1]
2291 line = line[:-1]
2289 self.log(line,'#?'+line,line_info.continue_prompt)
2292 self.log(line,'#?'+line,line_info.continue_prompt)
2290 if line:
2293 if line:
2291 #print 'line:<%r>' % line # dbg
2294 #print 'line:<%r>' % line # dbg
2292 self.magic_pinfo(line)
2295 self.magic_pinfo(line)
2293 else:
2296 else:
2294 page(self.usage,screen_lines=self.rc.screen_length)
2297 page(self.usage,screen_lines=self.rc.screen_length)
2295 return '' # Empty string is needed here!
2298 return '' # Empty string is needed here!
2296 except:
2299 except:
2297 # Pass any other exceptions through to the normal handler
2300 # Pass any other exceptions through to the normal handler
2298 return self.handle_normal(line_info)
2301 return self.handle_normal(line_info)
2299 else:
2302 else:
2300 # If the code compiles ok, we should handle it normally
2303 # If the code compiles ok, we should handle it normally
2301 return self.handle_normal(line_info)
2304 return self.handle_normal(line_info)
2302
2305
2303 def getapi(self):
2306 def getapi(self):
2304 """ Get an IPApi object for this shell instance
2307 """ Get an IPApi object for this shell instance
2305
2308
2306 Getting an IPApi object is always preferable to accessing the shell
2309 Getting an IPApi object is always preferable to accessing the shell
2307 directly, but this holds true especially for extensions.
2310 directly, but this holds true especially for extensions.
2308
2311
2309 It should always be possible to implement an extension with IPApi
2312 It should always be possible to implement an extension with IPApi
2310 alone. If not, contact maintainer to request an addition.
2313 alone. If not, contact maintainer to request an addition.
2311
2314
2312 """
2315 """
2313 return self.api
2316 return self.api
2314
2317
2315 def handle_emacs(self, line_info):
2318 def handle_emacs(self, line_info):
2316 """Handle input lines marked by python-mode."""
2319 """Handle input lines marked by python-mode."""
2317
2320
2318 # Currently, nothing is done. Later more functionality can be added
2321 # Currently, nothing is done. Later more functionality can be added
2319 # here if needed.
2322 # here if needed.
2320
2323
2321 # The input cache shouldn't be updated
2324 # The input cache shouldn't be updated
2322 return line_info.line
2325 return line_info.line
2323
2326
2324
2327
2325 def mktempfile(self,data=None):
2328 def mktempfile(self,data=None):
2326 """Make a new tempfile and return its filename.
2329 """Make a new tempfile and return its filename.
2327
2330
2328 This makes a call to tempfile.mktemp, but it registers the created
2331 This makes a call to tempfile.mktemp, but it registers the created
2329 filename internally so ipython cleans it up at exit time.
2332 filename internally so ipython cleans it up at exit time.
2330
2333
2331 Optional inputs:
2334 Optional inputs:
2332
2335
2333 - data(None): if data is given, it gets written out to the temp file
2336 - data(None): if data is given, it gets written out to the temp file
2334 immediately, and the file is closed again."""
2337 immediately, and the file is closed again."""
2335
2338
2336 filename = tempfile.mktemp('.py','ipython_edit_')
2339 filename = tempfile.mktemp('.py','ipython_edit_')
2337 self.tempfiles.append(filename)
2340 self.tempfiles.append(filename)
2338
2341
2339 if data:
2342 if data:
2340 tmp_file = open(filename,'w')
2343 tmp_file = open(filename,'w')
2341 tmp_file.write(data)
2344 tmp_file.write(data)
2342 tmp_file.close()
2345 tmp_file.close()
2343 return filename
2346 return filename
2344
2347
2345 def write(self,data):
2348 def write(self,data):
2346 """Write a string to the default output"""
2349 """Write a string to the default output"""
2347 Term.cout.write(data)
2350 Term.cout.write(data)
2348
2351
2349 def write_err(self,data):
2352 def write_err(self,data):
2350 """Write a string to the default error output"""
2353 """Write a string to the default error output"""
2351 Term.cerr.write(data)
2354 Term.cerr.write(data)
2352
2355
2353 def exit(self):
2356 def exit(self):
2354 """Handle interactive exit.
2357 """Handle interactive exit.
2355
2358
2356 This method sets the exit_now attribute."""
2359 This method sets the exit_now attribute."""
2357
2360
2358 if self.rc.confirm_exit:
2361 if self.rc.confirm_exit:
2359 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2362 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2360 self.exit_now = True
2363 self.exit_now = True
2361 else:
2364 else:
2362 self.exit_now = True
2365 self.exit_now = True
2363
2366
2364 def safe_execfile(self,fname,*where,**kw):
2367 def safe_execfile(self,fname,*where,**kw):
2365 """A safe version of the builtin execfile().
2368 """A safe version of the builtin execfile().
2366
2369
2367 This version will never throw an exception, and knows how to handle
2370 This version will never throw an exception, and knows how to handle
2368 ipython logs as well."""
2371 ipython logs as well."""
2369
2372
2370 def syspath_cleanup():
2373 def syspath_cleanup():
2371 """Internal cleanup routine for sys.path."""
2374 """Internal cleanup routine for sys.path."""
2372 if add_dname:
2375 if add_dname:
2373 try:
2376 try:
2374 sys.path.remove(dname)
2377 sys.path.remove(dname)
2375 except ValueError:
2378 except ValueError:
2376 # For some reason the user has already removed it, ignore.
2379 # For some reason the user has already removed it, ignore.
2377 pass
2380 pass
2378
2381
2379 fname = os.path.expanduser(fname)
2382 fname = os.path.expanduser(fname)
2380
2383
2381 # Find things also in current directory. This is needed to mimic the
2384 # Find things also in current directory. This is needed to mimic the
2382 # behavior of running a script from the system command line, where
2385 # behavior of running a script from the system command line, where
2383 # Python inserts the script's directory into sys.path
2386 # Python inserts the script's directory into sys.path
2384 dname = os.path.dirname(os.path.abspath(fname))
2387 dname = os.path.dirname(os.path.abspath(fname))
2385 add_dname = False
2388 add_dname = False
2386 if dname not in sys.path:
2389 if dname not in sys.path:
2387 sys.path.insert(0,dname)
2390 sys.path.insert(0,dname)
2388 add_dname = True
2391 add_dname = True
2389
2392
2390 try:
2393 try:
2391 xfile = open(fname)
2394 xfile = open(fname)
2392 except:
2395 except:
2393 print >> Term.cerr, \
2396 print >> Term.cerr, \
2394 'Could not open file <%s> for safe execution.' % fname
2397 'Could not open file <%s> for safe execution.' % fname
2395 syspath_cleanup()
2398 syspath_cleanup()
2396 return None
2399 return None
2397
2400
2398 kw.setdefault('islog',0)
2401 kw.setdefault('islog',0)
2399 kw.setdefault('quiet',1)
2402 kw.setdefault('quiet',1)
2400 kw.setdefault('exit_ignore',0)
2403 kw.setdefault('exit_ignore',0)
2401 first = xfile.readline()
2404 first = xfile.readline()
2402 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2405 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2403 xfile.close()
2406 xfile.close()
2404 # line by line execution
2407 # line by line execution
2405 if first.startswith(loghead) or kw['islog']:
2408 if first.startswith(loghead) or kw['islog']:
2406 print 'Loading log file <%s> one line at a time...' % fname
2409 print 'Loading log file <%s> one line at a time...' % fname
2407 if kw['quiet']:
2410 if kw['quiet']:
2408 stdout_save = sys.stdout
2411 stdout_save = sys.stdout
2409 sys.stdout = StringIO.StringIO()
2412 sys.stdout = StringIO.StringIO()
2410 try:
2413 try:
2411 globs,locs = where[0:2]
2414 globs,locs = where[0:2]
2412 except:
2415 except:
2413 try:
2416 try:
2414 globs = locs = where[0]
2417 globs = locs = where[0]
2415 except:
2418 except:
2416 globs = locs = globals()
2419 globs = locs = globals()
2417 badblocks = []
2420 badblocks = []
2418
2421
2419 # we also need to identify indented blocks of code when replaying
2422 # we also need to identify indented blocks of code when replaying
2420 # logs and put them together before passing them to an exec
2423 # logs and put them together before passing them to an exec
2421 # statement. This takes a bit of regexp and look-ahead work in the
2424 # statement. This takes a bit of regexp and look-ahead work in the
2422 # file. It's easiest if we swallow the whole thing in memory
2425 # file. It's easiest if we swallow the whole thing in memory
2423 # first, and manually walk through the lines list moving the
2426 # first, and manually walk through the lines list moving the
2424 # counter ourselves.
2427 # counter ourselves.
2425 indent_re = re.compile('\s+\S')
2428 indent_re = re.compile('\s+\S')
2426 xfile = open(fname)
2429 xfile = open(fname)
2427 filelines = xfile.readlines()
2430 filelines = xfile.readlines()
2428 xfile.close()
2431 xfile.close()
2429 nlines = len(filelines)
2432 nlines = len(filelines)
2430 lnum = 0
2433 lnum = 0
2431 while lnum < nlines:
2434 while lnum < nlines:
2432 line = filelines[lnum]
2435 line = filelines[lnum]
2433 lnum += 1
2436 lnum += 1
2434 # don't re-insert logger status info into cache
2437 # don't re-insert logger status info into cache
2435 if line.startswith('#log#'):
2438 if line.startswith('#log#'):
2436 continue
2439 continue
2437 else:
2440 else:
2438 # build a block of code (maybe a single line) for execution
2441 # build a block of code (maybe a single line) for execution
2439 block = line
2442 block = line
2440 try:
2443 try:
2441 next = filelines[lnum] # lnum has already incremented
2444 next = filelines[lnum] # lnum has already incremented
2442 except:
2445 except:
2443 next = None
2446 next = None
2444 while next and indent_re.match(next):
2447 while next and indent_re.match(next):
2445 block += next
2448 block += next
2446 lnum += 1
2449 lnum += 1
2447 try:
2450 try:
2448 next = filelines[lnum]
2451 next = filelines[lnum]
2449 except:
2452 except:
2450 next = None
2453 next = None
2451 # now execute the block of one or more lines
2454 # now execute the block of one or more lines
2452 try:
2455 try:
2453 exec block in globs,locs
2456 exec block in globs,locs
2454 except SystemExit:
2457 except SystemExit:
2455 pass
2458 pass
2456 except:
2459 except:
2457 badblocks.append(block.rstrip())
2460 badblocks.append(block.rstrip())
2458 if kw['quiet']: # restore stdout
2461 if kw['quiet']: # restore stdout
2459 sys.stdout.close()
2462 sys.stdout.close()
2460 sys.stdout = stdout_save
2463 sys.stdout = stdout_save
2461 print 'Finished replaying log file <%s>' % fname
2464 print 'Finished replaying log file <%s>' % fname
2462 if badblocks:
2465 if badblocks:
2463 print >> sys.stderr, ('\nThe following lines/blocks in file '
2466 print >> sys.stderr, ('\nThe following lines/blocks in file '
2464 '<%s> reported errors:' % fname)
2467 '<%s> reported errors:' % fname)
2465
2468
2466 for badline in badblocks:
2469 for badline in badblocks:
2467 print >> sys.stderr, badline
2470 print >> sys.stderr, badline
2468 else: # regular file execution
2471 else: # regular file execution
2469 try:
2472 try:
2470 if sys.platform == 'win32' and sys.version_info < (2,5,1):
2473 if sys.platform == 'win32' and sys.version_info < (2,5,1):
2471 # Work around a bug in Python for Windows. The bug was
2474 # Work around a bug in Python for Windows. The bug was
2472 # fixed in in Python 2.5 r54159 and 54158, but that's still
2475 # fixed in in Python 2.5 r54159 and 54158, but that's still
2473 # SVN Python as of March/07. For details, see:
2476 # SVN Python as of March/07. For details, see:
2474 # http://projects.scipy.org/ipython/ipython/ticket/123
2477 # http://projects.scipy.org/ipython/ipython/ticket/123
2475 try:
2478 try:
2476 globs,locs = where[0:2]
2479 globs,locs = where[0:2]
2477 except:
2480 except:
2478 try:
2481 try:
2479 globs = locs = where[0]
2482 globs = locs = where[0]
2480 except:
2483 except:
2481 globs = locs = globals()
2484 globs = locs = globals()
2482 exec file(fname) in globs,locs
2485 exec file(fname) in globs,locs
2483 else:
2486 else:
2484 execfile(fname,*where)
2487 execfile(fname,*where)
2485 except SyntaxError:
2488 except SyntaxError:
2486 self.showsyntaxerror()
2489 self.showsyntaxerror()
2487 warn('Failure executing file: <%s>' % fname)
2490 warn('Failure executing file: <%s>' % fname)
2488 except SystemExit,status:
2491 except SystemExit,status:
2489 # Code that correctly sets the exit status flag to success (0)
2492 # Code that correctly sets the exit status flag to success (0)
2490 # shouldn't be bothered with a traceback. Note that a plain
2493 # shouldn't be bothered with a traceback. Note that a plain
2491 # sys.exit() does NOT set the message to 0 (it's empty) so that
2494 # sys.exit() does NOT set the message to 0 (it's empty) so that
2492 # will still get a traceback. Note that the structure of the
2495 # will still get a traceback. Note that the structure of the
2493 # SystemExit exception changed between Python 2.4 and 2.5, so
2496 # SystemExit exception changed between Python 2.4 and 2.5, so
2494 # the checks must be done in a version-dependent way.
2497 # the checks must be done in a version-dependent way.
2495 show = False
2498 show = False
2496
2499
2497 if sys.version_info[:2] > (2,5):
2500 if sys.version_info[:2] > (2,5):
2498 if status.message!=0 and not kw['exit_ignore']:
2501 if status.message!=0 and not kw['exit_ignore']:
2499 show = True
2502 show = True
2500 else:
2503 else:
2501 if status.code and not kw['exit_ignore']:
2504 if status.code and not kw['exit_ignore']:
2502 show = True
2505 show = True
2503 if show:
2506 if show:
2504 self.showtraceback()
2507 self.showtraceback()
2505 warn('Failure executing file: <%s>' % fname)
2508 warn('Failure executing file: <%s>' % fname)
2506 except:
2509 except:
2507 self.showtraceback()
2510 self.showtraceback()
2508 warn('Failure executing file: <%s>' % fname)
2511 warn('Failure executing file: <%s>' % fname)
2509
2512
2510 syspath_cleanup()
2513 syspath_cleanup()
2511
2514
2512 #************************* end of file <iplib.py> *****************************
2515 #************************* end of file <iplib.py> *****************************
General Comments 0
You need to be logged in to leave comments. Login now