##// END OF EJS Templates
_ip.load runs init_ipython even if the module already exists
vivainio -
Show More
@@ -1,450 +1,457 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 self.extensions = {}
186 187 global _recent
187 188 _recent = self
188 189
189 190 # Use a property for some things which are added to the instance very
190 191 # late. I don't have time right now to disentangle the initialization
191 192 # order issues, so a property lets us delay item extraction while
192 193 # providing a normal attribute API.
193 194 def get_db(self):
194 195 """A handle to persistent dict-like database (a PickleShareDB object)"""
195 196 return self.IP.db
196 197
197 198 db = property(get_db,None,None,get_db.__doc__)
198 199
199 200 def get_options(self):
200 201 """All configurable variables."""
201 202
202 203 # catch typos by disabling new attribute creation. If new attr creation
203 204 # is in fact wanted (e.g. when exposing new options), do allow_new_attr(True)
204 205 # for the received rc struct.
205 206
206 207 self.IP.rc.allow_new_attr(False)
207 208 return self.IP.rc
208 209
209 210 options = property(get_options,None,None,get_options.__doc__)
210 211
211 212 def expose_magic(self,magicname, func):
212 213 ''' Expose own function as magic function for ipython
213 214
214 215 def foo_impl(self,parameter_s=''):
215 216 """My very own magic!. (Use docstrings, IPython reads them)."""
216 217 print 'Magic function. Passed parameter is between < >: <'+parameter_s+'>'
217 218 print 'The self object is:',self
218 219
219 220 ipapi.expose_magic("foo",foo_impl)
220 221 '''
221 222
222 223 import new
223 224 im = new.instancemethod(func,self.IP, self.IP.__class__)
224 225 setattr(self.IP, "magic_" + magicname, im)
225 226
226 227 def ex(self,cmd):
227 228 """ Execute a normal python statement in user namespace """
228 229 exec cmd in self.user_ns
229 230
230 231 def ev(self,expr):
231 232 """ Evaluate python expression expr in user namespace
232 233
233 234 Returns the result of evaluation"""
234 235 return eval(expr,self.user_ns)
235 236
236 237 def runlines(self,lines):
237 238 """ Run the specified lines in interpreter, honoring ipython directives.
238 239
239 240 This allows %magic and !shell escape notations.
240 241
241 242 Takes either all lines in one string or list of lines.
242 243 """
243 244 if isinstance(lines,basestring):
244 245 self.IP.runlines(lines)
245 246 else:
246 247 self.IP.runlines('\n'.join(lines))
247 248
248 249 def to_user_ns(self,vars, interactive = True):
249 250 """Inject a group of variables into the IPython user namespace.
250 251
251 252 Inputs:
252 253
253 254 - vars: string with variable names separated by whitespace
254 255
255 256 - interactive: if True (default), the var will be listed with
256 257 %whos et. al.
257 258
258 259 This utility routine is meant to ease interactive debugging work,
259 260 where you want to easily propagate some internal variable in your code
260 261 up to the interactive namespace for further exploration.
261 262
262 263 When you run code via %run, globals in your script become visible at
263 264 the interactive prompt, but this doesn't happen for locals inside your
264 265 own functions and methods. Yet when debugging, it is common to want
265 266 to explore some internal variables further at the interactive propmt.
266 267
267 268 Examples:
268 269
269 270 To use this, you first must obtain a handle on the ipython object as
270 271 indicated above, via:
271 272
272 273 import IPython.ipapi
273 274 ip = IPython.ipapi.get()
274 275
275 276 Once this is done, inside a routine foo() where you want to expose
276 277 variables x and y, you do the following:
277 278
278 279 def foo():
279 280 ...
280 281 x = your_computation()
281 282 y = something_else()
282 283
283 284 # This pushes x and y to the interactive prompt immediately, even
284 285 # if this routine crashes on the next line after:
285 286 ip.to_user_ns('x y')
286 287 ...
287 288 # return
288 289
289 290 If you need to rename variables, just use ip.user_ns with dict
290 291 and update:
291 292
292 293 # exposes variables 'foo' as 'x' and 'bar' as 'y' in IPython
293 294 # user namespace
294 295 ip.user_ns.update(dict(x=foo,y=bar))
295 296 """
296 297
297 298 # print 'vars given:',vars # dbg
298 299 # Get the caller's frame to evaluate the given names in
299 300 cf = sys._getframe(1)
300 301
301 302 user_ns = self.user_ns
302 303 config_ns = self.IP.user_config_ns
303 304 for name in vars.split():
304 305 try:
305 306 val = eval(name,cf.f_globals,cf.f_locals)
306 307 user_ns[name] = val
307 308 if not interactive:
308 309 config_ns[name] = val
309 310 else:
310 311 config_ns.pop(name,None)
311 312 except:
312 313 print ('could not get var. %s from %s' %
313 314 (name,cf.f_code.co_name))
314 315
315 316 def expand_alias(self,line):
316 317 """ Expand an alias in the command line
317 318
318 319 Returns the provided command line, possibly with the first word
319 320 (command) translated according to alias expansion rules.
320 321
321 322 [ipython]|16> _ip.expand_aliases("np myfile.txt")
322 323 <16> 'q:/opt/np/notepad++.exe myfile.txt'
323 324 """
324 325
325 326 pre,fn,rest = self.IP.split_user_input(line)
326 327 res = pre + self.IP.expand_aliases(fn,rest)
327 328 return res
328 329
329 330 def defalias(self, name, cmd):
330 331 """ Define a new alias
331 332
332 333 _ip.defalias('bb','bldmake bldfiles')
333 334
334 335 Creates a new alias named 'bb' in ipython user namespace
335 336 """
336 337
337 338
338 339 nargs = cmd.count('%s')
339 340 if nargs>0 and cmd.find('%l')>=0:
340 341 raise Exception('The %s and %l specifiers are mutually exclusive '
341 342 'in alias definitions.')
342 343
343 344 else: # all looks OK
344 345 self.IP.alias_table[name] = (nargs,cmd)
345 346
346 347 def defmacro(self, *args):
347 348 """ Define a new macro
348 349
349 350 2 forms of calling:
350 351
351 352 mac = _ip.defmacro('print "hello"\nprint "world"')
352 353
353 354 (doesn't put the created macro on user namespace)
354 355
355 356 _ip.defmacro('build', 'bldmake bldfiles\nabld build winscw udeb')
356 357
357 358 (creates a macro named 'build' in user namespace)
358 359 """
359 360
360 361 import IPython.macro
361 362
362 363 if len(args) == 1:
363 364 return IPython.macro.Macro(args[0])
364 365 elif len(args) == 2:
365 366 self.user_ns[args[0]] = IPython.macro.Macro(args[1])
366 367 else:
367 368 return Exception("_ip.defmacro must be called with 1 or 2 arguments")
368 369
369 370 def set_next_input(self, s):
370 371 """ Sets the 'default' input string for the next command line.
371 372
372 373 Requires readline.
373 374
374 375 Example:
375 376
376 377 [D:\ipython]|1> _ip.set_next_input("Hello Word")
377 378 [D:\ipython]|2> Hello Word_ # cursor is here
378 379 """
379 380
380 381 self.IP.rl_next_input = s
381 382
382 383 def load(self, mod):
383 if mod in sys.modules:
384 return
384 if mod in self.extensions:
385 # just to make sure we don't init it twice
386 # note that if you 'load' a module that has already been
387 # imported, init_ipython gets run anyway
388
389 return self.extensions[mod]
385 390 __import__(mod)
386 391 m = sys.modules[mod]
387 392 if hasattr(m,'init_ipython'):
388 393 m.init_ipython(self)
394 self.extensions[mod] = m
395 return m
389 396
390 397
391 398 def launch_new_instance(user_ns = None):
392 399 """ Make and start a new ipython instance.
393 400
394 401 This can be called even without having an already initialized
395 402 ipython session running.
396 403
397 404 This is also used as the egg entry point for the 'ipython' script.
398 405
399 406 """
400 407 ses = make_session(user_ns)
401 408 ses.mainloop()
402 409
403 410
404 411 def make_user_ns(user_ns = None):
405 412 """Return a valid user interactive namespace.
406 413
407 414 This builds a dict with the minimal information needed to operate as a
408 415 valid IPython user namespace, which you can pass to the various embedding
409 416 classes in ipython.
410 417 """
411 418
412 419 if user_ns is None:
413 420 # Set __name__ to __main__ to better match the behavior of the
414 421 # normal interpreter.
415 422 user_ns = {'__name__' :'__main__',
416 423 '__builtins__' : __builtin__,
417 424 }
418 425 else:
419 426 user_ns.setdefault('__name__','__main__')
420 427 user_ns.setdefault('__builtins__',__builtin__)
421 428
422 429 return user_ns
423 430
424 431
425 432 def make_user_global_ns(ns = None):
426 433 """Return a valid user global namespace.
427 434
428 435 Similar to make_user_ns(), but global namespaces are really only needed in
429 436 embedded applications, where there is a distinction between the user's
430 437 interactive namespace and the global one where ipython is running."""
431 438
432 439 if ns is None: ns = {}
433 440 return ns
434 441
435 442
436 443 def make_session(user_ns = None):
437 444 """Makes, but does not launch an IPython session.
438 445
439 446 Later on you can call obj.mainloop() on the returned object.
440 447
441 448 Inputs:
442 449
443 450 - user_ns(None): a dict to be used as the user's namespace with initial
444 451 data.
445 452
446 453 WARNING: This should *not* be run when a session exists already."""
447 454
448 455 import IPython
449 456 return IPython.Shell.start(user_ns)
450 457
General Comments 0
You need to be logged in to leave comments. Login now