##// END OF EJS Templates
Cleanup docs
Fernando Perez -
Show More
@@ -1,606 +1,609 b''
1 """IPython customization API
1 """IPython customization API
2
2
3 Your one-stop module for configuring & extending ipython
3 Your one-stop module for configuring & extending ipython
4
4
5 The API will probably break when ipython 1.0 is released, but so
5 The API will probably break when ipython 1.0 is released, but so
6 will the other configuration method (rc files).
6 will the other configuration method (rc files).
7
7
8 All names prefixed by underscores are for internal use, not part
8 All names prefixed by underscores are for internal use, not part
9 of the public api.
9 of the public api.
10
10
11 Below is an example that you can just put to a module and import from ipython.
11 Below is an example that you can just put to a module and import from ipython.
12
12
13 A good practice is to install the config script below as e.g.
13 A good practice is to install the config script below as e.g.
14
14
15 ~/.ipython/my_private_conf.py
15 ~/.ipython/my_private_conf.py
16
16
17 And do
17 And do
18
18
19 import_mod my_private_conf
19 import_mod my_private_conf
20
20
21 in ~/.ipython/ipythonrc
21 in ~/.ipython/ipythonrc
22
22
23 That way the module is imported at startup and you can have all your
23 That way the module is imported at startup and you can have all your
24 personal configuration (as opposed to boilerplate ipythonrc-PROFILENAME
24 personal configuration (as opposed to boilerplate ipythonrc-PROFILENAME
25 stuff) in there.
25 stuff) in there.
26
26
27 -----------------------------------------------
27 -----------------------------------------------
28 import IPython.ipapi
28 import IPython.ipapi
29 ip = IPython.ipapi.get()
29 ip = IPython.ipapi.get()
30
30
31 def ankka_f(self, arg):
31 def ankka_f(self, arg):
32 print "Ankka",self,"says uppercase:",arg.upper()
32 print 'Ankka',self,'says uppercase:',arg.upper()
33
33
34 ip.expose_magic("ankka",ankka_f)
34 ip.expose_magic('ankka',ankka_f)
35
35
36 ip.magic('alias sayhi echo "Testing, hi ok"')
36 ip.magic('alias sayhi echo "Testing, hi ok"')
37 ip.magic('alias helloworld echo "Hello world"')
37 ip.magic('alias helloworld echo "Hello world"')
38 ip.system('pwd')
38 ip.system('pwd')
39
39
40 ip.ex('import re')
40 ip.ex('import re')
41 ip.ex("""
41 ip.ex('''
42 def funcci(a,b):
42 def funcci(a,b):
43 print a+b
43 print a+b
44 print funcci(3,4)
44 print funcci(3,4)
45 """)
45 ''')
46 ip.ex("funcci(348,9)")
46 ip.ex('funcci(348,9)')
47
47
48 def jed_editor(self,filename, linenum=None):
48 def jed_editor(self,filename, linenum=None):
49 print "Calling my own editor, jed ... via hook!"
49 print 'Calling my own editor, jed ... via hook!'
50 import os
50 import os
51 if linenum is None: linenum = 0
51 if linenum is None: linenum = 0
52 os.system('jed +%d %s' % (linenum, filename))
52 os.system('jed +%d %s' % (linenum, filename))
53 print "exiting jed"
53 print 'exiting jed'
54
54
55 ip.set_hook('editor',jed_editor)
55 ip.set_hook('editor',jed_editor)
56
56
57 o = ip.options
57 o = ip.options
58 o.autocall = 2 # FULL autocall mode
58 o.autocall = 2 # FULL autocall mode
59
59
60 print "done!"
60 print 'done!'
61 """
61 """
62
62
63 #-----------------------------------------------------------------------------
63 #-----------------------------------------------------------------------------
64 # Modules and globals
64 # Modules and globals
65
65
66 # stdlib imports
66 # stdlib imports
67 import __builtin__
67 import __builtin__
68 import sys
68 import sys
69
69
70 # contains the most recently instantiated IPApi
70 # contains the most recently instantiated IPApi
71 _RECENT_IP = None
71 _RECENT_IP = None
72
72
73 #-----------------------------------------------------------------------------
73 #-----------------------------------------------------------------------------
74 # Code begins
74 # Code begins
75
75
76 class TryNext(Exception):
76 class TryNext(Exception):
77 """Try next hook exception.
77 """Try next hook exception.
78
78
79 Raise this in your hook function to indicate that the next hook handler
79 Raise this in your hook function to indicate that the next hook handler
80 should be used to handle the operation. If you pass arguments to the
80 should be used to handle the operation. If you pass arguments to the
81 constructor those arguments will be used by the next hook instead of the
81 constructor those arguments will be used by the next hook instead of the
82 original ones.
82 original ones.
83 """
83 """
84
84
85 def __init__(self, *args, **kwargs):
85 def __init__(self, *args, **kwargs):
86 self.args = args
86 self.args = args
87 self.kwargs = kwargs
87 self.kwargs = kwargs
88
88
89
89 class UsageError(Exception):
90 class UsageError(Exception):
90 """ Error in magic function arguments, etc.
91 """ Error in magic function arguments, etc.
91
92
92 Something that probably won't warrant a full traceback, but should
93 Something that probably won't warrant a full traceback, but should
93 nevertheless interrupt a macro / batch file.
94 nevertheless interrupt a macro / batch file.
94 """
95 """
95
96
97
96 class IPyAutocall:
98 class IPyAutocall:
97 """ Instances of this class are always autocalled
99 """ Instances of this class are always autocalled
98
100
99 This happens regardless of 'autocall' variable state. Use this to
101 This happens regardless of 'autocall' variable state. Use this to
100 develop macro-like mechanisms.
102 develop macro-like mechanisms.
101 """
103 """
102
104
103 def set_ip(self,ip):
105 def set_ip(self,ip):
104 """ Will be used to set _ip point to current ipython instance b/f call
106 """ Will be used to set _ip point to current ipython instance b/f call
105
107
106 Override this method if you don't want this to happen.
108 Override this method if you don't want this to happen.
107
109
108 """
110 """
109 self._ip = ip
111 self._ip = ip
110
112
111
113
112
113 class IPythonNotRunning:
114 class IPythonNotRunning:
114 """Dummy do-nothing class.
115 """Dummy do-nothing class.
115
116
116 Instances of this class return a dummy attribute on all accesses, which
117 Instances of this class return a dummy attribute on all accesses, which
117 can be called and warns. This makes it easier to write scripts which use
118 can be called and warns. This makes it easier to write scripts which use
118 the ipapi.get() object for informational purposes to operate both with and
119 the ipapi.get() object for informational purposes to operate both with and
119 without ipython. Obviously code which uses the ipython object for
120 without ipython. Obviously code which uses the ipython object for
120 computations will not work, but this allows a wider range of code to
121 computations will not work, but this allows a wider range of code to
121 transparently work whether ipython is being used or not."""
122 transparently work whether ipython is being used or not."""
122
123
123 def __init__(self,warn=True):
124 def __init__(self,warn=True):
124 if warn:
125 if warn:
125 self.dummy = self._dummy_warn
126 self.dummy = self._dummy_warn
126 else:
127 else:
127 self.dummy = self._dummy_silent
128 self.dummy = self._dummy_silent
128
129
129 def __str__(self):
130 def __str__(self):
130 return "<IPythonNotRunning>"
131 return "<IPythonNotRunning>"
131
132
132 __repr__ = __str__
133 __repr__ = __str__
133
134
134 def __getattr__(self,name):
135 def __getattr__(self,name):
135 return self.dummy
136 return self.dummy
136
137
137 def _dummy_warn(self,*args,**kw):
138 def _dummy_warn(self,*args,**kw):
138 """Dummy function, which doesn't do anything but warn."""
139 """Dummy function, which doesn't do anything but warn."""
139
140
140 print ("IPython is not running, this is a dummy no-op function")
141 print ("IPython is not running, this is a dummy no-op function")
141
142
142 def _dummy_silent(self,*args,**kw):
143 def _dummy_silent(self,*args,**kw):
143 """Dummy function, which doesn't do anything and emits no warnings."""
144 """Dummy function, which doesn't do anything and emits no warnings."""
144 pass
145 pass
145
146
146
147
147 def get(allow_dummy=False,dummy_warn=True):
148 def get(allow_dummy=False,dummy_warn=True):
148 """Get an IPApi object.
149 """Get an IPApi object.
149
150
150 If allow_dummy is true, returns an instance of IPythonNotRunning
151 If allow_dummy is true, returns an instance of IPythonNotRunning
151 instead of None if not running under IPython.
152 instead of None if not running under IPython.
152
153
153 If dummy_warn is false, the dummy instance will be completely silent.
154 If dummy_warn is false, the dummy instance will be completely silent.
154
155
155 Running this should be the first thing you do when writing extensions that
156 Running this should be the first thing you do when writing extensions that
156 can be imported as normal modules. You can then direct all the
157 can be imported as normal modules. You can then direct all the
157 configuration operations against the returned object.
158 configuration operations against the returned object.
158 """
159 """
159 global _RECENT_IP
160 global _RECENT_IP
160 if allow_dummy and not _RECENT_IP:
161 if allow_dummy and not _RECENT_IP:
161 _RECENT_IP = IPythonNotRunning(dummy_warn)
162 _RECENT_IP = IPythonNotRunning(dummy_warn)
162 return _RECENT_IP
163 return _RECENT_IP
163
164
164 class IPApi:
165
166 class IPApi(object):
165 """ The actual API class for configuring IPython
167 """ The actual API class for configuring IPython
166
168
167 You should do all of the IPython configuration by getting an IPApi object
169 You should do all of the IPython configuration by getting an IPApi object
168 with IPython.ipapi.get() and using the attributes and methods of the
170 with IPython.ipapi.get() and using the attributes and methods of the
169 returned object."""
171 returned object."""
170
172
171 def __init__(self,ip):
173 def __init__(self,ip):
172
174
173 global _RECENT_IP
175 global _RECENT_IP
174
176
175 # All attributes exposed here are considered to be the public API of
177 # All attributes exposed here are considered to be the public API of
176 # IPython. As needs dictate, some of these may be wrapped as
178 # IPython. As needs dictate, some of these may be wrapped as
177 # properties.
179 # properties.
178
180
179 self.magic = ip.ipmagic
181 self.magic = ip.ipmagic
180
182
181 self.system = ip.system
183 self.system = ip.system
182
184
183 self.set_hook = ip.set_hook
185 self.set_hook = ip.set_hook
184
186
185 self.set_custom_exc = ip.set_custom_exc
187 self.set_custom_exc = ip.set_custom_exc
186
188
187 self.user_ns = ip.user_ns
189 self.user_ns = ip.user_ns
188 self.user_ns['_ip'] = self
190 self.user_ns['_ip'] = self
189
191
190 self.set_crash_handler = ip.set_crash_handler
192 self.set_crash_handler = ip.set_crash_handler
191
193
192 # Session-specific data store, which can be used to store
194 # Session-specific data store, which can be used to store
193 # data that should persist through the ipython session.
195 # data that should persist through the ipython session.
194 self.meta = ip.meta
196 self.meta = ip.meta
195
197
196 # The ipython instance provided
198 # The ipython instance provided
197 self.IP = ip
199 self.IP = ip
198
200
199 self.extensions = {}
201 self.extensions = {}
200
202
201 self.dbg = DebugTools(self)
203 self.dbg = DebugTools(self)
202
204
203 _RECENT_IP = self
205 _RECENT_IP = self
204
206
205 # Use a property for some things which are added to the instance very
207 # Use a property for some things which are added to the instance very
206 # late. I don't have time right now to disentangle the initialization
208 # late. I don't have time right now to disentangle the initialization
207 # order issues, so a property lets us delay item extraction while
209 # order issues, so a property lets us delay item extraction while
208 # providing a normal attribute API.
210 # providing a normal attribute API.
209 def get_db(self):
211 def get_db(self):
210 """A handle to persistent dict-like database (a PickleShareDB object)"""
212 """A handle to persistent dict-like database (a PickleShareDB object)"""
211 return self.IP.db
213 return self.IP.db
212
214
213 db = property(get_db,None,None,get_db.__doc__)
215 db = property(get_db,None,None,get_db.__doc__)
214
216
215 def get_options(self):
217 def get_options(self):
216 """All configurable variables."""
218 """All configurable variables."""
217
219
218 # catch typos by disabling new attribute creation. If new attr creation
220 # catch typos by disabling new attribute creation. If new attr creation
219 # is in fact wanted (e.g. when exposing new options), do
221 # is in fact wanted (e.g. when exposing new options), do
220 # allow_new_attr(True) for the received rc struct.
222 # allow_new_attr(True) for the received rc struct.
221
223
222 self.IP.rc.allow_new_attr(False)
224 self.IP.rc.allow_new_attr(False)
223 return self.IP.rc
225 return self.IP.rc
224
226
225 options = property(get_options,None,None,get_options.__doc__)
227 options = property(get_options,None,None,get_options.__doc__)
226
228
227 def expose_magic(self,magicname, func):
229 def expose_magic(self,magicname, func):
228 ''' Expose own function as magic function for ipython
230 """Expose own function as magic function for ipython
229
231
230 def foo_impl(self,parameter_s=''):
232 def foo_impl(self,parameter_s=''):
231 """My very own magic!. (Use docstrings, IPython reads them)."""
233 'My very own magic!. (Use docstrings, IPython reads them).'
232 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
234 print 'Magic function. Passed parameter is between < >:'
235 print '<%s>' % parameter_s
233 print 'The self object is:',self
236 print 'The self object is:',self
234
237
235 ipapi.expose_magic("foo",foo_impl)
238 ipapi.expose_magic('foo',foo_impl)
236 '''
239 """
237
240
238 import new
241 import new
239 im = new.instancemethod(func,self.IP, self.IP.__class__)
242 im = new.instancemethod(func,self.IP, self.IP.__class__)
240 old = getattr(self.IP, "magic_" + magicname, None)
243 old = getattr(self.IP, "magic_" + magicname, None)
241 if old:
244 if old:
242 self.dbg.debug_stack("Magic redefinition '%s', old %s" % (magicname,
245 self.dbg.debug_stack("Magic redefinition '%s', old %s" %
243 old))
246 (magicname,old) )
244
247
245 setattr(self.IP, "magic_" + magicname, im)
248 setattr(self.IP, "magic_" + magicname, im)
246
249
247 def ex(self,cmd):
250 def ex(self,cmd):
248 """ Execute a normal python statement in user namespace """
251 """ Execute a normal python statement in user namespace """
249 exec cmd in self.user_ns
252 exec cmd in self.user_ns
250
253
251 def ev(self,expr):
254 def ev(self,expr):
252 """ Evaluate python expression expr in user namespace
255 """ Evaluate python expression expr in user namespace
253
256
254 Returns the result of evaluation"""
257 Returns the result of evaluation"""
255 return eval(expr,self.user_ns)
258 return eval(expr,self.user_ns)
256
259
257 def runlines(self,lines):
260 def runlines(self,lines):
258 """ Run the specified lines in interpreter, honoring ipython directives.
261 """ Run the specified lines in interpreter, honoring ipython directives.
259
262
260 This allows %magic and !shell escape notations.
263 This allows %magic and !shell escape notations.
261
264
262 Takes either all lines in one string or list of lines.
265 Takes either all lines in one string or list of lines.
263 """
266 """
264
267
265 def cleanup_ipy_script(script):
268 def cleanup_ipy_script(script):
266 """ Make a script safe for _ip.runlines()
269 """ Make a script safe for _ip.runlines()
267
270
268 - Removes empty lines Suffixes all indented blocks that end with
271 - Removes empty lines Suffixes all indented blocks that end with
269 - unindented lines with empty lines
272 - unindented lines with empty lines
270 """
273 """
271
274
272 res = []
275 res = []
273 lines = script.splitlines()
276 lines = script.splitlines()
274
277
275 level = 0
278 level = 0
276 for l in lines:
279 for l in lines:
277 lstripped = l.lstrip()
280 lstripped = l.lstrip()
278 stripped = l.strip()
281 stripped = l.strip()
279 if not stripped:
282 if not stripped:
280 continue
283 continue
281 newlevel = len(l) - len(lstripped)
284 newlevel = len(l) - len(lstripped)
282 def is_secondary_block_start(s):
285 def is_secondary_block_start(s):
283 if not s.endswith(':'):
286 if not s.endswith(':'):
284 return False
287 return False
285 if (s.startswith('elif') or
288 if (s.startswith('elif') or
286 s.startswith('else') or
289 s.startswith('else') or
287 s.startswith('except') or
290 s.startswith('except') or
288 s.startswith('finally')):
291 s.startswith('finally')):
289 return True
292 return True
290
293
291 if level > 0 and newlevel == 0 and \
294 if level > 0 and newlevel == 0 and \
292 not is_secondary_block_start(stripped):
295 not is_secondary_block_start(stripped):
293 # add empty line
296 # add empty line
294 res.append('')
297 res.append('')
295
298
296 res.append(l)
299 res.append(l)
297 level = newlevel
300 level = newlevel
298 return '\n'.join(res) + '\n'
301 return '\n'.join(res) + '\n'
299
302
300 if isinstance(lines,basestring):
303 if isinstance(lines,basestring):
301 script = lines
304 script = lines
302 else:
305 else:
303 script = '\n'.join(lines)
306 script = '\n'.join(lines)
304 clean=cleanup_ipy_script(script)
307 clean=cleanup_ipy_script(script)
305 # print "_ip.runlines() script:\n",clean # dbg
308 # print "_ip.runlines() script:\n",clean # dbg
306 self.IP.runlines(clean)
309 self.IP.runlines(clean)
307
310
308 def to_user_ns(self,vars, interactive = True):
311 def to_user_ns(self,vars, interactive = True):
309 """Inject a group of variables into the IPython user namespace.
312 """Inject a group of variables into the IPython user namespace.
310
313
311 Inputs:
314 Inputs:
312
315
313 - vars: string with variable names separated by whitespace, or a
316 - vars: string with variable names separated by whitespace, or a
314 dict with name/value pairs.
317 dict with name/value pairs.
315
318
316 - interactive: if True (default), the var will be listed with
319 - interactive: if True (default), the var will be listed with
317 %whos et. al.
320 %whos et. al.
318
321
319 This utility routine is meant to ease interactive debugging work,
322 This utility routine is meant to ease interactive debugging work,
320 where you want to easily propagate some internal variable in your code
323 where you want to easily propagate some internal variable in your code
321 up to the interactive namespace for further exploration.
324 up to the interactive namespace for further exploration.
322
325
323 When you run code via %run, globals in your script become visible at
326 When you run code via %run, globals in your script become visible at
324 the interactive prompt, but this doesn't happen for locals inside your
327 the interactive prompt, but this doesn't happen for locals inside your
325 own functions and methods. Yet when debugging, it is common to want
328 own functions and methods. Yet when debugging, it is common to want
326 to explore some internal variables further at the interactive propmt.
329 to explore some internal variables further at the interactive propmt.
327
330
328 Examples:
331 Examples:
329
332
330 To use this, you first must obtain a handle on the ipython object as
333 To use this, you first must obtain a handle on the ipython object as
331 indicated above, via:
334 indicated above, via:
332
335
333 import IPython.ipapi
336 import IPython.ipapi
334 ip = IPython.ipapi.get()
337 ip = IPython.ipapi.get()
335
338
336 Once this is done, inside a routine foo() where you want to expose
339 Once this is done, inside a routine foo() where you want to expose
337 variables x and y, you do the following:
340 variables x and y, you do the following:
338
341
339 def foo():
342 def foo():
340 ...
343 ...
341 x = your_computation()
344 x = your_computation()
342 y = something_else()
345 y = something_else()
343
346
344 # This pushes x and y to the interactive prompt immediately, even
347 # This pushes x and y to the interactive prompt immediately, even
345 # if this routine crashes on the next line after:
348 # if this routine crashes on the next line after:
346 ip.to_user_ns('x y')
349 ip.to_user_ns('x y')
347 ...
350 ...
348
351
349 # To expose *ALL* the local variables from the function, use:
352 # To expose *ALL* the local variables from the function, use:
350 ip.to_user_ns(locals())
353 ip.to_user_ns(locals())
351
354
352 ...
355 ...
353 # return
356 # return
354
357
355
358
356 If you need to rename variables, the dict input makes it easy. For
359 If you need to rename variables, the dict input makes it easy. For
357 example, this call exposes variables 'foo' as 'x' and 'bar' as 'y'
360 example, this call exposes variables 'foo' as 'x' and 'bar' as 'y'
358 in IPython user namespace:
361 in IPython user namespace:
359
362
360 ip.to_user_ns(dict(x=foo,y=bar))
363 ip.to_user_ns(dict(x=foo,y=bar))
361 """
364 """
362
365
363 # print 'vars given:',vars # dbg
366 # print 'vars given:',vars # dbg
364
367
365 # We need a dict of name/value pairs to do namespace updates.
368 # We need a dict of name/value pairs to do namespace updates.
366 if isinstance(vars,dict):
369 if isinstance(vars,dict):
367 # If a dict was given, no need to change anything.
370 # If a dict was given, no need to change anything.
368 vdict = vars
371 vdict = vars
369 elif isinstance(vars,basestring):
372 elif isinstance(vars,basestring):
370 # If a string with names was given, get the caller's frame to
373 # If a string with names was given, get the caller's frame to
371 # evaluate the given names in
374 # evaluate the given names in
372 cf = sys._getframe(1)
375 cf = sys._getframe(1)
373 vdict = {}
376 vdict = {}
374 for name in vars.split():
377 for name in vars.split():
375 try:
378 try:
376 vdict[name] = eval(name,cf.f_globals,cf.f_locals)
379 vdict[name] = eval(name,cf.f_globals,cf.f_locals)
377 except:
380 except:
378 print ('could not get var. %s from %s' %
381 print ('could not get var. %s from %s' %
379 (name,cf.f_code.co_name))
382 (name,cf.f_code.co_name))
380 else:
383 else:
381 raise ValueError('vars must be a string or a dict')
384 raise ValueError('vars must be a string or a dict')
382
385
383 # Propagate variables to user namespace
386 # Propagate variables to user namespace
384 self.user_ns.update(vdict)
387 self.user_ns.update(vdict)
385
388
386 # And configure interactive visibility
389 # And configure interactive visibility
387 config_ns = self.IP.user_config_ns
390 config_ns = self.IP.user_config_ns
388 if interactive:
391 if interactive:
389 for name,val in vdict.iteritems():
392 for name,val in vdict.iteritems():
390 config_ns.pop(name,None)
393 config_ns.pop(name,None)
391 else:
394 else:
392 for name,val in vdict.iteritems():
395 for name,val in vdict.iteritems():
393 config_ns[name] = val
396 config_ns[name] = val
394
397
395 def expand_alias(self,line):
398 def expand_alias(self,line):
396 """ Expand an alias in the command line
399 """ Expand an alias in the command line
397
400
398 Returns the provided command line, possibly with the first word
401 Returns the provided command line, possibly with the first word
399 (command) translated according to alias expansion rules.
402 (command) translated according to alias expansion rules.
400
403
401 [ipython]|16> _ip.expand_aliases("np myfile.txt")
404 [ipython]|16> _ip.expand_aliases("np myfile.txt")
402 <16> 'q:/opt/np/notepad++.exe myfile.txt'
405 <16> 'q:/opt/np/notepad++.exe myfile.txt'
403 """
406 """
404
407
405 pre,fn,rest = self.IP.split_user_input(line)
408 pre,fn,rest = self.IP.split_user_input(line)
406 res = pre + self.IP.expand_aliases(fn,rest)
409 res = pre + self.IP.expand_aliases(fn,rest)
407 return res
410 return res
408
411
409 def itpl(self, s, depth = 1):
412 def itpl(self, s, depth = 1):
410 """ Expand Itpl format string s.
413 """ Expand Itpl format string s.
411
414
412 Only callable from command line (i.e. prefilter results);
415 Only callable from command line (i.e. prefilter results);
413 If you use in your scripts, you need to use a bigger depth!
416 If you use in your scripts, you need to use a bigger depth!
414 """
417 """
415 return self.IP.var_expand(s, depth)
418 return self.IP.var_expand(s, depth)
416
419
417 def defalias(self, name, cmd):
420 def defalias(self, name, cmd):
418 """ Define a new alias
421 """ Define a new alias
419
422
420 _ip.defalias('bb','bldmake bldfiles')
423 _ip.defalias('bb','bldmake bldfiles')
421
424
422 Creates a new alias named 'bb' in ipython user namespace
425 Creates a new alias named 'bb' in ipython user namespace
423 """
426 """
424
427
425 self.dbg.check_hotname(name)
428 self.dbg.check_hotname(name)
426
429
427 if name in self.IP.alias_table:
430 if name in self.IP.alias_table:
428 self.dbg.debug_stack("Alias redefinition: '%s' => '%s' (old '%s')"
431 self.dbg.debug_stack("Alias redefinition: '%s' => '%s' (old '%s')"
429 % (name, cmd, self.IP.alias_table[name]))
432 % (name, cmd, self.IP.alias_table[name]))
430
433
431 if callable(cmd):
434 if callable(cmd):
432 self.IP.alias_table[name] = cmd
435 self.IP.alias_table[name] = cmd
433 import IPython.shadowns
436 import IPython.shadowns
434 setattr(IPython.shadowns, name,cmd)
437 setattr(IPython.shadowns, name,cmd)
435 return
438 return
436
439
437 if isinstance(cmd,basestring):
440 if isinstance(cmd,basestring):
438 nargs = cmd.count('%s')
441 nargs = cmd.count('%s')
439 if nargs>0 and cmd.find('%l')>=0:
442 if nargs>0 and cmd.find('%l')>=0:
440 raise Exception('The %s and %l specifiers are mutually '
443 raise Exception('The %s and %l specifiers are mutually '
441 'exclusive in alias definitions.')
444 'exclusive in alias definitions.')
442
445
443 self.IP.alias_table[name] = (nargs,cmd)
446 self.IP.alias_table[name] = (nargs,cmd)
444 return
447 return
445
448
446 # just put it in - it's probably (0,'foo')
449 # just put it in - it's probably (0,'foo')
447 self.IP.alias_table[name] = cmd
450 self.IP.alias_table[name] = cmd
448
451
449 def defmacro(self, *args):
452 def defmacro(self, *args):
450 """ Define a new macro
453 """ Define a new macro
451
454
452 2 forms of calling:
455 2 forms of calling:
453
456
454 mac = _ip.defmacro('print "hello"\nprint "world"')
457 mac = _ip.defmacro('print "hello"\nprint "world"')
455
458
456 (doesn't put the created macro on user namespace)
459 (doesn't put the created macro on user namespace)
457
460
458 _ip.defmacro('build', 'bldmake bldfiles\nabld build winscw udeb')
461 _ip.defmacro('build', 'bldmake bldfiles\nabld build winscw udeb')
459
462
460 (creates a macro named 'build' in user namespace)
463 (creates a macro named 'build' in user namespace)
461 """
464 """
462
465
463 import IPython.macro
466 import IPython.macro
464
467
465 if len(args) == 1:
468 if len(args) == 1:
466 return IPython.macro.Macro(args[0])
469 return IPython.macro.Macro(args[0])
467 elif len(args) == 2:
470 elif len(args) == 2:
468 self.user_ns[args[0]] = IPython.macro.Macro(args[1])
471 self.user_ns[args[0]] = IPython.macro.Macro(args[1])
469 else:
472 else:
470 return Exception("_ip.defmacro must be called with 1 or 2 arguments")
473 return Exception("_ip.defmacro must be called with 1 or 2 arguments")
471
474
472 def set_next_input(self, s):
475 def set_next_input(self, s):
473 """ Sets the 'default' input string for the next command line.
476 """ Sets the 'default' input string for the next command line.
474
477
475 Requires readline.
478 Requires readline.
476
479
477 Example:
480 Example:
478
481
479 [D:\ipython]|1> _ip.set_next_input("Hello Word")
482 [D:\ipython]|1> _ip.set_next_input("Hello Word")
480 [D:\ipython]|2> Hello Word_ # cursor is here
483 [D:\ipython]|2> Hello Word_ # cursor is here
481 """
484 """
482
485
483 self.IP.rl_next_input = s
486 self.IP.rl_next_input = s
484
487
485 def load(self, mod):
488 def load(self, mod):
486 """ Load an extension.
489 """ Load an extension.
487
490
488 Some modules should (or must) be 'load()':ed, rather than just imported.
491 Some modules should (or must) be 'load()':ed, rather than just imported.
489
492
490 Loading will do:
493 Loading will do:
491
494
492 - run init_ipython(ip)
495 - run init_ipython(ip)
493 - run ipython_firstrun(ip)
496 - run ipython_firstrun(ip)
494 """
497 """
495
498
496 if mod in self.extensions:
499 if mod in self.extensions:
497 # just to make sure we don't init it twice
500 # just to make sure we don't init it twice
498 # note that if you 'load' a module that has already been
501 # note that if you 'load' a module that has already been
499 # imported, init_ipython gets run anyway
502 # imported, init_ipython gets run anyway
500
503
501 return self.extensions[mod]
504 return self.extensions[mod]
502 __import__(mod)
505 __import__(mod)
503 m = sys.modules[mod]
506 m = sys.modules[mod]
504 if hasattr(m,'init_ipython'):
507 if hasattr(m,'init_ipython'):
505 m.init_ipython(self)
508 m.init_ipython(self)
506
509
507 if hasattr(m,'ipython_firstrun'):
510 if hasattr(m,'ipython_firstrun'):
508 already_loaded = self.db.get('firstrun_done', set())
511 already_loaded = self.db.get('firstrun_done', set())
509 if mod not in already_loaded:
512 if mod not in already_loaded:
510 m.ipython_firstrun(self)
513 m.ipython_firstrun(self)
511 already_loaded.add(mod)
514 already_loaded.add(mod)
512 self.db['firstrun_done'] = already_loaded
515 self.db['firstrun_done'] = already_loaded
513
516
514 self.extensions[mod] = m
517 self.extensions[mod] = m
515 return m
518 return m
516
519
517
520
518 class DebugTools:
521 class DebugTools:
519 """ Used for debugging mishaps in api usage
522 """ Used for debugging mishaps in api usage
520
523
521 So far, tracing redefinitions is supported.
524 So far, tracing redefinitions is supported.
522 """
525 """
523
526
524 def __init__(self, ip):
527 def __init__(self, ip):
525 self.ip = ip
528 self.ip = ip
526 self.debugmode = False
529 self.debugmode = False
527 self.hotnames = set()
530 self.hotnames = set()
528
531
529 def hotname(self, name_to_catch):
532 def hotname(self, name_to_catch):
530 self.hotnames.add(name_to_catch)
533 self.hotnames.add(name_to_catch)
531
534
532 def debug_stack(self, msg = None):
535 def debug_stack(self, msg = None):
533 if not self.debugmode:
536 if not self.debugmode:
534 return
537 return
535
538
536 import traceback
539 import traceback
537 if msg is not None:
540 if msg is not None:
538 print '====== %s ========' % msg
541 print '====== %s ========' % msg
539 traceback.print_stack()
542 traceback.print_stack()
540
543
541 def check_hotname(self,name):
544 def check_hotname(self,name):
542 if name in self.hotnames:
545 if name in self.hotnames:
543 self.debug_stack( "HotName '%s' caught" % name)
546 self.debug_stack( "HotName '%s' caught" % name)
544
547
545
548
546 def launch_new_instance(user_ns = None,shellclass = None):
549 def launch_new_instance(user_ns = None,shellclass = None):
547 """ Make and start a new ipython instance.
550 """ Make and start a new ipython instance.
548
551
549 This can be called even without having an already initialized
552 This can be called even without having an already initialized
550 ipython session running.
553 ipython session running.
551
554
552 This is also used as the egg entry point for the 'ipython' script.
555 This is also used as the egg entry point for the 'ipython' script.
553
556
554 """
557 """
555 ses = make_session(user_ns,shellclass)
558 ses = make_session(user_ns,shellclass)
556 ses.mainloop()
559 ses.mainloop()
557
560
558
561
559 def make_user_ns(user_ns = None):
562 def make_user_ns(user_ns = None):
560 """Return a valid user interactive namespace.
563 """Return a valid user interactive namespace.
561
564
562 This builds a dict with the minimal information needed to operate as a
565 This builds a dict with the minimal information needed to operate as a
563 valid IPython user namespace, which you can pass to the various embedding
566 valid IPython user namespace, which you can pass to the various embedding
564 classes in ipython.
567 classes in ipython.
565 """
568 """
566
569
567 if user_ns is None:
570 if user_ns is None:
568 # Set __name__ to __main__ to better match the behavior of the
571 # Set __name__ to __main__ to better match the behavior of the
569 # normal interpreter.
572 # normal interpreter.
570 user_ns = {'__name__' :'__main__',
573 user_ns = {'__name__' :'__main__',
571 '__builtins__' : __builtin__,
574 '__builtins__' : __builtin__,
572 }
575 }
573 else:
576 else:
574 user_ns.setdefault('__name__','__main__')
577 user_ns.setdefault('__name__','__main__')
575 user_ns.setdefault('__builtins__',__builtin__)
578 user_ns.setdefault('__builtins__',__builtin__)
576
579
577 return user_ns
580 return user_ns
578
581
579
582
580 def make_user_global_ns(ns = None):
583 def make_user_global_ns(ns = None):
581 """Return a valid user global namespace.
584 """Return a valid user global namespace.
582
585
583 Similar to make_user_ns(), but global namespaces are really only needed in
586 Similar to make_user_ns(), but global namespaces are really only needed in
584 embedded applications, where there is a distinction between the user's
587 embedded applications, where there is a distinction between the user's
585 interactive namespace and the global one where ipython is running."""
588 interactive namespace and the global one where ipython is running."""
586
589
587 if ns is None: ns = {}
590 if ns is None: ns = {}
588 return ns
591 return ns
589
592
590
593
591 def make_session(user_ns = None, shellclass = None):
594 def make_session(user_ns = None, shellclass = None):
592 """Makes, but does not launch an IPython session.
595 """Makes, but does not launch an IPython session.
593
596
594 Later on you can call obj.mainloop() on the returned object.
597 Later on you can call obj.mainloop() on the returned object.
595
598
596 Inputs:
599 Inputs:
597
600
598 - user_ns(None): a dict to be used as the user's namespace with initial
601 - user_ns(None): a dict to be used as the user's namespace with initial
599 data.
602 data.
600
603
601 WARNING: This should *not* be run when a session exists already."""
604 WARNING: This should *not* be run when a session exists already."""
602
605
603 import IPython.Shell
606 import IPython.Shell
604 if shellclass is None:
607 if shellclass is None:
605 return IPython.Shell.start(user_ns)
608 return IPython.Shell.start(user_ns)
606 return shellclass(user_ns = user_ns)
609 return shellclass(user_ns = user_ns)
General Comments 0
You need to be logged in to leave comments. Login now