##// END OF EJS Templates
- Fix problems with -pylab and custom namespaces....
fperez -
Show More

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

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