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

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

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