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