##// END OF EJS Templates
Added ipapi, the extension api for ipython....
vivainio -
Show More

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

@@ -0,0 +1,78 b''
1 ''' IPython customization API
2
3 Your one-stop module for configuring ipython
4
5 This is experimental, use at your own risk.
6
7 All names prefixed by underscores are for internal use, not part
8 of the public api.
9
10 No formal doc yet, here's an example that you can just put
11 to a module and import from ipython.
12
13 -----------------------------------------------
14 import IPython.ipapi as ip
15
16 def ankka_f(self, arg):
17 print "Ankka",self,"says uppercase:",arg.upper()
18
19 ip.expose_magic("ankka",ankka_f)
20
21 ip.magic('alias sayhi echo "Testing, hi ok"')
22 ip.magic('alias helloworld echo "Hello world"')
23 ip.system('pwd')
24
25 ip.ex('import re')
26 ip.ex("""
27 def funcci(a,b):
28 print a+b
29 print funcci(3,4)
30 """)
31 ip.ex("funcci(348,9)")
32
33 def jed_editor(self,filename, linenum=None):
34 print "Calling my own editor, jed ... via hook!"
35 import os
36 if linenum is None: linenum = 0
37 os.system('jed +%d %s' % (linenum, filename))
38 print "exiting jed"
39
40 ip.set_hook('editor',jed_editor)
41 print "done!"
42
43 '''
44
45
46
47
48 def _init_with_shell(ip):
49 global magic
50 magic = ip.ipmagic
51 global system
52 system = ip.ipsystem
53 global set_hook
54 set_hook = ip.set_hook
55 global __IP
56 __IP = ip
57
58 def user_ns():
59 return __IP.user_ns
60
61 def expose_magic(magicname, func):
62 ''' Expose own function as magic function for ipython
63
64 def foo_impl(self,parameter_s=''):
65 """My very own magic!. (Use docstrings, IPython reads them)."""
66 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
67 print 'The self object is:',self
68
69 ipapi.expose_magic("foo",foo_impl)
70 '''
71
72 from IPython import Magic
73
74 setattr(Magic.Magic, "magic_" + magicname, func)
75
76 def ex(cmd):
77 """ Execute a normal python statement """
78 exec cmd in user_ns() No newline at end of file
@@ -1,459 +1,461 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Tools for inspecting Python objects.
3 3
4 4 Uses syntax highlighting for presenting the various information elements.
5 5
6 6 Similar in spirit to the inspect module, but all calls take a name argument to
7 7 reference the name under which an object is being read.
8 8
9 $Id: OInspect.py 958 2005-12-27 23:17:51Z fperez $
9 $Id: OInspect.py 1016 2006-01-14 00:54:23Z vivainio $
10 10 """
11 11
12 12 #*****************************************************************************
13 13 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #*****************************************************************************
18 18
19 19 from IPython import Release
20 20 __author__ = '%s <%s>' % Release.authors['Fernando']
21 21 __license__ = Release.license
22 22
23 23 __all__ = ['Inspector','InspectColors']
24 24
25 25 # stdlib modules
26 26 import __builtin__
27 27 import inspect
28 28 import linecache
29 29 import string
30 30 import StringIO
31 31 import types
32 32
33 33 # IPython's own
34 34 from IPython import PyColorize
35 35 from IPython.genutils import page,indent,Term,mkdict
36 36 from IPython.Itpl import itpl
37 37 from IPython.wildcard import list_namespace
38 38 from IPython.ColorANSI import *
39 39
40 40 #****************************************************************************
41 41 # Builtin color schemes
42 42
43 43 Colors = TermColors # just a shorthand
44 44
45 45 # Build a few color schemes
46 46 NoColor = ColorScheme(
47 47 'NoColor',{
48 48 'header' : Colors.NoColor,
49 49 'normal' : Colors.NoColor # color off (usu. Colors.Normal)
50 50 } )
51 51
52 52 LinuxColors = ColorScheme(
53 53 'Linux',{
54 54 'header' : Colors.LightRed,
55 55 'normal' : Colors.Normal # color off (usu. Colors.Normal)
56 56 } )
57 57
58 58 LightBGColors = ColorScheme(
59 59 'LightBG',{
60 60 'header' : Colors.Red,
61 61 'normal' : Colors.Normal # color off (usu. Colors.Normal)
62 62 } )
63 63
64 64 # Build table of color schemes (needed by the parser)
65 65 InspectColors = ColorSchemeTable([NoColor,LinuxColors,LightBGColors],
66 66 'Linux')
67 67
68 68 #****************************************************************************
69 69 # Auxiliary functions
70 70 def getdoc(obj):
71 71 """Stable wrapper around inspect.getdoc.
72 72
73 73 This can't crash because of attribute problems.
74 74
75 75 It also attempts to call a getdoc() method on the given object. This
76 76 allows objects which provide their docstrings via non-standard mechanisms
77 77 (like Pyro proxies) to still be inspected by ipython's ? system."""
78 78
79 79 ds = None # default return value
80 80 try:
81 81 ds = inspect.getdoc(obj)
82 82 except:
83 83 # Harden against an inspect failure, which can occur with
84 84 # SWIG-wrapped extensions.
85 85 pass
86 86 # Allow objects to offer customized documentation via a getdoc method:
87 87 try:
88 88 ds2 = obj.getdoc()
89 89 except:
90 90 pass
91 91 else:
92 92 # if we get extra info, we add it to the normal docstring.
93 93 if ds is None:
94 94 ds = ds2
95 95 else:
96 96 ds = '%s\n%s' % (ds,ds2)
97 97 return ds
98 98
99 99 #****************************************************************************
100 100 # Class definitions
101 101
102 102 class myStringIO(StringIO.StringIO):
103 103 """Adds a writeln method to normal StringIO."""
104 104 def writeln(self,*arg,**kw):
105 105 """Does a write() and then a write('\n')"""
106 106 self.write(*arg,**kw)
107 107 self.write('\n')
108 108
109 109 class Inspector:
110 110 def __init__(self,color_table,code_color_table,scheme):
111 111 self.color_table = color_table
112 112 self.parser = PyColorize.Parser(code_color_table,out='str')
113 113 self.format = self.parser.format
114 114 self.set_active_scheme(scheme)
115 115
116 116 def __getargspec(self,obj):
117 117 """Get the names and default values of a function's arguments.
118 118
119 119 A tuple of four things is returned: (args, varargs, varkw, defaults).
120 120 'args' is a list of the argument names (it may contain nested lists).
121 121 'varargs' and 'varkw' are the names of the * and ** arguments or None.
122 122 'defaults' is an n-tuple of the default values of the last n arguments.
123 123
124 124 Modified version of inspect.getargspec from the Python Standard
125 125 Library."""
126 126
127 127 if inspect.isfunction(obj):
128 128 func_obj = obj
129 129 elif inspect.ismethod(obj):
130 130 func_obj = obj.im_func
131 131 else:
132 132 raise TypeError, 'arg is not a Python function'
133 133 args, varargs, varkw = inspect.getargs(func_obj.func_code)
134 134 return args, varargs, varkw, func_obj.func_defaults
135 135
136 136 def __getdef(self,obj,oname=''):
137 137 """Return the definition header for any callable object.
138 138
139 139 If any exception is generated, None is returned instead and the
140 140 exception is suppressed."""
141 141
142 142 try:
143 143 return oname + inspect.formatargspec(*self.__getargspec(obj))
144 144 except:
145 145 return None
146 146
147 147 def __head(self,h):
148 148 """Return a header string with proper colors."""
149 149 return '%s%s%s' % (self.color_table.active_colors.header,h,
150 150 self.color_table.active_colors.normal)
151 151
152 152 def set_active_scheme(self,scheme):
153 153 self.color_table.set_active_scheme(scheme)
154 154 self.parser.color_table.set_active_scheme(scheme)
155 155
156 156 def noinfo(self,msg,oname):
157 157 """Generic message when no information is found."""
158 158 print 'No %s found' % msg,
159 159 if oname:
160 160 print 'for %s' % oname
161 161 else:
162 162 print
163 163
164 164 def pdef(self,obj,oname=''):
165 165 """Print the definition header for any callable object.
166 166
167 167 If the object is a class, print the constructor information."""
168 168
169 169 if not callable(obj):
170 170 print 'Object is not callable.'
171 171 return
172 172
173 173 header = ''
174 174 if type(obj) is types.ClassType:
175 175 header = self.__head('Class constructor information:\n')
176 176 obj = obj.__init__
177 177 elif type(obj) is types.InstanceType:
178 178 obj = obj.__call__
179 179
180 180 output = self.__getdef(obj,oname)
181 181 if output is None:
182 182 self.noinfo('definition header',oname)
183 183 else:
184 184 print >>Term.cout, header,self.format(output),
185 185
186 186 def pdoc(self,obj,oname='',formatter = None):
187 187 """Print the docstring for any object.
188 188
189 189 Optional:
190 190 -formatter: a function to run the docstring through for specially
191 191 formatted docstrings."""
192 192
193 193 head = self.__head # so that itpl can find it even if private
194 194 ds = getdoc(obj)
195 195 if formatter:
196 196 ds = formatter(ds)
197 197 if type(obj) is types.ClassType:
198 198 init_ds = getdoc(obj.__init__)
199 199 output = itpl('$head("Class Docstring:")\n'
200 200 '$indent(ds)\n'
201 201 '$head("Constructor Docstring"):\n'
202 202 '$indent(init_ds)')
203 203 elif type(obj) is types.InstanceType and hasattr(obj,'__call__'):
204 204 call_ds = getdoc(obj.__call__)
205 205 if call_ds:
206 206 output = itpl('$head("Class Docstring:")\n$indent(ds)\n'
207 207 '$head("Calling Docstring:")\n$indent(call_ds)')
208 208 else:
209 209 output = ds
210 210 else:
211 211 output = ds
212 212 if output is None:
213 213 self.noinfo('documentation',oname)
214 214 return
215 215 page(output)
216 216
217 217 def psource(self,obj,oname=''):
218 218 """Print the source code for an object."""
219 219
220 220 # Flush the source cache because inspect can return out-of-date source
221 221 linecache.checkcache()
222 222 try:
223 223 src = inspect.getsource(obj)
224 224 except:
225 225 self.noinfo('source',oname)
226 226 else:
227 227 page(self.format(src))
228 228
229 229 def pfile(self,obj,oname=''):
230 230 """Show the whole file where an object was defined."""
231 231 try:
232 232 sourcelines,lineno = inspect.getsourcelines(obj)
233 233 except:
234 234 self.noinfo('file',oname)
235 235 else:
236 236 # run contents of file through pager starting at line
237 237 # where the object is defined
238 238 page(self.format(open(inspect.getabsfile(obj)).read()),lineno)
239 239
240 240 def pinfo(self,obj,oname='',formatter=None,info=None,detail_level=0):
241 241 """Show detailed information about an object.
242 242
243 243 Optional arguments:
244 244
245 245 - oname: name of the variable pointing to the object.
246 246
247 247 - formatter: special formatter for docstrings (see pdoc)
248 248
249 249 - info: a structure with some information fields which may have been
250 250 precomputed already.
251 251
252 252 - detail_level: if set to 1, more information is given.
253 253 """
254 254
255 255 obj_type = type(obj)
256 256
257 257 header = self.__head
258 258 if info is None:
259 259 ismagic = 0
260 260 isalias = 0
261 261 ospace = ''
262 262 else:
263 263 ismagic = info.ismagic
264 264 isalias = info.isalias
265 265 ospace = info.namespace
266 266 # Get docstring, special-casing aliases:
267 267 if isalias:
268 268 ds = "Alias to the system command:\n %s" % obj[1]
269 269 else:
270 270 ds = getdoc(obj)
271 if ds is None:
272 ds = '<no docstring>'
271 273 if formatter is not None:
272 274 ds = formatter(ds)
273 275
274 276 # store output in a list which gets joined with \n at the end.
275 277 out = myStringIO()
276 278
277 279 string_max = 200 # max size of strings to show (snipped if longer)
278 280 shalf = int((string_max -5)/2)
279 281
280 282 if ismagic:
281 283 obj_type_name = 'Magic function'
282 284 elif isalias:
283 285 obj_type_name = 'System alias'
284 286 else:
285 287 obj_type_name = obj_type.__name__
286 288 out.writeln(header('Type:\t\t')+obj_type_name)
287 289
288 290 try:
289 291 bclass = obj.__class__
290 292 out.writeln(header('Base Class:\t')+str(bclass))
291 293 except: pass
292 294
293 295 # String form, but snip if too long in ? form (full in ??)
294 296 try:
295 297 ostr = str(obj)
296 298 str_head = 'String Form:'
297 299 if not detail_level and len(ostr)>string_max:
298 300 ostr = ostr[:shalf] + ' <...> ' + ostr[-shalf:]
299 301 ostr = ("\n" + " " * len(str_head.expandtabs())).\
300 302 join(map(string.strip,ostr.split("\n")))
301 303 if ostr.find('\n') > -1:
302 304 # Print multi-line strings starting at the next line.
303 305 str_sep = '\n'
304 306 else:
305 307 str_sep = '\t'
306 308 out.writeln("%s%s%s" % (header(str_head),str_sep,ostr))
307 309 except:
308 310 pass
309 311
310 312 if ospace:
311 313 out.writeln(header('Namespace:\t')+ospace)
312 314
313 315 # Length (for strings and lists)
314 316 try:
315 317 length = str(len(obj))
316 318 out.writeln(header('Length:\t\t')+length)
317 319 except: pass
318 320
319 321 # Filename where object was defined
320 322 try:
321 323 file = inspect.getabsfile(obj)
322 324 if file.endswith('<string>'):
323 325 file = 'Dynamically generated function. No source code available.'
324 326 out.writeln(header('File:\t\t')+file)
325 327 except: pass
326 328
327 329 # reconstruct the function definition and print it:
328 330 defln = self.__getdef(obj,oname)
329 331 if defln:
330 332 out.write(header('Definition:\t')+self.format(defln))
331 333
332 334 # Docstrings only in detail 0 mode, since source contains them (we
333 335 # avoid repetitions). If source fails, we add them back, see below.
334 336 if ds and detail_level == 0:
335 337 out.writeln(header('Docstring:\n') + indent(ds))
336 338
337 339 # Original source code for any callable
338 340 if detail_level:
339 341 # Flush the source cache because inspect can return out-of-date source
340 342 linecache.checkcache()
341 343 try:
342 344 source = self.format(inspect.getsource(obj))
343 345 out.write(header('Source:\n')+source.rstrip())
344 346 except:
345 347 if ds:
346 348 out.writeln(header('Docstring:\n') + indent(ds))
347 349
348 350 # Constructor docstring for classes
349 351 if obj_type is types.ClassType:
350 352 # reconstruct the function definition and print it:
351 353 try:
352 354 obj_init = obj.__init__
353 355 except AttributeError:
354 356 init_def = init_ds = None
355 357 else:
356 358 init_def = self.__getdef(obj_init,oname)
357 359 init_ds = getdoc(obj_init)
358 360
359 361 if init_def or init_ds:
360 362 out.writeln(header('\nConstructor information:'))
361 363 if init_def:
362 364 out.write(header('Definition:\t')+ self.format(init_def))
363 365 if init_ds:
364 366 out.writeln(header('Docstring:\n') + indent(init_ds))
365 367 # and class docstring for instances:
366 368 elif obj_type is types.InstanceType:
367 369
368 370 # First, check whether the instance docstring is identical to the
369 371 # class one, and print it separately if they don't coincide. In
370 372 # most cases they will, but it's nice to print all the info for
371 373 # objects which use instance-customized docstrings.
372 374 if ds:
373 375 class_ds = getdoc(obj.__class__)
374 376 if class_ds and ds != class_ds:
375 377 out.writeln(header('Class Docstring:\n') +
376 378 indent(class_ds))
377 379
378 380 # Next, try to show constructor docstrings
379 381 try:
380 382 init_ds = getdoc(obj.__init__)
381 383 except AttributeError:
382 384 init_ds = None
383 385 if init_ds:
384 386 out.writeln(header('Constructor Docstring:\n') +
385 387 indent(init_ds))
386 388
387 389 # Call form docstring for callable instances
388 390 if hasattr(obj,'__call__'):
389 391 out.writeln(header('Callable:\t')+'Yes')
390 392 call_def = self.__getdef(obj.__call__,oname)
391 393 if call_def is None:
392 394 out.write(header('Call def:\t')+
393 395 'Calling definition not available.')
394 396 else:
395 397 out.write(header('Call def:\t')+self.format(call_def))
396 398 call_ds = getdoc(obj.__call__)
397 399 if call_ds:
398 400 out.writeln(header('Call docstring:\n') + indent(call_ds))
399 401
400 402 # Finally send to printer/pager
401 403 output = out.getvalue()
402 404 if output:
403 405 page(output)
404 406 # end pinfo
405 407
406 408 def psearch(self,pattern,ns_table,ns_search=[],
407 409 ignore_case=False,show_all=False):
408 410 """Search namespaces with wildcards for objects.
409 411
410 412 Arguments:
411 413
412 414 - pattern: string containing shell-like wildcards to use in namespace
413 415 searches and optionally a type specification to narrow the search to
414 416 objects of that type.
415 417
416 418 - ns_table: dict of name->namespaces for search.
417 419
418 420 Optional arguments:
419 421
420 422 - ns_search: list of namespace names to include in search.
421 423
422 424 - ignore_case(False): make the search case-insensitive.
423 425
424 426 - show_all(False): show all names, including those starting with
425 427 underscores.
426 428 """
427 429 # defaults
428 430 type_pattern = 'all'
429 431 filter = ''
430 432
431 433 cmds = pattern.split()
432 434 len_cmds = len(cmds)
433 435 if len_cmds == 1:
434 436 # Only filter pattern given
435 437 filter = cmds[0]
436 438 elif len_cmds == 2:
437 439 # Both filter and type specified
438 440 filter,type_pattern = cmds
439 441 else:
440 442 raise ValueError('invalid argument string for psearch: <%s>' %
441 443 pattern)
442 444
443 445 # filter search namespaces
444 446 for name in ns_search:
445 447 if name not in ns_table:
446 448 raise ValueError('invalid namespace <%s>. Valid names: %s' %
447 449 (name,ns_table.keys()))
448 450
449 451 #print 'type_pattern:',type_pattern # dbg
450 452 search_result = []
451 453 for ns_name in ns_search:
452 454 ns = ns_table[ns_name]
453 455 tmp_res = list(list_namespace(ns,type_pattern,filter,
454 456 ignore_case=ignore_case,
455 457 show_all=show_all))
456 458 search_result.extend(tmp_res)
457 459 search_result.sort()
458 460
459 461 page('\n'.join(search_result))
@@ -1,65 +1,66 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 IPython -- An enhanced Interactive Python
4 4
5 5 One of Python's nicest features is its interactive interpreter. This allows
6 6 very fast testing of ideas without the overhead of creating test files as is
7 7 typical in most programming languages. However, the interpreter supplied with
8 8 the standard Python distribution is fairly primitive (and IDLE isn't really
9 9 much better).
10 10
11 11 IPython tries to:
12 12
13 13 i - provide an efficient environment for interactive work in Python
14 14 programming. It tries to address what we see as shortcomings of the standard
15 15 Python prompt, and adds many features to make interactive work much more
16 16 efficient.
17 17
18 18 ii - offer a flexible framework so that it can be used as the base
19 19 environment for other projects and problems where Python can be the
20 20 underlying language. Specifically scientific environments like Mathematica,
21 21 IDL and Mathcad inspired its design, but similar ideas can be useful in many
22 22 fields. Python is a fabulous language for implementing this kind of system
23 23 (due to its dynamic and introspective features), and with suitable libraries
24 24 entire systems could be built leveraging Python's power.
25 25
26 26 iii - serve as an embeddable, ready to go interpreter for your own programs.
27 27
28 28 IPython requires Python 2.2 or newer.
29 29
30 $Id: __init__.py 1014 2006-01-13 19:16:41Z vivainio $"""
30 $Id: __init__.py 1016 2006-01-14 00:54:23Z vivainio $"""
31 31
32 32 #*****************************************************************************
33 33 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
34 34 #
35 35 # Distributed under the terms of the BSD License. The full license is in
36 36 # the file COPYING, distributed as part of this software.
37 37 #*****************************************************************************
38 38
39 39 # Enforce proper version requirements
40 40 import sys
41 41 if sys.version[0:3] < '2.3':
42 42 raise ImportError, 'Python Version 2.3 or above is required.'
43 43
44 44 # Define what gets imported with a 'from IPython import *'
45 45 __all__ = ['deep_reload','genutils','ipstruct','ultraTB','DPyGetOpt',
46 46 'Itpl','hooks','ConfigLoader','OutputTrap','Release','Shell',
47 'platutils','platutils_win32','platutils_posix','platutils_dummy']
47 'platutils','platutils_win32','platutils_posix','platutils_dummy',
48 'ipapi']
48 49
49 50 # Load __all__ in IPython namespace so that a simple 'import IPython' gives
50 51 # access to them via IPython.<name>
51 52 glob,loc = globals(),locals()
52 53 for name in __all__:
53 54 __import__(name,glob,loc,[])
54 55
55 56 # Release data
56 57 from IPython import Release # do it explicitly so pydoc can see it - pydoc bug
57 58 __author__ = '%s <%s>\n%s <%s>\n%s <%s>' % \
58 59 ( Release.authors['Fernando'] + Release.authors['Janko'] + \
59 60 Release.authors['Nathan'] )
60 61 __license__ = Release.license
61 62 __version__ = Release.version
62 63 __revision__ = Release.revision
63 64
64 65 # Namespace cleanup
65 66 del name,glob,loc
@@ -1,2193 +1,2198 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 IPython -- An enhanced Interactive Python
4 4
5 Requires Python 2.1 or newer.
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 1015 2006-01-13 22:47:06Z vivainio $
9 $Id: iplib.py 1016 2006-01-14 00:54:23Z vivainio $
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 __future__ import generators # for 2.2 backwards-compatibility
32 32
33 33 from IPython import Release
34 34 __author__ = '%s <%s>\n%s <%s>' % \
35 35 ( Release.authors['Janko'] + Release.authors['Fernando'] )
36 36 __license__ = Release.license
37 37 __version__ = Release.version
38 38
39 39 # Python standard modules
40 40 import __main__
41 41 import __builtin__
42 42 import StringIO
43 43 import bdb
44 44 import cPickle as pickle
45 45 import codeop
46 46 import exceptions
47 47 import glob
48 48 import inspect
49 49 import keyword
50 50 import new
51 51 import os
52 52 import pdb
53 53 import pydoc
54 54 import re
55 55 import shutil
56 56 import string
57 57 import sys
58 58 import tempfile
59 59 import traceback
60 60 import types
61 61
62 62 from pprint import pprint, pformat
63 63
64 64 # IPython's own modules
65 65 import IPython
66 66 from IPython import OInspect,PyColorize,ultraTB
67 67 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
68 68 from IPython.FakeModule import FakeModule
69 69 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
70 70 from IPython.Logger import Logger
71 71 from IPython.Magic import Magic
72 72 from IPython.Prompts import CachedOutput
73 73 from IPython.ipstruct import Struct
74 74 from IPython.background_jobs import BackgroundJobManager
75 75 from IPython.usage import cmd_line_usage,interactive_usage
76 76 from IPython.genutils import *
77 import IPython.ipapi
77 78
78 79 # Globals
79 80
80 81 # store the builtin raw_input globally, and use this always, in case user code
81 82 # overwrites it (like wx.py.PyShell does)
82 83 raw_input_original = raw_input
83 84
84 85 # compiled regexps for autoindent management
85 86 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
86 87
87 88
88 89 #****************************************************************************
89 90 # Some utility function definitions
90 91
91 92 ini_spaces_re = re.compile(r'^(\s+)')
92 93
93 94 def num_ini_spaces(strng):
94 95 """Return the number of initial spaces in a string"""
95 96
96 97 ini_spaces = ini_spaces_re.match(strng)
97 98 if ini_spaces:
98 99 return ini_spaces.end()
99 100 else:
100 101 return 0
101 102
102 103 def softspace(file, newvalue):
103 104 """Copied from code.py, to remove the dependency"""
104 105
105 106 oldvalue = 0
106 107 try:
107 108 oldvalue = file.softspace
108 109 except AttributeError:
109 110 pass
110 111 try:
111 112 file.softspace = newvalue
112 113 except (AttributeError, TypeError):
113 114 # "attribute-less object" or "read-only attributes"
114 115 pass
115 116 return oldvalue
116 117
117 118
118 119 #****************************************************************************
119 120 # Local use exceptions
120 121 class SpaceInInput(exceptions.Exception): pass
121 122
122 123
123 124 #****************************************************************************
124 125 # Local use classes
125 126 class Bunch: pass
126 127
127 128 class Undefined: pass
128 129
129 130 class InputList(list):
130 131 """Class to store user input.
131 132
132 133 It's basically a list, but slices return a string instead of a list, thus
133 134 allowing things like (assuming 'In' is an instance):
134 135
135 136 exec In[4:7]
136 137
137 138 or
138 139
139 140 exec In[5:9] + In[14] + In[21:25]"""
140 141
141 142 def __getslice__(self,i,j):
142 143 return ''.join(list.__getslice__(self,i,j))
143 144
144 145 class SyntaxTB(ultraTB.ListTB):
145 146 """Extension which holds some state: the last exception value"""
146 147
147 148 def __init__(self,color_scheme = 'NoColor'):
148 149 ultraTB.ListTB.__init__(self,color_scheme)
149 150 self.last_syntax_error = None
150 151
151 152 def __call__(self, etype, value, elist):
152 153 self.last_syntax_error = value
153 154 ultraTB.ListTB.__call__(self,etype,value,elist)
154 155
155 156 def clear_err_state(self):
156 157 """Return the current error state and clear it"""
157 158 e = self.last_syntax_error
158 159 self.last_syntax_error = None
159 160 return e
160 161
161 162 #****************************************************************************
162 163 # Main IPython class
163 164
164 165 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
165 166 # until a full rewrite is made. I've cleaned all cross-class uses of
166 167 # attributes and methods, but too much user code out there relies on the
167 168 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
168 169 #
169 170 # But at least now, all the pieces have been separated and we could, in
170 171 # principle, stop using the mixin. This will ease the transition to the
171 172 # chainsaw branch.
172 173
173 174 # For reference, the following is the list of 'self.foo' uses in the Magic
174 175 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
175 176 # class, to prevent clashes.
176 177
177 178 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
178 179 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
179 180 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
180 181 # 'self.value']
181 182
182 183 class InteractiveShell(object,Magic):
183 184 """An enhanced console for Python."""
184 185
185 186 # class attribute to indicate whether the class supports threads or not.
186 187 # Subclasses with thread support should override this as needed.
187 188 isthreaded = False
188 189
189 190 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
190 191 user_ns = None,user_global_ns=None,banner2='',
191 192 custom_exceptions=((),None),embedded=False):
192 193
194 # first thing: introduce ourselves to IPython.ipapi which is uncallable
195 # before it knows an InteractiveShell object. Uninitialized state is ok
196 IPython.ipapi._init_with_shell(self)
197
193 198 # some minimal strict typechecks. For some core data structures, I
194 199 # want actual basic python types, not just anything that looks like
195 200 # one. This is especially true for namespaces.
196 201 for ns in (user_ns,user_global_ns):
197 202 if ns is not None and type(ns) != types.DictType:
198 203 raise TypeError,'namespace must be a dictionary'
199 204
200 205 # Job manager (for jobs run as background threads)
201 206 self.jobs = BackgroundJobManager()
202 207
203 208 # track which builtins we add, so we can clean up later
204 209 self.builtins_added = {}
205 210 # This method will add the necessary builtins for operation, but
206 211 # tracking what it did via the builtins_added dict.
207 212 self.add_builtins()
208 213
209 214 # Do the intuitively correct thing for quit/exit: we remove the
210 215 # builtins if they exist, and our own magics will deal with this
211 216 try:
212 217 del __builtin__.exit, __builtin__.quit
213 218 except AttributeError:
214 219 pass
215 220
216 221 # Store the actual shell's name
217 222 self.name = name
218 223
219 224 # We need to know whether the instance is meant for embedding, since
220 225 # global/local namespaces need to be handled differently in that case
221 226 self.embedded = embedded
222 227
223 228 # command compiler
224 229 self.compile = codeop.CommandCompiler()
225 230
226 231 # User input buffer
227 232 self.buffer = []
228 233
229 234 # Default name given in compilation of code
230 235 self.filename = '<ipython console>'
231 236
232 237 # Make an empty namespace, which extension writers can rely on both
233 238 # existing and NEVER being used by ipython itself. This gives them a
234 239 # convenient location for storing additional information and state
235 240 # their extensions may require, without fear of collisions with other
236 241 # ipython names that may develop later.
237 242 self.meta = Bunch()
238 243
239 244 # Create the namespace where the user will operate. user_ns is
240 245 # normally the only one used, and it is passed to the exec calls as
241 246 # the locals argument. But we do carry a user_global_ns namespace
242 247 # given as the exec 'globals' argument, This is useful in embedding
243 248 # situations where the ipython shell opens in a context where the
244 249 # distinction between locals and globals is meaningful.
245 250
246 251 # FIXME. For some strange reason, __builtins__ is showing up at user
247 252 # level as a dict instead of a module. This is a manual fix, but I
248 253 # should really track down where the problem is coming from. Alex
249 254 # Schmolck reported this problem first.
250 255
251 256 # A useful post by Alex Martelli on this topic:
252 257 # Re: inconsistent value from __builtins__
253 258 # Von: Alex Martelli <aleaxit@yahoo.com>
254 259 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
255 260 # Gruppen: comp.lang.python
256 261
257 262 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
258 263 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
259 264 # > <type 'dict'>
260 265 # > >>> print type(__builtins__)
261 266 # > <type 'module'>
262 267 # > Is this difference in return value intentional?
263 268
264 269 # Well, it's documented that '__builtins__' can be either a dictionary
265 270 # or a module, and it's been that way for a long time. Whether it's
266 271 # intentional (or sensible), I don't know. In any case, the idea is
267 272 # that if you need to access the built-in namespace directly, you
268 273 # should start with "import __builtin__" (note, no 's') which will
269 274 # definitely give you a module. Yeah, it's somewhat confusing:-(.
270 275
271 276 if user_ns is None:
272 277 # Set __name__ to __main__ to better match the behavior of the
273 278 # normal interpreter.
274 279 user_ns = {'__name__' :'__main__',
275 280 '__builtins__' : __builtin__,
276 281 }
277 282
278 283 if user_global_ns is None:
279 284 user_global_ns = {}
280 285
281 286 # Assign namespaces
282 287 # This is the namespace where all normal user variables live
283 288 self.user_ns = user_ns
284 289 # Embedded instances require a separate namespace for globals.
285 290 # Normally this one is unused by non-embedded instances.
286 291 self.user_global_ns = user_global_ns
287 292 # A namespace to keep track of internal data structures to prevent
288 293 # them from cluttering user-visible stuff. Will be updated later
289 294 self.internal_ns = {}
290 295
291 296 # Namespace of system aliases. Each entry in the alias
292 297 # table must be a 2-tuple of the form (N,name), where N is the number
293 298 # of positional arguments of the alias.
294 299 self.alias_table = {}
295 300
296 301 # A table holding all the namespaces IPython deals with, so that
297 302 # introspection facilities can search easily.
298 303 self.ns_table = {'user':user_ns,
299 304 'user_global':user_global_ns,
300 305 'alias':self.alias_table,
301 306 'internal':self.internal_ns,
302 307 'builtin':__builtin__.__dict__
303 308 }
304 309
305 310 # The user namespace MUST have a pointer to the shell itself.
306 311 self.user_ns[name] = self
307 312
308 313 # We need to insert into sys.modules something that looks like a
309 314 # module but which accesses the IPython namespace, for shelve and
310 315 # pickle to work interactively. Normally they rely on getting
311 316 # everything out of __main__, but for embedding purposes each IPython
312 317 # instance has its own private namespace, so we can't go shoving
313 318 # everything into __main__.
314 319
315 320 # note, however, that we should only do this for non-embedded
316 321 # ipythons, which really mimic the __main__.__dict__ with their own
317 322 # namespace. Embedded instances, on the other hand, should not do
318 323 # this because they need to manage the user local/global namespaces
319 324 # only, but they live within a 'normal' __main__ (meaning, they
320 325 # shouldn't overtake the execution environment of the script they're
321 326 # embedded in).
322 327
323 328 if not embedded:
324 329 try:
325 330 main_name = self.user_ns['__name__']
326 331 except KeyError:
327 332 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
328 333 else:
329 334 #print "pickle hack in place" # dbg
330 335 #print 'main_name:',main_name # dbg
331 336 sys.modules[main_name] = FakeModule(self.user_ns)
332 337
333 338 # List of input with multi-line handling.
334 339 # Fill its zero entry, user counter starts at 1
335 340 self.input_hist = InputList(['\n'])
336 341
337 342 # list of visited directories
338 343 try:
339 344 self.dir_hist = [os.getcwd()]
340 345 except IOError, e:
341 346 self.dir_hist = []
342 347
343 348 # dict of output history
344 349 self.output_hist = {}
345 350
346 351 # dict of things NOT to alias (keywords, builtins and some magics)
347 352 no_alias = {}
348 353 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
349 354 for key in keyword.kwlist + no_alias_magics:
350 355 no_alias[key] = 1
351 356 no_alias.update(__builtin__.__dict__)
352 357 self.no_alias = no_alias
353 358
354 359 # make global variables for user access to these
355 360 self.user_ns['_ih'] = self.input_hist
356 361 self.user_ns['_oh'] = self.output_hist
357 362 self.user_ns['_dh'] = self.dir_hist
358 363
359 364 # user aliases to input and output histories
360 365 self.user_ns['In'] = self.input_hist
361 366 self.user_ns['Out'] = self.output_hist
362 367
363 368 # Object variable to store code object waiting execution. This is
364 369 # used mainly by the multithreaded shells, but it can come in handy in
365 370 # other situations. No need to use a Queue here, since it's a single
366 371 # item which gets cleared once run.
367 372 self.code_to_run = None
368 373
369 374 # escapes for automatic behavior on the command line
370 375 self.ESC_SHELL = '!'
371 376 self.ESC_HELP = '?'
372 377 self.ESC_MAGIC = '%'
373 378 self.ESC_QUOTE = ','
374 379 self.ESC_QUOTE2 = ';'
375 380 self.ESC_PAREN = '/'
376 381
377 382 # And their associated handlers
378 383 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
379 384 self.ESC_QUOTE : self.handle_auto,
380 385 self.ESC_QUOTE2 : self.handle_auto,
381 386 self.ESC_MAGIC : self.handle_magic,
382 387 self.ESC_HELP : self.handle_help,
383 388 self.ESC_SHELL : self.handle_shell_escape,
384 389 }
385 390
386 391 # class initializations
387 392 Magic.__init__(self,self)
388 393
389 394 # Python source parser/formatter for syntax highlighting
390 395 pyformat = PyColorize.Parser().format
391 396 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
392 397
393 398 # hooks holds pointers used for user-side customizations
394 399 self.hooks = Struct()
395 400
396 401 # Set all default hooks, defined in the IPython.hooks module.
397 402 hooks = IPython.hooks
398 403 for hook_name in hooks.__all__:
399 404 self.set_hook(hook_name,getattr(hooks,hook_name))
400 405
401 406 # Flag to mark unconditional exit
402 407 self.exit_now = False
403 408
404 409 self.usage_min = """\
405 410 An enhanced console for Python.
406 411 Some of its features are:
407 412 - Readline support if the readline library is present.
408 413 - Tab completion in the local namespace.
409 414 - Logging of input, see command-line options.
410 415 - System shell escape via ! , eg !ls.
411 416 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
412 417 - Keeps track of locally defined variables via %who, %whos.
413 418 - Show object information with a ? eg ?x or x? (use ?? for more info).
414 419 """
415 420 if usage: self.usage = usage
416 421 else: self.usage = self.usage_min
417 422
418 423 # Storage
419 424 self.rc = rc # This will hold all configuration information
420 425 self.pager = 'less'
421 426 # temporary files used for various purposes. Deleted at exit.
422 427 self.tempfiles = []
423 428
424 429 # Keep track of readline usage (later set by init_readline)
425 430 self.has_readline = False
426 431
427 432 # template for logfile headers. It gets resolved at runtime by the
428 433 # logstart method.
429 434 self.loghead_tpl = \
430 435 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
431 436 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
432 437 #log# opts = %s
433 438 #log# args = %s
434 439 #log# It is safe to make manual edits below here.
435 440 #log#-----------------------------------------------------------------------
436 441 """
437 442 # for pushd/popd management
438 443 try:
439 444 self.home_dir = get_home_dir()
440 445 except HomeDirError,msg:
441 446 fatal(msg)
442 447
443 448 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
444 449
445 450 # Functions to call the underlying shell.
446 451
447 452 # utility to expand user variables via Itpl
448 453 self.var_expand = lambda cmd: str(ItplNS(cmd.replace('#','\#'),
449 454 self.user_ns))
450 455 # The first is similar to os.system, but it doesn't return a value,
451 456 # and it allows interpolation of variables in the user's namespace.
452 457 self.system = lambda cmd: shell(self.var_expand(cmd),
453 458 header='IPython system call: ',
454 459 verbose=self.rc.system_verbose)
455 460 # These are for getoutput and getoutputerror:
456 461 self.getoutput = lambda cmd: \
457 462 getoutput(self.var_expand(cmd),
458 463 header='IPython system call: ',
459 464 verbose=self.rc.system_verbose)
460 465 self.getoutputerror = lambda cmd: \
461 466 getoutputerror(str(ItplNS(cmd.replace('#','\#'),
462 467 self.user_ns)),
463 468 header='IPython system call: ',
464 469 verbose=self.rc.system_verbose)
465 470
466 471 # RegExp for splitting line contents into pre-char//first
467 472 # word-method//rest. For clarity, each group in on one line.
468 473
469 474 # WARNING: update the regexp if the above escapes are changed, as they
470 475 # are hardwired in.
471 476
472 477 # Don't get carried away with trying to make the autocalling catch too
473 478 # much: it's better to be conservative rather than to trigger hidden
474 479 # evals() somewhere and end up causing side effects.
475 480
476 481 self.line_split = re.compile(r'^([\s*,;/])'
477 482 r'([\?\w\.]+\w*\s*)'
478 483 r'(\(?.*$)')
479 484
480 485 # Original re, keep around for a while in case changes break something
481 486 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
482 487 # r'(\s*[\?\w\.]+\w*\s*)'
483 488 # r'(\(?.*$)')
484 489
485 490 # RegExp to identify potential function names
486 491 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
487 492
488 493 # RegExp to exclude strings with this start from autocalling. In
489 494 # particular, all binary operators should be excluded, so that if foo
490 495 # is callable, foo OP bar doesn't become foo(OP bar), which is
491 496 # invalid. The characters '!=()' don't need to be checked for, as the
492 497 # _prefilter routine explicitely does so, to catch direct calls and
493 498 # rebindings of existing names.
494 499
495 500 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
496 501 # it affects the rest of the group in square brackets.
497 502 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
498 503 '|^is |^not |^in |^and |^or ')
499 504
500 505 # try to catch also methods for stuff in lists/tuples/dicts: off
501 506 # (experimental). For this to work, the line_split regexp would need
502 507 # to be modified so it wouldn't break things at '['. That line is
503 508 # nasty enough that I shouldn't change it until I can test it _well_.
504 509 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
505 510
506 511 # keep track of where we started running (mainly for crash post-mortem)
507 512 self.starting_dir = os.getcwd()
508 513
509 514 # Various switches which can be set
510 515 self.CACHELENGTH = 5000 # this is cheap, it's just text
511 516 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
512 517 self.banner2 = banner2
513 518
514 519 # TraceBack handlers:
515 520
516 521 # Syntax error handler.
517 522 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
518 523
519 524 # The interactive one is initialized with an offset, meaning we always
520 525 # want to remove the topmost item in the traceback, which is our own
521 526 # internal code. Valid modes: ['Plain','Context','Verbose']
522 527 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
523 528 color_scheme='NoColor',
524 529 tb_offset = 1)
525 530
526 531 # IPython itself shouldn't crash. This will produce a detailed
527 532 # post-mortem if it does. But we only install the crash handler for
528 533 # non-threaded shells, the threaded ones use a normal verbose reporter
529 534 # and lose the crash handler. This is because exceptions in the main
530 535 # thread (such as in GUI code) propagate directly to sys.excepthook,
531 536 # and there's no point in printing crash dumps for every user exception.
532 537 if self.isthreaded:
533 538 sys.excepthook = ultraTB.FormattedTB()
534 539 else:
535 540 from IPython import CrashHandler
536 541 sys.excepthook = CrashHandler.CrashHandler(self)
537 542
538 543 # The instance will store a pointer to this, so that runtime code
539 544 # (such as magics) can access it. This is because during the
540 545 # read-eval loop, it gets temporarily overwritten (to deal with GUI
541 546 # frameworks).
542 547 self.sys_excepthook = sys.excepthook
543 548
544 549 # and add any custom exception handlers the user may have specified
545 550 self.set_custom_exc(*custom_exceptions)
546 551
547 552 # Object inspector
548 553 self.inspector = OInspect.Inspector(OInspect.InspectColors,
549 554 PyColorize.ANSICodeColors,
550 555 'NoColor')
551 556 # indentation management
552 557 self.autoindent = False
553 558 self.indent_current_nsp = 0
554 559 self.indent_current = '' # actual indent string
555 560
556 561 # Make some aliases automatically
557 562 # Prepare list of shell aliases to auto-define
558 563 if os.name == 'posix':
559 564 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
560 565 'mv mv -i','rm rm -i','cp cp -i',
561 566 'cat cat','less less','clear clear',
562 567 # a better ls
563 568 'ls ls -F',
564 569 # long ls
565 570 'll ls -lF',
566 571 # color ls
567 572 'lc ls -F -o --color',
568 573 # ls normal files only
569 574 'lf ls -F -o --color %l | grep ^-',
570 575 # ls symbolic links
571 576 'lk ls -F -o --color %l | grep ^l',
572 577 # directories or links to directories,
573 578 'ldir ls -F -o --color %l | grep /$',
574 579 # things which are executable
575 580 'lx ls -F -o --color %l | grep ^-..x',
576 581 )
577 582 elif os.name in ['nt','dos']:
578 583 auto_alias = ('dir dir /on', 'ls dir /on',
579 584 'ddir dir /ad /on', 'ldir dir /ad /on',
580 585 'mkdir mkdir','rmdir rmdir','echo echo',
581 586 'ren ren','cls cls','copy copy')
582 587 else:
583 588 auto_alias = ()
584 589 self.auto_alias = map(lambda s:s.split(None,1),auto_alias)
585 590 # Call the actual (public) initializer
586 591 self.init_auto_alias()
587 592 # end __init__
588 593
589 594 def post_config_initialization(self):
590 595 """Post configuration init method
591 596
592 597 This is called after the configuration files have been processed to
593 598 'finalize' the initialization."""
594 599
595 600 rc = self.rc
596 601
597 602 # Load readline proper
598 603 if rc.readline:
599 604 self.init_readline()
600 605
601 606 # log system
602 607 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
603 608 # local shortcut, this is used a LOT
604 609 self.log = self.logger.log
605 610
606 611 # Initialize cache, set in/out prompts and printing system
607 612 self.outputcache = CachedOutput(self,
608 613 rc.cache_size,
609 614 rc.pprint,
610 615 input_sep = rc.separate_in,
611 616 output_sep = rc.separate_out,
612 617 output_sep2 = rc.separate_out2,
613 618 ps1 = rc.prompt_in1,
614 619 ps2 = rc.prompt_in2,
615 620 ps_out = rc.prompt_out,
616 621 pad_left = rc.prompts_pad_left)
617 622
618 623 # user may have over-ridden the default print hook:
619 624 try:
620 625 self.outputcache.__class__.display = self.hooks.display
621 626 except AttributeError:
622 627 pass
623 628
624 629 # I don't like assigning globally to sys, because it means when embedding
625 630 # instances, each embedded instance overrides the previous choice. But
626 631 # sys.displayhook seems to be called internally by exec, so I don't see a
627 632 # way around it.
628 633 sys.displayhook = self.outputcache
629 634
630 635 # Set user colors (don't do it in the constructor above so that it
631 636 # doesn't crash if colors option is invalid)
632 637 self.magic_colors(rc.colors)
633 638
634 639 # Set calling of pdb on exceptions
635 640 self.call_pdb = rc.pdb
636 641
637 642 # Load user aliases
638 643 for alias in rc.alias:
639 644 self.magic_alias(alias)
640 645
641 646 # dynamic data that survives through sessions
642 647 # XXX make the filename a config option?
643 648 persist_base = 'persist'
644 649 if rc.profile:
645 650 persist_base += '_%s' % rc.profile
646 651 self.persist_fname = os.path.join(rc.ipythondir,persist_base)
647 652
648 653 try:
649 654 self.persist = pickle.load(file(self.persist_fname))
650 655 except:
651 656 self.persist = {}
652 657
653 658
654 659 for (key, value) in [(k[2:],v) for (k,v) in self.persist.items() if k.startswith('S:')]:
655 660 try:
656 661 obj = pickle.loads(value)
657 662 except:
658 663
659 664 print "Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % key
660 665 print "The error was:",sys.exc_info()[0]
661 666 continue
662 667
663 668
664 669 self.user_ns[key] = obj
665 670
666 671 def add_builtins(self):
667 672 """Store ipython references into the builtin namespace.
668 673
669 674 Some parts of ipython operate via builtins injected here, which hold a
670 675 reference to IPython itself."""
671 676
672 677 builtins_new = dict(__IPYTHON__ = self,
673 678 ip_set_hook = self.set_hook,
674 679 jobs = self.jobs,
675 680 ipmagic = self.ipmagic,
676 681 ipalias = self.ipalias,
677 682 ipsystem = self.ipsystem,
678 683 )
679 684 for biname,bival in builtins_new.items():
680 685 try:
681 686 # store the orignal value so we can restore it
682 687 self.builtins_added[biname] = __builtin__.__dict__[biname]
683 688 except KeyError:
684 689 # or mark that it wasn't defined, and we'll just delete it at
685 690 # cleanup
686 691 self.builtins_added[biname] = Undefined
687 692 __builtin__.__dict__[biname] = bival
688 693
689 694 # Keep in the builtins a flag for when IPython is active. We set it
690 695 # with setdefault so that multiple nested IPythons don't clobber one
691 696 # another. Each will increase its value by one upon being activated,
692 697 # which also gives us a way to determine the nesting level.
693 698 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
694 699
695 700 def clean_builtins(self):
696 701 """Remove any builtins which might have been added by add_builtins, or
697 702 restore overwritten ones to their previous values."""
698 703 for biname,bival in self.builtins_added.items():
699 704 if bival is Undefined:
700 705 del __builtin__.__dict__[biname]
701 706 else:
702 707 __builtin__.__dict__[biname] = bival
703 708 self.builtins_added.clear()
704 709
705 710 def set_hook(self,name,hook):
706 711 """set_hook(name,hook) -> sets an internal IPython hook.
707 712
708 713 IPython exposes some of its internal API as user-modifiable hooks. By
709 714 resetting one of these hooks, you can modify IPython's behavior to
710 715 call at runtime your own routines."""
711 716
712 717 # At some point in the future, this should validate the hook before it
713 718 # accepts it. Probably at least check that the hook takes the number
714 719 # of args it's supposed to.
715 720 setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
716 721
717 722 def set_custom_exc(self,exc_tuple,handler):
718 723 """set_custom_exc(exc_tuple,handler)
719 724
720 725 Set a custom exception handler, which will be called if any of the
721 726 exceptions in exc_tuple occur in the mainloop (specifically, in the
722 727 runcode() method.
723 728
724 729 Inputs:
725 730
726 731 - exc_tuple: a *tuple* of valid exceptions to call the defined
727 732 handler for. It is very important that you use a tuple, and NOT A
728 733 LIST here, because of the way Python's except statement works. If
729 734 you only want to trap a single exception, use a singleton tuple:
730 735
731 736 exc_tuple == (MyCustomException,)
732 737
733 738 - handler: this must be defined as a function with the following
734 739 basic interface: def my_handler(self,etype,value,tb).
735 740
736 741 This will be made into an instance method (via new.instancemethod)
737 742 of IPython itself, and it will be called if any of the exceptions
738 743 listed in the exc_tuple are caught. If the handler is None, an
739 744 internal basic one is used, which just prints basic info.
740 745
741 746 WARNING: by putting in your own exception handler into IPython's main
742 747 execution loop, you run a very good chance of nasty crashes. This
743 748 facility should only be used if you really know what you are doing."""
744 749
745 750 assert type(exc_tuple)==type(()) , \
746 751 "The custom exceptions must be given AS A TUPLE."
747 752
748 753 def dummy_handler(self,etype,value,tb):
749 754 print '*** Simple custom exception handler ***'
750 755 print 'Exception type :',etype
751 756 print 'Exception value:',value
752 757 print 'Traceback :',tb
753 758 print 'Source code :','\n'.join(self.buffer)
754 759
755 760 if handler is None: handler = dummy_handler
756 761
757 762 self.CustomTB = new.instancemethod(handler,self,self.__class__)
758 763 self.custom_exceptions = exc_tuple
759 764
760 765 def set_custom_completer(self,completer,pos=0):
761 766 """set_custom_completer(completer,pos=0)
762 767
763 768 Adds a new custom completer function.
764 769
765 770 The position argument (defaults to 0) is the index in the completers
766 771 list where you want the completer to be inserted."""
767 772
768 773 newcomp = new.instancemethod(completer,self.Completer,
769 774 self.Completer.__class__)
770 775 self.Completer.matchers.insert(pos,newcomp)
771 776
772 777 def _get_call_pdb(self):
773 778 return self._call_pdb
774 779
775 780 def _set_call_pdb(self,val):
776 781
777 782 if val not in (0,1,False,True):
778 783 raise ValueError,'new call_pdb value must be boolean'
779 784
780 785 # store value in instance
781 786 self._call_pdb = val
782 787
783 788 # notify the actual exception handlers
784 789 self.InteractiveTB.call_pdb = val
785 790 if self.isthreaded:
786 791 try:
787 792 self.sys_excepthook.call_pdb = val
788 793 except:
789 794 warn('Failed to activate pdb for threaded exception handler')
790 795
791 796 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
792 797 'Control auto-activation of pdb at exceptions')
793 798
794 799
795 800 # These special functions get installed in the builtin namespace, to
796 801 # provide programmatic (pure python) access to magics, aliases and system
797 802 # calls. This is important for logging, user scripting, and more.
798 803
799 804 # We are basically exposing, via normal python functions, the three
800 805 # mechanisms in which ipython offers special call modes (magics for
801 806 # internal control, aliases for direct system access via pre-selected
802 807 # names, and !cmd for calling arbitrary system commands).
803 808
804 809 def ipmagic(self,arg_s):
805 810 """Call a magic function by name.
806 811
807 812 Input: a string containing the name of the magic function to call and any
808 813 additional arguments to be passed to the magic.
809 814
810 815 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
811 816 prompt:
812 817
813 818 In[1]: %name -opt foo bar
814 819
815 820 To call a magic without arguments, simply use ipmagic('name').
816 821
817 822 This provides a proper Python function to call IPython's magics in any
818 823 valid Python code you can type at the interpreter, including loops and
819 824 compound statements. It is added by IPython to the Python builtin
820 825 namespace upon initialization."""
821 826
822 827 args = arg_s.split(' ',1)
823 828 magic_name = args[0]
824 if magic_name.startswith(self.ESC_MAGIC):
825 magic_name = magic_name[1:]
829 magic_name = magic_name.lstrip(self.ESC_MAGIC)
830
826 831 try:
827 832 magic_args = args[1]
828 833 except IndexError:
829 834 magic_args = ''
830 835 fn = getattr(self,'magic_'+magic_name,None)
831 836 if fn is None:
832 837 error("Magic function `%s` not found." % magic_name)
833 838 else:
834 839 magic_args = self.var_expand(magic_args)
835 840 return fn(magic_args)
836 841
837 842 def ipalias(self,arg_s):
838 843 """Call an alias by name.
839 844
840 845 Input: a string containing the name of the alias to call and any
841 846 additional arguments to be passed to the magic.
842 847
843 848 ipalias('name -opt foo bar') is equivalent to typing at the ipython
844 849 prompt:
845 850
846 851 In[1]: name -opt foo bar
847 852
848 853 To call an alias without arguments, simply use ipalias('name').
849 854
850 855 This provides a proper Python function to call IPython's aliases in any
851 856 valid Python code you can type at the interpreter, including loops and
852 857 compound statements. It is added by IPython to the Python builtin
853 858 namespace upon initialization."""
854 859
855 860 args = arg_s.split(' ',1)
856 861 alias_name = args[0]
857 862 try:
858 863 alias_args = args[1]
859 864 except IndexError:
860 865 alias_args = ''
861 866 if alias_name in self.alias_table:
862 867 self.call_alias(alias_name,alias_args)
863 868 else:
864 869 error("Alias `%s` not found." % alias_name)
865 870
866 871 def ipsystem(self,arg_s):
867 872 """Make a system call, using IPython."""
868 873
869 874 self.system(arg_s)
870 875
871 876 def complete(self,text):
872 877 """Return a sorted list of all possible completions on text.
873 878
874 879 Inputs:
875 880
876 881 - text: a string of text to be completed on.
877 882
878 883 This is a wrapper around the completion mechanism, similar to what
879 884 readline does at the command line when the TAB key is hit. By
880 885 exposing it as a method, it can be used by other non-readline
881 886 environments (such as GUIs) for text completion.
882 887
883 888 Simple usage example:
884 889
885 890 In [1]: x = 'hello'
886 891
887 892 In [2]: __IP.complete('x.l')
888 893 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
889 894
890 895 complete = self.Completer.complete
891 896 state = 0
892 897 # use a dict so we get unique keys, since ipyhton's multiple
893 898 # completers can return duplicates.
894 899 comps = {}
895 900 while True:
896 901 newcomp = complete(text,state)
897 902 if newcomp is None:
898 903 break
899 904 comps[newcomp] = 1
900 905 state += 1
901 906 outcomps = comps.keys()
902 907 outcomps.sort()
903 908 return outcomps
904 909
905 910 def set_completer_frame(self, frame=None):
906 911 if frame:
907 912 self.Completer.namespace = frame.f_locals
908 913 self.Completer.global_namespace = frame.f_globals
909 914 else:
910 915 self.Completer.namespace = self.user_ns
911 916 self.Completer.global_namespace = self.user_global_ns
912 917
913 918 def init_auto_alias(self):
914 919 """Define some aliases automatically.
915 920
916 921 These are ALL parameter-less aliases"""
917 922
918 923 for alias,cmd in self.auto_alias:
919 924 self.alias_table[alias] = (0,cmd)
920 925
921 926 def alias_table_validate(self,verbose=0):
922 927 """Update information about the alias table.
923 928
924 929 In particular, make sure no Python keywords/builtins are in it."""
925 930
926 931 no_alias = self.no_alias
927 932 for k in self.alias_table.keys():
928 933 if k in no_alias:
929 934 del self.alias_table[k]
930 935 if verbose:
931 936 print ("Deleting alias <%s>, it's a Python "
932 937 "keyword or builtin." % k)
933 938
934 939 def set_autoindent(self,value=None):
935 940 """Set the autoindent flag, checking for readline support.
936 941
937 942 If called with no arguments, it acts as a toggle."""
938 943
939 944 if not self.has_readline:
940 945 if os.name == 'posix':
941 946 warn("The auto-indent feature requires the readline library")
942 947 self.autoindent = 0
943 948 return
944 949 if value is None:
945 950 self.autoindent = not self.autoindent
946 951 else:
947 952 self.autoindent = value
948 953
949 954 def rc_set_toggle(self,rc_field,value=None):
950 955 """Set or toggle a field in IPython's rc config. structure.
951 956
952 957 If called with no arguments, it acts as a toggle.
953 958
954 959 If called with a non-existent field, the resulting AttributeError
955 960 exception will propagate out."""
956 961
957 962 rc_val = getattr(self.rc,rc_field)
958 963 if value is None:
959 964 value = not rc_val
960 965 setattr(self.rc,rc_field,value)
961 966
962 967 def user_setup(self,ipythondir,rc_suffix,mode='install'):
963 968 """Install the user configuration directory.
964 969
965 970 Can be called when running for the first time or to upgrade the user's
966 971 .ipython/ directory with the mode parameter. Valid modes are 'install'
967 972 and 'upgrade'."""
968 973
969 974 def wait():
970 975 try:
971 976 raw_input("Please press <RETURN> to start IPython.")
972 977 except EOFError:
973 978 print >> Term.cout
974 979 print '*'*70
975 980
976 981 cwd = os.getcwd() # remember where we started
977 982 glb = glob.glob
978 983 print '*'*70
979 984 if mode == 'install':
980 985 print \
981 986 """Welcome to IPython. I will try to create a personal configuration directory
982 987 where you can customize many aspects of IPython's functionality in:\n"""
983 988 else:
984 989 print 'I am going to upgrade your configuration in:'
985 990
986 991 print ipythondir
987 992
988 993 rcdirend = os.path.join('IPython','UserConfig')
989 994 cfg = lambda d: os.path.join(d,rcdirend)
990 995 try:
991 996 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
992 997 except IOError:
993 998 warning = """
994 999 Installation error. IPython's directory was not found.
995 1000
996 1001 Check the following:
997 1002
998 1003 The ipython/IPython directory should be in a directory belonging to your
999 1004 PYTHONPATH environment variable (that is, it should be in a directory
1000 1005 belonging to sys.path). You can copy it explicitly there or just link to it.
1001 1006
1002 1007 IPython will proceed with builtin defaults.
1003 1008 """
1004 1009 warn(warning)
1005 1010 wait()
1006 1011 return
1007 1012
1008 1013 if mode == 'install':
1009 1014 try:
1010 1015 shutil.copytree(rcdir,ipythondir)
1011 1016 os.chdir(ipythondir)
1012 1017 rc_files = glb("ipythonrc*")
1013 1018 for rc_file in rc_files:
1014 1019 os.rename(rc_file,rc_file+rc_suffix)
1015 1020 except:
1016 1021 warning = """
1017 1022
1018 1023 There was a problem with the installation:
1019 1024 %s
1020 1025 Try to correct it or contact the developers if you think it's a bug.
1021 1026 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1022 1027 warn(warning)
1023 1028 wait()
1024 1029 return
1025 1030
1026 1031 elif mode == 'upgrade':
1027 1032 try:
1028 1033 os.chdir(ipythondir)
1029 1034 except:
1030 1035 print """
1031 1036 Can not upgrade: changing to directory %s failed. Details:
1032 1037 %s
1033 1038 """ % (ipythondir,sys.exc_info()[1])
1034 1039 wait()
1035 1040 return
1036 1041 else:
1037 1042 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1038 1043 for new_full_path in sources:
1039 1044 new_filename = os.path.basename(new_full_path)
1040 1045 if new_filename.startswith('ipythonrc'):
1041 1046 new_filename = new_filename + rc_suffix
1042 1047 # The config directory should only contain files, skip any
1043 1048 # directories which may be there (like CVS)
1044 1049 if os.path.isdir(new_full_path):
1045 1050 continue
1046 1051 if os.path.exists(new_filename):
1047 1052 old_file = new_filename+'.old'
1048 1053 if os.path.exists(old_file):
1049 1054 os.remove(old_file)
1050 1055 os.rename(new_filename,old_file)
1051 1056 shutil.copy(new_full_path,new_filename)
1052 1057 else:
1053 1058 raise ValueError,'unrecognized mode for install:',`mode`
1054 1059
1055 1060 # Fix line-endings to those native to each platform in the config
1056 1061 # directory.
1057 1062 try:
1058 1063 os.chdir(ipythondir)
1059 1064 except:
1060 1065 print """
1061 1066 Problem: changing to directory %s failed.
1062 1067 Details:
1063 1068 %s
1064 1069
1065 1070 Some configuration files may have incorrect line endings. This should not
1066 1071 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1067 1072 wait()
1068 1073 else:
1069 1074 for fname in glb('ipythonrc*'):
1070 1075 try:
1071 1076 native_line_ends(fname,backup=0)
1072 1077 except IOError:
1073 1078 pass
1074 1079
1075 1080 if mode == 'install':
1076 1081 print """
1077 1082 Successful installation!
1078 1083
1079 1084 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1080 1085 IPython manual (there are both HTML and PDF versions supplied with the
1081 1086 distribution) to make sure that your system environment is properly configured
1082 1087 to take advantage of IPython's features."""
1083 1088 else:
1084 1089 print """
1085 1090 Successful upgrade!
1086 1091
1087 1092 All files in your directory:
1088 1093 %(ipythondir)s
1089 1094 which would have been overwritten by the upgrade were backed up with a .old
1090 1095 extension. If you had made particular customizations in those files you may
1091 1096 want to merge them back into the new files.""" % locals()
1092 1097 wait()
1093 1098 os.chdir(cwd)
1094 1099 # end user_setup()
1095 1100
1096 1101 def atexit_operations(self):
1097 1102 """This will be executed at the time of exit.
1098 1103
1099 1104 Saving of persistent data should be performed here. """
1100 1105
1101 1106 #print '*** IPython exit cleanup ***' # dbg
1102 1107 # input history
1103 1108 self.savehist()
1104 1109
1105 1110 # Cleanup all tempfiles left around
1106 1111 for tfile in self.tempfiles:
1107 1112 try:
1108 1113 os.unlink(tfile)
1109 1114 except OSError:
1110 1115 pass
1111 1116
1112 1117 # save the "persistent data" catch-all dictionary
1113 1118 try:
1114 1119 pickle.dump(self.persist, open(self.persist_fname,"w"))
1115 1120 except:
1116 1121 print "*** ERROR *** persistent data saving failed."
1117 1122
1118 1123 def savehist(self):
1119 1124 """Save input history to a file (via readline library)."""
1120 1125 try:
1121 1126 self.readline.write_history_file(self.histfile)
1122 1127 except:
1123 1128 print 'Unable to save IPython command history to file: ' + \
1124 1129 `self.histfile`
1125 1130
1126 1131 def pre_readline(self):
1127 1132 """readline hook to be used at the start of each line.
1128 1133
1129 1134 Currently it handles auto-indent only."""
1130 1135
1131 1136 self.readline.insert_text(self.indent_current)
1132 1137
1133 1138 def init_readline(self):
1134 1139 """Command history completion/saving/reloading."""
1135 1140 try:
1136 1141 import readline
1137 1142 except ImportError:
1138 1143 self.has_readline = 0
1139 1144 self.readline = None
1140 1145 # no point in bugging windows users with this every time:
1141 1146 if os.name == 'posix':
1142 1147 warn('Readline services not available on this platform.')
1143 1148 else:
1144 1149 import atexit
1145 1150 from IPython.completer import IPCompleter
1146 1151 self.Completer = IPCompleter(self,
1147 1152 self.user_ns,
1148 1153 self.user_global_ns,
1149 1154 self.rc.readline_omit__names,
1150 1155 self.alias_table)
1151 1156
1152 1157 # Platform-specific configuration
1153 1158 if os.name == 'nt':
1154 1159 self.readline_startup_hook = readline.set_pre_input_hook
1155 1160 else:
1156 1161 self.readline_startup_hook = readline.set_startup_hook
1157 1162
1158 1163 # Load user's initrc file (readline config)
1159 1164 inputrc_name = os.environ.get('INPUTRC')
1160 1165 if inputrc_name is None:
1161 1166 home_dir = get_home_dir()
1162 1167 if home_dir is not None:
1163 1168 inputrc_name = os.path.join(home_dir,'.inputrc')
1164 1169 if os.path.isfile(inputrc_name):
1165 1170 try:
1166 1171 readline.read_init_file(inputrc_name)
1167 1172 except:
1168 1173 warn('Problems reading readline initialization file <%s>'
1169 1174 % inputrc_name)
1170 1175
1171 1176 self.has_readline = 1
1172 1177 self.readline = readline
1173 1178 # save this in sys so embedded copies can restore it properly
1174 1179 sys.ipcompleter = self.Completer.complete
1175 1180 readline.set_completer(self.Completer.complete)
1176 1181
1177 1182 # Configure readline according to user's prefs
1178 1183 for rlcommand in self.rc.readline_parse_and_bind:
1179 1184 readline.parse_and_bind(rlcommand)
1180 1185
1181 1186 # remove some chars from the delimiters list
1182 1187 delims = readline.get_completer_delims()
1183 1188 delims = delims.translate(string._idmap,
1184 1189 self.rc.readline_remove_delims)
1185 1190 readline.set_completer_delims(delims)
1186 1191 # otherwise we end up with a monster history after a while:
1187 1192 readline.set_history_length(1000)
1188 1193 try:
1189 1194 #print '*** Reading readline history' # dbg
1190 1195 readline.read_history_file(self.histfile)
1191 1196 except IOError:
1192 1197 pass # It doesn't exist yet.
1193 1198
1194 1199 atexit.register(self.atexit_operations)
1195 1200 del atexit
1196 1201
1197 1202 # Configure auto-indent for all platforms
1198 1203 self.set_autoindent(self.rc.autoindent)
1199 1204
1200 1205 def _should_recompile(self,e):
1201 1206 """Utility routine for edit_syntax_error"""
1202 1207
1203 1208 if e.filename in ('<ipython console>','<input>','<string>',
1204 1209 '<console>',None):
1205 1210
1206 1211 return False
1207 1212 try:
1208 1213 if not ask_yes_no('Return to editor to correct syntax error? '
1209 1214 '[Y/n] ','y'):
1210 1215 return False
1211 1216 except EOFError:
1212 1217 return False
1213 1218
1214 1219 def int0(x):
1215 1220 try:
1216 1221 return int(x)
1217 1222 except TypeError:
1218 1223 return 0
1219 1224 # always pass integer line and offset values to editor hook
1220 1225 self.hooks.fix_error_editor(e.filename,
1221 1226 int0(e.lineno),int0(e.offset),e.msg)
1222 1227 return True
1223 1228
1224 1229 def edit_syntax_error(self):
1225 1230 """The bottom half of the syntax error handler called in the main loop.
1226 1231
1227 1232 Loop until syntax error is fixed or user cancels.
1228 1233 """
1229 1234
1230 1235 while self.SyntaxTB.last_syntax_error:
1231 1236 # copy and clear last_syntax_error
1232 1237 err = self.SyntaxTB.clear_err_state()
1233 1238 if not self._should_recompile(err):
1234 1239 return
1235 1240 try:
1236 1241 # may set last_syntax_error again if a SyntaxError is raised
1237 1242 self.safe_execfile(err.filename,self.shell.user_ns)
1238 1243 except:
1239 1244 self.showtraceback()
1240 1245 else:
1241 1246 f = file(err.filename)
1242 1247 try:
1243 1248 sys.displayhook(f.read())
1244 1249 finally:
1245 1250 f.close()
1246 1251
1247 1252 def showsyntaxerror(self, filename=None):
1248 1253 """Display the syntax error that just occurred.
1249 1254
1250 1255 This doesn't display a stack trace because there isn't one.
1251 1256
1252 1257 If a filename is given, it is stuffed in the exception instead
1253 1258 of what was there before (because Python's parser always uses
1254 1259 "<string>" when reading from a string).
1255 1260 """
1256 1261 etype, value, last_traceback = sys.exc_info()
1257 1262 if filename and etype is SyntaxError:
1258 1263 # Work hard to stuff the correct filename in the exception
1259 1264 try:
1260 1265 msg, (dummy_filename, lineno, offset, line) = value
1261 1266 except:
1262 1267 # Not the format we expect; leave it alone
1263 1268 pass
1264 1269 else:
1265 1270 # Stuff in the right filename
1266 1271 try:
1267 1272 # Assume SyntaxError is a class exception
1268 1273 value = SyntaxError(msg, (filename, lineno, offset, line))
1269 1274 except:
1270 1275 # If that failed, assume SyntaxError is a string
1271 1276 value = msg, (filename, lineno, offset, line)
1272 1277 self.SyntaxTB(etype,value,[])
1273 1278
1274 1279 def debugger(self):
1275 1280 """Call the pdb debugger."""
1276 1281
1277 1282 if not self.rc.pdb:
1278 1283 return
1279 1284 pdb.pm()
1280 1285
1281 1286 def showtraceback(self,exc_tuple = None,filename=None):
1282 1287 """Display the exception that just occurred."""
1283 1288
1284 1289 # Though this won't be called by syntax errors in the input line,
1285 1290 # there may be SyntaxError cases whith imported code.
1286 1291 if exc_tuple is None:
1287 1292 type, value, tb = sys.exc_info()
1288 1293 else:
1289 1294 type, value, tb = exc_tuple
1290 1295 if type is SyntaxError:
1291 1296 self.showsyntaxerror(filename)
1292 1297 else:
1293 1298 self.InteractiveTB()
1294 1299 if self.InteractiveTB.call_pdb and self.has_readline:
1295 1300 # pdb mucks up readline, fix it back
1296 1301 self.readline.set_completer(self.Completer.complete)
1297 1302
1298 1303 def mainloop(self,banner=None):
1299 1304 """Creates the local namespace and starts the mainloop.
1300 1305
1301 1306 If an optional banner argument is given, it will override the
1302 1307 internally created default banner."""
1303 1308
1304 1309 if self.rc.c: # Emulate Python's -c option
1305 1310 self.exec_init_cmd()
1306 1311 if banner is None:
1307 1312 if self.rc.banner:
1308 1313 banner = self.BANNER+self.banner2
1309 1314 else:
1310 1315 banner = ''
1311 1316 self.interact(banner)
1312 1317
1313 1318 def exec_init_cmd(self):
1314 1319 """Execute a command given at the command line.
1315 1320
1316 1321 This emulates Python's -c option."""
1317 1322
1318 1323 sys.argv = ['-c']
1319 1324 self.push(self.rc.c)
1320 1325
1321 1326 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1322 1327 """Embeds IPython into a running python program.
1323 1328
1324 1329 Input:
1325 1330
1326 1331 - header: An optional header message can be specified.
1327 1332
1328 1333 - local_ns, global_ns: working namespaces. If given as None, the
1329 1334 IPython-initialized one is updated with __main__.__dict__, so that
1330 1335 program variables become visible but user-specific configuration
1331 1336 remains possible.
1332 1337
1333 1338 - stack_depth: specifies how many levels in the stack to go to
1334 1339 looking for namespaces (when local_ns and global_ns are None). This
1335 1340 allows an intermediate caller to make sure that this function gets
1336 1341 the namespace from the intended level in the stack. By default (0)
1337 1342 it will get its locals and globals from the immediate caller.
1338 1343
1339 1344 Warning: it's possible to use this in a program which is being run by
1340 1345 IPython itself (via %run), but some funny things will happen (a few
1341 1346 globals get overwritten). In the future this will be cleaned up, as
1342 1347 there is no fundamental reason why it can't work perfectly."""
1343 1348
1344 1349 # Get locals and globals from caller
1345 1350 if local_ns is None or global_ns is None:
1346 1351 call_frame = sys._getframe(stack_depth).f_back
1347 1352
1348 1353 if local_ns is None:
1349 1354 local_ns = call_frame.f_locals
1350 1355 if global_ns is None:
1351 1356 global_ns = call_frame.f_globals
1352 1357
1353 1358 # Update namespaces and fire up interpreter
1354 1359
1355 1360 # The global one is easy, we can just throw it in
1356 1361 self.user_global_ns = global_ns
1357 1362
1358 1363 # but the user/local one is tricky: ipython needs it to store internal
1359 1364 # data, but we also need the locals. We'll copy locals in the user
1360 1365 # one, but will track what got copied so we can delete them at exit.
1361 1366 # This is so that a later embedded call doesn't see locals from a
1362 1367 # previous call (which most likely existed in a separate scope).
1363 1368 local_varnames = local_ns.keys()
1364 1369 self.user_ns.update(local_ns)
1365 1370
1366 1371 # Patch for global embedding to make sure that things don't overwrite
1367 1372 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1368 1373 # FIXME. Test this a bit more carefully (the if.. is new)
1369 1374 if local_ns is None and global_ns is None:
1370 1375 self.user_global_ns.update(__main__.__dict__)
1371 1376
1372 1377 # make sure the tab-completer has the correct frame information, so it
1373 1378 # actually completes using the frame's locals/globals
1374 1379 self.set_completer_frame()
1375 1380
1376 1381 # before activating the interactive mode, we need to make sure that
1377 1382 # all names in the builtin namespace needed by ipython point to
1378 1383 # ourselves, and not to other instances.
1379 1384 self.add_builtins()
1380 1385
1381 1386 self.interact(header)
1382 1387
1383 1388 # now, purge out the user namespace from anything we might have added
1384 1389 # from the caller's local namespace
1385 1390 delvar = self.user_ns.pop
1386 1391 for var in local_varnames:
1387 1392 delvar(var,None)
1388 1393 # and clean builtins we may have overridden
1389 1394 self.clean_builtins()
1390 1395
1391 1396 def interact(self, banner=None):
1392 1397 """Closely emulate the interactive Python console.
1393 1398
1394 1399 The optional banner argument specify the banner to print
1395 1400 before the first interaction; by default it prints a banner
1396 1401 similar to the one printed by the real Python interpreter,
1397 1402 followed by the current class name in parentheses (so as not
1398 1403 to confuse this with the real interpreter -- since it's so
1399 1404 close!).
1400 1405
1401 1406 """
1402 1407 cprt = 'Type "copyright", "credits" or "license" for more information.'
1403 1408 if banner is None:
1404 1409 self.write("Python %s on %s\n%s\n(%s)\n" %
1405 1410 (sys.version, sys.platform, cprt,
1406 1411 self.__class__.__name__))
1407 1412 else:
1408 1413 self.write(banner)
1409 1414
1410 1415 more = 0
1411 1416
1412 1417 # Mark activity in the builtins
1413 1418 __builtin__.__dict__['__IPYTHON__active'] += 1
1414 1419
1415 1420 # exit_now is set by a call to %Exit or %Quit
1416 1421 self.exit_now = False
1417 1422 while not self.exit_now:
1418 1423
1419 1424 try:
1420 1425 if more:
1421 1426 prompt = self.outputcache.prompt2
1422 1427 if self.autoindent:
1423 1428 self.readline_startup_hook(self.pre_readline)
1424 1429 else:
1425 1430 prompt = self.outputcache.prompt1
1426 1431 try:
1427 1432 line = self.raw_input(prompt,more)
1428 1433 if self.autoindent:
1429 1434 self.readline_startup_hook(None)
1430 1435 except EOFError:
1431 1436 if self.autoindent:
1432 1437 self.readline_startup_hook(None)
1433 1438 self.write("\n")
1434 1439 self.exit()
1435 1440 else:
1436 1441 more = self.push(line)
1437 1442
1438 1443 if (self.SyntaxTB.last_syntax_error and
1439 1444 self.rc.autoedit_syntax):
1440 1445 self.edit_syntax_error()
1441 1446
1442 1447 except KeyboardInterrupt:
1443 1448 self.write("\nKeyboardInterrupt\n")
1444 1449 self.resetbuffer()
1445 1450 more = 0
1446 1451 # keep cache in sync with the prompt counter:
1447 1452 self.outputcache.prompt_count -= 1
1448 1453
1449 1454 if self.autoindent:
1450 1455 self.indent_current_nsp = 0
1451 1456 self.indent_current = ' '* self.indent_current_nsp
1452 1457
1453 1458 except bdb.BdbQuit:
1454 1459 warn("The Python debugger has exited with a BdbQuit exception.\n"
1455 1460 "Because of how pdb handles the stack, it is impossible\n"
1456 1461 "for IPython to properly format this particular exception.\n"
1457 1462 "IPython will resume normal operation.")
1458 1463
1459 1464 # We are off again...
1460 1465 __builtin__.__dict__['__IPYTHON__active'] -= 1
1461 1466
1462 1467 def excepthook(self, type, value, tb):
1463 1468 """One more defense for GUI apps that call sys.excepthook.
1464 1469
1465 1470 GUI frameworks like wxPython trap exceptions and call
1466 1471 sys.excepthook themselves. I guess this is a feature that
1467 1472 enables them to keep running after exceptions that would
1468 1473 otherwise kill their mainloop. This is a bother for IPython
1469 1474 which excepts to catch all of the program exceptions with a try:
1470 1475 except: statement.
1471 1476
1472 1477 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1473 1478 any app directly invokes sys.excepthook, it will look to the user like
1474 1479 IPython crashed. In order to work around this, we can disable the
1475 1480 CrashHandler and replace it with this excepthook instead, which prints a
1476 1481 regular traceback using our InteractiveTB. In this fashion, apps which
1477 1482 call sys.excepthook will generate a regular-looking exception from
1478 1483 IPython, and the CrashHandler will only be triggered by real IPython
1479 1484 crashes.
1480 1485
1481 1486 This hook should be used sparingly, only in places which are not likely
1482 1487 to be true IPython errors.
1483 1488 """
1484 1489
1485 1490 self.InteractiveTB(type, value, tb, tb_offset=0)
1486 1491 if self.InteractiveTB.call_pdb and self.has_readline:
1487 1492 self.readline.set_completer(self.Completer.complete)
1488 1493
1489 1494 def call_alias(self,alias,rest=''):
1490 1495 """Call an alias given its name and the rest of the line.
1491 1496
1492 1497 This function MUST be given a proper alias, because it doesn't make
1493 1498 any checks when looking up into the alias table. The caller is
1494 1499 responsible for invoking it only with a valid alias."""
1495 1500
1496 1501 #print 'ALIAS: <%s>+<%s>' % (alias,rest) # dbg
1497 1502 nargs,cmd = self.alias_table[alias]
1498 1503 # Expand the %l special to be the user's input line
1499 1504 if cmd.find('%l') >= 0:
1500 1505 cmd = cmd.replace('%l',rest)
1501 1506 rest = ''
1502 1507 if nargs==0:
1503 1508 # Simple, argument-less aliases
1504 1509 cmd = '%s %s' % (cmd,rest)
1505 1510 else:
1506 1511 # Handle aliases with positional arguments
1507 1512 args = rest.split(None,nargs)
1508 1513 if len(args)< nargs:
1509 1514 error('Alias <%s> requires %s arguments, %s given.' %
1510 1515 (alias,nargs,len(args)))
1511 1516 return
1512 1517 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1513 1518 # Now call the macro, evaluating in the user's namespace
1514 1519 try:
1515 1520 self.system(cmd)
1516 1521 except:
1517 1522 self.showtraceback()
1518 1523
1519 1524 def autoindent_update(self,line):
1520 1525 """Keep track of the indent level."""
1521 1526
1522 1527 if self.autoindent:
1523 1528 if line:
1524 1529 self.indent_current_nsp = num_ini_spaces(line)
1525 1530
1526 1531 if line[-1] == ':':
1527 1532 self.indent_current_nsp += 4
1528 1533 elif dedent_re.match(line):
1529 1534 self.indent_current_nsp -= 4
1530 1535 else:
1531 1536 self.indent_current_nsp = 0
1532 1537
1533 1538 # indent_current is the actual string to be inserted
1534 1539 # by the readline hooks for indentation
1535 1540 self.indent_current = ' '* self.indent_current_nsp
1536 1541
1537 1542 def runlines(self,lines):
1538 1543 """Run a string of one or more lines of source.
1539 1544
1540 1545 This method is capable of running a string containing multiple source
1541 1546 lines, as if they had been entered at the IPython prompt. Since it
1542 1547 exposes IPython's processing machinery, the given strings can contain
1543 1548 magic calls (%magic), special shell access (!cmd), etc."""
1544 1549
1545 1550 # We must start with a clean buffer, in case this is run from an
1546 1551 # interactive IPython session (via a magic, for example).
1547 1552 self.resetbuffer()
1548 1553 lines = lines.split('\n')
1549 1554 more = 0
1550 1555 for line in lines:
1551 1556 # skip blank lines so we don't mess up the prompt counter, but do
1552 1557 # NOT skip even a blank line if we are in a code block (more is
1553 1558 # true)
1554 1559 if line or more:
1555 1560 more = self.push(self.prefilter(line,more))
1556 1561 # IPython's runsource returns None if there was an error
1557 1562 # compiling the code. This allows us to stop processing right
1558 1563 # away, so the user gets the error message at the right place.
1559 1564 if more is None:
1560 1565 break
1561 1566 # final newline in case the input didn't have it, so that the code
1562 1567 # actually does get executed
1563 1568 if more:
1564 1569 self.push('\n')
1565 1570
1566 1571 def runsource(self, source, filename='<input>', symbol='single'):
1567 1572 """Compile and run some source in the interpreter.
1568 1573
1569 1574 Arguments are as for compile_command().
1570 1575
1571 1576 One several things can happen:
1572 1577
1573 1578 1) The input is incorrect; compile_command() raised an
1574 1579 exception (SyntaxError or OverflowError). A syntax traceback
1575 1580 will be printed by calling the showsyntaxerror() method.
1576 1581
1577 1582 2) The input is incomplete, and more input is required;
1578 1583 compile_command() returned None. Nothing happens.
1579 1584
1580 1585 3) The input is complete; compile_command() returned a code
1581 1586 object. The code is executed by calling self.runcode() (which
1582 1587 also handles run-time exceptions, except for SystemExit).
1583 1588
1584 1589 The return value is:
1585 1590
1586 1591 - True in case 2
1587 1592
1588 1593 - False in the other cases, unless an exception is raised, where
1589 1594 None is returned instead. This can be used by external callers to
1590 1595 know whether to continue feeding input or not.
1591 1596
1592 1597 The return value can be used to decide whether to use sys.ps1 or
1593 1598 sys.ps2 to prompt the next line."""
1594 1599
1595 1600 try:
1596 1601 code = self.compile(source,filename,symbol)
1597 1602 except (OverflowError, SyntaxError, ValueError):
1598 1603 # Case 1
1599 1604 self.showsyntaxerror(filename)
1600 1605 return None
1601 1606
1602 1607 if code is None:
1603 1608 # Case 2
1604 1609 return True
1605 1610
1606 1611 # Case 3
1607 1612 # We store the code object so that threaded shells and
1608 1613 # custom exception handlers can access all this info if needed.
1609 1614 # The source corresponding to this can be obtained from the
1610 1615 # buffer attribute as '\n'.join(self.buffer).
1611 1616 self.code_to_run = code
1612 1617 # now actually execute the code object
1613 1618 if self.runcode(code) == 0:
1614 1619 return False
1615 1620 else:
1616 1621 return None
1617 1622
1618 1623 def runcode(self,code_obj):
1619 1624 """Execute a code object.
1620 1625
1621 1626 When an exception occurs, self.showtraceback() is called to display a
1622 1627 traceback.
1623 1628
1624 1629 Return value: a flag indicating whether the code to be run completed
1625 1630 successfully:
1626 1631
1627 1632 - 0: successful execution.
1628 1633 - 1: an error occurred.
1629 1634 """
1630 1635
1631 1636 # Set our own excepthook in case the user code tries to call it
1632 1637 # directly, so that the IPython crash handler doesn't get triggered
1633 1638 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1634 1639
1635 1640 # we save the original sys.excepthook in the instance, in case config
1636 1641 # code (such as magics) needs access to it.
1637 1642 self.sys_excepthook = old_excepthook
1638 1643 outflag = 1 # happens in more places, so it's easier as default
1639 1644 try:
1640 1645 try:
1641 1646 # Embedded instances require separate global/local namespaces
1642 1647 # so they can see both the surrounding (local) namespace and
1643 1648 # the module-level globals when called inside another function.
1644 1649 if self.embedded:
1645 1650 exec code_obj in self.user_global_ns, self.user_ns
1646 1651 # Normal (non-embedded) instances should only have a single
1647 1652 # namespace for user code execution, otherwise functions won't
1648 1653 # see interactive top-level globals.
1649 1654 else:
1650 1655 exec code_obj in self.user_ns
1651 1656 finally:
1652 1657 # Reset our crash handler in place
1653 1658 sys.excepthook = old_excepthook
1654 1659 except SystemExit:
1655 1660 self.resetbuffer()
1656 1661 self.showtraceback()
1657 1662 warn("Type exit or quit to exit IPython "
1658 1663 "(%Exit or %Quit do so unconditionally).",level=1)
1659 1664 except self.custom_exceptions:
1660 1665 etype,value,tb = sys.exc_info()
1661 1666 self.CustomTB(etype,value,tb)
1662 1667 except:
1663 1668 self.showtraceback()
1664 1669 else:
1665 1670 outflag = 0
1666 1671 if softspace(sys.stdout, 0):
1667 1672 print
1668 1673 # Flush out code object which has been run (and source)
1669 1674 self.code_to_run = None
1670 1675 return outflag
1671 1676
1672 1677 def push(self, line):
1673 1678 """Push a line to the interpreter.
1674 1679
1675 1680 The line should not have a trailing newline; it may have
1676 1681 internal newlines. The line is appended to a buffer and the
1677 1682 interpreter's runsource() method is called with the
1678 1683 concatenated contents of the buffer as source. If this
1679 1684 indicates that the command was executed or invalid, the buffer
1680 1685 is reset; otherwise, the command is incomplete, and the buffer
1681 1686 is left as it was after the line was appended. The return
1682 1687 value is 1 if more input is required, 0 if the line was dealt
1683 1688 with in some way (this is the same as runsource()).
1684 1689 """
1685 1690
1686 1691 # autoindent management should be done here, and not in the
1687 1692 # interactive loop, since that one is only seen by keyboard input. We
1688 1693 # need this done correctly even for code run via runlines (which uses
1689 1694 # push).
1690 1695
1691 1696 #print 'push line: <%s>' % line # dbg
1692 1697 self.autoindent_update(line)
1693 1698
1694 1699 self.buffer.append(line)
1695 1700 more = self.runsource('\n'.join(self.buffer), self.filename)
1696 1701 if not more:
1697 1702 self.resetbuffer()
1698 1703 return more
1699 1704
1700 1705 def resetbuffer(self):
1701 1706 """Reset the input buffer."""
1702 1707 self.buffer[:] = []
1703 1708
1704 1709 def raw_input(self,prompt='',continue_prompt=False):
1705 1710 """Write a prompt and read a line.
1706 1711
1707 1712 The returned line does not include the trailing newline.
1708 1713 When the user enters the EOF key sequence, EOFError is raised.
1709 1714
1710 1715 Optional inputs:
1711 1716
1712 1717 - prompt(''): a string to be printed to prompt the user.
1713 1718
1714 1719 - continue_prompt(False): whether this line is the first one or a
1715 1720 continuation in a sequence of inputs.
1716 1721 """
1717 1722
1718 1723 line = raw_input_original(prompt)
1719 1724 # Try to be reasonably smart about not re-indenting pasted input more
1720 1725 # than necessary. We do this by trimming out the auto-indent initial
1721 1726 # spaces, if the user's actual input started itself with whitespace.
1722 1727 #debugp('self.buffer[-1]')
1723 1728 ## if self.autoindent:
1724 1729 ## try:
1725 1730 ## prev_line = self.buffer[-1]
1726 1731 ## except IndexError:
1727 1732 ## prev_line = ''
1728 1733 ## prev_indent = num_ini_spaces(prev_line)
1729 1734 ## debugp('prev_indent')
1730 1735 ## # Split the user's input
1731 1736 ## line1 = line[:self.indent_current_nsp]
1732 1737 ## line2 = line[self.indent_current_nsp:]
1733 1738 ## if line1.isspace() and line2 and \
1734 1739 ## num_ini_spaces(line2)==prev_indent:
1735 1740 ## line = line2
1736 1741 #debugp('line')
1737 1742 #debugp('line1')
1738 1743 #debugp('line2')
1739 1744 ## if line1.isspace() and line2 and line2[0:1] in (' ','\t'):
1740 1745 ## line = line2
1741 1746 ## debugp('line')
1742 1747 return self.prefilter(line,continue_prompt)
1743 1748
1744 1749 def split_user_input(self,line):
1745 1750 """Split user input into pre-char, function part and rest."""
1746 1751
1747 1752 lsplit = self.line_split.match(line)
1748 1753 if lsplit is None: # no regexp match returns None
1749 1754 try:
1750 1755 iFun,theRest = line.split(None,1)
1751 1756 except ValueError:
1752 1757 iFun,theRest = line,''
1753 1758 pre = re.match('^(\s*)(.*)',line).groups()[0]
1754 1759 else:
1755 1760 pre,iFun,theRest = lsplit.groups()
1756 1761
1757 1762 #print 'line:<%s>' % line # dbg
1758 1763 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
1759 1764 return pre,iFun.strip(),theRest
1760 1765
1761 1766 def _prefilter(self, line, continue_prompt):
1762 1767 """Calls different preprocessors, depending on the form of line."""
1763 1768
1764 1769 # All handlers *must* return a value, even if it's blank ('').
1765 1770
1766 1771 # Lines are NOT logged here. Handlers should process the line as
1767 1772 # needed, update the cache AND log it (so that the input cache array
1768 1773 # stays synced).
1769 1774
1770 1775 # This function is _very_ delicate, and since it's also the one which
1771 1776 # determines IPython's response to user input, it must be as efficient
1772 1777 # as possible. For this reason it has _many_ returns in it, trying
1773 1778 # always to exit as quickly as it can figure out what it needs to do.
1774 1779
1775 1780 # This function is the main responsible for maintaining IPython's
1776 1781 # behavior respectful of Python's semantics. So be _very_ careful if
1777 1782 # making changes to anything here.
1778 1783
1779 1784 #.....................................................................
1780 1785 # Code begins
1781 1786
1782 1787 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
1783 1788
1784 1789 # save the line away in case we crash, so the post-mortem handler can
1785 1790 # record it
1786 1791 self._last_input_line = line
1787 1792
1788 1793 #print '***line: <%s>' % line # dbg
1789 1794
1790 1795 # the input history needs to track even empty lines
1791 1796 if not line.strip():
1792 1797 if not continue_prompt:
1793 1798 self.outputcache.prompt_count -= 1
1794 1799 return self.handle_normal(line,continue_prompt)
1795 1800 #return self.handle_normal('',continue_prompt)
1796 1801
1797 1802 # print '***cont',continue_prompt # dbg
1798 1803 # special handlers are only allowed for single line statements
1799 1804 if continue_prompt and not self.rc.multi_line_specials:
1800 1805 return self.handle_normal(line,continue_prompt)
1801 1806
1802 1807 # For the rest, we need the structure of the input
1803 1808 pre,iFun,theRest = self.split_user_input(line)
1804 1809 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1805 1810
1806 1811 # First check for explicit escapes in the last/first character
1807 1812 handler = None
1808 1813 if line[-1] == self.ESC_HELP:
1809 1814 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
1810 1815 if handler is None:
1811 1816 # look at the first character of iFun, NOT of line, so we skip
1812 1817 # leading whitespace in multiline input
1813 1818 handler = self.esc_handlers.get(iFun[0:1])
1814 1819 if handler is not None:
1815 1820 return handler(line,continue_prompt,pre,iFun,theRest)
1816 1821 # Emacs ipython-mode tags certain input lines
1817 1822 if line.endswith('# PYTHON-MODE'):
1818 1823 return self.handle_emacs(line,continue_prompt)
1819 1824
1820 1825 # Next, check if we can automatically execute this thing
1821 1826
1822 1827 # Allow ! in multi-line statements if multi_line_specials is on:
1823 1828 if continue_prompt and self.rc.multi_line_specials and \
1824 1829 iFun.startswith(self.ESC_SHELL):
1825 1830 return self.handle_shell_escape(line,continue_prompt,
1826 1831 pre=pre,iFun=iFun,
1827 1832 theRest=theRest)
1828 1833
1829 1834 # Let's try to find if the input line is a magic fn
1830 1835 oinfo = None
1831 1836 if hasattr(self,'magic_'+iFun):
1832 1837 # WARNING: _ofind uses getattr(), so it can consume generators and
1833 1838 # cause other side effects.
1834 1839 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1835 1840 if oinfo['ismagic']:
1836 1841 # Be careful not to call magics when a variable assignment is
1837 1842 # being made (ls='hi', for example)
1838 1843 if self.rc.automagic and \
1839 1844 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
1840 1845 (self.rc.multi_line_specials or not continue_prompt):
1841 1846 return self.handle_magic(line,continue_prompt,
1842 1847 pre,iFun,theRest)
1843 1848 else:
1844 1849 return self.handle_normal(line,continue_prompt)
1845 1850
1846 1851 # If the rest of the line begins with an (in)equality, assginment or
1847 1852 # function call, we should not call _ofind but simply execute it.
1848 1853 # This avoids spurious geattr() accesses on objects upon assignment.
1849 1854 #
1850 1855 # It also allows users to assign to either alias or magic names true
1851 1856 # python variables (the magic/alias systems always take second seat to
1852 1857 # true python code).
1853 1858 if theRest and theRest[0] in '!=()':
1854 1859 return self.handle_normal(line,continue_prompt)
1855 1860
1856 1861 if oinfo is None:
1857 1862 # let's try to ensure that _oinfo is ONLY called when autocall is
1858 1863 # on. Since it has inevitable potential side effects, at least
1859 1864 # having autocall off should be a guarantee to the user that no
1860 1865 # weird things will happen.
1861 1866
1862 1867 if self.rc.autocall:
1863 1868 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1864 1869 else:
1865 1870 # in this case, all that's left is either an alias or
1866 1871 # processing the line normally.
1867 1872 if iFun in self.alias_table:
1868 1873 return self.handle_alias(line,continue_prompt,
1869 1874 pre,iFun,theRest)
1870 1875
1871 1876 else:
1872 1877 return self.handle_normal(line,continue_prompt)
1873 1878
1874 1879 if not oinfo['found']:
1875 1880 return self.handle_normal(line,continue_prompt)
1876 1881 else:
1877 1882 #print 'iFun <%s> rest <%s>' % (iFun,theRest) # dbg
1878 1883 if oinfo['isalias']:
1879 1884 return self.handle_alias(line,continue_prompt,
1880 1885 pre,iFun,theRest)
1881 1886
1882 1887 if self.rc.autocall and \
1883 1888 not self.re_exclude_auto.match(theRest) and \
1884 1889 self.re_fun_name.match(iFun) and \
1885 1890 callable(oinfo['obj']) :
1886 1891 #print 'going auto' # dbg
1887 1892 return self.handle_auto(line,continue_prompt,
1888 1893 pre,iFun,theRest,oinfo['obj'])
1889 1894 else:
1890 1895 #print 'was callable?', callable(oinfo['obj']) # dbg
1891 1896 return self.handle_normal(line,continue_prompt)
1892 1897
1893 1898 # If we get here, we have a normal Python line. Log and return.
1894 1899 return self.handle_normal(line,continue_prompt)
1895 1900
1896 1901 def _prefilter_dumb(self, line, continue_prompt):
1897 1902 """simple prefilter function, for debugging"""
1898 1903 return self.handle_normal(line,continue_prompt)
1899 1904
1900 1905 # Set the default prefilter() function (this can be user-overridden)
1901 1906 prefilter = _prefilter
1902 1907
1903 1908 def handle_normal(self,line,continue_prompt=None,
1904 1909 pre=None,iFun=None,theRest=None):
1905 1910 """Handle normal input lines. Use as a template for handlers."""
1906 1911
1907 1912 # With autoindent on, we need some way to exit the input loop, and I
1908 1913 # don't want to force the user to have to backspace all the way to
1909 1914 # clear the line. The rule will be in this case, that either two
1910 1915 # lines of pure whitespace in a row, or a line of pure whitespace but
1911 1916 # of a size different to the indent level, will exit the input loop.
1912 1917
1913 1918 if (continue_prompt and self.autoindent and line.isspace() and
1914 1919 (line != self.indent_current or (self.buffer[-1]).isspace() )):
1915 1920 line = ''
1916 1921
1917 1922 self.log(line,continue_prompt)
1918 1923 return line
1919 1924
1920 1925 def handle_alias(self,line,continue_prompt=None,
1921 1926 pre=None,iFun=None,theRest=None):
1922 1927 """Handle alias input lines. """
1923 1928
1924 1929 # pre is needed, because it carries the leading whitespace. Otherwise
1925 1930 # aliases won't work in indented sections.
1926 1931 line_out = '%sipalias(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
1927 1932 self.log(line_out,continue_prompt)
1928 1933 return line_out
1929 1934
1930 1935 def handle_shell_escape(self, line, continue_prompt=None,
1931 1936 pre=None,iFun=None,theRest=None):
1932 1937 """Execute the line in a shell, empty return value"""
1933 1938
1934 1939 #print 'line in :', `line` # dbg
1935 1940 # Example of a special handler. Others follow a similar pattern.
1936 1941 if line.lstrip().startswith('!!'):
1937 1942 # rewrite iFun/theRest to properly hold the call to %sx and
1938 1943 # the actual command to be executed, so handle_magic can work
1939 1944 # correctly
1940 1945 theRest = '%s %s' % (iFun[2:],theRest)
1941 1946 iFun = 'sx'
1942 1947 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
1943 1948 line.lstrip()[2:]),
1944 1949 continue_prompt,pre,iFun,theRest)
1945 1950 else:
1946 1951 cmd=line.lstrip().lstrip('!')
1947 1952 line_out = '%sipsystem(%s)' % (pre,make_quoted_expr(cmd))
1948 1953 # update cache/log and return
1949 1954 self.log(line_out,continue_prompt)
1950 1955 return line_out
1951 1956
1952 1957 def handle_magic(self, line, continue_prompt=None,
1953 1958 pre=None,iFun=None,theRest=None):
1954 1959 """Execute magic functions."""
1955 1960
1956 1961
1957 1962 cmd = '%sipmagic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
1958 1963 self.log(cmd,continue_prompt)
1959 1964 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
1960 1965 return cmd
1961 1966
1962 1967 def handle_auto(self, line, continue_prompt=None,
1963 1968 pre=None,iFun=None,theRest=None,obj=None):
1964 1969 """Hande lines which can be auto-executed, quoting if requested."""
1965 1970
1966 1971 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1967 1972
1968 1973 # This should only be active for single-line input!
1969 1974 if continue_prompt:
1970 1975 self.log(line,continue_prompt)
1971 1976 return line
1972 1977
1973 1978 auto_rewrite = True
1974 1979 if pre == self.ESC_QUOTE:
1975 1980 # Auto-quote splitting on whitespace
1976 1981 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
1977 1982 elif pre == self.ESC_QUOTE2:
1978 1983 # Auto-quote whole string
1979 1984 newcmd = '%s("%s")' % (iFun,theRest)
1980 1985 else:
1981 1986 # Auto-paren.
1982 1987 # We only apply it to argument-less calls if the autocall
1983 1988 # parameter is set to 2. We only need to check that autocall is <
1984 1989 # 2, since this function isn't called unless it's at least 1.
1985 1990 if not theRest and (self.rc.autocall < 2):
1986 1991 newcmd = '%s %s' % (iFun,theRest)
1987 1992 auto_rewrite = False
1988 1993 else:
1989 1994 if theRest.startswith('['):
1990 1995 if hasattr(obj,'__getitem__'):
1991 1996 # Don't autocall in this case: item access for an object
1992 1997 # which is BOTH callable and implements __getitem__.
1993 1998 newcmd = '%s %s' % (iFun,theRest)
1994 1999 auto_rewrite = False
1995 2000 else:
1996 2001 # if the object doesn't support [] access, go ahead and
1997 2002 # autocall
1998 2003 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
1999 2004 elif theRest.endswith(';'):
2000 2005 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2001 2006 else:
2002 2007 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2003 2008
2004 2009 if auto_rewrite:
2005 2010 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2006 2011 # log what is now valid Python, not the actual user input (without the
2007 2012 # final newline)
2008 2013 self.log(newcmd,continue_prompt)
2009 2014 return newcmd
2010 2015
2011 2016 def handle_help(self, line, continue_prompt=None,
2012 2017 pre=None,iFun=None,theRest=None):
2013 2018 """Try to get some help for the object.
2014 2019
2015 2020 obj? or ?obj -> basic information.
2016 2021 obj?? or ??obj -> more details.
2017 2022 """
2018 2023
2019 2024 # We need to make sure that we don't process lines which would be
2020 2025 # otherwise valid python, such as "x=1 # what?"
2021 2026 try:
2022 2027 codeop.compile_command(line)
2023 2028 except SyntaxError:
2024 2029 # We should only handle as help stuff which is NOT valid syntax
2025 2030 if line[0]==self.ESC_HELP:
2026 2031 line = line[1:]
2027 2032 elif line[-1]==self.ESC_HELP:
2028 2033 line = line[:-1]
2029 2034 self.log('#?'+line)
2030 2035 if line:
2031 2036 self.magic_pinfo(line)
2032 2037 else:
2033 2038 page(self.usage,screen_lines=self.rc.screen_length)
2034 2039 return '' # Empty string is needed here!
2035 2040 except:
2036 2041 # Pass any other exceptions through to the normal handler
2037 2042 return self.handle_normal(line,continue_prompt)
2038 2043 else:
2039 2044 # If the code compiles ok, we should handle it normally
2040 2045 return self.handle_normal(line,continue_prompt)
2041 2046
2042 2047 def handle_emacs(self,line,continue_prompt=None,
2043 2048 pre=None,iFun=None,theRest=None):
2044 2049 """Handle input lines marked by python-mode."""
2045 2050
2046 2051 # Currently, nothing is done. Later more functionality can be added
2047 2052 # here if needed.
2048 2053
2049 2054 # The input cache shouldn't be updated
2050 2055
2051 2056 return line
2052 2057
2053 2058 def mktempfile(self,data=None):
2054 2059 """Make a new tempfile and return its filename.
2055 2060
2056 2061 This makes a call to tempfile.mktemp, but it registers the created
2057 2062 filename internally so ipython cleans it up at exit time.
2058 2063
2059 2064 Optional inputs:
2060 2065
2061 2066 - data(None): if data is given, it gets written out to the temp file
2062 2067 immediately, and the file is closed again."""
2063 2068
2064 2069 filename = tempfile.mktemp('.py','ipython_edit_')
2065 2070 self.tempfiles.append(filename)
2066 2071
2067 2072 if data:
2068 2073 tmp_file = open(filename,'w')
2069 2074 tmp_file.write(data)
2070 2075 tmp_file.close()
2071 2076 return filename
2072 2077
2073 2078 def write(self,data):
2074 2079 """Write a string to the default output"""
2075 2080 Term.cout.write(data)
2076 2081
2077 2082 def write_err(self,data):
2078 2083 """Write a string to the default error output"""
2079 2084 Term.cerr.write(data)
2080 2085
2081 2086 def exit(self):
2082 2087 """Handle interactive exit.
2083 2088
2084 2089 This method sets the exit_now attribute."""
2085 2090
2086 2091 if self.rc.confirm_exit:
2087 2092 if ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2088 2093 self.exit_now = True
2089 2094 else:
2090 2095 self.exit_now = True
2091 2096 return self.exit_now
2092 2097
2093 2098 def safe_execfile(self,fname,*where,**kw):
2094 2099 fname = os.path.expanduser(fname)
2095 2100
2096 2101 # find things also in current directory
2097 2102 dname = os.path.dirname(fname)
2098 2103 if not sys.path.count(dname):
2099 2104 sys.path.append(dname)
2100 2105
2101 2106 try:
2102 2107 xfile = open(fname)
2103 2108 except:
2104 2109 print >> Term.cerr, \
2105 2110 'Could not open file <%s> for safe execution.' % fname
2106 2111 return None
2107 2112
2108 2113 kw.setdefault('islog',0)
2109 2114 kw.setdefault('quiet',1)
2110 2115 kw.setdefault('exit_ignore',0)
2111 2116 first = xfile.readline()
2112 2117 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2113 2118 xfile.close()
2114 2119 # line by line execution
2115 2120 if first.startswith(loghead) or kw['islog']:
2116 2121 print 'Loading log file <%s> one line at a time...' % fname
2117 2122 if kw['quiet']:
2118 2123 stdout_save = sys.stdout
2119 2124 sys.stdout = StringIO.StringIO()
2120 2125 try:
2121 2126 globs,locs = where[0:2]
2122 2127 except:
2123 2128 try:
2124 2129 globs = locs = where[0]
2125 2130 except:
2126 2131 globs = locs = globals()
2127 2132 badblocks = []
2128 2133
2129 2134 # we also need to identify indented blocks of code when replaying
2130 2135 # logs and put them together before passing them to an exec
2131 2136 # statement. This takes a bit of regexp and look-ahead work in the
2132 2137 # file. It's easiest if we swallow the whole thing in memory
2133 2138 # first, and manually walk through the lines list moving the
2134 2139 # counter ourselves.
2135 2140 indent_re = re.compile('\s+\S')
2136 2141 xfile = open(fname)
2137 2142 filelines = xfile.readlines()
2138 2143 xfile.close()
2139 2144 nlines = len(filelines)
2140 2145 lnum = 0
2141 2146 while lnum < nlines:
2142 2147 line = filelines[lnum]
2143 2148 lnum += 1
2144 2149 # don't re-insert logger status info into cache
2145 2150 if line.startswith('#log#'):
2146 2151 continue
2147 2152 else:
2148 2153 # build a block of code (maybe a single line) for execution
2149 2154 block = line
2150 2155 try:
2151 2156 next = filelines[lnum] # lnum has already incremented
2152 2157 except:
2153 2158 next = None
2154 2159 while next and indent_re.match(next):
2155 2160 block += next
2156 2161 lnum += 1
2157 2162 try:
2158 2163 next = filelines[lnum]
2159 2164 except:
2160 2165 next = None
2161 2166 # now execute the block of one or more lines
2162 2167 try:
2163 2168 exec block in globs,locs
2164 2169 except SystemExit:
2165 2170 pass
2166 2171 except:
2167 2172 badblocks.append(block.rstrip())
2168 2173 if kw['quiet']: # restore stdout
2169 2174 sys.stdout.close()
2170 2175 sys.stdout = stdout_save
2171 2176 print 'Finished replaying log file <%s>' % fname
2172 2177 if badblocks:
2173 2178 print >> sys.stderr, ('\nThe following lines/blocks in file '
2174 2179 '<%s> reported errors:' % fname)
2175 2180
2176 2181 for badline in badblocks:
2177 2182 print >> sys.stderr, badline
2178 2183 else: # regular file execution
2179 2184 try:
2180 2185 execfile(fname,*where)
2181 2186 except SyntaxError:
2182 2187 etype,evalue = sys.exc_info()[:2]
2183 2188 self.SyntaxTB(etype,evalue,[])
2184 2189 warn('Failure executing file: <%s>' % fname)
2185 2190 except SystemExit,status:
2186 2191 if not kw['exit_ignore']:
2187 2192 self.InteractiveTB()
2188 2193 warn('Failure executing file: <%s>' % fname)
2189 2194 except:
2190 2195 self.InteractiveTB()
2191 2196 warn('Failure executing file: <%s>' % fname)
2192 2197
2193 2198 #************************* 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
General Comments 0
You need to be logged in to leave comments. Login now