##// END OF EJS Templates
Fixed logical flaw (harmless so far) in handle_shell_escape
vivainio -
Show More

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

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