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