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