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