##// END OF EJS Templates
Add support for set_trace-like functionality, but with IPython's enhanced...
fperez -
Show More

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

@@ -1,416 +1,497 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 Pdb debugger class.
3 Pdb debugger class.
4
4
5 Modified from the standard pdb.Pdb class to avoid including readline, so that
5 Modified from the standard pdb.Pdb class to avoid including readline, so that
6 the command line completion of other programs which include this isn't
6 the command line completion of other programs which include this isn't
7 damaged.
7 damaged.
8
8
9 In the future, this class will be expanded with improvements over the standard
9 In the future, this class will be expanded with improvements over the standard
10 pdb.
10 pdb.
11
11
12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
13 changes. Licensing should therefore be under the standard Python terms. For
13 changes. Licensing should therefore be under the standard Python terms. For
14 details on the PSF (Python Software Foundation) standard license, see:
14 details on the PSF (Python Software Foundation) standard license, see:
15
15
16 http://www.python.org/2.2.3/license.html
16 http://www.python.org/2.2.3/license.html
17
17
18 $Id: Debugger.py 1961 2006-12-05 21:02:40Z vivainio $"""
18 $Id: Debugger.py 2014 2007-01-05 10:36:58Z fperez $"""
19
19
20 #*****************************************************************************
20 #*****************************************************************************
21 #
21 #
22 # Since this file is essentially a modified copy of the pdb module which is
22 # Since this file is essentially a modified copy of the pdb module which is
23 # part of the standard Python distribution, I assume that the proper procedure
23 # part of the standard Python distribution, I assume that the proper procedure
24 # is to maintain its copyright as belonging to the Python Software Foundation
24 # is to maintain its copyright as belonging to the Python Software Foundation
25 # (in addition to my own, for all new code).
25 # (in addition to my own, for all new code).
26 #
26 #
27 # Copyright (C) 2001 Python Software Foundation, www.python.org
27 # Copyright (C) 2001 Python Software Foundation, www.python.org
28 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
28 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
29 #
29 #
30 # Distributed under the terms of the BSD License. The full license is in
30 # Distributed under the terms of the BSD License. The full license is in
31 # the file COPYING, distributed as part of this software.
31 # the file COPYING, distributed as part of this software.
32 #
32 #
33 #*****************************************************************************
33 #*****************************************************************************
34
34
35 from IPython import Release
35 from IPython import Release
36 __author__ = '%s <%s>' % Release.authors['Fernando']
36 __author__ = '%s <%s>' % Release.authors['Fernando']
37 __license__ = 'Python'
37 __license__ = 'Python'
38
38
39 import bdb
39 import bdb
40 import cmd
40 import cmd
41 import linecache
41 import linecache
42 import os
42 import os
43 import sys
43 import sys
44
44
45 from IPython import PyColorize, ColorANSI
45 from IPython import PyColorize, ColorANSI, ipapi
46 from IPython.genutils import Term
46 from IPython.genutils import Term
47 from IPython.excolors import ExceptionColors
47 from IPython.excolors import ExceptionColors
48
48
49 # See if we can use pydb.
49 # See if we can use pydb.
50 has_pydb = False
50 has_pydb = False
51 prompt = 'ipdb>'
51 prompt = 'ipdb>'
52 try:
52 try:
53 import pydb
53 import pydb
54 if hasattr(pydb.pydb, "runl"):
54 if hasattr(pydb.pydb, "runl"):
55 has_pydb = True
55 has_pydb = True
56 from pydb import Pdb as OldPdb
56 from pydb import Pdb as OldPdb
57 prompt = 'ipydb>'
57 prompt = 'ipydb>'
58 except ImportError:
58 except ImportError:
59 pass
59 pass
60
60
61 if has_pydb:
61 if has_pydb:
62 from pydb import Pdb as OldPdb
62 from pydb import Pdb as OldPdb
63 else:
63 else:
64 from pdb import Pdb as OldPdb
64 from pdb import Pdb as OldPdb
65
65
66 # Allow the set_trace code to operate outside of an ipython instance, even if
67 # it does so with some limitations. The rest of this support is implemented in
68 # the Tracer constructor.
69 def BdbQuit_excepthook(et,ev,tb):
70 if et==bdb.BdbQuit:
71 print 'Exiting Debugger.'
72 else:
73 ehook.excepthook_ori(et,ev,tb)
74
75 def BdbQuit_IPython_excepthook(self,et,ev,tb):
76 print 'Exiting Debugger.'
77
78 class Tracer(object):
79 """Class for local debugging, similar to pdb.set_trace.
80
81 Instances of this class, when called, behave like pdb.set_trace, but
82 providing IPython's enhanced capabilities.
83
84 This is implemented as a class which must be initialized in your own code
85 and not as a standalone function because we need to detect at runtime
86 whether IPython is already active or not. That detection is done in the
87 constructor, ensuring that this code plays nicely with a running IPython,
88 while functioning acceptably (though with limitations) if outside of it.
89 """
90
91 def __init__(self,colors=None):
92 """Create a local debugger instance.
93
94 :Parameters:
95
96 - `colors` (None): a string containing the name of the color scheme to
97 use, it must be one of IPython's valid color schemes. If not given, the
98 function will default to the current IPython scheme when running inside
99 IPython, and to 'NoColor' otherwise.
100
101 Usage example:
102
103 from IPython.Debugger import Tracer; debug_here = Tracer()
104
105 ... later in your code
106 debug_here() # -> will open up the debugger at that point.
107
108 Once the debugger activates, you can use all of its regular commands to
109 step through code, set breakpoints, etc. See the pdb documentation
110 from the Python standard library for usage details.
111 """
112
113 global __IPYTHON__
114 try:
115 __IPYTHON__
116 except NameError:
117 # Outside of ipython, we set our own exception hook manually
118 __IPYTHON__ = ipapi.get(True,False)
119 BdbQuit_excepthook.excepthook_ori = sys.excepthook
120 sys.excepthook = BdbQuit_excepthook
121 def_colors = 'NoColor'
122 try:
123 # Limited tab completion support
124 import rlcompleter,readline
125 readline.parse_and_bind('tab: complete')
126 except ImportError:
127 pass
128 else:
129 # In ipython, we use its custom exception handler mechanism
130 ip = ipapi.get()
131 def_colors = ip.options.colors
132 ip.set_custom_exc((bdb.BdbQuit,),BdbQuit_IPython_excepthook)
133
134 if colors is None:
135 colors = def_colors
136 self.debugger = Pdb(colors)
137
138 def __call__(self):
139 """Starts an interactive debugger at the point where called.
140
141 This is similar to the pdb.set_trace() function from the std lib, but
142 using IPython's enhanced debugger."""
143
144 self.debugger.set_trace(sys._getframe().f_back)
145
66 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
146 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
67 """Make new_fn have old_fn's doc string. This is particularly useful
147 """Make new_fn have old_fn's doc string. This is particularly useful
68 for the do_... commands that hook into the help system.
148 for the do_... commands that hook into the help system.
69 Adapted from from a comp.lang.python posting
149 Adapted from from a comp.lang.python posting
70 by Duncan Booth."""
150 by Duncan Booth."""
71 def wrapper(*args, **kw):
151 def wrapper(*args, **kw):
72 return new_fn(*args, **kw)
152 return new_fn(*args, **kw)
73 if old_fn.__doc__:
153 if old_fn.__doc__:
74 wrapper.__doc__ = old_fn.__doc__ + additional_text
154 wrapper.__doc__ = old_fn.__doc__ + additional_text
75 return wrapper
155 return wrapper
76
156
77 def _file_lines(fname):
157 def _file_lines(fname):
78 """Return the contents of a named file as a list of lines.
158 """Return the contents of a named file as a list of lines.
79
159
80 This function never raises an IOError exception: if the file can't be
160 This function never raises an IOError exception: if the file can't be
81 read, it simply returns an empty list."""
161 read, it simply returns an empty list."""
82
162
83 try:
163 try:
84 outfile = open(fname)
164 outfile = open(fname)
85 except IOError:
165 except IOError:
86 return []
166 return []
87 else:
167 else:
88 out = outfile.readlines()
168 out = outfile.readlines()
89 outfile.close()
169 outfile.close()
90 return out
170 return out
91
171
92 class Pdb(OldPdb):
172 class Pdb(OldPdb):
93 """Modified Pdb class, does not load readline."""
173 """Modified Pdb class, does not load readline."""
94
174
95 if sys.version[:3] >= '2.5' or has_pydb:
175 if sys.version[:3] >= '2.5' or has_pydb:
96 def __init__(self,color_scheme='NoColor',completekey=None,
176 def __init__(self,color_scheme='NoColor',completekey=None,
97 stdin=None, stdout=None):
177 stdin=None, stdout=None):
98
178
99 # Parent constructor:
179 # Parent constructor:
100 if has_pydb and completekey is None:
180 if has_pydb and completekey is None:
101 OldPdb.__init__(self,stdin=stdin,stdout=stdout)
181 OldPdb.__init__(self,stdin=stdin,stdout=stdout)
102 else:
182 else:
103 OldPdb.__init__(self,completekey,stdin,stdout)
183 OldPdb.__init__(self,completekey,stdin,stdout)
104 self.prompt = prompt # The default prompt is '(Pdb)'
184 self.prompt = prompt # The default prompt is '(Pdb)'
105
185
106 # IPython changes...
186 # IPython changes...
107 self.is_pydb = has_pydb
187 self.is_pydb = has_pydb
108
188
109 if self.is_pydb:
189 if self.is_pydb:
110
190
111 # iplib.py's ipalias seems to want pdb's checkline
191 # iplib.py's ipalias seems to want pdb's checkline
112 # which located in pydb.fn
192 # which located in pydb.fn
113 import pydb.fns
193 import pydb.fns
114 self.checkline = lambda filename, lineno: \
194 self.checkline = lambda filename, lineno: \
115 pydb.fns.checkline(self, filename, lineno)
195 pydb.fns.checkline(self, filename, lineno)
116
196
117 self.curframe = None
197 self.curframe = None
118 self.do_restart = self.new_do_restart
198 self.do_restart = self.new_do_restart
119
199
120 self.old_all_completions = __IPYTHON__.Completer.all_completions
200 self.old_all_completions = __IPYTHON__.Completer.all_completions
121 __IPYTHON__.Completer.all_completions=self.all_completions
201 __IPYTHON__.Completer.all_completions=self.all_completions
122
202
123 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
203 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
124 OldPdb.do_list)
204 OldPdb.do_list)
125 self.do_l = self.do_list
205 self.do_l = self.do_list
126 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
206 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
127 OldPdb.do_frame)
207 OldPdb.do_frame)
128
208
129 self.aliases = {}
209 self.aliases = {}
130
210
131 # Create color table: we copy the default one from the traceback
211 # Create color table: we copy the default one from the traceback
132 # module and add a few attributes needed for debugging
212 # module and add a few attributes needed for debugging
133 self.color_scheme_table = ExceptionColors.copy()
213 self.color_scheme_table = ExceptionColors.copy()
134
214
135 # shorthands
215 # shorthands
136 C = ColorANSI.TermColors
216 C = ColorANSI.TermColors
137 cst = self.color_scheme_table
217 cst = self.color_scheme_table
138
218
139 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
219 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
140 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
220 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
141
221
142 cst['Linux'].colors.breakpoint_enabled = C.LightRed
222 cst['Linux'].colors.breakpoint_enabled = C.LightRed
143 cst['Linux'].colors.breakpoint_disabled = C.Red
223 cst['Linux'].colors.breakpoint_disabled = C.Red
144
224
145 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
225 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
146 cst['LightBG'].colors.breakpoint_disabled = C.Red
226 cst['LightBG'].colors.breakpoint_disabled = C.Red
147
227
148 self.set_colors(color_scheme)
228 self.set_colors(color_scheme)
149
229
150 else:
230 else:
151 # Ugly hack: for Python 2.3-2.4, we can't call the parent constructor,
231 # Ugly hack: for Python 2.3-2.4, we can't call the parent constructor,
152 # because it binds readline and breaks tab-completion. This means we
232 # because it binds readline and breaks tab-completion. This means we
153 # have to COPY the constructor here.
233 # have to COPY the constructor here.
154 def __init__(self,color_scheme='NoColor'):
234 def __init__(self,color_scheme='NoColor'):
155 bdb.Bdb.__init__(self)
235 bdb.Bdb.__init__(self)
156 cmd.Cmd.__init__(self,completekey=None) # don't load readline
236 cmd.Cmd.__init__(self,completekey=None) # don't load readline
157 self.prompt = 'ipdb> ' # The default prompt is '(Pdb)'
237 self.prompt = 'ipdb> ' # The default prompt is '(Pdb)'
158 self.aliases = {}
238 self.aliases = {}
159
239
160 # These two lines are part of the py2.4 constructor, let's put them
240 # These two lines are part of the py2.4 constructor, let's put them
161 # unconditionally here as they won't cause any problems in 2.3.
241 # unconditionally here as they won't cause any problems in 2.3.
162 self.mainpyfile = ''
242 self.mainpyfile = ''
163 self._wait_for_mainpyfile = 0
243 self._wait_for_mainpyfile = 0
164
244
165 # Read $HOME/.pdbrc and ./.pdbrc
245 # Read $HOME/.pdbrc and ./.pdbrc
166 try:
246 try:
167 self.rcLines = _file_lines(os.path.join(os.environ['HOME'],
247 self.rcLines = _file_lines(os.path.join(os.environ['HOME'],
168 ".pdbrc"))
248 ".pdbrc"))
169 except KeyError:
249 except KeyError:
170 self.rcLines = []
250 self.rcLines = []
171 self.rcLines.extend(_file_lines(".pdbrc"))
251 self.rcLines.extend(_file_lines(".pdbrc"))
172
252
173 # Create color table: we copy the default one from the traceback
253 # Create color table: we copy the default one from the traceback
174 # module and add a few attributes needed for debugging
254 # module and add a few attributes needed for debugging
255 ExceptionColors.set_active_scheme(color_scheme)
175 self.color_scheme_table = ExceptionColors.copy()
256 self.color_scheme_table = ExceptionColors.copy()
176
257
177 # shorthands
258 # shorthands
178 C = ColorANSI.TermColors
259 C = ColorANSI.TermColors
179 cst = self.color_scheme_table
260 cst = self.color_scheme_table
180
261
181 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
262 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
182 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
263 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
183
264
184 cst['Linux'].colors.breakpoint_enabled = C.LightRed
265 cst['Linux'].colors.breakpoint_enabled = C.LightRed
185 cst['Linux'].colors.breakpoint_disabled = C.Red
266 cst['Linux'].colors.breakpoint_disabled = C.Red
186
267
187 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
268 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
188 cst['LightBG'].colors.breakpoint_disabled = C.Red
269 cst['LightBG'].colors.breakpoint_disabled = C.Red
189
270
190 self.set_colors(color_scheme)
271 self.set_colors(color_scheme)
191
272
192 def set_colors(self, scheme):
273 def set_colors(self, scheme):
193 """Shorthand access to the color table scheme selector method."""
274 """Shorthand access to the color table scheme selector method."""
194 self.color_scheme_table.set_active_scheme(scheme)
275 self.color_scheme_table.set_active_scheme(scheme)
195
276
196 def interaction(self, frame, traceback):
277 def interaction(self, frame, traceback):
197 __IPYTHON__.set_completer_frame(frame)
278 __IPYTHON__.set_completer_frame(frame)
198 OldPdb.interaction(self, frame, traceback)
279 OldPdb.interaction(self, frame, traceback)
199
280
200 def new_do_up(self, arg):
281 def new_do_up(self, arg):
201 OldPdb.do_up(self, arg)
282 OldPdb.do_up(self, arg)
202 __IPYTHON__.set_completer_frame(self.curframe)
283 __IPYTHON__.set_completer_frame(self.curframe)
203 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
284 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
204
285
205 def new_do_down(self, arg):
286 def new_do_down(self, arg):
206 OldPdb.do_down(self, arg)
287 OldPdb.do_down(self, arg)
207 __IPYTHON__.set_completer_frame(self.curframe)
288 __IPYTHON__.set_completer_frame(self.curframe)
208
289
209 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
290 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
210
291
211 def new_do_frame(self, arg):
292 def new_do_frame(self, arg):
212 OldPdb.do_frame(self, arg)
293 OldPdb.do_frame(self, arg)
213 __IPYTHON__.set_completer_frame(self.curframe)
294 __IPYTHON__.set_completer_frame(self.curframe)
214
295
215 def new_do_quit(self, arg):
296 def new_do_quit(self, arg):
216
297
217 if hasattr(self, 'old_all_completions'):
298 if hasattr(self, 'old_all_completions'):
218 __IPYTHON__.Completer.all_completions=self.old_all_completions
299 __IPYTHON__.Completer.all_completions=self.old_all_completions
219
300
220
301
221 return OldPdb.do_quit(self, arg)
302 return OldPdb.do_quit(self, arg)
222
303
223 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
304 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
224
305
225 def new_do_restart(self, arg):
306 def new_do_restart(self, arg):
226 """Restart command. In the context of ipython this is exactly the same
307 """Restart command. In the context of ipython this is exactly the same
227 thing as 'quit'."""
308 thing as 'quit'."""
228 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
309 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
229 return self.do_quit(arg)
310 return self.do_quit(arg)
230
311
231 def postloop(self):
312 def postloop(self):
232 __IPYTHON__.set_completer_frame(None)
313 __IPYTHON__.set_completer_frame(None)
233
314
234 def print_stack_trace(self):
315 def print_stack_trace(self):
235 try:
316 try:
236 for frame_lineno in self.stack:
317 for frame_lineno in self.stack:
237 self.print_stack_entry(frame_lineno, context = 5)
318 self.print_stack_entry(frame_lineno, context = 5)
238 except KeyboardInterrupt:
319 except KeyboardInterrupt:
239 pass
320 pass
240
321
241 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
322 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
242 context = 3):
323 context = 3):
243 frame, lineno = frame_lineno
324 frame, lineno = frame_lineno
244 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
325 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
245
326
246 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
327 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
247 import linecache, repr
328 import linecache, repr
248
329
249 ret = []
330 ret = []
250
331
251 Colors = self.color_scheme_table.active_colors
332 Colors = self.color_scheme_table.active_colors
252 ColorsNormal = Colors.Normal
333 ColorsNormal = Colors.Normal
253 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
334 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
254 tpl_call = '%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
335 tpl_call = '%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
255 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
336 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
256 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
337 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
257 ColorsNormal)
338 ColorsNormal)
258
339
259 frame, lineno = frame_lineno
340 frame, lineno = frame_lineno
260
341
261 return_value = ''
342 return_value = ''
262 if '__return__' in frame.f_locals:
343 if '__return__' in frame.f_locals:
263 rv = frame.f_locals['__return__']
344 rv = frame.f_locals['__return__']
264 #return_value += '->'
345 #return_value += '->'
265 return_value += repr.repr(rv) + '\n'
346 return_value += repr.repr(rv) + '\n'
266 ret.append(return_value)
347 ret.append(return_value)
267
348
268 #s = filename + '(' + `lineno` + ')'
349 #s = filename + '(' + `lineno` + ')'
269 filename = self.canonic(frame.f_code.co_filename)
350 filename = self.canonic(frame.f_code.co_filename)
270 link = tpl_link % filename
351 link = tpl_link % filename
271
352
272 if frame.f_code.co_name:
353 if frame.f_code.co_name:
273 func = frame.f_code.co_name
354 func = frame.f_code.co_name
274 else:
355 else:
275 func = "<lambda>"
356 func = "<lambda>"
276
357
277 call = ''
358 call = ''
278 if func != '?':
359 if func != '?':
279 if '__args__' in frame.f_locals:
360 if '__args__' in frame.f_locals:
280 args = repr.repr(frame.f_locals['__args__'])
361 args = repr.repr(frame.f_locals['__args__'])
281 else:
362 else:
282 args = '()'
363 args = '()'
283 call = tpl_call % (func, args)
364 call = tpl_call % (func, args)
284
365
285 # The level info should be generated in the same format pdb uses, to
366 # The level info should be generated in the same format pdb uses, to
286 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
367 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
287 ret.append('> %s(%s)%s\n' % (link,lineno,call))
368 ret.append('> %s(%s)%s\n' % (link,lineno,call))
288
369
289 start = lineno - 1 - context//2
370 start = lineno - 1 - context//2
290 lines = linecache.getlines(filename)
371 lines = linecache.getlines(filename)
291 start = max(start, 0)
372 start = max(start, 0)
292 start = min(start, len(lines) - context)
373 start = min(start, len(lines) - context)
293 lines = lines[start : start + context]
374 lines = lines[start : start + context]
294
375
295 for i,line in enumerate(lines):
376 for i,line in enumerate(lines):
296 show_arrow = (start + 1 + i == lineno)
377 show_arrow = (start + 1 + i == lineno)
297 ret.append(self.__format_line(tpl_line_em, filename,
378 ret.append(self.__format_line(tpl_line_em, filename,
298 start + 1 + i, line,
379 start + 1 + i, line,
299 arrow = show_arrow) )
380 arrow = show_arrow) )
300
381
301 return ''.join(ret)
382 return ''.join(ret)
302
383
303 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
384 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
304 bp_mark = ""
385 bp_mark = ""
305 bp_mark_color = ""
386 bp_mark_color = ""
306
387
307 bp = None
388 bp = None
308 if lineno in self.get_file_breaks(filename):
389 if lineno in self.get_file_breaks(filename):
309 bps = self.get_breaks(filename, lineno)
390 bps = self.get_breaks(filename, lineno)
310 bp = bps[-1]
391 bp = bps[-1]
311
392
312 if bp:
393 if bp:
313 Colors = self.color_scheme_table.active_colors
394 Colors = self.color_scheme_table.active_colors
314 bp_mark = str(bp.number)
395 bp_mark = str(bp.number)
315 bp_mark_color = Colors.breakpoint_enabled
396 bp_mark_color = Colors.breakpoint_enabled
316 if not bp.enabled:
397 if not bp.enabled:
317 bp_mark_color = Colors.breakpoint_disabled
398 bp_mark_color = Colors.breakpoint_disabled
318
399
319 numbers_width = 7
400 numbers_width = 7
320 if arrow:
401 if arrow:
321 # This is the line with the error
402 # This is the line with the error
322 pad = numbers_width - len(str(lineno)) - len(bp_mark)
403 pad = numbers_width - len(str(lineno)) - len(bp_mark)
323 if pad >= 3:
404 if pad >= 3:
324 marker = '-'*(pad-3) + '-> '
405 marker = '-'*(pad-3) + '-> '
325 elif pad == 2:
406 elif pad == 2:
326 marker = '> '
407 marker = '> '
327 elif pad == 1:
408 elif pad == 1:
328 marker = '>'
409 marker = '>'
329 else:
410 else:
330 marker = ''
411 marker = ''
331 num = '%s%s' % (marker, str(lineno))
412 num = '%s%s' % (marker, str(lineno))
332 line = tpl_line % (bp_mark_color + bp_mark, num, line)
413 line = tpl_line % (bp_mark_color + bp_mark, num, line)
333 else:
414 else:
334 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
415 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
335 line = tpl_line % (bp_mark_color + bp_mark, num, line)
416 line = tpl_line % (bp_mark_color + bp_mark, num, line)
336
417
337 return line
418 return line
338
419
339 def list_command_pydb(self, arg):
420 def list_command_pydb(self, arg):
340 """List command to use if we have a newer pydb installed"""
421 """List command to use if we have a newer pydb installed"""
341 filename, first, last = OldPdb.parse_list_cmd(self, arg)
422 filename, first, last = OldPdb.parse_list_cmd(self, arg)
342 if filename is not None:
423 if filename is not None:
343 self.print_list_lines(filename, first, last)
424 self.print_list_lines(filename, first, last)
344
425
345 def print_list_lines(self, filename, first, last):
426 def print_list_lines(self, filename, first, last):
346 """The printing (as opposed to the parsing part of a 'list'
427 """The printing (as opposed to the parsing part of a 'list'
347 command."""
428 command."""
348 try:
429 try:
349 Colors = self.color_scheme_table.active_colors
430 Colors = self.color_scheme_table.active_colors
350 ColorsNormal = Colors.Normal
431 ColorsNormal = Colors.Normal
351 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
432 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
352 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
433 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
353 src = []
434 src = []
354 for lineno in range(first, last+1):
435 for lineno in range(first, last+1):
355 line = linecache.getline(filename, lineno)
436 line = linecache.getline(filename, lineno)
356 if not line:
437 if not line:
357 break
438 break
358
439
359 if lineno == self.curframe.f_lineno:
440 if lineno == self.curframe.f_lineno:
360 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
441 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
361 else:
442 else:
362 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
443 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
363
444
364 src.append(line)
445 src.append(line)
365 self.lineno = lineno
446 self.lineno = lineno
366
447
367 print >>Term.cout, ''.join(src)
448 print >>Term.cout, ''.join(src)
368
449
369 except KeyboardInterrupt:
450 except KeyboardInterrupt:
370 pass
451 pass
371
452
372 def do_list(self, arg):
453 def do_list(self, arg):
373 self.lastcmd = 'list'
454 self.lastcmd = 'list'
374 last = None
455 last = None
375 if arg:
456 if arg:
376 try:
457 try:
377 x = eval(arg, {}, {})
458 x = eval(arg, {}, {})
378 if type(x) == type(()):
459 if type(x) == type(()):
379 first, last = x
460 first, last = x
380 first = int(first)
461 first = int(first)
381 last = int(last)
462 last = int(last)
382 if last < first:
463 if last < first:
383 # Assume it's a count
464 # Assume it's a count
384 last = first + last
465 last = first + last
385 else:
466 else:
386 first = max(1, int(x) - 5)
467 first = max(1, int(x) - 5)
387 except:
468 except:
388 print '*** Error in argument:', `arg`
469 print '*** Error in argument:', `arg`
389 return
470 return
390 elif self.lineno is None:
471 elif self.lineno is None:
391 first = max(1, self.curframe.f_lineno - 5)
472 first = max(1, self.curframe.f_lineno - 5)
392 else:
473 else:
393 first = self.lineno + 1
474 first = self.lineno + 1
394 if last is None:
475 if last is None:
395 last = first + 10
476 last = first + 10
396 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
477 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
397
478
398 do_l = do_list
479 do_l = do_list
399
480
400 def do_pdef(self, arg):
481 def do_pdef(self, arg):
401 """The debugger interface to magic_pdef"""
482 """The debugger interface to magic_pdef"""
402 namespaces = [('Locals', self.curframe.f_locals),
483 namespaces = [('Locals', self.curframe.f_locals),
403 ('Globals', self.curframe.f_globals)]
484 ('Globals', self.curframe.f_globals)]
404 __IPYTHON__.magic_pdef(arg, namespaces=namespaces)
485 __IPYTHON__.magic_pdef(arg, namespaces=namespaces)
405
486
406 def do_pdoc(self, arg):
487 def do_pdoc(self, arg):
407 """The debugger interface to magic_pdoc"""
488 """The debugger interface to magic_pdoc"""
408 namespaces = [('Locals', self.curframe.f_locals),
489 namespaces = [('Locals', self.curframe.f_locals),
409 ('Globals', self.curframe.f_globals)]
490 ('Globals', self.curframe.f_globals)]
410 __IPYTHON__.magic_pdoc(arg, namespaces=namespaces)
491 __IPYTHON__.magic_pdoc(arg, namespaces=namespaces)
411
492
412 def do_pinfo(self, arg):
493 def do_pinfo(self, arg):
413 """The debugger equivalant of ?obj"""
494 """The debugger equivalant of ?obj"""
414 namespaces = [('Locals', self.curframe.f_locals),
495 namespaces = [('Locals', self.curframe.f_locals),
415 ('Globals', self.curframe.f_globals)]
496 ('Globals', self.curframe.f_globals)]
416 __IPYTHON__.magic_pinfo("pinfo %s" % arg, namespaces=namespaces)
497 __IPYTHON__.magic_pinfo("pinfo %s" % arg, namespaces=namespaces)
@@ -1,351 +1,364 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 # contains the most recently instantiated IPApi
83 # contains the most recently instantiated IPApi
84
84
85 class IPythonNotRunning:
85 class IPythonNotRunning:
86 """Dummy do-nothing class.
86 """Dummy do-nothing class.
87
87
88 Instances of this class return a dummy attribute on all accesses, which
88 Instances of this class return a dummy attribute on all accesses, which
89 can be called and warns. This makes it easier to write scripts which use
89 can be called and warns. This makes it easier to write scripts which use
90 the ipapi.get() object for informational purposes to operate both with and
90 the ipapi.get() object for informational purposes to operate both with and
91 without ipython. Obviously code which uses the ipython object for
91 without ipython. Obviously code which uses the ipython object for
92 computations will not work, but this allows a wider range of code to
92 computations will not work, but this allows a wider range of code to
93 transparently work whether ipython is being used or not."""
93 transparently work whether ipython is being used or not."""
94
95 def __init__(self,warn=True):
96 if warn:
97 self.dummy = self._dummy_warn
98 else:
99 self.dummy = self._dummy_silent
94
100
95 def __str__(self):
101 def __str__(self):
96 return "<IPythonNotRunning>"
102 return "<IPythonNotRunning>"
97
103
98 __repr__ = __str__
104 __repr__ = __str__
99
105
100 def __getattr__(self,name):
106 def __getattr__(self,name):
101 return self.dummy
107 return self.dummy
102
108
103 def dummy(self,*args,**kw):
109 def _dummy_warn(self,*args,**kw):
104 """Dummy function, which doesn't do anything but warn."""
110 """Dummy function, which doesn't do anything but warn."""
111
105 warn("IPython is not running, this is a dummy no-op function")
112 warn("IPython is not running, this is a dummy no-op function")
106
113
114 def _dummy_silent(self,*args,**kw):
115 """Dummy function, which doesn't do anything and emits no warnings."""
116 pass
117
107 _recent = None
118 _recent = None
108
119
109
120
110 def get(allow_dummy=False):
121 def get(allow_dummy=False,dummy_warn=True):
111 """Get an IPApi object.
122 """Get an IPApi object.
112
123
113 If allow_dummy is true, returns an instance of IPythonNotRunning
124 If allow_dummy is true, returns an instance of IPythonNotRunning
114 instead of None if not running under IPython.
125 instead of None if not running under IPython.
115
126
127 If dummy_warn is false, the dummy instance will be completely silent.
128
116 Running this should be the first thing you do when writing extensions that
129 Running this should be the first thing you do when writing extensions that
117 can be imported as normal modules. You can then direct all the
130 can be imported as normal modules. You can then direct all the
118 configuration operations against the returned object.
131 configuration operations against the returned object.
119 """
132 """
120 global _recent
133 global _recent
121 if allow_dummy and not _recent:
134 if allow_dummy and not _recent:
122 _recent = IPythonNotRunning()
135 _recent = IPythonNotRunning(dummy_warn)
123 return _recent
136 return _recent
124
137
125 class IPApi:
138 class IPApi:
126 """ The actual API class for configuring IPython
139 """ The actual API class for configuring IPython
127
140
128 You should do all of the IPython configuration by getting an IPApi object
141 You should do all of the IPython configuration by getting an IPApi object
129 with IPython.ipapi.get() and using the attributes and methods of the
142 with IPython.ipapi.get() and using the attributes and methods of the
130 returned object."""
143 returned object."""
131
144
132 def __init__(self,ip):
145 def __init__(self,ip):
133
146
134 # All attributes exposed here are considered to be the public API of
147 # All attributes exposed here are considered to be the public API of
135 # IPython. As needs dictate, some of these may be wrapped as
148 # IPython. As needs dictate, some of these may be wrapped as
136 # properties.
149 # properties.
137
150
138 self.magic = ip.ipmagic
151 self.magic = ip.ipmagic
139
152
140 self.system = ip.ipsystem
153 self.system = ip.ipsystem
141
154
142 self.set_hook = ip.set_hook
155 self.set_hook = ip.set_hook
143
156
144 self.set_custom_exc = ip.set_custom_exc
157 self.set_custom_exc = ip.set_custom_exc
145
158
146 self.user_ns = ip.user_ns
159 self.user_ns = ip.user_ns
147
160
148 self.set_crash_handler = ip.set_crash_handler
161 self.set_crash_handler = ip.set_crash_handler
149
162
150 # Session-specific data store, which can be used to store
163 # Session-specific data store, which can be used to store
151 # data that should persist through the ipython session.
164 # data that should persist through the ipython session.
152 self.meta = ip.meta
165 self.meta = ip.meta
153
166
154 # The ipython instance provided
167 # The ipython instance provided
155 self.IP = ip
168 self.IP = ip
156
169
157 global _recent
170 global _recent
158 _recent = self
171 _recent = self
159
172
160 # Use a property for some things which are added to the instance very
173 # Use a property for some things which are added to the instance very
161 # late. I don't have time right now to disentangle the initialization
174 # late. I don't have time right now to disentangle the initialization
162 # order issues, so a property lets us delay item extraction while
175 # order issues, so a property lets us delay item extraction while
163 # providing a normal attribute API.
176 # providing a normal attribute API.
164 def get_db(self):
177 def get_db(self):
165 """A handle to persistent dict-like database (a PickleShareDB object)"""
178 """A handle to persistent dict-like database (a PickleShareDB object)"""
166 return self.IP.db
179 return self.IP.db
167
180
168 db = property(get_db,None,None,get_db.__doc__)
181 db = property(get_db,None,None,get_db.__doc__)
169
182
170 def get_options(self):
183 def get_options(self):
171 """All configurable variables."""
184 """All configurable variables."""
172
185
173 # catch typos by disabling new attribute creation. If new attr creation
186 # catch typos by disabling new attribute creation. If new attr creation
174 # is in fact wanted (e.g. when exposing new options), do allow_new_attr(True)
187 # is in fact wanted (e.g. when exposing new options), do allow_new_attr(True)
175 # for the received rc struct.
188 # for the received rc struct.
176
189
177 self.IP.rc.allow_new_attr(False)
190 self.IP.rc.allow_new_attr(False)
178 return self.IP.rc
191 return self.IP.rc
179
192
180 options = property(get_options,None,None,get_options.__doc__)
193 options = property(get_options,None,None,get_options.__doc__)
181
194
182 def expose_magic(self,magicname, func):
195 def expose_magic(self,magicname, func):
183 ''' Expose own function as magic function for ipython
196 ''' Expose own function as magic function for ipython
184
197
185 def foo_impl(self,parameter_s=''):
198 def foo_impl(self,parameter_s=''):
186 """My very own magic!. (Use docstrings, IPython reads them)."""
199 """My very own magic!. (Use docstrings, IPython reads them)."""
187 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
200 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
188 print 'The self object is:',self
201 print 'The self object is:',self
189
202
190 ipapi.expose_magic("foo",foo_impl)
203 ipapi.expose_magic("foo",foo_impl)
191 '''
204 '''
192
205
193 import new
206 import new
194 im = new.instancemethod(func,self.IP, self.IP.__class__)
207 im = new.instancemethod(func,self.IP, self.IP.__class__)
195 setattr(self.IP, "magic_" + magicname, im)
208 setattr(self.IP, "magic_" + magicname, im)
196
209
197 def ex(self,cmd):
210 def ex(self,cmd):
198 """ Execute a normal python statement in user namespace """
211 """ Execute a normal python statement in user namespace """
199 exec cmd in self.user_ns
212 exec cmd in self.user_ns
200
213
201 def ev(self,expr):
214 def ev(self,expr):
202 """ Evaluate python expression expr in user namespace
215 """ Evaluate python expression expr in user namespace
203
216
204 Returns the result of evaluation"""
217 Returns the result of evaluation"""
205 return eval(expr,self.user_ns)
218 return eval(expr,self.user_ns)
206
219
207 def runlines(self,lines):
220 def runlines(self,lines):
208 """ Run the specified lines in interpreter, honoring ipython directives.
221 """ Run the specified lines in interpreter, honoring ipython directives.
209
222
210 This allows %magic and !shell escape notations.
223 This allows %magic and !shell escape notations.
211
224
212 Takes either all lines in one string or list of lines.
225 Takes either all lines in one string or list of lines.
213 """
226 """
214 if isinstance(lines,basestring):
227 if isinstance(lines,basestring):
215 self.IP.runlines(lines)
228 self.IP.runlines(lines)
216 else:
229 else:
217 self.IP.runlines('\n'.join(lines))
230 self.IP.runlines('\n'.join(lines))
218
231
219 def to_user_ns(self,vars):
232 def to_user_ns(self,vars):
220 """Inject a group of variables into the IPython user namespace.
233 """Inject a group of variables into the IPython user namespace.
221
234
222 Inputs:
235 Inputs:
223
236
224 - vars: string with variable names separated by whitespace
237 - vars: string with variable names separated by whitespace
225
238
226 This utility routine is meant to ease interactive debugging work,
239 This utility routine is meant to ease interactive debugging work,
227 where you want to easily propagate some internal variable in your code
240 where you want to easily propagate some internal variable in your code
228 up to the interactive namespace for further exploration.
241 up to the interactive namespace for further exploration.
229
242
230 When you run code via %run, globals in your script become visible at
243 When you run code via %run, globals in your script become visible at
231 the interactive prompt, but this doesn't happen for locals inside your
244 the interactive prompt, but this doesn't happen for locals inside your
232 own functions and methods. Yet when debugging, it is common to want
245 own functions and methods. Yet when debugging, it is common to want
233 to explore some internal variables further at the interactive propmt.
246 to explore some internal variables further at the interactive propmt.
234
247
235 Examples:
248 Examples:
236
249
237 To use this, you first must obtain a handle on the ipython object as
250 To use this, you first must obtain a handle on the ipython object as
238 indicated above, via:
251 indicated above, via:
239
252
240 import IPython.ipapi
253 import IPython.ipapi
241 ip = IPython.ipapi.get()
254 ip = IPython.ipapi.get()
242
255
243 Once this is done, inside a routine foo() where you want to expose
256 Once this is done, inside a routine foo() where you want to expose
244 variables x and y, you do the following:
257 variables x and y, you do the following:
245
258
246 def foo():
259 def foo():
247 ...
260 ...
248 x = your_computation()
261 x = your_computation()
249 y = something_else()
262 y = something_else()
250
263
251 # This pushes x and y to the interactive prompt immediately, even
264 # This pushes x and y to the interactive prompt immediately, even
252 # if this routine crashes on the next line after:
265 # if this routine crashes on the next line after:
253 ip.to_user_ns('x y')
266 ip.to_user_ns('x y')
254 ...
267 ...
255 # return
268 # return
256
269
257 If you need to rename variables, just use ip.user_ns with dict
270 If you need to rename variables, just use ip.user_ns with dict
258 and update:
271 and update:
259
272
260 # exposes variables 'foo' as 'x' and 'bar' as 'y' in IPython
273 # exposes variables 'foo' as 'x' and 'bar' as 'y' in IPython
261 # user namespace
274 # user namespace
262 ip.user_ns.update(dict(x=foo,y=bar))
275 ip.user_ns.update(dict(x=foo,y=bar))
263 """
276 """
264
277
265 # print 'vars given:',vars # dbg
278 # print 'vars given:',vars # dbg
266 # Get the caller's frame to evaluate the given names in
279 # Get the caller's frame to evaluate the given names in
267 cf = sys._getframe(1)
280 cf = sys._getframe(1)
268
281
269 user_ns = self.user_ns
282 user_ns = self.user_ns
270
283
271 for name in vars.split():
284 for name in vars.split():
272 try:
285 try:
273 user_ns[name] = eval(name,cf.f_globals,cf.f_locals)
286 user_ns[name] = eval(name,cf.f_globals,cf.f_locals)
274 except:
287 except:
275 error('could not get var. %s from %s' %
288 error('could not get var. %s from %s' %
276 (name,cf.f_code.co_name))
289 (name,cf.f_code.co_name))
277
290
278 def expand_alias(self,line):
291 def expand_alias(self,line):
279 """ Expand an alias in the command line
292 """ Expand an alias in the command line
280
293
281 Returns the provided command line, possibly with the first word
294 Returns the provided command line, possibly with the first word
282 (command) translated according to alias expansion rules.
295 (command) translated according to alias expansion rules.
283
296
284 [ipython]|16> _ip.expand_aliases("np myfile.txt")
297 [ipython]|16> _ip.expand_aliases("np myfile.txt")
285 <16> 'q:/opt/np/notepad++.exe myfile.txt'
298 <16> 'q:/opt/np/notepad++.exe myfile.txt'
286 """
299 """
287
300
288 pre,fn,rest = self.IP.split_user_input(line)
301 pre,fn,rest = self.IP.split_user_input(line)
289 res = pre + self.IP.expand_aliases(fn,rest)
302 res = pre + self.IP.expand_aliases(fn,rest)
290
303
291
304
292
305
293 def launch_new_instance(user_ns = None):
306 def launch_new_instance(user_ns = None):
294 """ Make and start a new ipython instance.
307 """ Make and start a new ipython instance.
295
308
296 This can be called even without having an already initialized
309 This can be called even without having an already initialized
297 ipython session running.
310 ipython session running.
298
311
299 This is also used as the egg entry point for the 'ipython' script.
312 This is also used as the egg entry point for the 'ipython' script.
300
313
301 """
314 """
302 ses = make_session(user_ns)
315 ses = make_session(user_ns)
303 ses.mainloop()
316 ses.mainloop()
304
317
305
318
306 def make_user_ns(user_ns = None):
319 def make_user_ns(user_ns = None):
307 """Return a valid user interactive namespace.
320 """Return a valid user interactive namespace.
308
321
309 This builds a dict with the minimal information needed to operate as a
322 This builds a dict with the minimal information needed to operate as a
310 valid IPython user namespace, which you can pass to the various embedding
323 valid IPython user namespace, which you can pass to the various embedding
311 classes in ipython.
324 classes in ipython.
312 """
325 """
313
326
314 if user_ns is None:
327 if user_ns is None:
315 # Set __name__ to __main__ to better match the behavior of the
328 # Set __name__ to __main__ to better match the behavior of the
316 # normal interpreter.
329 # normal interpreter.
317 user_ns = {'__name__' :'__main__',
330 user_ns = {'__name__' :'__main__',
318 '__builtins__' : __builtin__,
331 '__builtins__' : __builtin__,
319 }
332 }
320 else:
333 else:
321 user_ns.setdefault('__name__','__main__')
334 user_ns.setdefault('__name__','__main__')
322 user_ns.setdefault('__builtins__',__builtin__)
335 user_ns.setdefault('__builtins__',__builtin__)
323
336
324 return user_ns
337 return user_ns
325
338
326
339
327 def make_user_global_ns(ns = None):
340 def make_user_global_ns(ns = None):
328 """Return a valid user global namespace.
341 """Return a valid user global namespace.
329
342
330 Similar to make_user_ns(), but global namespaces are really only needed in
343 Similar to make_user_ns(), but global namespaces are really only needed in
331 embedded applications, where there is a distinction between the user's
344 embedded applications, where there is a distinction between the user's
332 interactive namespace and the global one where ipython is running."""
345 interactive namespace and the global one where ipython is running."""
333
346
334 if ns is None: ns = {}
347 if ns is None: ns = {}
335 return ns
348 return ns
336
349
337
350
338 def make_session(user_ns = None):
351 def make_session(user_ns = None):
339 """Makes, but does not launch an IPython session.
352 """Makes, but does not launch an IPython session.
340
353
341 Later on you can call obj.mainloop() on the returned object.
354 Later on you can call obj.mainloop() on the returned object.
342
355
343 Inputs:
356 Inputs:
344
357
345 - user_ns(None): a dict to be used as the user's namespace with initial
358 - user_ns(None): a dict to be used as the user's namespace with initial
346 data.
359 data.
347
360
348 WARNING: This should *not* be run when a session exists already."""
361 WARNING: This should *not* be run when a session exists already."""
349
362
350 import IPython
363 import IPython
351 return IPython.Shell.start(user_ns)
364 return IPython.Shell.start(user_ns)
@@ -1,2538 +1,2542 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 1977 2006-12-11 16:52:12Z fperez $
9 $Id: iplib.py 2014 2007-01-05 10:36:58Z fperez $
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 exceptions
44 import exceptions
45 import glob
45 import glob
46 import inspect
46 import inspect
47 import keyword
47 import keyword
48 import new
48 import new
49 import os
49 import os
50 import pydoc
50 import pydoc
51 import re
51 import re
52 import shutil
52 import shutil
53 import string
53 import string
54 import sys
54 import sys
55 import tempfile
55 import tempfile
56 import traceback
56 import traceback
57 import types
57 import types
58 import pickleshare
58 import pickleshare
59 from sets import Set
59 from sets import Set
60 from pprint import pprint, pformat
60 from pprint import pprint, pformat
61
61
62 # IPython's own modules
62 # IPython's own modules
63 import IPython
63 import IPython
64 from IPython import OInspect,PyColorize,ultraTB
64 from IPython import OInspect,PyColorize,ultraTB
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
66 from IPython.FakeModule import FakeModule
66 from IPython.FakeModule import FakeModule
67 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
67 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
68 from IPython.Logger import Logger
68 from IPython.Logger import Logger
69 from IPython.Magic import Magic
69 from IPython.Magic import Magic
70 from IPython.Prompts import CachedOutput
70 from IPython.Prompts import CachedOutput
71 from IPython.ipstruct import Struct
71 from IPython.ipstruct import Struct
72 from IPython.background_jobs import BackgroundJobManager
72 from IPython.background_jobs import BackgroundJobManager
73 from IPython.usage import cmd_line_usage,interactive_usage
73 from IPython.usage import cmd_line_usage,interactive_usage
74 from IPython.genutils import *
74 from IPython.genutils import *
75 from IPython.strdispatch import StrDispatch
75 from IPython.strdispatch import StrDispatch
76 import IPython.ipapi
76 import IPython.ipapi
77
77
78 # Globals
78 # Globals
79
79
80 # store the builtin raw_input globally, and use this always, in case user code
80 # store the builtin raw_input globally, and use this always, in case user code
81 # overwrites it (like wx.py.PyShell does)
81 # overwrites it (like wx.py.PyShell does)
82 raw_input_original = raw_input
82 raw_input_original = raw_input
83
83
84 # compiled regexps for autoindent management
84 # compiled regexps for autoindent management
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
86
86
87
87
88 #****************************************************************************
88 #****************************************************************************
89 # Some utility function definitions
89 # Some utility function definitions
90
90
91 ini_spaces_re = re.compile(r'^(\s+)')
91 ini_spaces_re = re.compile(r'^(\s+)')
92
92
93 def num_ini_spaces(strng):
93 def num_ini_spaces(strng):
94 """Return the number of initial spaces in a string"""
94 """Return the number of initial spaces in a string"""
95
95
96 ini_spaces = ini_spaces_re.match(strng)
96 ini_spaces = ini_spaces_re.match(strng)
97 if ini_spaces:
97 if ini_spaces:
98 return ini_spaces.end()
98 return ini_spaces.end()
99 else:
99 else:
100 return 0
100 return 0
101
101
102 def softspace(file, newvalue):
102 def softspace(file, newvalue):
103 """Copied from code.py, to remove the dependency"""
103 """Copied from code.py, to remove the dependency"""
104
104
105 oldvalue = 0
105 oldvalue = 0
106 try:
106 try:
107 oldvalue = file.softspace
107 oldvalue = file.softspace
108 except AttributeError:
108 except AttributeError:
109 pass
109 pass
110 try:
110 try:
111 file.softspace = newvalue
111 file.softspace = newvalue
112 except (AttributeError, TypeError):
112 except (AttributeError, TypeError):
113 # "attribute-less object" or "read-only attributes"
113 # "attribute-less object" or "read-only attributes"
114 pass
114 pass
115 return oldvalue
115 return oldvalue
116
116
117
117
118 #****************************************************************************
118 #****************************************************************************
119 # Local use exceptions
119 # Local use exceptions
120 class SpaceInInput(exceptions.Exception): pass
120 class SpaceInInput(exceptions.Exception): pass
121
121
122
122
123 #****************************************************************************
123 #****************************************************************************
124 # Local use classes
124 # Local use classes
125 class Bunch: pass
125 class Bunch: pass
126
126
127 class Undefined: pass
127 class Undefined: pass
128
128
129 class Quitter(object):
129 class Quitter(object):
130 """Simple class to handle exit, similar to Python 2.5's.
130 """Simple class to handle exit, similar to Python 2.5's.
131
131
132 It handles exiting in an ipython-safe manner, which the one in Python 2.5
132 It handles exiting in an ipython-safe manner, which the one in Python 2.5
133 doesn't do (obviously, since it doesn't know about ipython)."""
133 doesn't do (obviously, since it doesn't know about ipython)."""
134
134
135 def __init__(self,shell,name):
135 def __init__(self,shell,name):
136 self.shell = shell
136 self.shell = shell
137 self.name = name
137 self.name = name
138
138
139 def __repr__(self):
139 def __repr__(self):
140 return 'Type %s() to exit.' % self.name
140 return 'Type %s() to exit.' % self.name
141 __str__ = __repr__
141 __str__ = __repr__
142
142
143 def __call__(self):
143 def __call__(self):
144 self.shell.exit()
144 self.shell.exit()
145
145
146 class InputList(list):
146 class InputList(list):
147 """Class to store user input.
147 """Class to store user input.
148
148
149 It's basically a list, but slices return a string instead of a list, thus
149 It's basically a list, but slices return a string instead of a list, thus
150 allowing things like (assuming 'In' is an instance):
150 allowing things like (assuming 'In' is an instance):
151
151
152 exec In[4:7]
152 exec In[4:7]
153
153
154 or
154 or
155
155
156 exec In[5:9] + In[14] + In[21:25]"""
156 exec In[5:9] + In[14] + In[21:25]"""
157
157
158 def __getslice__(self,i,j):
158 def __getslice__(self,i,j):
159 return ''.join(list.__getslice__(self,i,j))
159 return ''.join(list.__getslice__(self,i,j))
160
160
161 class SyntaxTB(ultraTB.ListTB):
161 class SyntaxTB(ultraTB.ListTB):
162 """Extension which holds some state: the last exception value"""
162 """Extension which holds some state: the last exception value"""
163
163
164 def __init__(self,color_scheme = 'NoColor'):
164 def __init__(self,color_scheme = 'NoColor'):
165 ultraTB.ListTB.__init__(self,color_scheme)
165 ultraTB.ListTB.__init__(self,color_scheme)
166 self.last_syntax_error = None
166 self.last_syntax_error = None
167
167
168 def __call__(self, etype, value, elist):
168 def __call__(self, etype, value, elist):
169 self.last_syntax_error = value
169 self.last_syntax_error = value
170 ultraTB.ListTB.__call__(self,etype,value,elist)
170 ultraTB.ListTB.__call__(self,etype,value,elist)
171
171
172 def clear_err_state(self):
172 def clear_err_state(self):
173 """Return the current error state and clear it"""
173 """Return the current error state and clear it"""
174 e = self.last_syntax_error
174 e = self.last_syntax_error
175 self.last_syntax_error = None
175 self.last_syntax_error = None
176 return e
176 return e
177
177
178 #****************************************************************************
178 #****************************************************************************
179 # Main IPython class
179 # Main IPython class
180
180
181 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
181 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
182 # until a full rewrite is made. I've cleaned all cross-class uses of
182 # until a full rewrite is made. I've cleaned all cross-class uses of
183 # attributes and methods, but too much user code out there relies on the
183 # attributes and methods, but too much user code out there relies on the
184 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
184 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
185 #
185 #
186 # But at least now, all the pieces have been separated and we could, in
186 # But at least now, all the pieces have been separated and we could, in
187 # principle, stop using the mixin. This will ease the transition to the
187 # principle, stop using the mixin. This will ease the transition to the
188 # chainsaw branch.
188 # chainsaw branch.
189
189
190 # For reference, the following is the list of 'self.foo' uses in the Magic
190 # For reference, the following is the list of 'self.foo' uses in the Magic
191 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
191 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
192 # class, to prevent clashes.
192 # class, to prevent clashes.
193
193
194 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
194 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
195 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
195 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
196 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
196 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
197 # 'self.value']
197 # 'self.value']
198
198
199 class InteractiveShell(object,Magic):
199 class InteractiveShell(object,Magic):
200 """An enhanced console for Python."""
200 """An enhanced console for Python."""
201
201
202 # class attribute to indicate whether the class supports threads or not.
202 # class attribute to indicate whether the class supports threads or not.
203 # Subclasses with thread support should override this as needed.
203 # Subclasses with thread support should override this as needed.
204 isthreaded = False
204 isthreaded = False
205
205
206 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
206 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
207 user_ns = None,user_global_ns=None,banner2='',
207 user_ns = None,user_global_ns=None,banner2='',
208 custom_exceptions=((),None),embedded=False):
208 custom_exceptions=((),None),embedded=False):
209
209
210 # log system
210 # log system
211 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
211 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
212
212
213 # some minimal strict typechecks. For some core data structures, I
213 # some minimal strict typechecks. For some core data structures, I
214 # want actual basic python types, not just anything that looks like
214 # want actual basic python types, not just anything that looks like
215 # one. This is especially true for namespaces.
215 # one. This is especially true for namespaces.
216 for ns in (user_ns,user_global_ns):
216 for ns in (user_ns,user_global_ns):
217 if ns is not None and type(ns) != types.DictType:
217 if ns is not None and type(ns) != types.DictType:
218 raise TypeError,'namespace must be a dictionary'
218 raise TypeError,'namespace must be a dictionary'
219
219
220 # Job manager (for jobs run as background threads)
220 # Job manager (for jobs run as background threads)
221 self.jobs = BackgroundJobManager()
221 self.jobs = BackgroundJobManager()
222
222
223 # Store the actual shell's name
223 # Store the actual shell's name
224 self.name = name
224 self.name = name
225
225
226 # We need to know whether the instance is meant for embedding, since
226 # We need to know whether the instance is meant for embedding, since
227 # global/local namespaces need to be handled differently in that case
227 # global/local namespaces need to be handled differently in that case
228 self.embedded = embedded
228 self.embedded = embedded
229
229
230 # command compiler
230 # command compiler
231 self.compile = codeop.CommandCompiler()
231 self.compile = codeop.CommandCompiler()
232
232
233 # User input buffer
233 # User input buffer
234 self.buffer = []
234 self.buffer = []
235
235
236 # Default name given in compilation of code
236 # Default name given in compilation of code
237 self.filename = '<ipython console>'
237 self.filename = '<ipython console>'
238
238
239 # Install our own quitter instead of the builtins. For python2.3-2.4,
239 # Install our own quitter instead of the builtins. For python2.3-2.4,
240 # this brings in behavior like 2.5, and for 2.5 it's identical.
240 # this brings in behavior like 2.5, and for 2.5 it's identical.
241 __builtin__.exit = Quitter(self,'exit')
241 __builtin__.exit = Quitter(self,'exit')
242 __builtin__.quit = Quitter(self,'quit')
242 __builtin__.quit = Quitter(self,'quit')
243
243
244 # Make an empty namespace, which extension writers can rely on both
244 # Make an empty namespace, which extension writers can rely on both
245 # existing and NEVER being used by ipython itself. This gives them a
245 # existing and NEVER being used by ipython itself. This gives them a
246 # convenient location for storing additional information and state
246 # convenient location for storing additional information and state
247 # their extensions may require, without fear of collisions with other
247 # their extensions may require, without fear of collisions with other
248 # ipython names that may develop later.
248 # ipython names that may develop later.
249 self.meta = Struct()
249 self.meta = Struct()
250
250
251 # Create the namespace where the user will operate. user_ns is
251 # Create the namespace where the user will operate. user_ns is
252 # normally the only one used, and it is passed to the exec calls as
252 # normally the only one used, and it is passed to the exec calls as
253 # the locals argument. But we do carry a user_global_ns namespace
253 # the locals argument. But we do carry a user_global_ns namespace
254 # given as the exec 'globals' argument, This is useful in embedding
254 # given as the exec 'globals' argument, This is useful in embedding
255 # situations where the ipython shell opens in a context where the
255 # situations where the ipython shell opens in a context where the
256 # distinction between locals and globals is meaningful.
256 # distinction between locals and globals is meaningful.
257
257
258 # FIXME. For some strange reason, __builtins__ is showing up at user
258 # FIXME. For some strange reason, __builtins__ is showing up at user
259 # level as a dict instead of a module. This is a manual fix, but I
259 # level as a dict instead of a module. This is a manual fix, but I
260 # should really track down where the problem is coming from. Alex
260 # should really track down where the problem is coming from. Alex
261 # Schmolck reported this problem first.
261 # Schmolck reported this problem first.
262
262
263 # A useful post by Alex Martelli on this topic:
263 # A useful post by Alex Martelli on this topic:
264 # Re: inconsistent value from __builtins__
264 # Re: inconsistent value from __builtins__
265 # Von: Alex Martelli <aleaxit@yahoo.com>
265 # Von: Alex Martelli <aleaxit@yahoo.com>
266 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
266 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
267 # Gruppen: comp.lang.python
267 # Gruppen: comp.lang.python
268
268
269 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
269 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
270 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
270 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
271 # > <type 'dict'>
271 # > <type 'dict'>
272 # > >>> print type(__builtins__)
272 # > >>> print type(__builtins__)
273 # > <type 'module'>
273 # > <type 'module'>
274 # > Is this difference in return value intentional?
274 # > Is this difference in return value intentional?
275
275
276 # Well, it's documented that '__builtins__' can be either a dictionary
276 # Well, it's documented that '__builtins__' can be either a dictionary
277 # or a module, and it's been that way for a long time. Whether it's
277 # or a module, and it's been that way for a long time. Whether it's
278 # intentional (or sensible), I don't know. In any case, the idea is
278 # intentional (or sensible), I don't know. In any case, the idea is
279 # that if you need to access the built-in namespace directly, you
279 # that if you need to access the built-in namespace directly, you
280 # should start with "import __builtin__" (note, no 's') which will
280 # should start with "import __builtin__" (note, no 's') which will
281 # definitely give you a module. Yeah, it's somewhat confusing:-(.
281 # definitely give you a module. Yeah, it's somewhat confusing:-(.
282
282
283 # These routines return properly built dicts as needed by the rest of
283 # These routines return properly built dicts as needed by the rest of
284 # the code, and can also be used by extension writers to generate
284 # the code, and can also be used by extension writers to generate
285 # properly initialized namespaces.
285 # properly initialized namespaces.
286 user_ns = IPython.ipapi.make_user_ns(user_ns)
286 user_ns = IPython.ipapi.make_user_ns(user_ns)
287 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
287 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
288
288
289 # Assign namespaces
289 # Assign namespaces
290 # This is the namespace where all normal user variables live
290 # This is the namespace where all normal user variables live
291 self.user_ns = user_ns
291 self.user_ns = user_ns
292 # Embedded instances require a separate namespace for globals.
292 # Embedded instances require a separate namespace for globals.
293 # Normally this one is unused by non-embedded instances.
293 # Normally this one is unused by non-embedded instances.
294 self.user_global_ns = user_global_ns
294 self.user_global_ns = user_global_ns
295 # A namespace to keep track of internal data structures to prevent
295 # A namespace to keep track of internal data structures to prevent
296 # them from cluttering user-visible stuff. Will be updated later
296 # them from cluttering user-visible stuff. Will be updated later
297 self.internal_ns = {}
297 self.internal_ns = {}
298
298
299 # Namespace of system aliases. Each entry in the alias
299 # Namespace of system aliases. Each entry in the alias
300 # table must be a 2-tuple of the form (N,name), where N is the number
300 # table must be a 2-tuple of the form (N,name), where N is the number
301 # of positional arguments of the alias.
301 # of positional arguments of the alias.
302 self.alias_table = {}
302 self.alias_table = {}
303
303
304 # A table holding all the namespaces IPython deals with, so that
304 # A table holding all the namespaces IPython deals with, so that
305 # introspection facilities can search easily.
305 # introspection facilities can search easily.
306 self.ns_table = {'user':user_ns,
306 self.ns_table = {'user':user_ns,
307 'user_global':user_global_ns,
307 'user_global':user_global_ns,
308 'alias':self.alias_table,
308 'alias':self.alias_table,
309 'internal':self.internal_ns,
309 'internal':self.internal_ns,
310 'builtin':__builtin__.__dict__
310 'builtin':__builtin__.__dict__
311 }
311 }
312
312
313 # The user namespace MUST have a pointer to the shell itself.
313 # The user namespace MUST have a pointer to the shell itself.
314 self.user_ns[name] = self
314 self.user_ns[name] = self
315
315
316 # We need to insert into sys.modules something that looks like a
316 # We need to insert into sys.modules something that looks like a
317 # module but which accesses the IPython namespace, for shelve and
317 # module but which accesses the IPython namespace, for shelve and
318 # pickle to work interactively. Normally they rely on getting
318 # pickle to work interactively. Normally they rely on getting
319 # everything out of __main__, but for embedding purposes each IPython
319 # everything out of __main__, but for embedding purposes each IPython
320 # instance has its own private namespace, so we can't go shoving
320 # instance has its own private namespace, so we can't go shoving
321 # everything into __main__.
321 # everything into __main__.
322
322
323 # note, however, that we should only do this for non-embedded
323 # note, however, that we should only do this for non-embedded
324 # ipythons, which really mimic the __main__.__dict__ with their own
324 # ipythons, which really mimic the __main__.__dict__ with their own
325 # namespace. Embedded instances, on the other hand, should not do
325 # namespace. Embedded instances, on the other hand, should not do
326 # this because they need to manage the user local/global namespaces
326 # this because they need to manage the user local/global namespaces
327 # only, but they live within a 'normal' __main__ (meaning, they
327 # only, but they live within a 'normal' __main__ (meaning, they
328 # shouldn't overtake the execution environment of the script they're
328 # shouldn't overtake the execution environment of the script they're
329 # embedded in).
329 # embedded in).
330
330
331 if not embedded:
331 if not embedded:
332 try:
332 try:
333 main_name = self.user_ns['__name__']
333 main_name = self.user_ns['__name__']
334 except KeyError:
334 except KeyError:
335 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
335 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
336 else:
336 else:
337 #print "pickle hack in place" # dbg
337 #print "pickle hack in place" # dbg
338 #print 'main_name:',main_name # dbg
338 #print 'main_name:',main_name # dbg
339 sys.modules[main_name] = FakeModule(self.user_ns)
339 sys.modules[main_name] = FakeModule(self.user_ns)
340
340
341 # List of input with multi-line handling.
341 # List of input with multi-line handling.
342 # Fill its zero entry, user counter starts at 1
342 # Fill its zero entry, user counter starts at 1
343 self.input_hist = InputList(['\n'])
343 self.input_hist = InputList(['\n'])
344 # This one will hold the 'raw' input history, without any
344 # This one will hold the 'raw' input history, without any
345 # pre-processing. This will allow users to retrieve the input just as
345 # pre-processing. This will allow users to retrieve the input just as
346 # it was exactly typed in by the user, with %hist -r.
346 # it was exactly typed in by the user, with %hist -r.
347 self.input_hist_raw = InputList(['\n'])
347 self.input_hist_raw = InputList(['\n'])
348
348
349 # list of visited directories
349 # list of visited directories
350 try:
350 try:
351 self.dir_hist = [os.getcwd()]
351 self.dir_hist = [os.getcwd()]
352 except IOError, e:
352 except IOError, e:
353 self.dir_hist = []
353 self.dir_hist = []
354
354
355 # dict of output history
355 # dict of output history
356 self.output_hist = {}
356 self.output_hist = {}
357
357
358 # dict of things NOT to alias (keywords, builtins and some magics)
358 # dict of things NOT to alias (keywords, builtins and some magics)
359 no_alias = {}
359 no_alias = {}
360 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
360 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
361 for key in keyword.kwlist + no_alias_magics:
361 for key in keyword.kwlist + no_alias_magics:
362 no_alias[key] = 1
362 no_alias[key] = 1
363 no_alias.update(__builtin__.__dict__)
363 no_alias.update(__builtin__.__dict__)
364 self.no_alias = no_alias
364 self.no_alias = no_alias
365
365
366 # make global variables for user access to these
366 # make global variables for user access to these
367 self.user_ns['_ih'] = self.input_hist
367 self.user_ns['_ih'] = self.input_hist
368 self.user_ns['_oh'] = self.output_hist
368 self.user_ns['_oh'] = self.output_hist
369 self.user_ns['_dh'] = self.dir_hist
369 self.user_ns['_dh'] = self.dir_hist
370
370
371 # user aliases to input and output histories
371 # user aliases to input and output histories
372 self.user_ns['In'] = self.input_hist
372 self.user_ns['In'] = self.input_hist
373 self.user_ns['Out'] = self.output_hist
373 self.user_ns['Out'] = self.output_hist
374
374
375 # Object variable to store code object waiting execution. This is
375 # Object variable to store code object waiting execution. This is
376 # used mainly by the multithreaded shells, but it can come in handy in
376 # used mainly by the multithreaded shells, but it can come in handy in
377 # other situations. No need to use a Queue here, since it's a single
377 # other situations. No need to use a Queue here, since it's a single
378 # item which gets cleared once run.
378 # item which gets cleared once run.
379 self.code_to_run = None
379 self.code_to_run = None
380
380
381 # escapes for automatic behavior on the command line
381 # escapes for automatic behavior on the command line
382 self.ESC_SHELL = '!'
382 self.ESC_SHELL = '!'
383 self.ESC_HELP = '?'
383 self.ESC_HELP = '?'
384 self.ESC_MAGIC = '%'
384 self.ESC_MAGIC = '%'
385 self.ESC_QUOTE = ','
385 self.ESC_QUOTE = ','
386 self.ESC_QUOTE2 = ';'
386 self.ESC_QUOTE2 = ';'
387 self.ESC_PAREN = '/'
387 self.ESC_PAREN = '/'
388
388
389 # And their associated handlers
389 # And their associated handlers
390 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
390 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
391 self.ESC_QUOTE : self.handle_auto,
391 self.ESC_QUOTE : self.handle_auto,
392 self.ESC_QUOTE2 : self.handle_auto,
392 self.ESC_QUOTE2 : self.handle_auto,
393 self.ESC_MAGIC : self.handle_magic,
393 self.ESC_MAGIC : self.handle_magic,
394 self.ESC_HELP : self.handle_help,
394 self.ESC_HELP : self.handle_help,
395 self.ESC_SHELL : self.handle_shell_escape,
395 self.ESC_SHELL : self.handle_shell_escape,
396 }
396 }
397
397
398 # class initializations
398 # class initializations
399 Magic.__init__(self,self)
399 Magic.__init__(self,self)
400
400
401 # Python source parser/formatter for syntax highlighting
401 # Python source parser/formatter for syntax highlighting
402 pyformat = PyColorize.Parser().format
402 pyformat = PyColorize.Parser().format
403 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
403 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
404
404
405 # hooks holds pointers used for user-side customizations
405 # hooks holds pointers used for user-side customizations
406 self.hooks = Struct()
406 self.hooks = Struct()
407
407
408 self.strdispatchers = {}
408 self.strdispatchers = {}
409
409
410 # Set all default hooks, defined in the IPython.hooks module.
410 # Set all default hooks, defined in the IPython.hooks module.
411 hooks = IPython.hooks
411 hooks = IPython.hooks
412 for hook_name in hooks.__all__:
412 for hook_name in hooks.__all__:
413 # default hooks have priority 100, i.e. low; user hooks should have 0-100 priority
413 # default hooks have priority 100, i.e. low; user hooks should have 0-100 priority
414 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
414 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
415 #print "bound hook",hook_name
415 #print "bound hook",hook_name
416
416
417 # Flag to mark unconditional exit
417 # Flag to mark unconditional exit
418 self.exit_now = False
418 self.exit_now = False
419
419
420 self.usage_min = """\
420 self.usage_min = """\
421 An enhanced console for Python.
421 An enhanced console for Python.
422 Some of its features are:
422 Some of its features are:
423 - Readline support if the readline library is present.
423 - Readline support if the readline library is present.
424 - Tab completion in the local namespace.
424 - Tab completion in the local namespace.
425 - Logging of input, see command-line options.
425 - Logging of input, see command-line options.
426 - System shell escape via ! , eg !ls.
426 - System shell escape via ! , eg !ls.
427 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
427 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
428 - Keeps track of locally defined variables via %who, %whos.
428 - Keeps track of locally defined variables via %who, %whos.
429 - Show object information with a ? eg ?x or x? (use ?? for more info).
429 - Show object information with a ? eg ?x or x? (use ?? for more info).
430 """
430 """
431 if usage: self.usage = usage
431 if usage: self.usage = usage
432 else: self.usage = self.usage_min
432 else: self.usage = self.usage_min
433
433
434 # Storage
434 # Storage
435 self.rc = rc # This will hold all configuration information
435 self.rc = rc # This will hold all configuration information
436 self.pager = 'less'
436 self.pager = 'less'
437 # temporary files used for various purposes. Deleted at exit.
437 # temporary files used for various purposes. Deleted at exit.
438 self.tempfiles = []
438 self.tempfiles = []
439
439
440 # Keep track of readline usage (later set by init_readline)
440 # Keep track of readline usage (later set by init_readline)
441 self.has_readline = False
441 self.has_readline = False
442
442
443 # template for logfile headers. It gets resolved at runtime by the
443 # template for logfile headers. It gets resolved at runtime by the
444 # logstart method.
444 # logstart method.
445 self.loghead_tpl = \
445 self.loghead_tpl = \
446 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
446 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
447 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
447 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
448 #log# opts = %s
448 #log# opts = %s
449 #log# args = %s
449 #log# args = %s
450 #log# It is safe to make manual edits below here.
450 #log# It is safe to make manual edits below here.
451 #log#-----------------------------------------------------------------------
451 #log#-----------------------------------------------------------------------
452 """
452 """
453 # for pushd/popd management
453 # for pushd/popd management
454 try:
454 try:
455 self.home_dir = get_home_dir()
455 self.home_dir = get_home_dir()
456 except HomeDirError,msg:
456 except HomeDirError,msg:
457 fatal(msg)
457 fatal(msg)
458
458
459 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
459 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
460
460
461 # Functions to call the underlying shell.
461 # Functions to call the underlying shell.
462
462
463 # The first is similar to os.system, but it doesn't return a value,
463 # The first is similar to os.system, but it doesn't return a value,
464 # and it allows interpolation of variables in the user's namespace.
464 # and it allows interpolation of variables in the user's namespace.
465 self.system = lambda cmd: \
465 self.system = lambda cmd: \
466 shell(self.var_expand(cmd,depth=2),
466 shell(self.var_expand(cmd,depth=2),
467 header=self.rc.system_header,
467 header=self.rc.system_header,
468 verbose=self.rc.system_verbose)
468 verbose=self.rc.system_verbose)
469
469
470 # These are for getoutput and getoutputerror:
470 # These are for getoutput and getoutputerror:
471 self.getoutput = lambda cmd: \
471 self.getoutput = lambda cmd: \
472 getoutput(self.var_expand(cmd,depth=2),
472 getoutput(self.var_expand(cmd,depth=2),
473 header=self.rc.system_header,
473 header=self.rc.system_header,
474 verbose=self.rc.system_verbose)
474 verbose=self.rc.system_verbose)
475
475
476 self.getoutputerror = lambda cmd: \
476 self.getoutputerror = lambda cmd: \
477 getoutputerror(self.var_expand(cmd,depth=2),
477 getoutputerror(self.var_expand(cmd,depth=2),
478 header=self.rc.system_header,
478 header=self.rc.system_header,
479 verbose=self.rc.system_verbose)
479 verbose=self.rc.system_verbose)
480
480
481 # RegExp for splitting line contents into pre-char//first
481 # RegExp for splitting line contents into pre-char//first
482 # word-method//rest. For clarity, each group in on one line.
482 # word-method//rest. For clarity, each group in on one line.
483
483
484 # WARNING: update the regexp if the above escapes are changed, as they
484 # WARNING: update the regexp if the above escapes are changed, as they
485 # are hardwired in.
485 # are hardwired in.
486
486
487 # Don't get carried away with trying to make the autocalling catch too
487 # Don't get carried away with trying to make the autocalling catch too
488 # much: it's better to be conservative rather than to trigger hidden
488 # much: it's better to be conservative rather than to trigger hidden
489 # evals() somewhere and end up causing side effects.
489 # evals() somewhere and end up causing side effects.
490
490
491 self.line_split = re.compile(r'^([\s*,;/])'
491 self.line_split = re.compile(r'^([\s*,;/])'
492 r'([\?\w\.]+\w*\s*)'
492 r'([\?\w\.]+\w*\s*)'
493 r'(\(?.*$)')
493 r'(\(?.*$)')
494
494
495 # Original re, keep around for a while in case changes break something
495 # Original re, keep around for a while in case changes break something
496 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
496 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
497 # r'(\s*[\?\w\.]+\w*\s*)'
497 # r'(\s*[\?\w\.]+\w*\s*)'
498 # r'(\(?.*$)')
498 # r'(\(?.*$)')
499
499
500 # RegExp to identify potential function names
500 # RegExp to identify potential function names
501 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
501 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
502
502
503 # RegExp to exclude strings with this start from autocalling. In
503 # RegExp to exclude strings with this start from autocalling. In
504 # particular, all binary operators should be excluded, so that if foo
504 # particular, all binary operators should be excluded, so that if foo
505 # is callable, foo OP bar doesn't become foo(OP bar), which is
505 # is callable, foo OP bar doesn't become foo(OP bar), which is
506 # invalid. The characters '!=()' don't need to be checked for, as the
506 # invalid. The characters '!=()' don't need to be checked for, as the
507 # _prefilter routine explicitely does so, to catch direct calls and
507 # _prefilter routine explicitely does so, to catch direct calls and
508 # rebindings of existing names.
508 # rebindings of existing names.
509
509
510 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
510 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
511 # it affects the rest of the group in square brackets.
511 # it affects the rest of the group in square brackets.
512 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
512 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
513 '|^is |^not |^in |^and |^or ')
513 '|^is |^not |^in |^and |^or ')
514
514
515 # try to catch also methods for stuff in lists/tuples/dicts: off
515 # try to catch also methods for stuff in lists/tuples/dicts: off
516 # (experimental). For this to work, the line_split regexp would need
516 # (experimental). For this to work, the line_split regexp would need
517 # to be modified so it wouldn't break things at '['. That line is
517 # to be modified so it wouldn't break things at '['. That line is
518 # nasty enough that I shouldn't change it until I can test it _well_.
518 # nasty enough that I shouldn't change it until I can test it _well_.
519 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
519 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
520
520
521 # keep track of where we started running (mainly for crash post-mortem)
521 # keep track of where we started running (mainly for crash post-mortem)
522 self.starting_dir = os.getcwd()
522 self.starting_dir = os.getcwd()
523
523
524 # Various switches which can be set
524 # Various switches which can be set
525 self.CACHELENGTH = 5000 # this is cheap, it's just text
525 self.CACHELENGTH = 5000 # this is cheap, it's just text
526 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
526 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
527 self.banner2 = banner2
527 self.banner2 = banner2
528
528
529 # TraceBack handlers:
529 # TraceBack handlers:
530
530
531 # Syntax error handler.
531 # Syntax error handler.
532 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
532 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
533
533
534 # The interactive one is initialized with an offset, meaning we always
534 # The interactive one is initialized with an offset, meaning we always
535 # want to remove the topmost item in the traceback, which is our own
535 # want to remove the topmost item in the traceback, which is our own
536 # internal code. Valid modes: ['Plain','Context','Verbose']
536 # internal code. Valid modes: ['Plain','Context','Verbose']
537 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
537 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
538 color_scheme='NoColor',
538 color_scheme='NoColor',
539 tb_offset = 1)
539 tb_offset = 1)
540
540
541 # IPython itself shouldn't crash. This will produce a detailed
541 # IPython itself shouldn't crash. This will produce a detailed
542 # post-mortem if it does. But we only install the crash handler for
542 # post-mortem if it does. But we only install the crash handler for
543 # non-threaded shells, the threaded ones use a normal verbose reporter
543 # non-threaded shells, the threaded ones use a normal verbose reporter
544 # and lose the crash handler. This is because exceptions in the main
544 # and lose the crash handler. This is because exceptions in the main
545 # thread (such as in GUI code) propagate directly to sys.excepthook,
545 # thread (such as in GUI code) propagate directly to sys.excepthook,
546 # and there's no point in printing crash dumps for every user exception.
546 # and there's no point in printing crash dumps for every user exception.
547 if self.isthreaded:
547 if self.isthreaded:
548 ipCrashHandler = ultraTB.FormattedTB()
548 ipCrashHandler = ultraTB.FormattedTB()
549 else:
549 else:
550 from IPython import CrashHandler
550 from IPython import CrashHandler
551 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
551 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
552 self.set_crash_handler(ipCrashHandler)
552 self.set_crash_handler(ipCrashHandler)
553
553
554 # and add any custom exception handlers the user may have specified
554 # and add any custom exception handlers the user may have specified
555 self.set_custom_exc(*custom_exceptions)
555 self.set_custom_exc(*custom_exceptions)
556
556
557 # indentation management
557 # indentation management
558 self.autoindent = False
558 self.autoindent = False
559 self.indent_current_nsp = 0
559 self.indent_current_nsp = 0
560
560
561 # Make some aliases automatically
561 # Make some aliases automatically
562 # Prepare list of shell aliases to auto-define
562 # Prepare list of shell aliases to auto-define
563 if os.name == 'posix':
563 if os.name == 'posix':
564 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
564 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
565 'mv mv -i','rm rm -i','cp cp -i',
565 'mv mv -i','rm rm -i','cp cp -i',
566 'cat cat','less less','clear clear',
566 'cat cat','less less','clear clear',
567 # a better ls
567 # a better ls
568 'ls ls -F',
568 'ls ls -F',
569 # long ls
569 # long ls
570 'll ls -lF')
570 'll ls -lF')
571 # Extra ls aliases with color, which need special treatment on BSD
571 # Extra ls aliases with color, which need special treatment on BSD
572 # variants
572 # variants
573 ls_extra = ( # color ls
573 ls_extra = ( # color ls
574 'lc ls -F -o --color',
574 'lc ls -F -o --color',
575 # ls normal files only
575 # ls normal files only
576 'lf ls -F -o --color %l | grep ^-',
576 'lf ls -F -o --color %l | grep ^-',
577 # ls symbolic links
577 # ls symbolic links
578 'lk ls -F -o --color %l | grep ^l',
578 'lk ls -F -o --color %l | grep ^l',
579 # directories or links to directories,
579 # directories or links to directories,
580 'ldir ls -F -o --color %l | grep /$',
580 'ldir ls -F -o --color %l | grep /$',
581 # things which are executable
581 # things which are executable
582 'lx ls -F -o --color %l | grep ^-..x',
582 'lx ls -F -o --color %l | grep ^-..x',
583 )
583 )
584 # The BSDs don't ship GNU ls, so they don't understand the
584 # The BSDs don't ship GNU ls, so they don't understand the
585 # --color switch out of the box
585 # --color switch out of the box
586 if 'bsd' in sys.platform:
586 if 'bsd' in sys.platform:
587 ls_extra = ( # ls normal files only
587 ls_extra = ( # ls normal files only
588 'lf ls -lF | grep ^-',
588 'lf ls -lF | grep ^-',
589 # ls symbolic links
589 # ls symbolic links
590 'lk ls -lF | grep ^l',
590 'lk ls -lF | grep ^l',
591 # directories or links to directories,
591 # directories or links to directories,
592 'ldir ls -lF | grep /$',
592 'ldir ls -lF | grep /$',
593 # things which are executable
593 # things which are executable
594 'lx ls -lF | grep ^-..x',
594 'lx ls -lF | grep ^-..x',
595 )
595 )
596 auto_alias = auto_alias + ls_extra
596 auto_alias = auto_alias + ls_extra
597 elif os.name in ['nt','dos']:
597 elif os.name in ['nt','dos']:
598 auto_alias = ('dir dir /on', 'ls dir /on',
598 auto_alias = ('dir dir /on', 'ls dir /on',
599 'ddir dir /ad /on', 'ldir dir /ad /on',
599 'ddir dir /ad /on', 'ldir dir /ad /on',
600 'mkdir mkdir','rmdir rmdir','echo echo',
600 'mkdir mkdir','rmdir rmdir','echo echo',
601 'ren ren','cls cls','copy copy')
601 'ren ren','cls cls','copy copy')
602 else:
602 else:
603 auto_alias = ()
603 auto_alias = ()
604 self.auto_alias = [s.split(None,1) for s in auto_alias]
604 self.auto_alias = [s.split(None,1) for s in auto_alias]
605 # Call the actual (public) initializer
605 # Call the actual (public) initializer
606 self.init_auto_alias()
606 self.init_auto_alias()
607
607
608 # Produce a public API instance
608 # Produce a public API instance
609 self.api = IPython.ipapi.IPApi(self)
609 self.api = IPython.ipapi.IPApi(self)
610
610
611 # track which builtins we add, so we can clean up later
611 # track which builtins we add, so we can clean up later
612 self.builtins_added = {}
612 self.builtins_added = {}
613 # This method will add the necessary builtins for operation, but
613 # This method will add the necessary builtins for operation, but
614 # tracking what it did via the builtins_added dict.
614 # tracking what it did via the builtins_added dict.
615 self.add_builtins()
615 self.add_builtins()
616
616
617 # end __init__
617 # end __init__
618
618
619 def var_expand(self,cmd,depth=0):
619 def var_expand(self,cmd,depth=0):
620 """Expand python variables in a string.
620 """Expand python variables in a string.
621
621
622 The depth argument indicates how many frames above the caller should
622 The depth argument indicates how many frames above the caller should
623 be walked to look for the local namespace where to expand variables.
623 be walked to look for the local namespace where to expand variables.
624
624
625 The global namespace for expansion is always the user's interactive
625 The global namespace for expansion is always the user's interactive
626 namespace.
626 namespace.
627 """
627 """
628
628
629 return str(ItplNS(cmd.replace('#','\#'),
629 return str(ItplNS(cmd.replace('#','\#'),
630 self.user_ns, # globals
630 self.user_ns, # globals
631 # Skip our own frame in searching for locals:
631 # Skip our own frame in searching for locals:
632 sys._getframe(depth+1).f_locals # locals
632 sys._getframe(depth+1).f_locals # locals
633 ))
633 ))
634
634
635 def pre_config_initialization(self):
635 def pre_config_initialization(self):
636 """Pre-configuration init method
636 """Pre-configuration init method
637
637
638 This is called before the configuration files are processed to
638 This is called before the configuration files are processed to
639 prepare the services the config files might need.
639 prepare the services the config files might need.
640
640
641 self.rc already has reasonable default values at this point.
641 self.rc already has reasonable default values at this point.
642 """
642 """
643 rc = self.rc
643 rc = self.rc
644
644
645 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
645 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
646
646
647 def post_config_initialization(self):
647 def post_config_initialization(self):
648 """Post configuration init method
648 """Post configuration init method
649
649
650 This is called after the configuration files have been processed to
650 This is called after the configuration files have been processed to
651 'finalize' the initialization."""
651 'finalize' the initialization."""
652
652
653 rc = self.rc
653 rc = self.rc
654
654
655 # Object inspector
655 # Object inspector
656 self.inspector = OInspect.Inspector(OInspect.InspectColors,
656 self.inspector = OInspect.Inspector(OInspect.InspectColors,
657 PyColorize.ANSICodeColors,
657 PyColorize.ANSICodeColors,
658 'NoColor',
658 'NoColor',
659 rc.object_info_string_level)
659 rc.object_info_string_level)
660
660
661 # Load readline proper
661 # Load readline proper
662 if rc.readline:
662 if rc.readline:
663 self.init_readline()
663 self.init_readline()
664
664
665 # local shortcut, this is used a LOT
665 # local shortcut, this is used a LOT
666 self.log = self.logger.log
666 self.log = self.logger.log
667
667
668 # Initialize cache, set in/out prompts and printing system
668 # Initialize cache, set in/out prompts and printing system
669 self.outputcache = CachedOutput(self,
669 self.outputcache = CachedOutput(self,
670 rc.cache_size,
670 rc.cache_size,
671 rc.pprint,
671 rc.pprint,
672 input_sep = rc.separate_in,
672 input_sep = rc.separate_in,
673 output_sep = rc.separate_out,
673 output_sep = rc.separate_out,
674 output_sep2 = rc.separate_out2,
674 output_sep2 = rc.separate_out2,
675 ps1 = rc.prompt_in1,
675 ps1 = rc.prompt_in1,
676 ps2 = rc.prompt_in2,
676 ps2 = rc.prompt_in2,
677 ps_out = rc.prompt_out,
677 ps_out = rc.prompt_out,
678 pad_left = rc.prompts_pad_left)
678 pad_left = rc.prompts_pad_left)
679
679
680 # user may have over-ridden the default print hook:
680 # user may have over-ridden the default print hook:
681 try:
681 try:
682 self.outputcache.__class__.display = self.hooks.display
682 self.outputcache.__class__.display = self.hooks.display
683 except AttributeError:
683 except AttributeError:
684 pass
684 pass
685
685
686 # I don't like assigning globally to sys, because it means when
686 # I don't like assigning globally to sys, because it means when
687 # embedding instances, each embedded instance overrides the previous
687 # embedding instances, each embedded instance overrides the previous
688 # choice. But sys.displayhook seems to be called internally by exec,
688 # choice. But sys.displayhook seems to be called internally by exec,
689 # so I don't see a way around it. We first save the original and then
689 # so I don't see a way around it. We first save the original and then
690 # overwrite it.
690 # overwrite it.
691 self.sys_displayhook = sys.displayhook
691 self.sys_displayhook = sys.displayhook
692 sys.displayhook = self.outputcache
692 sys.displayhook = self.outputcache
693
693
694 # Set user colors (don't do it in the constructor above so that it
694 # Set user colors (don't do it in the constructor above so that it
695 # doesn't crash if colors option is invalid)
695 # doesn't crash if colors option is invalid)
696 self.magic_colors(rc.colors)
696 self.magic_colors(rc.colors)
697
697
698 # Set calling of pdb on exceptions
698 # Set calling of pdb on exceptions
699 self.call_pdb = rc.pdb
699 self.call_pdb = rc.pdb
700
700
701 # Load user aliases
701 # Load user aliases
702 for alias in rc.alias:
702 for alias in rc.alias:
703 self.magic_alias(alias)
703 self.magic_alias(alias)
704 self.hooks.late_startup_hook()
704 self.hooks.late_startup_hook()
705
705
706 batchrun = False
706 batchrun = False
707 for batchfile in [path(arg) for arg in self.rc.args
707 for batchfile in [path(arg) for arg in self.rc.args
708 if arg.lower().endswith('.ipy')]:
708 if arg.lower().endswith('.ipy')]:
709 if not batchfile.isfile():
709 if not batchfile.isfile():
710 print "No such batch file:", batchfile
710 print "No such batch file:", batchfile
711 continue
711 continue
712 self.api.runlines(batchfile.text())
712 self.api.runlines(batchfile.text())
713 batchrun = True
713 batchrun = True
714 if batchrun:
714 if batchrun:
715 self.exit_now = True
715 self.exit_now = True
716
716
717 def add_builtins(self):
717 def add_builtins(self):
718 """Store ipython references into the builtin namespace.
718 """Store ipython references into the builtin namespace.
719
719
720 Some parts of ipython operate via builtins injected here, which hold a
720 Some parts of ipython operate via builtins injected here, which hold a
721 reference to IPython itself."""
721 reference to IPython itself."""
722
722
723 # TODO: deprecate all except _ip; 'jobs' should be installed
723 # TODO: deprecate all except _ip; 'jobs' should be installed
724 # by an extension and the rest are under _ip, ipalias is redundant
724 # by an extension and the rest are under _ip, ipalias is redundant
725 builtins_new = dict(__IPYTHON__ = self,
725 builtins_new = dict(__IPYTHON__ = self,
726 ip_set_hook = self.set_hook,
726 ip_set_hook = self.set_hook,
727 jobs = self.jobs,
727 jobs = self.jobs,
728 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
728 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
729 ipalias = wrap_deprecated(self.ipalias),
729 ipalias = wrap_deprecated(self.ipalias),
730 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
730 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
731 _ip = self.api
731 _ip = self.api
732 )
732 )
733 for biname,bival in builtins_new.items():
733 for biname,bival in builtins_new.items():
734 try:
734 try:
735 # store the orignal value so we can restore it
735 # store the orignal value so we can restore it
736 self.builtins_added[biname] = __builtin__.__dict__[biname]
736 self.builtins_added[biname] = __builtin__.__dict__[biname]
737 except KeyError:
737 except KeyError:
738 # or mark that it wasn't defined, and we'll just delete it at
738 # or mark that it wasn't defined, and we'll just delete it at
739 # cleanup
739 # cleanup
740 self.builtins_added[biname] = Undefined
740 self.builtins_added[biname] = Undefined
741 __builtin__.__dict__[biname] = bival
741 __builtin__.__dict__[biname] = bival
742
742
743 # Keep in the builtins a flag for when IPython is active. We set it
743 # Keep in the builtins a flag for when IPython is active. We set it
744 # with setdefault so that multiple nested IPythons don't clobber one
744 # with setdefault so that multiple nested IPythons don't clobber one
745 # another. Each will increase its value by one upon being activated,
745 # another. Each will increase its value by one upon being activated,
746 # which also gives us a way to determine the nesting level.
746 # which also gives us a way to determine the nesting level.
747 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
747 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
748
748
749 def clean_builtins(self):
749 def clean_builtins(self):
750 """Remove any builtins which might have been added by add_builtins, or
750 """Remove any builtins which might have been added by add_builtins, or
751 restore overwritten ones to their previous values."""
751 restore overwritten ones to their previous values."""
752 for biname,bival in self.builtins_added.items():
752 for biname,bival in self.builtins_added.items():
753 if bival is Undefined:
753 if bival is Undefined:
754 del __builtin__.__dict__[biname]
754 del __builtin__.__dict__[biname]
755 else:
755 else:
756 __builtin__.__dict__[biname] = bival
756 __builtin__.__dict__[biname] = bival
757 self.builtins_added.clear()
757 self.builtins_added.clear()
758
758
759 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
759 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
760 """set_hook(name,hook) -> sets an internal IPython hook.
760 """set_hook(name,hook) -> sets an internal IPython hook.
761
761
762 IPython exposes some of its internal API as user-modifiable hooks. By
762 IPython exposes some of its internal API as user-modifiable hooks. By
763 adding your function to one of these hooks, you can modify IPython's
763 adding your function to one of these hooks, you can modify IPython's
764 behavior to call at runtime your own routines."""
764 behavior to call at runtime your own routines."""
765
765
766 # At some point in the future, this should validate the hook before it
766 # At some point in the future, this should validate the hook before it
767 # accepts it. Probably at least check that the hook takes the number
767 # accepts it. Probably at least check that the hook takes the number
768 # of args it's supposed to.
768 # of args it's supposed to.
769
769
770 f = new.instancemethod(hook,self,self.__class__)
770 f = new.instancemethod(hook,self,self.__class__)
771
771
772 # check if the hook is for strdispatcher first
772 # check if the hook is for strdispatcher first
773 if str_key is not None:
773 if str_key is not None:
774 sdp = self.strdispatchers.get(name, StrDispatch())
774 sdp = self.strdispatchers.get(name, StrDispatch())
775 sdp.add_s(str_key, f, priority )
775 sdp.add_s(str_key, f, priority )
776 self.strdispatchers[name] = sdp
776 self.strdispatchers[name] = sdp
777 return
777 return
778 if re_key is not None:
778 if re_key is not None:
779 sdp = self.strdispatchers.get(name, StrDispatch())
779 sdp = self.strdispatchers.get(name, StrDispatch())
780 sdp.add_re(re.compile(re_key), f, priority )
780 sdp.add_re(re.compile(re_key), f, priority )
781 self.strdispatchers[name] = sdp
781 self.strdispatchers[name] = sdp
782 return
782 return
783
783
784 dp = getattr(self.hooks, name, None)
784 dp = getattr(self.hooks, name, None)
785 if name not in IPython.hooks.__all__:
785 if name not in IPython.hooks.__all__:
786 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
786 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
787 if not dp:
787 if not dp:
788 dp = IPython.hooks.CommandChainDispatcher()
788 dp = IPython.hooks.CommandChainDispatcher()
789
789
790 try:
790 try:
791 dp.add(f,priority)
791 dp.add(f,priority)
792 except AttributeError:
792 except AttributeError:
793 # it was not commandchain, plain old func - replace
793 # it was not commandchain, plain old func - replace
794 dp = f
794 dp = f
795
795
796 setattr(self.hooks,name, dp)
796 setattr(self.hooks,name, dp)
797
797
798
798
799 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
799 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
800
800
801 def set_crash_handler(self,crashHandler):
801 def set_crash_handler(self,crashHandler):
802 """Set the IPython crash handler.
802 """Set the IPython crash handler.
803
803
804 This must be a callable with a signature suitable for use as
804 This must be a callable with a signature suitable for use as
805 sys.excepthook."""
805 sys.excepthook."""
806
806
807 # Install the given crash handler as the Python exception hook
807 # Install the given crash handler as the Python exception hook
808 sys.excepthook = crashHandler
808 sys.excepthook = crashHandler
809
809
810 # The instance will store a pointer to this, so that runtime code
810 # The instance will store a pointer to this, so that runtime code
811 # (such as magics) can access it. This is because during the
811 # (such as magics) can access it. This is because during the
812 # read-eval loop, it gets temporarily overwritten (to deal with GUI
812 # read-eval loop, it gets temporarily overwritten (to deal with GUI
813 # frameworks).
813 # frameworks).
814 self.sys_excepthook = sys.excepthook
814 self.sys_excepthook = sys.excepthook
815
815
816
816
817 def set_custom_exc(self,exc_tuple,handler):
817 def set_custom_exc(self,exc_tuple,handler):
818 """set_custom_exc(exc_tuple,handler)
818 """set_custom_exc(exc_tuple,handler)
819
819
820 Set a custom exception handler, which will be called if any of the
820 Set a custom exception handler, which will be called if any of the
821 exceptions in exc_tuple occur in the mainloop (specifically, in the
821 exceptions in exc_tuple occur in the mainloop (specifically, in the
822 runcode() method.
822 runcode() method.
823
823
824 Inputs:
824 Inputs:
825
825
826 - exc_tuple: a *tuple* of valid exceptions to call the defined
826 - exc_tuple: a *tuple* of valid exceptions to call the defined
827 handler for. It is very important that you use a tuple, and NOT A
827 handler for. It is very important that you use a tuple, and NOT A
828 LIST here, because of the way Python's except statement works. If
828 LIST here, because of the way Python's except statement works. If
829 you only want to trap a single exception, use a singleton tuple:
829 you only want to trap a single exception, use a singleton tuple:
830
830
831 exc_tuple == (MyCustomException,)
831 exc_tuple == (MyCustomException,)
832
832
833 - handler: this must be defined as a function with the following
833 - handler: this must be defined as a function with the following
834 basic interface: def my_handler(self,etype,value,tb).
834 basic interface: def my_handler(self,etype,value,tb).
835
835
836 This will be made into an instance method (via new.instancemethod)
836 This will be made into an instance method (via new.instancemethod)
837 of IPython itself, and it will be called if any of the exceptions
837 of IPython itself, and it will be called if any of the exceptions
838 listed in the exc_tuple are caught. If the handler is None, an
838 listed in the exc_tuple are caught. If the handler is None, an
839 internal basic one is used, which just prints basic info.
839 internal basic one is used, which just prints basic info.
840
840
841 WARNING: by putting in your own exception handler into IPython's main
841 WARNING: by putting in your own exception handler into IPython's main
842 execution loop, you run a very good chance of nasty crashes. This
842 execution loop, you run a very good chance of nasty crashes. This
843 facility should only be used if you really know what you are doing."""
843 facility should only be used if you really know what you are doing."""
844
844
845 assert type(exc_tuple)==type(()) , \
845 assert type(exc_tuple)==type(()) , \
846 "The custom exceptions must be given AS A TUPLE."
846 "The custom exceptions must be given AS A TUPLE."
847
847
848 def dummy_handler(self,etype,value,tb):
848 def dummy_handler(self,etype,value,tb):
849 print '*** Simple custom exception handler ***'
849 print '*** Simple custom exception handler ***'
850 print 'Exception type :',etype
850 print 'Exception type :',etype
851 print 'Exception value:',value
851 print 'Exception value:',value
852 print 'Traceback :',tb
852 print 'Traceback :',tb
853 print 'Source code :','\n'.join(self.buffer)
853 print 'Source code :','\n'.join(self.buffer)
854
854
855 if handler is None: handler = dummy_handler
855 if handler is None: handler = dummy_handler
856
856
857 self.CustomTB = new.instancemethod(handler,self,self.__class__)
857 self.CustomTB = new.instancemethod(handler,self,self.__class__)
858 self.custom_exceptions = exc_tuple
858 self.custom_exceptions = exc_tuple
859
859
860 def set_custom_completer(self,completer,pos=0):
860 def set_custom_completer(self,completer,pos=0):
861 """set_custom_completer(completer,pos=0)
861 """set_custom_completer(completer,pos=0)
862
862
863 Adds a new custom completer function.
863 Adds a new custom completer function.
864
864
865 The position argument (defaults to 0) is the index in the completers
865 The position argument (defaults to 0) is the index in the completers
866 list where you want the completer to be inserted."""
866 list where you want the completer to be inserted."""
867
867
868 newcomp = new.instancemethod(completer,self.Completer,
868 newcomp = new.instancemethod(completer,self.Completer,
869 self.Completer.__class__)
869 self.Completer.__class__)
870 self.Completer.matchers.insert(pos,newcomp)
870 self.Completer.matchers.insert(pos,newcomp)
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.
993 # completers can return duplicates.
994 comps = {}
994 comps = {}
995 while True:
995 while True:
996 newcomp = complete(text,state)
996 newcomp = complete(text,state)
997 if newcomp is None:
997 if newcomp is None:
998 break
998 break
999 comps[newcomp] = 1
999 comps[newcomp] = 1
1000 state += 1
1000 state += 1
1001 outcomps = comps.keys()
1001 outcomps = comps.keys()
1002 outcomps.sort()
1002 outcomps.sort()
1003 return outcomps
1003 return outcomps
1004
1004
1005 def set_completer_frame(self, frame=None):
1005 def set_completer_frame(self, frame=None):
1006 if frame:
1006 if frame:
1007 self.Completer.namespace = frame.f_locals
1007 self.Completer.namespace = frame.f_locals
1008 self.Completer.global_namespace = frame.f_globals
1008 self.Completer.global_namespace = frame.f_globals
1009 else:
1009 else:
1010 self.Completer.namespace = self.user_ns
1010 self.Completer.namespace = self.user_ns
1011 self.Completer.global_namespace = self.user_global_ns
1011 self.Completer.global_namespace = self.user_global_ns
1012
1012
1013 def init_auto_alias(self):
1013 def init_auto_alias(self):
1014 """Define some aliases automatically.
1014 """Define some aliases automatically.
1015
1015
1016 These are ALL parameter-less aliases"""
1016 These are ALL parameter-less aliases"""
1017
1017
1018 for alias,cmd in self.auto_alias:
1018 for alias,cmd in self.auto_alias:
1019 self.alias_table[alias] = (0,cmd)
1019 self.alias_table[alias] = (0,cmd)
1020
1020
1021 def alias_table_validate(self,verbose=0):
1021 def alias_table_validate(self,verbose=0):
1022 """Update information about the alias table.
1022 """Update information about the alias table.
1023
1023
1024 In particular, make sure no Python keywords/builtins are in it."""
1024 In particular, make sure no Python keywords/builtins are in it."""
1025
1025
1026 no_alias = self.no_alias
1026 no_alias = self.no_alias
1027 for k in self.alias_table.keys():
1027 for k in self.alias_table.keys():
1028 if k in no_alias:
1028 if k in no_alias:
1029 del self.alias_table[k]
1029 del self.alias_table[k]
1030 if verbose:
1030 if verbose:
1031 print ("Deleting alias <%s>, it's a Python "
1031 print ("Deleting alias <%s>, it's a Python "
1032 "keyword or builtin." % k)
1032 "keyword or builtin." % k)
1033
1033
1034 def set_autoindent(self,value=None):
1034 def set_autoindent(self,value=None):
1035 """Set the autoindent flag, checking for readline support.
1035 """Set the autoindent flag, checking for readline support.
1036
1036
1037 If called with no arguments, it acts as a toggle."""
1037 If called with no arguments, it acts as a toggle."""
1038
1038
1039 if not self.has_readline:
1039 if not self.has_readline:
1040 if os.name == 'posix':
1040 if os.name == 'posix':
1041 warn("The auto-indent feature requires the readline library")
1041 warn("The auto-indent feature requires the readline library")
1042 self.autoindent = 0
1042 self.autoindent = 0
1043 return
1043 return
1044 if value is None:
1044 if value is None:
1045 self.autoindent = not self.autoindent
1045 self.autoindent = not self.autoindent
1046 else:
1046 else:
1047 self.autoindent = value
1047 self.autoindent = value
1048
1048
1049 def rc_set_toggle(self,rc_field,value=None):
1049 def rc_set_toggle(self,rc_field,value=None):
1050 """Set or toggle a field in IPython's rc config. structure.
1050 """Set or toggle a field in IPython's rc config. structure.
1051
1051
1052 If called with no arguments, it acts as a toggle.
1052 If called with no arguments, it acts as a toggle.
1053
1053
1054 If called with a non-existent field, the resulting AttributeError
1054 If called with a non-existent field, the resulting AttributeError
1055 exception will propagate out."""
1055 exception will propagate out."""
1056
1056
1057 rc_val = getattr(self.rc,rc_field)
1057 rc_val = getattr(self.rc,rc_field)
1058 if value is None:
1058 if value is None:
1059 value = not rc_val
1059 value = not rc_val
1060 setattr(self.rc,rc_field,value)
1060 setattr(self.rc,rc_field,value)
1061
1061
1062 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1062 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1063 """Install the user configuration directory.
1063 """Install the user configuration directory.
1064
1064
1065 Can be called when running for the first time or to upgrade the user's
1065 Can be called when running for the first time or to upgrade the user's
1066 .ipython/ directory with the mode parameter. Valid modes are 'install'
1066 .ipython/ directory with the mode parameter. Valid modes are 'install'
1067 and 'upgrade'."""
1067 and 'upgrade'."""
1068
1068
1069 def wait():
1069 def wait():
1070 try:
1070 try:
1071 raw_input("Please press <RETURN> to start IPython.")
1071 raw_input("Please press <RETURN> to start IPython.")
1072 except EOFError:
1072 except EOFError:
1073 print >> Term.cout
1073 print >> Term.cout
1074 print '*'*70
1074 print '*'*70
1075
1075
1076 cwd = os.getcwd() # remember where we started
1076 cwd = os.getcwd() # remember where we started
1077 glb = glob.glob
1077 glb = glob.glob
1078 print '*'*70
1078 print '*'*70
1079 if mode == 'install':
1079 if mode == 'install':
1080 print \
1080 print \
1081 """Welcome to IPython. I will try to create a personal configuration directory
1081 """Welcome to IPython. I will try to create a personal configuration directory
1082 where you can customize many aspects of IPython's functionality in:\n"""
1082 where you can customize many aspects of IPython's functionality in:\n"""
1083 else:
1083 else:
1084 print 'I am going to upgrade your configuration in:'
1084 print 'I am going to upgrade your configuration in:'
1085
1085
1086 print ipythondir
1086 print ipythondir
1087
1087
1088 rcdirend = os.path.join('IPython','UserConfig')
1088 rcdirend = os.path.join('IPython','UserConfig')
1089 cfg = lambda d: os.path.join(d,rcdirend)
1089 cfg = lambda d: os.path.join(d,rcdirend)
1090 try:
1090 try:
1091 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1091 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1092 except IOError:
1092 except IOError:
1093 warning = """
1093 warning = """
1094 Installation error. IPython's directory was not found.
1094 Installation error. IPython's directory was not found.
1095
1095
1096 Check the following:
1096 Check the following:
1097
1097
1098 The ipython/IPython directory should be in a directory belonging to your
1098 The ipython/IPython directory should be in a directory belonging to your
1099 PYTHONPATH environment variable (that is, it should be in a directory
1099 PYTHONPATH environment variable (that is, it should be in a directory
1100 belonging to sys.path). You can copy it explicitly there or just link to it.
1100 belonging to sys.path). You can copy it explicitly there or just link to it.
1101
1101
1102 IPython will proceed with builtin defaults.
1102 IPython will proceed with builtin defaults.
1103 """
1103 """
1104 warn(warning)
1104 warn(warning)
1105 wait()
1105 wait()
1106 return
1106 return
1107
1107
1108 if mode == 'install':
1108 if mode == 'install':
1109 try:
1109 try:
1110 shutil.copytree(rcdir,ipythondir)
1110 shutil.copytree(rcdir,ipythondir)
1111 os.chdir(ipythondir)
1111 os.chdir(ipythondir)
1112 rc_files = glb("ipythonrc*")
1112 rc_files = glb("ipythonrc*")
1113 for rc_file in rc_files:
1113 for rc_file in rc_files:
1114 os.rename(rc_file,rc_file+rc_suffix)
1114 os.rename(rc_file,rc_file+rc_suffix)
1115 except:
1115 except:
1116 warning = """
1116 warning = """
1117
1117
1118 There was a problem with the installation:
1118 There was a problem with the installation:
1119 %s
1119 %s
1120 Try to correct it or contact the developers if you think it's a bug.
1120 Try to correct it or contact the developers if you think it's a bug.
1121 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1121 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1122 warn(warning)
1122 warn(warning)
1123 wait()
1123 wait()
1124 return
1124 return
1125
1125
1126 elif mode == 'upgrade':
1126 elif mode == 'upgrade':
1127 try:
1127 try:
1128 os.chdir(ipythondir)
1128 os.chdir(ipythondir)
1129 except:
1129 except:
1130 print """
1130 print """
1131 Can not upgrade: changing to directory %s failed. Details:
1131 Can not upgrade: changing to directory %s failed. Details:
1132 %s
1132 %s
1133 """ % (ipythondir,sys.exc_info()[1])
1133 """ % (ipythondir,sys.exc_info()[1])
1134 wait()
1134 wait()
1135 return
1135 return
1136 else:
1136 else:
1137 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1137 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1138 for new_full_path in sources:
1138 for new_full_path in sources:
1139 new_filename = os.path.basename(new_full_path)
1139 new_filename = os.path.basename(new_full_path)
1140 if new_filename.startswith('ipythonrc'):
1140 if new_filename.startswith('ipythonrc'):
1141 new_filename = new_filename + rc_suffix
1141 new_filename = new_filename + rc_suffix
1142 # The config directory should only contain files, skip any
1142 # The config directory should only contain files, skip any
1143 # directories which may be there (like CVS)
1143 # directories which may be there (like CVS)
1144 if os.path.isdir(new_full_path):
1144 if os.path.isdir(new_full_path):
1145 continue
1145 continue
1146 if os.path.exists(new_filename):
1146 if os.path.exists(new_filename):
1147 old_file = new_filename+'.old'
1147 old_file = new_filename+'.old'
1148 if os.path.exists(old_file):
1148 if os.path.exists(old_file):
1149 os.remove(old_file)
1149 os.remove(old_file)
1150 os.rename(new_filename,old_file)
1150 os.rename(new_filename,old_file)
1151 shutil.copy(new_full_path,new_filename)
1151 shutil.copy(new_full_path,new_filename)
1152 else:
1152 else:
1153 raise ValueError,'unrecognized mode for install:',`mode`
1153 raise ValueError,'unrecognized mode for install:',`mode`
1154
1154
1155 # Fix line-endings to those native to each platform in the config
1155 # Fix line-endings to those native to each platform in the config
1156 # directory.
1156 # directory.
1157 try:
1157 try:
1158 os.chdir(ipythondir)
1158 os.chdir(ipythondir)
1159 except:
1159 except:
1160 print """
1160 print """
1161 Problem: changing to directory %s failed.
1161 Problem: changing to directory %s failed.
1162 Details:
1162 Details:
1163 %s
1163 %s
1164
1164
1165 Some configuration files may have incorrect line endings. This should not
1165 Some configuration files may have incorrect line endings. This should not
1166 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1166 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1167 wait()
1167 wait()
1168 else:
1168 else:
1169 for fname in glb('ipythonrc*'):
1169 for fname in glb('ipythonrc*'):
1170 try:
1170 try:
1171 native_line_ends(fname,backup=0)
1171 native_line_ends(fname,backup=0)
1172 except IOError:
1172 except IOError:
1173 pass
1173 pass
1174
1174
1175 if mode == 'install':
1175 if mode == 'install':
1176 print """
1176 print """
1177 Successful installation!
1177 Successful installation!
1178
1178
1179 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1179 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1180 IPython manual (there are both HTML and PDF versions supplied with the
1180 IPython manual (there are both HTML and PDF versions supplied with the
1181 distribution) to make sure that your system environment is properly configured
1181 distribution) to make sure that your system environment is properly configured
1182 to take advantage of IPython's features.
1182 to take advantage of IPython's features.
1183
1183
1184 Important note: the configuration system has changed! The old system is
1184 Important note: the configuration system has changed! The old system is
1185 still in place, but its setting may be partly overridden by the settings in
1185 still in place, but its setting may be partly overridden by the settings in
1186 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1186 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1187 if some of the new settings bother you.
1187 if some of the new settings bother you.
1188
1188
1189 """
1189 """
1190 else:
1190 else:
1191 print """
1191 print """
1192 Successful upgrade!
1192 Successful upgrade!
1193
1193
1194 All files in your directory:
1194 All files in your directory:
1195 %(ipythondir)s
1195 %(ipythondir)s
1196 which would have been overwritten by the upgrade were backed up with a .old
1196 which would have been overwritten by the upgrade were backed up with a .old
1197 extension. If you had made particular customizations in those files you may
1197 extension. If you had made particular customizations in those files you may
1198 want to merge them back into the new files.""" % locals()
1198 want to merge them back into the new files.""" % locals()
1199 wait()
1199 wait()
1200 os.chdir(cwd)
1200 os.chdir(cwd)
1201 # end user_setup()
1201 # end user_setup()
1202
1202
1203 def atexit_operations(self):
1203 def atexit_operations(self):
1204 """This will be executed at the time of exit.
1204 """This will be executed at the time of exit.
1205
1205
1206 Saving of persistent data should be performed here. """
1206 Saving of persistent data should be performed here. """
1207
1207
1208 #print '*** IPython exit cleanup ***' # dbg
1208 #print '*** IPython exit cleanup ***' # dbg
1209 # input history
1209 # input history
1210 self.savehist()
1210 self.savehist()
1211
1211
1212 # Cleanup all tempfiles left around
1212 # Cleanup all tempfiles left around
1213 for tfile in self.tempfiles:
1213 for tfile in self.tempfiles:
1214 try:
1214 try:
1215 os.unlink(tfile)
1215 os.unlink(tfile)
1216 except OSError:
1216 except OSError:
1217 pass
1217 pass
1218
1218
1219 # save the "persistent data" catch-all dictionary
1219 # save the "persistent data" catch-all dictionary
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 history_saving_wrapper(self, func):
1230 def history_saving_wrapper(self, func):
1231 """ Wrap func for readline history saving
1231 """ Wrap func for readline history saving
1232
1232
1233 Convert func into callable that saves & restores
1233 Convert func into callable that saves & restores
1234 history around the call """
1234 history around the call """
1235
1235
1236 if not self.has_readline:
1236 if not self.has_readline:
1237 return func
1237 return func
1238
1238
1239 def wrapper():
1239 def wrapper():
1240 self.savehist()
1240 self.savehist()
1241 try:
1241 try:
1242 func()
1242 func()
1243 finally:
1243 finally:
1244 readline.read_history_file(self.histfile)
1244 readline.read_history_file(self.histfile)
1245 return wrapper
1245 return wrapper
1246
1246
1247
1247
1248 def pre_readline(self):
1248 def pre_readline(self):
1249 """readline hook to be used at the start of each line.
1249 """readline hook to be used at the start of each line.
1250
1250
1251 Currently it handles auto-indent only."""
1251 Currently it handles auto-indent only."""
1252
1252
1253 #debugx('self.indent_current_nsp','pre_readline:')
1253 #debugx('self.indent_current_nsp','pre_readline:')
1254 self.readline.insert_text(self.indent_current_str())
1254 self.readline.insert_text(self.indent_current_str())
1255
1255
1256 def init_readline(self):
1256 def init_readline(self):
1257 """Command history completion/saving/reloading."""
1257 """Command history completion/saving/reloading."""
1258
1258
1259 import IPython.rlineimpl as readline
1259 import IPython.rlineimpl as readline
1260 if not readline.have_readline:
1260 if not readline.have_readline:
1261 self.has_readline = 0
1261 self.has_readline = 0
1262 self.readline = None
1262 self.readline = None
1263 # no point in bugging windows users with this every time:
1263 # no point in bugging windows users with this every time:
1264 warn('Readline services not available on this platform.')
1264 warn('Readline services not available on this platform.')
1265 else:
1265 else:
1266 sys.modules['readline'] = readline
1266 sys.modules['readline'] = readline
1267 import atexit
1267 import atexit
1268 from IPython.completer import IPCompleter
1268 from IPython.completer import IPCompleter
1269 self.Completer = IPCompleter(self,
1269 self.Completer = IPCompleter(self,
1270 self.user_ns,
1270 self.user_ns,
1271 self.user_global_ns,
1271 self.user_global_ns,
1272 self.rc.readline_omit__names,
1272 self.rc.readline_omit__names,
1273 self.alias_table)
1273 self.alias_table)
1274 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1274 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1275 self.strdispatchers['complete_command'] = sdisp
1275 self.strdispatchers['complete_command'] = sdisp
1276 self.Completer.custom_completers = sdisp
1276 self.Completer.custom_completers = sdisp
1277 # Platform-specific configuration
1277 # Platform-specific configuration
1278 if os.name == 'nt':
1278 if os.name == 'nt':
1279 self.readline_startup_hook = readline.set_pre_input_hook
1279 self.readline_startup_hook = readline.set_pre_input_hook
1280 else:
1280 else:
1281 self.readline_startup_hook = readline.set_startup_hook
1281 self.readline_startup_hook = readline.set_startup_hook
1282
1282
1283 # Load user's initrc file (readline config)
1283 # Load user's initrc file (readline config)
1284 inputrc_name = os.environ.get('INPUTRC')
1284 inputrc_name = os.environ.get('INPUTRC')
1285 if inputrc_name is None:
1285 if inputrc_name is None:
1286 home_dir = get_home_dir()
1286 home_dir = get_home_dir()
1287 if home_dir is not None:
1287 if home_dir is not None:
1288 inputrc_name = os.path.join(home_dir,'.inputrc')
1288 inputrc_name = os.path.join(home_dir,'.inputrc')
1289 if os.path.isfile(inputrc_name):
1289 if os.path.isfile(inputrc_name):
1290 try:
1290 try:
1291 readline.read_init_file(inputrc_name)
1291 readline.read_init_file(inputrc_name)
1292 except:
1292 except:
1293 warn('Problems reading readline initialization file <%s>'
1293 warn('Problems reading readline initialization file <%s>'
1294 % inputrc_name)
1294 % inputrc_name)
1295
1295
1296 self.has_readline = 1
1296 self.has_readline = 1
1297 self.readline = readline
1297 self.readline = readline
1298 # save this in sys so embedded copies can restore it properly
1298 # save this in sys so embedded copies can restore it properly
1299 sys.ipcompleter = self.Completer.complete
1299 sys.ipcompleter = self.Completer.complete
1300 readline.set_completer(self.Completer.complete)
1300 readline.set_completer(self.Completer.complete)
1301
1301
1302 # Configure readline according to user's prefs
1302 # Configure readline according to user's prefs
1303 for rlcommand in self.rc.readline_parse_and_bind:
1303 for rlcommand in self.rc.readline_parse_and_bind:
1304 readline.parse_and_bind(rlcommand)
1304 readline.parse_and_bind(rlcommand)
1305
1305
1306 # remove some chars from the delimiters list
1306 # remove some chars from the delimiters list
1307 delims = readline.get_completer_delims()
1307 delims = readline.get_completer_delims()
1308 delims = delims.translate(string._idmap,
1308 delims = delims.translate(string._idmap,
1309 self.rc.readline_remove_delims)
1309 self.rc.readline_remove_delims)
1310 readline.set_completer_delims(delims)
1310 readline.set_completer_delims(delims)
1311 # otherwise we end up with a monster history after a while:
1311 # otherwise we end up with a monster history after a while:
1312 readline.set_history_length(1000)
1312 readline.set_history_length(1000)
1313 try:
1313 try:
1314 #print '*** Reading readline history' # dbg
1314 #print '*** Reading readline history' # dbg
1315 readline.read_history_file(self.histfile)
1315 readline.read_history_file(self.histfile)
1316 except IOError:
1316 except IOError:
1317 pass # It doesn't exist yet.
1317 pass # It doesn't exist yet.
1318
1318
1319 atexit.register(self.atexit_operations)
1319 atexit.register(self.atexit_operations)
1320 del atexit
1320 del atexit
1321
1321
1322 # Configure auto-indent for all platforms
1322 # Configure auto-indent for all platforms
1323 self.set_autoindent(self.rc.autoindent)
1323 self.set_autoindent(self.rc.autoindent)
1324
1324
1325 def ask_yes_no(self,prompt,default=True):
1325 def ask_yes_no(self,prompt,default=True):
1326 if self.rc.quiet:
1326 if self.rc.quiet:
1327 return True
1327 return True
1328 return ask_yes_no(prompt,default)
1328 return ask_yes_no(prompt,default)
1329
1329
1330 def _should_recompile(self,e):
1330 def _should_recompile(self,e):
1331 """Utility routine for edit_syntax_error"""
1331 """Utility routine for edit_syntax_error"""
1332
1332
1333 if e.filename in ('<ipython console>','<input>','<string>',
1333 if e.filename in ('<ipython console>','<input>','<string>',
1334 '<console>','<BackgroundJob compilation>',
1334 '<console>','<BackgroundJob compilation>',
1335 None):
1335 None):
1336
1336
1337 return False
1337 return False
1338 try:
1338 try:
1339 if (self.rc.autoedit_syntax and
1339 if (self.rc.autoedit_syntax and
1340 not self.ask_yes_no('Return to editor to correct syntax error? '
1340 not self.ask_yes_no('Return to editor to correct syntax error? '
1341 '[Y/n] ','y')):
1341 '[Y/n] ','y')):
1342 return False
1342 return False
1343 except EOFError:
1343 except EOFError:
1344 return False
1344 return False
1345
1345
1346 def int0(x):
1346 def int0(x):
1347 try:
1347 try:
1348 return int(x)
1348 return int(x)
1349 except TypeError:
1349 except TypeError:
1350 return 0
1350 return 0
1351 # always pass integer line and offset values to editor hook
1351 # always pass integer line and offset values to editor hook
1352 self.hooks.fix_error_editor(e.filename,
1352 self.hooks.fix_error_editor(e.filename,
1353 int0(e.lineno),int0(e.offset),e.msg)
1353 int0(e.lineno),int0(e.offset),e.msg)
1354 return True
1354 return True
1355
1355
1356 def edit_syntax_error(self):
1356 def edit_syntax_error(self):
1357 """The bottom half of the syntax error handler called in the main loop.
1357 """The bottom half of the syntax error handler called in the main loop.
1358
1358
1359 Loop until syntax error is fixed or user cancels.
1359 Loop until syntax error is fixed or user cancels.
1360 """
1360 """
1361
1361
1362 while self.SyntaxTB.last_syntax_error:
1362 while self.SyntaxTB.last_syntax_error:
1363 # copy and clear last_syntax_error
1363 # copy and clear last_syntax_error
1364 err = self.SyntaxTB.clear_err_state()
1364 err = self.SyntaxTB.clear_err_state()
1365 if not self._should_recompile(err):
1365 if not self._should_recompile(err):
1366 return
1366 return
1367 try:
1367 try:
1368 # may set last_syntax_error again if a SyntaxError is raised
1368 # may set last_syntax_error again if a SyntaxError is raised
1369 self.safe_execfile(err.filename,self.user_ns)
1369 self.safe_execfile(err.filename,self.user_ns)
1370 except:
1370 except:
1371 self.showtraceback()
1371 self.showtraceback()
1372 else:
1372 else:
1373 try:
1373 try:
1374 f = file(err.filename)
1374 f = file(err.filename)
1375 try:
1375 try:
1376 sys.displayhook(f.read())
1376 sys.displayhook(f.read())
1377 finally:
1377 finally:
1378 f.close()
1378 f.close()
1379 except:
1379 except:
1380 self.showtraceback()
1380 self.showtraceback()
1381
1381
1382 def showsyntaxerror(self, filename=None):
1382 def showsyntaxerror(self, filename=None):
1383 """Display the syntax error that just occurred.
1383 """Display the syntax error that just occurred.
1384
1384
1385 This doesn't display a stack trace because there isn't one.
1385 This doesn't display a stack trace because there isn't one.
1386
1386
1387 If a filename is given, it is stuffed in the exception instead
1387 If a filename is given, it is stuffed in the exception instead
1388 of what was there before (because Python's parser always uses
1388 of what was there before (because Python's parser always uses
1389 "<string>" when reading from a string).
1389 "<string>" when reading from a string).
1390 """
1390 """
1391 etype, value, last_traceback = sys.exc_info()
1391 etype, value, last_traceback = sys.exc_info()
1392
1392
1393 # See note about these variables in showtraceback() below
1393 # See note about these variables in showtraceback() below
1394 sys.last_type = etype
1394 sys.last_type = etype
1395 sys.last_value = value
1395 sys.last_value = value
1396 sys.last_traceback = last_traceback
1396 sys.last_traceback = last_traceback
1397
1397
1398 if filename and etype is SyntaxError:
1398 if filename and etype is SyntaxError:
1399 # Work hard to stuff the correct filename in the exception
1399 # Work hard to stuff the correct filename in the exception
1400 try:
1400 try:
1401 msg, (dummy_filename, lineno, offset, line) = value
1401 msg, (dummy_filename, lineno, offset, line) = value
1402 except:
1402 except:
1403 # Not the format we expect; leave it alone
1403 # Not the format we expect; leave it alone
1404 pass
1404 pass
1405 else:
1405 else:
1406 # Stuff in the right filename
1406 # Stuff in the right filename
1407 try:
1407 try:
1408 # Assume SyntaxError is a class exception
1408 # Assume SyntaxError is a class exception
1409 value = SyntaxError(msg, (filename, lineno, offset, line))
1409 value = SyntaxError(msg, (filename, lineno, offset, line))
1410 except:
1410 except:
1411 # If that failed, assume SyntaxError is a string
1411 # If that failed, assume SyntaxError is a string
1412 value = msg, (filename, lineno, offset, line)
1412 value = msg, (filename, lineno, offset, line)
1413 self.SyntaxTB(etype,value,[])
1413 self.SyntaxTB(etype,value,[])
1414
1414
1415 def debugger(self,force=False):
1415 def debugger(self,force=False):
1416 """Call the pydb/pdb debugger.
1416 """Call the pydb/pdb debugger.
1417
1417
1418 Keywords:
1418 Keywords:
1419
1419
1420 - force(False): by default, this routine checks the instance call_pdb
1420 - force(False): by default, this routine checks the instance call_pdb
1421 flag and does not actually invoke the debugger if the flag is false.
1421 flag and does not actually invoke the debugger if the flag is false.
1422 The 'force' option forces the debugger to activate even if the flag
1422 The 'force' option forces the debugger to activate even if the flag
1423 is false.
1423 is false.
1424 """
1424 """
1425
1425
1426 if not (force or self.call_pdb):
1426 if not (force or self.call_pdb):
1427 return
1427 return
1428
1428
1429 if not hasattr(sys,'last_traceback'):
1429 if not hasattr(sys,'last_traceback'):
1430 error('No traceback has been produced, nothing to debug.')
1430 error('No traceback has been produced, nothing to debug.')
1431 return
1431 return
1432
1432
1433 have_pydb = False
1433 have_pydb = False
1434 # use pydb if available
1434 # use pydb if available
1435 try:
1435 try:
1436 from pydb import pm
1436 from pydb import pm
1437 have_pydb = True
1437 have_pydb = True
1438 except ImportError:
1438 except ImportError:
1439 pass
1439 pass
1440 if not have_pydb:
1440 if not have_pydb:
1441 # fallback to our internal debugger
1441 # fallback to our internal debugger
1442 pm = lambda : self.InteractiveTB.debugger(force=True)
1442 pm = lambda : self.InteractiveTB.debugger(force=True)
1443 self.history_saving_wrapper(pm)()
1443 self.history_saving_wrapper(pm)()
1444
1444
1445 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1445 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1446 """Display the exception that just occurred.
1446 """Display the exception that just occurred.
1447
1447
1448 If nothing is known about the exception, this is the method which
1448 If nothing is known about the exception, this is the method which
1449 should be used throughout the code for presenting user tracebacks,
1449 should be used throughout the code for presenting user tracebacks,
1450 rather than directly invoking the InteractiveTB object.
1450 rather than directly invoking the InteractiveTB object.
1451
1451
1452 A specific showsyntaxerror() also exists, but this method can take
1452 A specific showsyntaxerror() also exists, but this method can take
1453 care of calling it if needed, so unless you are explicitly catching a
1453 care of calling it if needed, so unless you are explicitly catching a
1454 SyntaxError exception, don't try to analyze the stack manually and
1454 SyntaxError exception, don't try to analyze the stack manually and
1455 simply call this method."""
1455 simply call this method."""
1456
1456
1457 # Though this won't be called by syntax errors in the input line,
1457 # Though this won't be called by syntax errors in the input line,
1458 # there may be SyntaxError cases whith imported code.
1458 # there may be SyntaxError cases whith imported code.
1459 if exc_tuple is None:
1459 if exc_tuple is None:
1460 etype, value, tb = sys.exc_info()
1460 etype, value, tb = sys.exc_info()
1461 else:
1461 else:
1462 etype, value, tb = exc_tuple
1462 etype, value, tb = exc_tuple
1463
1463 if etype is SyntaxError:
1464 if etype is SyntaxError:
1464 self.showsyntaxerror(filename)
1465 self.showsyntaxerror(filename)
1465 else:
1466 else:
1466 # WARNING: these variables are somewhat deprecated and not
1467 # WARNING: these variables are somewhat deprecated and not
1467 # necessarily safe to use in a threaded environment, but tools
1468 # necessarily safe to use in a threaded environment, but tools
1468 # like pdb depend on their existence, so let's set them. If we
1469 # like pdb depend on their existence, so let's set them. If we
1469 # find problems in the field, we'll need to revisit their use.
1470 # find problems in the field, we'll need to revisit their use.
1470 sys.last_type = etype
1471 sys.last_type = etype
1471 sys.last_value = value
1472 sys.last_value = value
1472 sys.last_traceback = tb
1473 sys.last_traceback = tb
1473
1474
1474 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1475 if etype in self.custom_exceptions:
1475 if self.InteractiveTB.call_pdb and self.has_readline:
1476 self.CustomTB(etype,value,tb)
1476 # pdb mucks up readline, fix it back
1477 else:
1477 self.readline.set_completer(self.Completer.complete)
1478 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1479 if self.InteractiveTB.call_pdb and self.has_readline:
1480 # pdb mucks up readline, fix it back
1481 self.readline.set_completer(self.Completer.complete)
1478
1482
1479 def mainloop(self,banner=None):
1483 def mainloop(self,banner=None):
1480 """Creates the local namespace and starts the mainloop.
1484 """Creates the local namespace and starts the mainloop.
1481
1485
1482 If an optional banner argument is given, it will override the
1486 If an optional banner argument is given, it will override the
1483 internally created default banner."""
1487 internally created default banner."""
1484
1488
1485 if self.rc.c: # Emulate Python's -c option
1489 if self.rc.c: # Emulate Python's -c option
1486 self.exec_init_cmd()
1490 self.exec_init_cmd()
1487 if banner is None:
1491 if banner is None:
1488 if not self.rc.banner:
1492 if not self.rc.banner:
1489 banner = ''
1493 banner = ''
1490 # banner is string? Use it directly!
1494 # banner is string? Use it directly!
1491 elif isinstance(self.rc.banner,basestring):
1495 elif isinstance(self.rc.banner,basestring):
1492 banner = self.rc.banner
1496 banner = self.rc.banner
1493 else:
1497 else:
1494 banner = self.BANNER+self.banner2
1498 banner = self.BANNER+self.banner2
1495
1499
1496 self.interact(banner)
1500 self.interact(banner)
1497
1501
1498 def exec_init_cmd(self):
1502 def exec_init_cmd(self):
1499 """Execute a command given at the command line.
1503 """Execute a command given at the command line.
1500
1504
1501 This emulates Python's -c option."""
1505 This emulates Python's -c option."""
1502
1506
1503 #sys.argv = ['-c']
1507 #sys.argv = ['-c']
1504 self.push(self.rc.c)
1508 self.push(self.rc.c)
1505
1509
1506 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1510 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1507 """Embeds IPython into a running python program.
1511 """Embeds IPython into a running python program.
1508
1512
1509 Input:
1513 Input:
1510
1514
1511 - header: An optional header message can be specified.
1515 - header: An optional header message can be specified.
1512
1516
1513 - local_ns, global_ns: working namespaces. If given as None, the
1517 - local_ns, global_ns: working namespaces. If given as None, the
1514 IPython-initialized one is updated with __main__.__dict__, so that
1518 IPython-initialized one is updated with __main__.__dict__, so that
1515 program variables become visible but user-specific configuration
1519 program variables become visible but user-specific configuration
1516 remains possible.
1520 remains possible.
1517
1521
1518 - stack_depth: specifies how many levels in the stack to go to
1522 - stack_depth: specifies how many levels in the stack to go to
1519 looking for namespaces (when local_ns and global_ns are None). This
1523 looking for namespaces (when local_ns and global_ns are None). This
1520 allows an intermediate caller to make sure that this function gets
1524 allows an intermediate caller to make sure that this function gets
1521 the namespace from the intended level in the stack. By default (0)
1525 the namespace from the intended level in the stack. By default (0)
1522 it will get its locals and globals from the immediate caller.
1526 it will get its locals and globals from the immediate caller.
1523
1527
1524 Warning: it's possible to use this in a program which is being run by
1528 Warning: it's possible to use this in a program which is being run by
1525 IPython itself (via %run), but some funny things will happen (a few
1529 IPython itself (via %run), but some funny things will happen (a few
1526 globals get overwritten). In the future this will be cleaned up, as
1530 globals get overwritten). In the future this will be cleaned up, as
1527 there is no fundamental reason why it can't work perfectly."""
1531 there is no fundamental reason why it can't work perfectly."""
1528
1532
1529 # Get locals and globals from caller
1533 # Get locals and globals from caller
1530 if local_ns is None or global_ns is None:
1534 if local_ns is None or global_ns is None:
1531 call_frame = sys._getframe(stack_depth).f_back
1535 call_frame = sys._getframe(stack_depth).f_back
1532
1536
1533 if local_ns is None:
1537 if local_ns is None:
1534 local_ns = call_frame.f_locals
1538 local_ns = call_frame.f_locals
1535 if global_ns is None:
1539 if global_ns is None:
1536 global_ns = call_frame.f_globals
1540 global_ns = call_frame.f_globals
1537
1541
1538 # Update namespaces and fire up interpreter
1542 # Update namespaces and fire up interpreter
1539
1543
1540 # The global one is easy, we can just throw it in
1544 # The global one is easy, we can just throw it in
1541 self.user_global_ns = global_ns
1545 self.user_global_ns = global_ns
1542
1546
1543 # but the user/local one is tricky: ipython needs it to store internal
1547 # but the user/local one is tricky: ipython needs it to store internal
1544 # data, but we also need the locals. We'll copy locals in the user
1548 # data, but we also need the locals. We'll copy locals in the user
1545 # one, but will track what got copied so we can delete them at exit.
1549 # one, but will track what got copied so we can delete them at exit.
1546 # This is so that a later embedded call doesn't see locals from a
1550 # This is so that a later embedded call doesn't see locals from a
1547 # previous call (which most likely existed in a separate scope).
1551 # previous call (which most likely existed in a separate scope).
1548 local_varnames = local_ns.keys()
1552 local_varnames = local_ns.keys()
1549 self.user_ns.update(local_ns)
1553 self.user_ns.update(local_ns)
1550
1554
1551 # Patch for global embedding to make sure that things don't overwrite
1555 # Patch for global embedding to make sure that things don't overwrite
1552 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1556 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1553 # FIXME. Test this a bit more carefully (the if.. is new)
1557 # FIXME. Test this a bit more carefully (the if.. is new)
1554 if local_ns is None and global_ns is None:
1558 if local_ns is None and global_ns is None:
1555 self.user_global_ns.update(__main__.__dict__)
1559 self.user_global_ns.update(__main__.__dict__)
1556
1560
1557 # make sure the tab-completer has the correct frame information, so it
1561 # make sure the tab-completer has the correct frame information, so it
1558 # actually completes using the frame's locals/globals
1562 # actually completes using the frame's locals/globals
1559 self.set_completer_frame()
1563 self.set_completer_frame()
1560
1564
1561 # before activating the interactive mode, we need to make sure that
1565 # before activating the interactive mode, we need to make sure that
1562 # all names in the builtin namespace needed by ipython point to
1566 # all names in the builtin namespace needed by ipython point to
1563 # ourselves, and not to other instances.
1567 # ourselves, and not to other instances.
1564 self.add_builtins()
1568 self.add_builtins()
1565
1569
1566 self.interact(header)
1570 self.interact(header)
1567
1571
1568 # now, purge out the user namespace from anything we might have added
1572 # now, purge out the user namespace from anything we might have added
1569 # from the caller's local namespace
1573 # from the caller's local namespace
1570 delvar = self.user_ns.pop
1574 delvar = self.user_ns.pop
1571 for var in local_varnames:
1575 for var in local_varnames:
1572 delvar(var,None)
1576 delvar(var,None)
1573 # and clean builtins we may have overridden
1577 # and clean builtins we may have overridden
1574 self.clean_builtins()
1578 self.clean_builtins()
1575
1579
1576 def interact(self, banner=None):
1580 def interact(self, banner=None):
1577 """Closely emulate the interactive Python console.
1581 """Closely emulate the interactive Python console.
1578
1582
1579 The optional banner argument specify the banner to print
1583 The optional banner argument specify the banner to print
1580 before the first interaction; by default it prints a banner
1584 before the first interaction; by default it prints a banner
1581 similar to the one printed by the real Python interpreter,
1585 similar to the one printed by the real Python interpreter,
1582 followed by the current class name in parentheses (so as not
1586 followed by the current class name in parentheses (so as not
1583 to confuse this with the real interpreter -- since it's so
1587 to confuse this with the real interpreter -- since it's so
1584 close!).
1588 close!).
1585
1589
1586 """
1590 """
1587
1591
1588 if self.exit_now:
1592 if self.exit_now:
1589 # batch run -> do not interact
1593 # batch run -> do not interact
1590 return
1594 return
1591 cprt = 'Type "copyright", "credits" or "license" for more information.'
1595 cprt = 'Type "copyright", "credits" or "license" for more information.'
1592 if banner is None:
1596 if banner is None:
1593 self.write("Python %s on %s\n%s\n(%s)\n" %
1597 self.write("Python %s on %s\n%s\n(%s)\n" %
1594 (sys.version, sys.platform, cprt,
1598 (sys.version, sys.platform, cprt,
1595 self.__class__.__name__))
1599 self.__class__.__name__))
1596 else:
1600 else:
1597 self.write(banner)
1601 self.write(banner)
1598
1602
1599 more = 0
1603 more = 0
1600
1604
1601 # Mark activity in the builtins
1605 # Mark activity in the builtins
1602 __builtin__.__dict__['__IPYTHON__active'] += 1
1606 __builtin__.__dict__['__IPYTHON__active'] += 1
1603
1607
1604 # exit_now is set by a call to %Exit or %Quit
1608 # exit_now is set by a call to %Exit or %Quit
1605 while not self.exit_now:
1609 while not self.exit_now:
1606 if more:
1610 if more:
1607 prompt = self.hooks.generate_prompt(True)
1611 prompt = self.hooks.generate_prompt(True)
1608 if self.autoindent:
1612 if self.autoindent:
1609 self.readline_startup_hook(self.pre_readline)
1613 self.readline_startup_hook(self.pre_readline)
1610 else:
1614 else:
1611 prompt = self.hooks.generate_prompt(False)
1615 prompt = self.hooks.generate_prompt(False)
1612 try:
1616 try:
1613 line = self.raw_input(prompt,more)
1617 line = self.raw_input(prompt,more)
1614 if self.exit_now:
1618 if self.exit_now:
1615 # quick exit on sys.std[in|out] close
1619 # quick exit on sys.std[in|out] close
1616 break
1620 break
1617 if self.autoindent:
1621 if self.autoindent:
1618 self.readline_startup_hook(None)
1622 self.readline_startup_hook(None)
1619 except KeyboardInterrupt:
1623 except KeyboardInterrupt:
1620 self.write('\nKeyboardInterrupt\n')
1624 self.write('\nKeyboardInterrupt\n')
1621 self.resetbuffer()
1625 self.resetbuffer()
1622 # keep cache in sync with the prompt counter:
1626 # keep cache in sync with the prompt counter:
1623 self.outputcache.prompt_count -= 1
1627 self.outputcache.prompt_count -= 1
1624
1628
1625 if self.autoindent:
1629 if self.autoindent:
1626 self.indent_current_nsp = 0
1630 self.indent_current_nsp = 0
1627 more = 0
1631 more = 0
1628 except EOFError:
1632 except EOFError:
1629 if self.autoindent:
1633 if self.autoindent:
1630 self.readline_startup_hook(None)
1634 self.readline_startup_hook(None)
1631 self.write('\n')
1635 self.write('\n')
1632 self.exit()
1636 self.exit()
1633 except bdb.BdbQuit:
1637 except bdb.BdbQuit:
1634 warn('The Python debugger has exited with a BdbQuit exception.\n'
1638 warn('The Python debugger has exited with a BdbQuit exception.\n'
1635 'Because of how pdb handles the stack, it is impossible\n'
1639 'Because of how pdb handles the stack, it is impossible\n'
1636 'for IPython to properly format this particular exception.\n'
1640 'for IPython to properly format this particular exception.\n'
1637 'IPython will resume normal operation.')
1641 'IPython will resume normal operation.')
1638 except:
1642 except:
1639 # exceptions here are VERY RARE, but they can be triggered
1643 # exceptions here are VERY RARE, but they can be triggered
1640 # asynchronously by signal handlers, for example.
1644 # asynchronously by signal handlers, for example.
1641 self.showtraceback()
1645 self.showtraceback()
1642 else:
1646 else:
1643 more = self.push(line)
1647 more = self.push(line)
1644 if (self.SyntaxTB.last_syntax_error and
1648 if (self.SyntaxTB.last_syntax_error and
1645 self.rc.autoedit_syntax):
1649 self.rc.autoedit_syntax):
1646 self.edit_syntax_error()
1650 self.edit_syntax_error()
1647
1651
1648 # We are off again...
1652 # We are off again...
1649 __builtin__.__dict__['__IPYTHON__active'] -= 1
1653 __builtin__.__dict__['__IPYTHON__active'] -= 1
1650
1654
1651 def excepthook(self, etype, value, tb):
1655 def excepthook(self, etype, value, tb):
1652 """One more defense for GUI apps that call sys.excepthook.
1656 """One more defense for GUI apps that call sys.excepthook.
1653
1657
1654 GUI frameworks like wxPython trap exceptions and call
1658 GUI frameworks like wxPython trap exceptions and call
1655 sys.excepthook themselves. I guess this is a feature that
1659 sys.excepthook themselves. I guess this is a feature that
1656 enables them to keep running after exceptions that would
1660 enables them to keep running after exceptions that would
1657 otherwise kill their mainloop. This is a bother for IPython
1661 otherwise kill their mainloop. This is a bother for IPython
1658 which excepts to catch all of the program exceptions with a try:
1662 which excepts to catch all of the program exceptions with a try:
1659 except: statement.
1663 except: statement.
1660
1664
1661 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1665 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1662 any app directly invokes sys.excepthook, it will look to the user like
1666 any app directly invokes sys.excepthook, it will look to the user like
1663 IPython crashed. In order to work around this, we can disable the
1667 IPython crashed. In order to work around this, we can disable the
1664 CrashHandler and replace it with this excepthook instead, which prints a
1668 CrashHandler and replace it with this excepthook instead, which prints a
1665 regular traceback using our InteractiveTB. In this fashion, apps which
1669 regular traceback using our InteractiveTB. In this fashion, apps which
1666 call sys.excepthook will generate a regular-looking exception from
1670 call sys.excepthook will generate a regular-looking exception from
1667 IPython, and the CrashHandler will only be triggered by real IPython
1671 IPython, and the CrashHandler will only be triggered by real IPython
1668 crashes.
1672 crashes.
1669
1673
1670 This hook should be used sparingly, only in places which are not likely
1674 This hook should be used sparingly, only in places which are not likely
1671 to be true IPython errors.
1675 to be true IPython errors.
1672 """
1676 """
1673 self.showtraceback((etype,value,tb),tb_offset=0)
1677 self.showtraceback((etype,value,tb),tb_offset=0)
1674
1678
1675 def expand_aliases(self,fn,rest):
1679 def expand_aliases(self,fn,rest):
1676 """ Expand multiple levels of aliases:
1680 """ Expand multiple levels of aliases:
1677
1681
1678 if:
1682 if:
1679
1683
1680 alias foo bar /tmp
1684 alias foo bar /tmp
1681 alias baz foo
1685 alias baz foo
1682
1686
1683 then:
1687 then:
1684
1688
1685 baz huhhahhei -> bar /tmp huhhahhei
1689 baz huhhahhei -> bar /tmp huhhahhei
1686
1690
1687 """
1691 """
1688 line = fn + " " + rest
1692 line = fn + " " + rest
1689
1693
1690 done = Set()
1694 done = Set()
1691 while 1:
1695 while 1:
1692 pre,fn,rest = self.split_user_input(line)
1696 pre,fn,rest = self.split_user_input(line)
1693 if fn in self.alias_table:
1697 if fn in self.alias_table:
1694 if fn in done:
1698 if fn in done:
1695 warn("Cyclic alias definition, repeated '%s'" % fn)
1699 warn("Cyclic alias definition, repeated '%s'" % fn)
1696 return ""
1700 return ""
1697 done.add(fn)
1701 done.add(fn)
1698
1702
1699 l2 = self.transform_alias(fn,rest)
1703 l2 = self.transform_alias(fn,rest)
1700 # dir -> dir
1704 # dir -> dir
1701 # print "alias",line, "->",l2 #dbg
1705 # print "alias",line, "->",l2 #dbg
1702 if l2 == line:
1706 if l2 == line:
1703 break
1707 break
1704 # ls -> ls -F should not recurse forever
1708 # ls -> ls -F should not recurse forever
1705 if l2.split(None,1)[0] == line.split(None,1)[0]:
1709 if l2.split(None,1)[0] == line.split(None,1)[0]:
1706 line = l2
1710 line = l2
1707 break
1711 break
1708
1712
1709 line=l2
1713 line=l2
1710
1714
1711
1715
1712 # print "al expand to",line #dbg
1716 # print "al expand to",line #dbg
1713 else:
1717 else:
1714 break
1718 break
1715
1719
1716 return line
1720 return line
1717
1721
1718 def transform_alias(self, alias,rest=''):
1722 def transform_alias(self, alias,rest=''):
1719 """ Transform alias to system command string.
1723 """ Transform alias to system command string.
1720 """
1724 """
1721 nargs,cmd = self.alias_table[alias]
1725 nargs,cmd = self.alias_table[alias]
1722 if ' ' in cmd and os.path.isfile(cmd):
1726 if ' ' in cmd and os.path.isfile(cmd):
1723 cmd = '"%s"' % cmd
1727 cmd = '"%s"' % cmd
1724
1728
1725 # Expand the %l special to be the user's input line
1729 # Expand the %l special to be the user's input line
1726 if cmd.find('%l') >= 0:
1730 if cmd.find('%l') >= 0:
1727 cmd = cmd.replace('%l',rest)
1731 cmd = cmd.replace('%l',rest)
1728 rest = ''
1732 rest = ''
1729 if nargs==0:
1733 if nargs==0:
1730 # Simple, argument-less aliases
1734 # Simple, argument-less aliases
1731 cmd = '%s %s' % (cmd,rest)
1735 cmd = '%s %s' % (cmd,rest)
1732 else:
1736 else:
1733 # Handle aliases with positional arguments
1737 # Handle aliases with positional arguments
1734 args = rest.split(None,nargs)
1738 args = rest.split(None,nargs)
1735 if len(args)< nargs:
1739 if len(args)< nargs:
1736 error('Alias <%s> requires %s arguments, %s given.' %
1740 error('Alias <%s> requires %s arguments, %s given.' %
1737 (alias,nargs,len(args)))
1741 (alias,nargs,len(args)))
1738 return None
1742 return None
1739 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1743 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1740 # Now call the macro, evaluating in the user's namespace
1744 # Now call the macro, evaluating in the user's namespace
1741 #print 'new command: <%r>' % cmd # dbg
1745 #print 'new command: <%r>' % cmd # dbg
1742 return cmd
1746 return cmd
1743
1747
1744 def call_alias(self,alias,rest=''):
1748 def call_alias(self,alias,rest=''):
1745 """Call an alias given its name and the rest of the line.
1749 """Call an alias given its name and the rest of the line.
1746
1750
1747 This is only used to provide backwards compatibility for users of
1751 This is only used to provide backwards compatibility for users of
1748 ipalias(), use of which is not recommended for anymore."""
1752 ipalias(), use of which is not recommended for anymore."""
1749
1753
1750 # Now call the macro, evaluating in the user's namespace
1754 # Now call the macro, evaluating in the user's namespace
1751 cmd = self.transform_alias(alias, rest)
1755 cmd = self.transform_alias(alias, rest)
1752 try:
1756 try:
1753 self.system(cmd)
1757 self.system(cmd)
1754 except:
1758 except:
1755 self.showtraceback()
1759 self.showtraceback()
1756
1760
1757 def indent_current_str(self):
1761 def indent_current_str(self):
1758 """return the current level of indentation as a string"""
1762 """return the current level of indentation as a string"""
1759 return self.indent_current_nsp * ' '
1763 return self.indent_current_nsp * ' '
1760
1764
1761 def autoindent_update(self,line):
1765 def autoindent_update(self,line):
1762 """Keep track of the indent level."""
1766 """Keep track of the indent level."""
1763
1767
1764 #debugx('line')
1768 #debugx('line')
1765 #debugx('self.indent_current_nsp')
1769 #debugx('self.indent_current_nsp')
1766 if self.autoindent:
1770 if self.autoindent:
1767 if line:
1771 if line:
1768 inisp = num_ini_spaces(line)
1772 inisp = num_ini_spaces(line)
1769 if inisp < self.indent_current_nsp:
1773 if inisp < self.indent_current_nsp:
1770 self.indent_current_nsp = inisp
1774 self.indent_current_nsp = inisp
1771
1775
1772 if line[-1] == ':':
1776 if line[-1] == ':':
1773 self.indent_current_nsp += 4
1777 self.indent_current_nsp += 4
1774 elif dedent_re.match(line):
1778 elif dedent_re.match(line):
1775 self.indent_current_nsp -= 4
1779 self.indent_current_nsp -= 4
1776 else:
1780 else:
1777 self.indent_current_nsp = 0
1781 self.indent_current_nsp = 0
1778
1782
1779 def runlines(self,lines):
1783 def runlines(self,lines):
1780 """Run a string of one or more lines of source.
1784 """Run a string of one or more lines of source.
1781
1785
1782 This method is capable of running a string containing multiple source
1786 This method is capable of running a string containing multiple source
1783 lines, as if they had been entered at the IPython prompt. Since it
1787 lines, as if they had been entered at the IPython prompt. Since it
1784 exposes IPython's processing machinery, the given strings can contain
1788 exposes IPython's processing machinery, the given strings can contain
1785 magic calls (%magic), special shell access (!cmd), etc."""
1789 magic calls (%magic), special shell access (!cmd), etc."""
1786
1790
1787 # We must start with a clean buffer, in case this is run from an
1791 # We must start with a clean buffer, in case this is run from an
1788 # interactive IPython session (via a magic, for example).
1792 # interactive IPython session (via a magic, for example).
1789 self.resetbuffer()
1793 self.resetbuffer()
1790 lines = lines.split('\n')
1794 lines = lines.split('\n')
1791 more = 0
1795 more = 0
1792 for line in lines:
1796 for line in lines:
1793 # skip blank lines so we don't mess up the prompt counter, but do
1797 # skip blank lines so we don't mess up the prompt counter, but do
1794 # NOT skip even a blank line if we are in a code block (more is
1798 # NOT skip even a blank line if we are in a code block (more is
1795 # true)
1799 # true)
1796 if line or more:
1800 if line or more:
1797 more = self.push(self.prefilter(line,more))
1801 more = self.push(self.prefilter(line,more))
1798 # IPython's runsource returns None if there was an error
1802 # IPython's runsource returns None if there was an error
1799 # compiling the code. This allows us to stop processing right
1803 # compiling the code. This allows us to stop processing right
1800 # away, so the user gets the error message at the right place.
1804 # away, so the user gets the error message at the right place.
1801 if more is None:
1805 if more is None:
1802 break
1806 break
1803 # final newline in case the input didn't have it, so that the code
1807 # final newline in case the input didn't have it, so that the code
1804 # actually does get executed
1808 # actually does get executed
1805 if more:
1809 if more:
1806 self.push('\n')
1810 self.push('\n')
1807
1811
1808 def runsource(self, source, filename='<input>', symbol='single'):
1812 def runsource(self, source, filename='<input>', symbol='single'):
1809 """Compile and run some source in the interpreter.
1813 """Compile and run some source in the interpreter.
1810
1814
1811 Arguments are as for compile_command().
1815 Arguments are as for compile_command().
1812
1816
1813 One several things can happen:
1817 One several things can happen:
1814
1818
1815 1) The input is incorrect; compile_command() raised an
1819 1) The input is incorrect; compile_command() raised an
1816 exception (SyntaxError or OverflowError). A syntax traceback
1820 exception (SyntaxError or OverflowError). A syntax traceback
1817 will be printed by calling the showsyntaxerror() method.
1821 will be printed by calling the showsyntaxerror() method.
1818
1822
1819 2) The input is incomplete, and more input is required;
1823 2) The input is incomplete, and more input is required;
1820 compile_command() returned None. Nothing happens.
1824 compile_command() returned None. Nothing happens.
1821
1825
1822 3) The input is complete; compile_command() returned a code
1826 3) The input is complete; compile_command() returned a code
1823 object. The code is executed by calling self.runcode() (which
1827 object. The code is executed by calling self.runcode() (which
1824 also handles run-time exceptions, except for SystemExit).
1828 also handles run-time exceptions, except for SystemExit).
1825
1829
1826 The return value is:
1830 The return value is:
1827
1831
1828 - True in case 2
1832 - True in case 2
1829
1833
1830 - False in the other cases, unless an exception is raised, where
1834 - False in the other cases, unless an exception is raised, where
1831 None is returned instead. This can be used by external callers to
1835 None is returned instead. This can be used by external callers to
1832 know whether to continue feeding input or not.
1836 know whether to continue feeding input or not.
1833
1837
1834 The return value can be used to decide whether to use sys.ps1 or
1838 The return value can be used to decide whether to use sys.ps1 or
1835 sys.ps2 to prompt the next line."""
1839 sys.ps2 to prompt the next line."""
1836
1840
1837 # if the source code has leading blanks, add 'if 1:\n' to it
1841 # if the source code has leading blanks, add 'if 1:\n' to it
1838 # this allows execution of indented pasted code. It is tempting
1842 # this allows execution of indented pasted code. It is tempting
1839 # to add '\n' at the end of source to run commands like ' a=1'
1843 # to add '\n' at the end of source to run commands like ' a=1'
1840 # directly, but this fails for more complicated scenarios
1844 # directly, but this fails for more complicated scenarios
1841 if source[:1] in [' ', '\t']:
1845 if source[:1] in [' ', '\t']:
1842 source = 'if 1:\n%s' % source
1846 source = 'if 1:\n%s' % source
1843
1847
1844 try:
1848 try:
1845 code = self.compile(source,filename,symbol)
1849 code = self.compile(source,filename,symbol)
1846 except (OverflowError, SyntaxError, ValueError):
1850 except (OverflowError, SyntaxError, ValueError):
1847 # Case 1
1851 # Case 1
1848 self.showsyntaxerror(filename)
1852 self.showsyntaxerror(filename)
1849 return None
1853 return None
1850
1854
1851 if code is None:
1855 if code is None:
1852 # Case 2
1856 # Case 2
1853 return True
1857 return True
1854
1858
1855 # Case 3
1859 # Case 3
1856 # We store the code object so that threaded shells and
1860 # We store the code object so that threaded shells and
1857 # custom exception handlers can access all this info if needed.
1861 # custom exception handlers can access all this info if needed.
1858 # The source corresponding to this can be obtained from the
1862 # The source corresponding to this can be obtained from the
1859 # buffer attribute as '\n'.join(self.buffer).
1863 # buffer attribute as '\n'.join(self.buffer).
1860 self.code_to_run = code
1864 self.code_to_run = code
1861 # now actually execute the code object
1865 # now actually execute the code object
1862 if self.runcode(code) == 0:
1866 if self.runcode(code) == 0:
1863 return False
1867 return False
1864 else:
1868 else:
1865 return None
1869 return None
1866
1870
1867 def runcode(self,code_obj):
1871 def runcode(self,code_obj):
1868 """Execute a code object.
1872 """Execute a code object.
1869
1873
1870 When an exception occurs, self.showtraceback() is called to display a
1874 When an exception occurs, self.showtraceback() is called to display a
1871 traceback.
1875 traceback.
1872
1876
1873 Return value: a flag indicating whether the code to be run completed
1877 Return value: a flag indicating whether the code to be run completed
1874 successfully:
1878 successfully:
1875
1879
1876 - 0: successful execution.
1880 - 0: successful execution.
1877 - 1: an error occurred.
1881 - 1: an error occurred.
1878 """
1882 """
1879
1883
1880 # Set our own excepthook in case the user code tries to call it
1884 # Set our own excepthook in case the user code tries to call it
1881 # directly, so that the IPython crash handler doesn't get triggered
1885 # directly, so that the IPython crash handler doesn't get triggered
1882 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1886 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1883
1887
1884 # we save the original sys.excepthook in the instance, in case config
1888 # we save the original sys.excepthook in the instance, in case config
1885 # code (such as magics) needs access to it.
1889 # code (such as magics) needs access to it.
1886 self.sys_excepthook = old_excepthook
1890 self.sys_excepthook = old_excepthook
1887 outflag = 1 # happens in more places, so it's easier as default
1891 outflag = 1 # happens in more places, so it's easier as default
1888 try:
1892 try:
1889 try:
1893 try:
1890 # Embedded instances require separate global/local namespaces
1894 # Embedded instances require separate global/local namespaces
1891 # so they can see both the surrounding (local) namespace and
1895 # so they can see both the surrounding (local) namespace and
1892 # the module-level globals when called inside another function.
1896 # the module-level globals when called inside another function.
1893 if self.embedded:
1897 if self.embedded:
1894 exec code_obj in self.user_global_ns, self.user_ns
1898 exec code_obj in self.user_global_ns, self.user_ns
1895 # Normal (non-embedded) instances should only have a single
1899 # Normal (non-embedded) instances should only have a single
1896 # namespace for user code execution, otherwise functions won't
1900 # namespace for user code execution, otherwise functions won't
1897 # see interactive top-level globals.
1901 # see interactive top-level globals.
1898 else:
1902 else:
1899 exec code_obj in self.user_ns
1903 exec code_obj in self.user_ns
1900 finally:
1904 finally:
1901 # Reset our crash handler in place
1905 # Reset our crash handler in place
1902 sys.excepthook = old_excepthook
1906 sys.excepthook = old_excepthook
1903 except SystemExit:
1907 except SystemExit:
1904 self.resetbuffer()
1908 self.resetbuffer()
1905 self.showtraceback()
1909 self.showtraceback()
1906 warn("Type %exit or %quit to exit IPython "
1910 warn("Type %exit or %quit to exit IPython "
1907 "(%Exit or %Quit do so unconditionally).",level=1)
1911 "(%Exit or %Quit do so unconditionally).",level=1)
1908 except self.custom_exceptions:
1912 except self.custom_exceptions:
1909 etype,value,tb = sys.exc_info()
1913 etype,value,tb = sys.exc_info()
1910 self.CustomTB(etype,value,tb)
1914 self.CustomTB(etype,value,tb)
1911 except:
1915 except:
1912 self.showtraceback()
1916 self.showtraceback()
1913 else:
1917 else:
1914 outflag = 0
1918 outflag = 0
1915 if softspace(sys.stdout, 0):
1919 if softspace(sys.stdout, 0):
1916 print
1920 print
1917 # Flush out code object which has been run (and source)
1921 # Flush out code object which has been run (and source)
1918 self.code_to_run = None
1922 self.code_to_run = None
1919 return outflag
1923 return outflag
1920
1924
1921 def push(self, line):
1925 def push(self, line):
1922 """Push a line to the interpreter.
1926 """Push a line to the interpreter.
1923
1927
1924 The line should not have a trailing newline; it may have
1928 The line should not have a trailing newline; it may have
1925 internal newlines. The line is appended to a buffer and the
1929 internal newlines. The line is appended to a buffer and the
1926 interpreter's runsource() method is called with the
1930 interpreter's runsource() method is called with the
1927 concatenated contents of the buffer as source. If this
1931 concatenated contents of the buffer as source. If this
1928 indicates that the command was executed or invalid, the buffer
1932 indicates that the command was executed or invalid, the buffer
1929 is reset; otherwise, the command is incomplete, and the buffer
1933 is reset; otherwise, the command is incomplete, and the buffer
1930 is left as it was after the line was appended. The return
1934 is left as it was after the line was appended. The return
1931 value is 1 if more input is required, 0 if the line was dealt
1935 value is 1 if more input is required, 0 if the line was dealt
1932 with in some way (this is the same as runsource()).
1936 with in some way (this is the same as runsource()).
1933 """
1937 """
1934
1938
1935 # autoindent management should be done here, and not in the
1939 # autoindent management should be done here, and not in the
1936 # interactive loop, since that one is only seen by keyboard input. We
1940 # interactive loop, since that one is only seen by keyboard input. We
1937 # need this done correctly even for code run via runlines (which uses
1941 # need this done correctly even for code run via runlines (which uses
1938 # push).
1942 # push).
1939
1943
1940 #print 'push line: <%s>' % line # dbg
1944 #print 'push line: <%s>' % line # dbg
1941 for subline in line.splitlines():
1945 for subline in line.splitlines():
1942 self.autoindent_update(subline)
1946 self.autoindent_update(subline)
1943 self.buffer.append(line)
1947 self.buffer.append(line)
1944 more = self.runsource('\n'.join(self.buffer), self.filename)
1948 more = self.runsource('\n'.join(self.buffer), self.filename)
1945 if not more:
1949 if not more:
1946 self.resetbuffer()
1950 self.resetbuffer()
1947 return more
1951 return more
1948
1952
1949 def resetbuffer(self):
1953 def resetbuffer(self):
1950 """Reset the input buffer."""
1954 """Reset the input buffer."""
1951 self.buffer[:] = []
1955 self.buffer[:] = []
1952
1956
1953 def raw_input(self,prompt='',continue_prompt=False):
1957 def raw_input(self,prompt='',continue_prompt=False):
1954 """Write a prompt and read a line.
1958 """Write a prompt and read a line.
1955
1959
1956 The returned line does not include the trailing newline.
1960 The returned line does not include the trailing newline.
1957 When the user enters the EOF key sequence, EOFError is raised.
1961 When the user enters the EOF key sequence, EOFError is raised.
1958
1962
1959 Optional inputs:
1963 Optional inputs:
1960
1964
1961 - prompt(''): a string to be printed to prompt the user.
1965 - prompt(''): a string to be printed to prompt the user.
1962
1966
1963 - continue_prompt(False): whether this line is the first one or a
1967 - continue_prompt(False): whether this line is the first one or a
1964 continuation in a sequence of inputs.
1968 continuation in a sequence of inputs.
1965 """
1969 """
1966
1970
1967 try:
1971 try:
1968 line = raw_input_original(prompt)
1972 line = raw_input_original(prompt)
1969 except ValueError:
1973 except ValueError:
1970 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1974 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1971 self.exit_now = True
1975 self.exit_now = True
1972 return ""
1976 return ""
1973
1977
1974
1978
1975 # Try to be reasonably smart about not re-indenting pasted input more
1979 # Try to be reasonably smart about not re-indenting pasted input more
1976 # than necessary. We do this by trimming out the auto-indent initial
1980 # than necessary. We do this by trimming out the auto-indent initial
1977 # spaces, if the user's actual input started itself with whitespace.
1981 # spaces, if the user's actual input started itself with whitespace.
1978 #debugx('self.buffer[-1]')
1982 #debugx('self.buffer[-1]')
1979
1983
1980 if self.autoindent:
1984 if self.autoindent:
1981 if num_ini_spaces(line) > self.indent_current_nsp:
1985 if num_ini_spaces(line) > self.indent_current_nsp:
1982 line = line[self.indent_current_nsp:]
1986 line = line[self.indent_current_nsp:]
1983 self.indent_current_nsp = 0
1987 self.indent_current_nsp = 0
1984
1988
1985 # store the unfiltered input before the user has any chance to modify
1989 # store the unfiltered input before the user has any chance to modify
1986 # it.
1990 # it.
1987 if line.strip():
1991 if line.strip():
1988 if continue_prompt:
1992 if continue_prompt:
1989 self.input_hist_raw[-1] += '%s\n' % line
1993 self.input_hist_raw[-1] += '%s\n' % line
1990 if self.has_readline: # and some config option is set?
1994 if self.has_readline: # and some config option is set?
1991 try:
1995 try:
1992 histlen = self.readline.get_current_history_length()
1996 histlen = self.readline.get_current_history_length()
1993 newhist = self.input_hist_raw[-1].rstrip()
1997 newhist = self.input_hist_raw[-1].rstrip()
1994 self.readline.remove_history_item(histlen-1)
1998 self.readline.remove_history_item(histlen-1)
1995 self.readline.replace_history_item(histlen-2,newhist)
1999 self.readline.replace_history_item(histlen-2,newhist)
1996 except AttributeError:
2000 except AttributeError:
1997 pass # re{move,place}_history_item are new in 2.4.
2001 pass # re{move,place}_history_item are new in 2.4.
1998 else:
2002 else:
1999 self.input_hist_raw.append('%s\n' % line)
2003 self.input_hist_raw.append('%s\n' % line)
2000
2004
2001 try:
2005 try:
2002 lineout = self.prefilter(line,continue_prompt)
2006 lineout = self.prefilter(line,continue_prompt)
2003 except:
2007 except:
2004 # blanket except, in case a user-defined prefilter crashes, so it
2008 # blanket except, in case a user-defined prefilter crashes, so it
2005 # can't take all of ipython with it.
2009 # can't take all of ipython with it.
2006 self.showtraceback()
2010 self.showtraceback()
2007 return ''
2011 return ''
2008 else:
2012 else:
2009 return lineout
2013 return lineout
2010
2014
2011 def split_user_input(self,line):
2015 def split_user_input(self,line):
2012 """Split user input into pre-char, function part and rest."""
2016 """Split user input into pre-char, function part and rest."""
2013
2017
2014 lsplit = self.line_split.match(line)
2018 lsplit = self.line_split.match(line)
2015 if lsplit is None: # no regexp match returns None
2019 if lsplit is None: # no regexp match returns None
2016 try:
2020 try:
2017 iFun,theRest = line.split(None,1)
2021 iFun,theRest = line.split(None,1)
2018 except ValueError:
2022 except ValueError:
2019 iFun,theRest = line,''
2023 iFun,theRest = line,''
2020 pre = re.match('^(\s*)(.*)',line).groups()[0]
2024 pre = re.match('^(\s*)(.*)',line).groups()[0]
2021 else:
2025 else:
2022 pre,iFun,theRest = lsplit.groups()
2026 pre,iFun,theRest = lsplit.groups()
2023
2027
2024 #print 'line:<%s>' % line # dbg
2028 #print 'line:<%s>' % line # dbg
2025 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2029 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2026 return pre,iFun.strip(),theRest
2030 return pre,iFun.strip(),theRest
2027
2031
2028 def _prefilter(self, line, continue_prompt):
2032 def _prefilter(self, line, continue_prompt):
2029 """Calls different preprocessors, depending on the form of line."""
2033 """Calls different preprocessors, depending on the form of line."""
2030
2034
2031 # All handlers *must* return a value, even if it's blank ('').
2035 # All handlers *must* return a value, even if it's blank ('').
2032
2036
2033 # Lines are NOT logged here. Handlers should process the line as
2037 # Lines are NOT logged here. Handlers should process the line as
2034 # needed, update the cache AND log it (so that the input cache array
2038 # needed, update the cache AND log it (so that the input cache array
2035 # stays synced).
2039 # stays synced).
2036
2040
2037 # This function is _very_ delicate, and since it's also the one which
2041 # This function is _very_ delicate, and since it's also the one which
2038 # determines IPython's response to user input, it must be as efficient
2042 # determines IPython's response to user input, it must be as efficient
2039 # as possible. For this reason it has _many_ returns in it, trying
2043 # as possible. For this reason it has _many_ returns in it, trying
2040 # always to exit as quickly as it can figure out what it needs to do.
2044 # always to exit as quickly as it can figure out what it needs to do.
2041
2045
2042 # This function is the main responsible for maintaining IPython's
2046 # This function is the main responsible for maintaining IPython's
2043 # behavior respectful of Python's semantics. So be _very_ careful if
2047 # behavior respectful of Python's semantics. So be _very_ careful if
2044 # making changes to anything here.
2048 # making changes to anything here.
2045
2049
2046 #.....................................................................
2050 #.....................................................................
2047 # Code begins
2051 # Code begins
2048
2052
2049 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2053 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2050
2054
2051 # save the line away in case we crash, so the post-mortem handler can
2055 # save the line away in case we crash, so the post-mortem handler can
2052 # record it
2056 # record it
2053 self._last_input_line = line
2057 self._last_input_line = line
2054
2058
2055 #print '***line: <%s>' % line # dbg
2059 #print '***line: <%s>' % line # dbg
2056
2060
2057 # the input history needs to track even empty lines
2061 # the input history needs to track even empty lines
2058 stripped = line.strip()
2062 stripped = line.strip()
2059
2063
2060 if not stripped:
2064 if not stripped:
2061 if not continue_prompt:
2065 if not continue_prompt:
2062 self.outputcache.prompt_count -= 1
2066 self.outputcache.prompt_count -= 1
2063 return self.handle_normal(line,continue_prompt)
2067 return self.handle_normal(line,continue_prompt)
2064 #return self.handle_normal('',continue_prompt)
2068 #return self.handle_normal('',continue_prompt)
2065
2069
2066 # print '***cont',continue_prompt # dbg
2070 # print '***cont',continue_prompt # dbg
2067 # special handlers are only allowed for single line statements
2071 # special handlers are only allowed for single line statements
2068 if continue_prompt and not self.rc.multi_line_specials:
2072 if continue_prompt and not self.rc.multi_line_specials:
2069 return self.handle_normal(line,continue_prompt)
2073 return self.handle_normal(line,continue_prompt)
2070
2074
2071
2075
2072 # For the rest, we need the structure of the input
2076 # For the rest, we need the structure of the input
2073 pre,iFun,theRest = self.split_user_input(line)
2077 pre,iFun,theRest = self.split_user_input(line)
2074
2078
2075 # See whether any pre-existing handler can take care of it
2079 # See whether any pre-existing handler can take care of it
2076
2080
2077 rewritten = self.hooks.input_prefilter(stripped)
2081 rewritten = self.hooks.input_prefilter(stripped)
2078 if rewritten != stripped: # ok, some prefilter did something
2082 if rewritten != stripped: # ok, some prefilter did something
2079 rewritten = pre + rewritten # add indentation
2083 rewritten = pre + rewritten # add indentation
2080 return self.handle_normal(rewritten)
2084 return self.handle_normal(rewritten)
2081
2085
2082 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2086 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2083
2087
2084 # First check for explicit escapes in the last/first character
2088 # First check for explicit escapes in the last/first character
2085 handler = None
2089 handler = None
2086 if line[-1] == self.ESC_HELP:
2090 if line[-1] == self.ESC_HELP:
2087 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2091 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2088 if handler is None:
2092 if handler is None:
2089 # look at the first character of iFun, NOT of line, so we skip
2093 # look at the first character of iFun, NOT of line, so we skip
2090 # leading whitespace in multiline input
2094 # leading whitespace in multiline input
2091 handler = self.esc_handlers.get(iFun[0:1])
2095 handler = self.esc_handlers.get(iFun[0:1])
2092 if handler is not None:
2096 if handler is not None:
2093 return handler(line,continue_prompt,pre,iFun,theRest)
2097 return handler(line,continue_prompt,pre,iFun,theRest)
2094 # Emacs ipython-mode tags certain input lines
2098 # Emacs ipython-mode tags certain input lines
2095 if line.endswith('# PYTHON-MODE'):
2099 if line.endswith('# PYTHON-MODE'):
2096 return self.handle_emacs(line,continue_prompt)
2100 return self.handle_emacs(line,continue_prompt)
2097
2101
2098 # Next, check if we can automatically execute this thing
2102 # Next, check if we can automatically execute this thing
2099
2103
2100 # Allow ! in multi-line statements if multi_line_specials is on:
2104 # Allow ! in multi-line statements if multi_line_specials is on:
2101 if continue_prompt and self.rc.multi_line_specials and \
2105 if continue_prompt and self.rc.multi_line_specials and \
2102 iFun.startswith(self.ESC_SHELL):
2106 iFun.startswith(self.ESC_SHELL):
2103 return self.handle_shell_escape(line,continue_prompt,
2107 return self.handle_shell_escape(line,continue_prompt,
2104 pre=pre,iFun=iFun,
2108 pre=pre,iFun=iFun,
2105 theRest=theRest)
2109 theRest=theRest)
2106
2110
2107 # Let's try to find if the input line is a magic fn
2111 # Let's try to find if the input line is a magic fn
2108 oinfo = None
2112 oinfo = None
2109 if hasattr(self,'magic_'+iFun):
2113 if hasattr(self,'magic_'+iFun):
2110 # WARNING: _ofind uses getattr(), so it can consume generators and
2114 # WARNING: _ofind uses getattr(), so it can consume generators and
2111 # cause other side effects.
2115 # cause other side effects.
2112 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2116 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2113 if oinfo['ismagic']:
2117 if oinfo['ismagic']:
2114 # Be careful not to call magics when a variable assignment is
2118 # Be careful not to call magics when a variable assignment is
2115 # being made (ls='hi', for example)
2119 # being made (ls='hi', for example)
2116 if self.rc.automagic and \
2120 if self.rc.automagic and \
2117 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2121 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2118 (self.rc.multi_line_specials or not continue_prompt):
2122 (self.rc.multi_line_specials or not continue_prompt):
2119 return self.handle_magic(line,continue_prompt,
2123 return self.handle_magic(line,continue_prompt,
2120 pre,iFun,theRest)
2124 pre,iFun,theRest)
2121 else:
2125 else:
2122 return self.handle_normal(line,continue_prompt)
2126 return self.handle_normal(line,continue_prompt)
2123
2127
2124 # If the rest of the line begins with an (in)equality, assginment or
2128 # If the rest of the line begins with an (in)equality, assginment or
2125 # function call, we should not call _ofind but simply execute it.
2129 # function call, we should not call _ofind but simply execute it.
2126 # This avoids spurious geattr() accesses on objects upon assignment.
2130 # This avoids spurious geattr() accesses on objects upon assignment.
2127 #
2131 #
2128 # It also allows users to assign to either alias or magic names true
2132 # It also allows users to assign to either alias or magic names true
2129 # python variables (the magic/alias systems always take second seat to
2133 # python variables (the magic/alias systems always take second seat to
2130 # true python code).
2134 # true python code).
2131 if theRest and theRest[0] in '!=()':
2135 if theRest and theRest[0] in '!=()':
2132 return self.handle_normal(line,continue_prompt)
2136 return self.handle_normal(line,continue_prompt)
2133
2137
2134 if oinfo is None:
2138 if oinfo is None:
2135 # let's try to ensure that _oinfo is ONLY called when autocall is
2139 # let's try to ensure that _oinfo is ONLY called when autocall is
2136 # on. Since it has inevitable potential side effects, at least
2140 # on. Since it has inevitable potential side effects, at least
2137 # having autocall off should be a guarantee to the user that no
2141 # having autocall off should be a guarantee to the user that no
2138 # weird things will happen.
2142 # weird things will happen.
2139
2143
2140 if self.rc.autocall:
2144 if self.rc.autocall:
2141 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2145 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2142 else:
2146 else:
2143 # in this case, all that's left is either an alias or
2147 # in this case, all that's left is either an alias or
2144 # processing the line normally.
2148 # processing the line normally.
2145 if iFun in self.alias_table:
2149 if iFun in self.alias_table:
2146 # if autocall is off, by not running _ofind we won't know
2150 # if autocall is off, by not running _ofind we won't know
2147 # whether the given name may also exist in one of the
2151 # whether the given name may also exist in one of the
2148 # user's namespace. At this point, it's best to do a
2152 # user's namespace. At this point, it's best to do a
2149 # quick check just to be sure that we don't let aliases
2153 # quick check just to be sure that we don't let aliases
2150 # shadow variables.
2154 # shadow variables.
2151 head = iFun.split('.',1)[0]
2155 head = iFun.split('.',1)[0]
2152 if head in self.user_ns or head in self.internal_ns \
2156 if head in self.user_ns or head in self.internal_ns \
2153 or head in __builtin__.__dict__:
2157 or head in __builtin__.__dict__:
2154 return self.handle_normal(line,continue_prompt)
2158 return self.handle_normal(line,continue_prompt)
2155 else:
2159 else:
2156 return self.handle_alias(line,continue_prompt,
2160 return self.handle_alias(line,continue_prompt,
2157 pre,iFun,theRest)
2161 pre,iFun,theRest)
2158
2162
2159 else:
2163 else:
2160 return self.handle_normal(line,continue_prompt)
2164 return self.handle_normal(line,continue_prompt)
2161
2165
2162 if not oinfo['found']:
2166 if not oinfo['found']:
2163 return self.handle_normal(line,continue_prompt)
2167 return self.handle_normal(line,continue_prompt)
2164 else:
2168 else:
2165 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2169 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2166 if oinfo['isalias']:
2170 if oinfo['isalias']:
2167 return self.handle_alias(line,continue_prompt,
2171 return self.handle_alias(line,continue_prompt,
2168 pre,iFun,theRest)
2172 pre,iFun,theRest)
2169
2173
2170 if (self.rc.autocall
2174 if (self.rc.autocall
2171 and
2175 and
2172 (
2176 (
2173 #only consider exclusion re if not "," or ";" autoquoting
2177 #only consider exclusion re if not "," or ";" autoquoting
2174 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2178 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2175 or pre == self.ESC_PAREN) or
2179 or pre == self.ESC_PAREN) or
2176 (not self.re_exclude_auto.match(theRest)))
2180 (not self.re_exclude_auto.match(theRest)))
2177 and
2181 and
2178 self.re_fun_name.match(iFun) and
2182 self.re_fun_name.match(iFun) and
2179 callable(oinfo['obj'])) :
2183 callable(oinfo['obj'])) :
2180 #print 'going auto' # dbg
2184 #print 'going auto' # dbg
2181 return self.handle_auto(line,continue_prompt,
2185 return self.handle_auto(line,continue_prompt,
2182 pre,iFun,theRest,oinfo['obj'])
2186 pre,iFun,theRest,oinfo['obj'])
2183 else:
2187 else:
2184 #print 'was callable?', callable(oinfo['obj']) # dbg
2188 #print 'was callable?', callable(oinfo['obj']) # dbg
2185 return self.handle_normal(line,continue_prompt)
2189 return self.handle_normal(line,continue_prompt)
2186
2190
2187 # If we get here, we have a normal Python line. Log and return.
2191 # If we get here, we have a normal Python line. Log and return.
2188 return self.handle_normal(line,continue_prompt)
2192 return self.handle_normal(line,continue_prompt)
2189
2193
2190 def _prefilter_dumb(self, line, continue_prompt):
2194 def _prefilter_dumb(self, line, continue_prompt):
2191 """simple prefilter function, for debugging"""
2195 """simple prefilter function, for debugging"""
2192 return self.handle_normal(line,continue_prompt)
2196 return self.handle_normal(line,continue_prompt)
2193
2197
2194
2198
2195 def multiline_prefilter(self, line, continue_prompt):
2199 def multiline_prefilter(self, line, continue_prompt):
2196 """ Run _prefilter for each line of input
2200 """ Run _prefilter for each line of input
2197
2201
2198 Covers cases where there are multiple lines in the user entry,
2202 Covers cases where there are multiple lines in the user entry,
2199 which is the case when the user goes back to a multiline history
2203 which is the case when the user goes back to a multiline history
2200 entry and presses enter.
2204 entry and presses enter.
2201
2205
2202 """
2206 """
2203 out = []
2207 out = []
2204 for l in line.rstrip('\n').split('\n'):
2208 for l in line.rstrip('\n').split('\n'):
2205 out.append(self._prefilter(l, continue_prompt))
2209 out.append(self._prefilter(l, continue_prompt))
2206 return '\n'.join(out)
2210 return '\n'.join(out)
2207
2211
2208 # Set the default prefilter() function (this can be user-overridden)
2212 # Set the default prefilter() function (this can be user-overridden)
2209 prefilter = multiline_prefilter
2213 prefilter = multiline_prefilter
2210
2214
2211 def handle_normal(self,line,continue_prompt=None,
2215 def handle_normal(self,line,continue_prompt=None,
2212 pre=None,iFun=None,theRest=None):
2216 pre=None,iFun=None,theRest=None):
2213 """Handle normal input lines. Use as a template for handlers."""
2217 """Handle normal input lines. Use as a template for handlers."""
2214
2218
2215 # With autoindent on, we need some way to exit the input loop, and I
2219 # With autoindent on, we need some way to exit the input loop, and I
2216 # don't want to force the user to have to backspace all the way to
2220 # don't want to force the user to have to backspace all the way to
2217 # clear the line. The rule will be in this case, that either two
2221 # clear the line. The rule will be in this case, that either two
2218 # lines of pure whitespace in a row, or a line of pure whitespace but
2222 # lines of pure whitespace in a row, or a line of pure whitespace but
2219 # of a size different to the indent level, will exit the input loop.
2223 # of a size different to the indent level, will exit the input loop.
2220
2224
2221 if (continue_prompt and self.autoindent and line.isspace() and
2225 if (continue_prompt and self.autoindent and line.isspace() and
2222 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2226 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2223 (self.buffer[-1]).isspace() )):
2227 (self.buffer[-1]).isspace() )):
2224 line = ''
2228 line = ''
2225
2229
2226 self.log(line,line,continue_prompt)
2230 self.log(line,line,continue_prompt)
2227 return line
2231 return line
2228
2232
2229 def handle_alias(self,line,continue_prompt=None,
2233 def handle_alias(self,line,continue_prompt=None,
2230 pre=None,iFun=None,theRest=None):
2234 pre=None,iFun=None,theRest=None):
2231 """Handle alias input lines. """
2235 """Handle alias input lines. """
2232
2236
2233 # pre is needed, because it carries the leading whitespace. Otherwise
2237 # pre is needed, because it carries the leading whitespace. Otherwise
2234 # aliases won't work in indented sections.
2238 # aliases won't work in indented sections.
2235 transformed = self.expand_aliases(iFun, theRest)
2239 transformed = self.expand_aliases(iFun, theRest)
2236 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2240 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2237 self.log(line,line_out,continue_prompt)
2241 self.log(line,line_out,continue_prompt)
2238 #print 'line out:',line_out # dbg
2242 #print 'line out:',line_out # dbg
2239 return line_out
2243 return line_out
2240
2244
2241 def handle_shell_escape(self, line, continue_prompt=None,
2245 def handle_shell_escape(self, line, continue_prompt=None,
2242 pre=None,iFun=None,theRest=None):
2246 pre=None,iFun=None,theRest=None):
2243 """Execute the line in a shell, empty return value"""
2247 """Execute the line in a shell, empty return value"""
2244
2248
2245 #print 'line in :', `line` # dbg
2249 #print 'line in :', `line` # dbg
2246 # Example of a special handler. Others follow a similar pattern.
2250 # Example of a special handler. Others follow a similar pattern.
2247 if line.lstrip().startswith('!!'):
2251 if line.lstrip().startswith('!!'):
2248 # rewrite iFun/theRest to properly hold the call to %sx and
2252 # rewrite iFun/theRest to properly hold the call to %sx and
2249 # the actual command to be executed, so handle_magic can work
2253 # the actual command to be executed, so handle_magic can work
2250 # correctly
2254 # correctly
2251 theRest = '%s %s' % (iFun[2:],theRest)
2255 theRest = '%s %s' % (iFun[2:],theRest)
2252 iFun = 'sx'
2256 iFun = 'sx'
2253 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2257 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2254 line.lstrip()[2:]),
2258 line.lstrip()[2:]),
2255 continue_prompt,pre,iFun,theRest)
2259 continue_prompt,pre,iFun,theRest)
2256 else:
2260 else:
2257 cmd=line.lstrip().lstrip('!')
2261 cmd=line.lstrip().lstrip('!')
2258 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2262 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2259 # update cache/log and return
2263 # update cache/log and return
2260 self.log(line,line_out,continue_prompt)
2264 self.log(line,line_out,continue_prompt)
2261 return line_out
2265 return line_out
2262
2266
2263 def handle_magic(self, line, continue_prompt=None,
2267 def handle_magic(self, line, continue_prompt=None,
2264 pre=None,iFun=None,theRest=None):
2268 pre=None,iFun=None,theRest=None):
2265 """Execute magic functions."""
2269 """Execute magic functions."""
2266
2270
2267
2271
2268 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2272 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2269 self.log(line,cmd,continue_prompt)
2273 self.log(line,cmd,continue_prompt)
2270 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2274 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2271 return cmd
2275 return cmd
2272
2276
2273 def handle_auto(self, line, continue_prompt=None,
2277 def handle_auto(self, line, continue_prompt=None,
2274 pre=None,iFun=None,theRest=None,obj=None):
2278 pre=None,iFun=None,theRest=None,obj=None):
2275 """Hande lines which can be auto-executed, quoting if requested."""
2279 """Hande lines which can be auto-executed, quoting if requested."""
2276
2280
2277 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2281 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2278
2282
2279 # This should only be active for single-line input!
2283 # This should only be active for single-line input!
2280 if continue_prompt:
2284 if continue_prompt:
2281 self.log(line,line,continue_prompt)
2285 self.log(line,line,continue_prompt)
2282 return line
2286 return line
2283
2287
2284 auto_rewrite = True
2288 auto_rewrite = True
2285
2289
2286 if pre == self.ESC_QUOTE:
2290 if pre == self.ESC_QUOTE:
2287 # Auto-quote splitting on whitespace
2291 # Auto-quote splitting on whitespace
2288 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2292 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2289 elif pre == self.ESC_QUOTE2:
2293 elif pre == self.ESC_QUOTE2:
2290 # Auto-quote whole string
2294 # Auto-quote whole string
2291 newcmd = '%s("%s")' % (iFun,theRest)
2295 newcmd = '%s("%s")' % (iFun,theRest)
2292 elif pre == self.ESC_PAREN:
2296 elif pre == self.ESC_PAREN:
2293 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2297 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2294 else:
2298 else:
2295 # Auto-paren.
2299 # Auto-paren.
2296 # We only apply it to argument-less calls if the autocall
2300 # We only apply it to argument-less calls if the autocall
2297 # parameter is set to 2. We only need to check that autocall is <
2301 # parameter is set to 2. We only need to check that autocall is <
2298 # 2, since this function isn't called unless it's at least 1.
2302 # 2, since this function isn't called unless it's at least 1.
2299 if not theRest and (self.rc.autocall < 2):
2303 if not theRest and (self.rc.autocall < 2):
2300 newcmd = '%s %s' % (iFun,theRest)
2304 newcmd = '%s %s' % (iFun,theRest)
2301 auto_rewrite = False
2305 auto_rewrite = False
2302 else:
2306 else:
2303 if theRest.startswith('['):
2307 if theRest.startswith('['):
2304 if hasattr(obj,'__getitem__'):
2308 if hasattr(obj,'__getitem__'):
2305 # Don't autocall in this case: item access for an object
2309 # Don't autocall in this case: item access for an object
2306 # which is BOTH callable and implements __getitem__.
2310 # which is BOTH callable and implements __getitem__.
2307 newcmd = '%s %s' % (iFun,theRest)
2311 newcmd = '%s %s' % (iFun,theRest)
2308 auto_rewrite = False
2312 auto_rewrite = False
2309 else:
2313 else:
2310 # if the object doesn't support [] access, go ahead and
2314 # if the object doesn't support [] access, go ahead and
2311 # autocall
2315 # autocall
2312 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2316 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2313 elif theRest.endswith(';'):
2317 elif theRest.endswith(';'):
2314 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2318 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2315 else:
2319 else:
2316 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2320 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2317
2321
2318 if auto_rewrite:
2322 if auto_rewrite:
2319 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2323 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2320 # log what is now valid Python, not the actual user input (without the
2324 # log what is now valid Python, not the actual user input (without the
2321 # final newline)
2325 # final newline)
2322 self.log(line,newcmd,continue_prompt)
2326 self.log(line,newcmd,continue_prompt)
2323 return newcmd
2327 return newcmd
2324
2328
2325 def handle_help(self, line, continue_prompt=None,
2329 def handle_help(self, line, continue_prompt=None,
2326 pre=None,iFun=None,theRest=None):
2330 pre=None,iFun=None,theRest=None):
2327 """Try to get some help for the object.
2331 """Try to get some help for the object.
2328
2332
2329 obj? or ?obj -> basic information.
2333 obj? or ?obj -> basic information.
2330 obj?? or ??obj -> more details.
2334 obj?? or ??obj -> more details.
2331 """
2335 """
2332
2336
2333 # We need to make sure that we don't process lines which would be
2337 # We need to make sure that we don't process lines which would be
2334 # otherwise valid python, such as "x=1 # what?"
2338 # otherwise valid python, such as "x=1 # what?"
2335 try:
2339 try:
2336 codeop.compile_command(line)
2340 codeop.compile_command(line)
2337 except SyntaxError:
2341 except SyntaxError:
2338 # We should only handle as help stuff which is NOT valid syntax
2342 # We should only handle as help stuff which is NOT valid syntax
2339 if line[0]==self.ESC_HELP:
2343 if line[0]==self.ESC_HELP:
2340 line = line[1:]
2344 line = line[1:]
2341 elif line[-1]==self.ESC_HELP:
2345 elif line[-1]==self.ESC_HELP:
2342 line = line[:-1]
2346 line = line[:-1]
2343 self.log(line,'#?'+line,continue_prompt)
2347 self.log(line,'#?'+line,continue_prompt)
2344 if line:
2348 if line:
2345 self.magic_pinfo(line)
2349 self.magic_pinfo(line)
2346 else:
2350 else:
2347 page(self.usage,screen_lines=self.rc.screen_length)
2351 page(self.usage,screen_lines=self.rc.screen_length)
2348 return '' # Empty string is needed here!
2352 return '' # Empty string is needed here!
2349 except:
2353 except:
2350 # Pass any other exceptions through to the normal handler
2354 # Pass any other exceptions through to the normal handler
2351 return self.handle_normal(line,continue_prompt)
2355 return self.handle_normal(line,continue_prompt)
2352 else:
2356 else:
2353 # If the code compiles ok, we should handle it normally
2357 # If the code compiles ok, we should handle it normally
2354 return self.handle_normal(line,continue_prompt)
2358 return self.handle_normal(line,continue_prompt)
2355
2359
2356 def getapi(self):
2360 def getapi(self):
2357 """ Get an IPApi object for this shell instance
2361 """ Get an IPApi object for this shell instance
2358
2362
2359 Getting an IPApi object is always preferable to accessing the shell
2363 Getting an IPApi object is always preferable to accessing the shell
2360 directly, but this holds true especially for extensions.
2364 directly, but this holds true especially for extensions.
2361
2365
2362 It should always be possible to implement an extension with IPApi
2366 It should always be possible to implement an extension with IPApi
2363 alone. If not, contact maintainer to request an addition.
2367 alone. If not, contact maintainer to request an addition.
2364
2368
2365 """
2369 """
2366 return self.api
2370 return self.api
2367
2371
2368 def handle_emacs(self,line,continue_prompt=None,
2372 def handle_emacs(self,line,continue_prompt=None,
2369 pre=None,iFun=None,theRest=None):
2373 pre=None,iFun=None,theRest=None):
2370 """Handle input lines marked by python-mode."""
2374 """Handle input lines marked by python-mode."""
2371
2375
2372 # Currently, nothing is done. Later more functionality can be added
2376 # Currently, nothing is done. Later more functionality can be added
2373 # here if needed.
2377 # here if needed.
2374
2378
2375 # The input cache shouldn't be updated
2379 # The input cache shouldn't be updated
2376
2380
2377 return line
2381 return line
2378
2382
2379 def mktempfile(self,data=None):
2383 def mktempfile(self,data=None):
2380 """Make a new tempfile and return its filename.
2384 """Make a new tempfile and return its filename.
2381
2385
2382 This makes a call to tempfile.mktemp, but it registers the created
2386 This makes a call to tempfile.mktemp, but it registers the created
2383 filename internally so ipython cleans it up at exit time.
2387 filename internally so ipython cleans it up at exit time.
2384
2388
2385 Optional inputs:
2389 Optional inputs:
2386
2390
2387 - data(None): if data is given, it gets written out to the temp file
2391 - data(None): if data is given, it gets written out to the temp file
2388 immediately, and the file is closed again."""
2392 immediately, and the file is closed again."""
2389
2393
2390 filename = tempfile.mktemp('.py','ipython_edit_')
2394 filename = tempfile.mktemp('.py','ipython_edit_')
2391 self.tempfiles.append(filename)
2395 self.tempfiles.append(filename)
2392
2396
2393 if data:
2397 if data:
2394 tmp_file = open(filename,'w')
2398 tmp_file = open(filename,'w')
2395 tmp_file.write(data)
2399 tmp_file.write(data)
2396 tmp_file.close()
2400 tmp_file.close()
2397 return filename
2401 return filename
2398
2402
2399 def write(self,data):
2403 def write(self,data):
2400 """Write a string to the default output"""
2404 """Write a string to the default output"""
2401 Term.cout.write(data)
2405 Term.cout.write(data)
2402
2406
2403 def write_err(self,data):
2407 def write_err(self,data):
2404 """Write a string to the default error output"""
2408 """Write a string to the default error output"""
2405 Term.cerr.write(data)
2409 Term.cerr.write(data)
2406
2410
2407 def exit(self):
2411 def exit(self):
2408 """Handle interactive exit.
2412 """Handle interactive exit.
2409
2413
2410 This method sets the exit_now attribute."""
2414 This method sets the exit_now attribute."""
2411
2415
2412 if self.rc.confirm_exit:
2416 if self.rc.confirm_exit:
2413 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2417 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2414 self.exit_now = True
2418 self.exit_now = True
2415 else:
2419 else:
2416 self.exit_now = True
2420 self.exit_now = True
2417
2421
2418 def safe_execfile(self,fname,*where,**kw):
2422 def safe_execfile(self,fname,*where,**kw):
2419 """A safe version of the builtin execfile().
2423 """A safe version of the builtin execfile().
2420
2424
2421 This version will never throw an exception, and knows how to handle
2425 This version will never throw an exception, and knows how to handle
2422 ipython logs as well."""
2426 ipython logs as well."""
2423
2427
2424 def syspath_cleanup():
2428 def syspath_cleanup():
2425 """Internal cleanup routine for sys.path."""
2429 """Internal cleanup routine for sys.path."""
2426 if add_dname:
2430 if add_dname:
2427 try:
2431 try:
2428 sys.path.remove(dname)
2432 sys.path.remove(dname)
2429 except ValueError:
2433 except ValueError:
2430 # For some reason the user has already removed it, ignore.
2434 # For some reason the user has already removed it, ignore.
2431 pass
2435 pass
2432
2436
2433 fname = os.path.expanduser(fname)
2437 fname = os.path.expanduser(fname)
2434
2438
2435 # Find things also in current directory. This is needed to mimic the
2439 # Find things also in current directory. This is needed to mimic the
2436 # behavior of running a script from the system command line, where
2440 # behavior of running a script from the system command line, where
2437 # Python inserts the script's directory into sys.path
2441 # Python inserts the script's directory into sys.path
2438 dname = os.path.dirname(os.path.abspath(fname))
2442 dname = os.path.dirname(os.path.abspath(fname))
2439 add_dname = False
2443 add_dname = False
2440 if dname not in sys.path:
2444 if dname not in sys.path:
2441 sys.path.insert(0,dname)
2445 sys.path.insert(0,dname)
2442 add_dname = True
2446 add_dname = True
2443
2447
2444 try:
2448 try:
2445 xfile = open(fname)
2449 xfile = open(fname)
2446 except:
2450 except:
2447 print >> Term.cerr, \
2451 print >> Term.cerr, \
2448 'Could not open file <%s> for safe execution.' % fname
2452 'Could not open file <%s> for safe execution.' % fname
2449 syspath_cleanup()
2453 syspath_cleanup()
2450 return None
2454 return None
2451
2455
2452 kw.setdefault('islog',0)
2456 kw.setdefault('islog',0)
2453 kw.setdefault('quiet',1)
2457 kw.setdefault('quiet',1)
2454 kw.setdefault('exit_ignore',0)
2458 kw.setdefault('exit_ignore',0)
2455 first = xfile.readline()
2459 first = xfile.readline()
2456 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2460 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2457 xfile.close()
2461 xfile.close()
2458 # line by line execution
2462 # line by line execution
2459 if first.startswith(loghead) or kw['islog']:
2463 if first.startswith(loghead) or kw['islog']:
2460 print 'Loading log file <%s> one line at a time...' % fname
2464 print 'Loading log file <%s> one line at a time...' % fname
2461 if kw['quiet']:
2465 if kw['quiet']:
2462 stdout_save = sys.stdout
2466 stdout_save = sys.stdout
2463 sys.stdout = StringIO.StringIO()
2467 sys.stdout = StringIO.StringIO()
2464 try:
2468 try:
2465 globs,locs = where[0:2]
2469 globs,locs = where[0:2]
2466 except:
2470 except:
2467 try:
2471 try:
2468 globs = locs = where[0]
2472 globs = locs = where[0]
2469 except:
2473 except:
2470 globs = locs = globals()
2474 globs = locs = globals()
2471 badblocks = []
2475 badblocks = []
2472
2476
2473 # we also need to identify indented blocks of code when replaying
2477 # we also need to identify indented blocks of code when replaying
2474 # logs and put them together before passing them to an exec
2478 # logs and put them together before passing them to an exec
2475 # statement. This takes a bit of regexp and look-ahead work in the
2479 # statement. This takes a bit of regexp and look-ahead work in the
2476 # file. It's easiest if we swallow the whole thing in memory
2480 # file. It's easiest if we swallow the whole thing in memory
2477 # first, and manually walk through the lines list moving the
2481 # first, and manually walk through the lines list moving the
2478 # counter ourselves.
2482 # counter ourselves.
2479 indent_re = re.compile('\s+\S')
2483 indent_re = re.compile('\s+\S')
2480 xfile = open(fname)
2484 xfile = open(fname)
2481 filelines = xfile.readlines()
2485 filelines = xfile.readlines()
2482 xfile.close()
2486 xfile.close()
2483 nlines = len(filelines)
2487 nlines = len(filelines)
2484 lnum = 0
2488 lnum = 0
2485 while lnum < nlines:
2489 while lnum < nlines:
2486 line = filelines[lnum]
2490 line = filelines[lnum]
2487 lnum += 1
2491 lnum += 1
2488 # don't re-insert logger status info into cache
2492 # don't re-insert logger status info into cache
2489 if line.startswith('#log#'):
2493 if line.startswith('#log#'):
2490 continue
2494 continue
2491 else:
2495 else:
2492 # build a block of code (maybe a single line) for execution
2496 # build a block of code (maybe a single line) for execution
2493 block = line
2497 block = line
2494 try:
2498 try:
2495 next = filelines[lnum] # lnum has already incremented
2499 next = filelines[lnum] # lnum has already incremented
2496 except:
2500 except:
2497 next = None
2501 next = None
2498 while next and indent_re.match(next):
2502 while next and indent_re.match(next):
2499 block += next
2503 block += next
2500 lnum += 1
2504 lnum += 1
2501 try:
2505 try:
2502 next = filelines[lnum]
2506 next = filelines[lnum]
2503 except:
2507 except:
2504 next = None
2508 next = None
2505 # now execute the block of one or more lines
2509 # now execute the block of one or more lines
2506 try:
2510 try:
2507 exec block in globs,locs
2511 exec block in globs,locs
2508 except SystemExit:
2512 except SystemExit:
2509 pass
2513 pass
2510 except:
2514 except:
2511 badblocks.append(block.rstrip())
2515 badblocks.append(block.rstrip())
2512 if kw['quiet']: # restore stdout
2516 if kw['quiet']: # restore stdout
2513 sys.stdout.close()
2517 sys.stdout.close()
2514 sys.stdout = stdout_save
2518 sys.stdout = stdout_save
2515 print 'Finished replaying log file <%s>' % fname
2519 print 'Finished replaying log file <%s>' % fname
2516 if badblocks:
2520 if badblocks:
2517 print >> sys.stderr, ('\nThe following lines/blocks in file '
2521 print >> sys.stderr, ('\nThe following lines/blocks in file '
2518 '<%s> reported errors:' % fname)
2522 '<%s> reported errors:' % fname)
2519
2523
2520 for badline in badblocks:
2524 for badline in badblocks:
2521 print >> sys.stderr, badline
2525 print >> sys.stderr, badline
2522 else: # regular file execution
2526 else: # regular file execution
2523 try:
2527 try:
2524 execfile(fname,*where)
2528 execfile(fname,*where)
2525 except SyntaxError:
2529 except SyntaxError:
2526 self.showsyntaxerror()
2530 self.showsyntaxerror()
2527 warn('Failure executing file: <%s>' % fname)
2531 warn('Failure executing file: <%s>' % fname)
2528 except SystemExit,status:
2532 except SystemExit,status:
2529 if not kw['exit_ignore']:
2533 if not kw['exit_ignore']:
2530 self.showtraceback()
2534 self.showtraceback()
2531 warn('Failure executing file: <%s>' % fname)
2535 warn('Failure executing file: <%s>' % fname)
2532 except:
2536 except:
2533 self.showtraceback()
2537 self.showtraceback()
2534 warn('Failure executing file: <%s>' % fname)
2538 warn('Failure executing file: <%s>' % fname)
2535
2539
2536 syspath_cleanup()
2540 syspath_cleanup()
2537
2541
2538 #************************* end of file <iplib.py> *****************************
2542 #************************* end of file <iplib.py> *****************************
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,29 +1,29 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 # release test
3 # release test
4
4
5 # clean up build/dist directories
5 # clean up build/dist directories
6 rm -rf ~/ipython/ipython/build/*
6 rm -rf ~/ipython/ipython/build/*
7 rm -rf ~/ipython/ipython/dist/*
7 rm -rf ~/ipython/ipython/dist/*
8
8
9 # build source distros
9 # build source distros
10 cd ~/ipython/ipython
10 cd ~/ipython/ipython
11
11
12 ./setup.py sdist --formats=gztar
12 ./setup.py sdist --formats=gztar
13
13
14 # Build rpm
14 # Build rpm
15 python2.4 ./setup.py bdist_rpm --binary-only --release=py24 --python=/usr/bin/python2.4
15 #python2.4 ./setup.py bdist_rpm --binary-only --release=py24 --python=/usr/bin/python2.4
16
16
17 # Build eggs
17 # Build eggs
18 ./eggsetup.py bdist_egg
18 ./eggsetup.py bdist_egg
19
19
20 # Call the windows build separately, so that the extra Windows scripts don't
20 # Call the windows build separately, so that the extra Windows scripts don't
21 # get pulled into Unix builds (setup.py has code which checks for
21 # get pulled into Unix builds (setup.py has code which checks for
22 # bdist_wininst)
22 # bdist_wininst)
23
23
24 # For now, make the win32 installer with a hand-built 2.3.5 python, which is
24 # For now, make the win32 installer with a hand-built 2.3.5 python, which is
25 # the only one that fixes a crash in the post-install phase.
25 # the only one that fixes a crash in the post-install phase.
26 #$HOME/tmp/local/bin/python2.3 setup.py bdist_wininst \
26 #$HOME/tmp/local/bin/python2.3 setup.py bdist_wininst \
27 # --install-script=ipython_win_post_install.py
27 # --install-script=ipython_win_post_install.py
28
28
29 ./setup.py bdist_wininst --install-script=ipython_win_post_install.py
29 ./setup.py bdist_wininst --install-script=ipython_win_post_install.py
@@ -1,6 +1,6 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 # clean public testing/ dir and upload
3 # clean public testing/ dir and upload
4 ssh "rm -f ipython@ipython.scipy.org:www/dist/testing/*"
4 #ssh "rm -f ipython@ipython.scipy.org:www/dist/testing/*"
5 cd ~/ipython/ipython/dist
5 cd ~/ipython/ipython/dist
6 scp * ipython@ipython.scipy.org:www/dist/testing/
6 scp * ipython@ipython.scipy.org:www/dist/testing/
General Comments 0
You need to be logged in to leave comments. Login now