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