##// END OF EJS Templates
Close issue 41, remove obsolete gtk 1.x code, trap os.getcwd exceptions at...
fperez -
Show More

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

@@ -1,886 +1,881 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 703 2005-08-16 17:34:44Z fperez $"""
7 $Id: Shell.py 802 2005-09-06 03:49:12Z fperez $"""
8 8
9 9 #*****************************************************************************
10 10 # Copyright (C) 2001-2004 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 __main__
22 22 import __builtin__
23 23 import sys
24 24 import os
25 25 import code
26 26 import threading
27 27 import signal
28 28
29 29 import IPython
30 30 from IPython.iplib import InteractiveShell
31 31 from IPython.ipmaker import make_IPython
32 32 from IPython.genutils import Term,warn,error,flag_calls
33 33 from IPython.Struct import Struct
34 34 from IPython.Magic import Magic
35 35 from IPython import ultraTB
36 36
37 37 # global flag to pass around information about Ctrl-C without exceptions
38 38 KBINT = False
39 39
40 40 # global flag to turn on/off Tk support.
41 41 USE_TK = False
42 42
43 43 #-----------------------------------------------------------------------------
44 44 # This class is trivial now, but I want to have it in to publish a clean
45 45 # interface. Later when the internals are reorganized, code that uses this
46 46 # shouldn't have to change.
47 47
48 48 class IPShell:
49 49 """Create an IPython instance."""
50 50
51 51 def __init__(self,argv=None,user_ns=None,debug=1,
52 52 shell_class=InteractiveShell):
53 53 self.IP = make_IPython(argv,user_ns=user_ns,debug=debug,
54 54 shell_class=shell_class)
55 55
56 56 def mainloop(self,sys_exit=0,banner=None):
57 57 self.IP.mainloop(banner)
58 58 if sys_exit:
59 59 sys.exit()
60 60
61 61 #-----------------------------------------------------------------------------
62 62 class IPShellEmbed:
63 63 """Allow embedding an IPython shell into a running program.
64 64
65 65 Instances of this class are callable, with the __call__ method being an
66 66 alias to the embed() method of an InteractiveShell instance.
67 67
68 68 Usage (see also the example-embed.py file for a running example):
69 69
70 70 ipshell = IPShellEmbed([argv,banner,exit_msg,rc_override])
71 71
72 72 - argv: list containing valid command-line options for IPython, as they
73 73 would appear in sys.argv[1:].
74 74
75 75 For example, the following command-line options:
76 76
77 77 $ ipython -prompt_in1 'Input <\\#>' -colors LightBG
78 78
79 79 would be passed in the argv list as:
80 80
81 81 ['-prompt_in1','Input <\\#>','-colors','LightBG']
82 82
83 83 - banner: string which gets printed every time the interpreter starts.
84 84
85 85 - exit_msg: string which gets printed every time the interpreter exits.
86 86
87 87 - rc_override: a dict or Struct of configuration options such as those
88 88 used by IPython. These options are read from your ~/.ipython/ipythonrc
89 89 file when the Shell object is created. Passing an explicit rc_override
90 90 dict with any options you want allows you to override those values at
91 91 creation time without having to modify the file. This way you can create
92 92 embeddable instances configured in any way you want without editing any
93 93 global files (thus keeping your interactive IPython configuration
94 94 unchanged).
95 95
96 96 Then the ipshell instance can be called anywhere inside your code:
97 97
98 98 ipshell(header='') -> Opens up an IPython shell.
99 99
100 100 - header: string printed by the IPython shell upon startup. This can let
101 101 you know where in your code you are when dropping into the shell. Note
102 102 that 'banner' gets prepended to all calls, so header is used for
103 103 location-specific information.
104 104
105 105 For more details, see the __call__ method below.
106 106
107 107 When the IPython shell is exited with Ctrl-D, normal program execution
108 108 resumes.
109 109
110 110 This functionality was inspired by a posting on comp.lang.python by cmkl
111 111 <cmkleffner@gmx.de> on Dec. 06/01 concerning similar uses of pyrepl, and
112 112 by the IDL stop/continue commands."""
113 113
114 114 def __init__(self,argv=None,banner='',exit_msg=None,rc_override=None):
115 115 """Note that argv here is a string, NOT a list."""
116 116 self.set_banner(banner)
117 117 self.set_exit_msg(exit_msg)
118 118 self.set_dummy_mode(0)
119 119
120 120 # sys.displayhook is a global, we need to save the user's original
121 121 # Don't rely on __displayhook__, as the user may have changed that.
122 122 self.sys_displayhook_ori = sys.displayhook
123 123
124 124 # save readline completer status
125 125 try:
126 126 #print 'Save completer',sys.ipcompleter # dbg
127 127 self.sys_ipcompleter_ori = sys.ipcompleter
128 128 except:
129 129 pass # not nested with IPython
130 130
131 131 # FIXME. Passing user_ns breaks namespace handling.
132 132 #self.IP = make_IPython(argv,user_ns=__main__.__dict__)
133 133 self.IP = make_IPython(argv,rc_override=rc_override,embedded=True)
134 134
135 135 self.IP.name_space_init()
136 136 # mark this as an embedded instance so we know if we get a crash
137 137 # post-mortem
138 138 self.IP.rc.embedded = 1
139 139 # copy our own displayhook also
140 140 self.sys_displayhook_embed = sys.displayhook
141 141 # and leave the system's display hook clean
142 142 sys.displayhook = self.sys_displayhook_ori
143 143 # don't use the ipython crash handler so that user exceptions aren't
144 144 # trapped
145 145 sys.excepthook = ultraTB.FormattedTB(color_scheme = self.IP.rc.colors,
146 146 mode = self.IP.rc.xmode,
147 147 call_pdb = self.IP.rc.pdb)
148 148 self.restore_system_completer()
149 149
150 150 def restore_system_completer(self):
151 151 """Restores the readline completer which was in place.
152 152
153 153 This allows embedded IPython within IPython not to disrupt the
154 154 parent's completion.
155 155 """
156 156
157 157 try:
158 158 self.IP.readline.set_completer(self.sys_ipcompleter_ori)
159 159 sys.ipcompleter = self.sys_ipcompleter_ori
160 160 except:
161 161 pass
162 162
163 163 def __call__(self,header='',local_ns=None,global_ns=None,dummy=None):
164 164 """Activate the interactive interpreter.
165 165
166 166 __call__(self,header='',local_ns=None,global_ns,dummy=None) -> Start
167 167 the interpreter shell with the given local and global namespaces, and
168 168 optionally print a header string at startup.
169 169
170 170 The shell can be globally activated/deactivated using the
171 171 set/get_dummy_mode methods. This allows you to turn off a shell used
172 172 for debugging globally.
173 173
174 174 However, *each* time you call the shell you can override the current
175 175 state of dummy_mode with the optional keyword parameter 'dummy'. For
176 176 example, if you set dummy mode on with IPShell.set_dummy_mode(1), you
177 177 can still have a specific call work by making it as IPShell(dummy=0).
178 178
179 179 The optional keyword parameter dummy controls whether the call
180 180 actually does anything. """
181 181
182 182 # Allow the dummy parameter to override the global __dummy_mode
183 183 if dummy or (dummy != 0 and self.__dummy_mode):
184 184 return
185 185
186 186 # Set global subsystems (display,completions) to our values
187 187 sys.displayhook = self.sys_displayhook_embed
188 188 if self.IP.has_readline:
189 189 self.IP.readline.set_completer(self.IP.Completer.complete)
190 190
191 191 if self.banner and header:
192 192 format = '%s\n%s\n'
193 193 else:
194 194 format = '%s%s\n'
195 195 banner = format % (self.banner,header)
196 196
197 197 # Call the embedding code with a stack depth of 1 so it can skip over
198 198 # our call and get the original caller's namespaces.
199 199 self.IP.embed_mainloop(banner,local_ns,global_ns,stack_depth=1)
200 200
201 201 if self.exit_msg:
202 202 print self.exit_msg
203 203
204 204 # Restore global systems (display, completion)
205 205 sys.displayhook = self.sys_displayhook_ori
206 206 self.restore_system_completer()
207 207
208 208 def set_dummy_mode(self,dummy):
209 209 """Sets the embeddable shell's dummy mode parameter.
210 210
211 211 set_dummy_mode(dummy): dummy = 0 or 1.
212 212
213 213 This parameter is persistent and makes calls to the embeddable shell
214 214 silently return without performing any action. This allows you to
215 215 globally activate or deactivate a shell you're using with a single call.
216 216
217 217 If you need to manually"""
218 218
219 219 if dummy not in [0,1]:
220 220 raise ValueError,'dummy parameter must be 0 or 1'
221 221 self.__dummy_mode = dummy
222 222
223 223 def get_dummy_mode(self):
224 224 """Return the current value of the dummy mode parameter.
225 225 """
226 226 return self.__dummy_mode
227 227
228 228 def set_banner(self,banner):
229 229 """Sets the global banner.
230 230
231 231 This banner gets prepended to every header printed when the shell
232 232 instance is called."""
233 233
234 234 self.banner = banner
235 235
236 236 def set_exit_msg(self,exit_msg):
237 237 """Sets the global exit_msg.
238 238
239 239 This exit message gets printed upon exiting every time the embedded
240 240 shell is called. It is None by default. """
241 241
242 242 self.exit_msg = exit_msg
243 243
244 244 #-----------------------------------------------------------------------------
245 245 def sigint_handler (signum,stack_frame):
246 246 """Sigint handler for threaded apps.
247 247
248 248 This is a horrible hack to pass information about SIGINT _without_ using
249 249 exceptions, since I haven't been able to properly manage cross-thread
250 250 exceptions in GTK/WX. In fact, I don't think it can be done (or at least
251 251 that's my understanding from a c.l.py thread where this was discussed)."""
252 252
253 253 global KBINT
254 254
255 255 print '\nKeyboardInterrupt - Press <Enter> to continue.',
256 256 Term.cout.flush()
257 257 # Set global flag so that runsource can know that Ctrl-C was hit
258 258 KBINT = True
259 259
260 260 class MTInteractiveShell(InteractiveShell):
261 261 """Simple multi-threaded shell."""
262 262
263 263 # Threading strategy taken from:
264 264 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65109, by Brian
265 265 # McErlean and John Finlay. Modified with corrections by Antoon Pardon,
266 266 # from the pygtk mailing list, to avoid lockups with system calls.
267 267
268 268 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
269 269 user_ns = None, banner2='',**kw):
270 270 """Similar to the normal InteractiveShell, but with threading control"""
271 271
272 272 IPython.iplib.InteractiveShell.__init__(self,name,usage,rc,user_ns,banner2)
273 273
274 274 # Locking control variable
275 275 self.thread_ready = threading.Condition()
276 276
277 277 # Stuff to do at closing time
278 278 self._kill = False
279 279 on_kill = kw.get('on_kill')
280 280 if on_kill is None:
281 281 on_kill = []
282 282 # Check that all things to kill are callable:
283 283 for t in on_kill:
284 284 if not callable(t):
285 285 raise TypeError,'on_kill must be a list of callables'
286 286 self.on_kill = on_kill
287 287
288 288 def runsource(self, source, filename="<input>", symbol="single"):
289 289 """Compile and run some source in the interpreter.
290 290
291 291 Modified version of code.py's runsource(), to handle threading issues.
292 292 See the original for full docstring details."""
293 293
294 294 global KBINT
295 295
296 296 # If Ctrl-C was typed, we reset the flag and return right away
297 297 if KBINT:
298 298 KBINT = False
299 299 return False
300 300
301 301 try:
302 302 code = self.compile(source, filename, symbol)
303 303 except (OverflowError, SyntaxError, ValueError):
304 304 # Case 1
305 305 self.showsyntaxerror(filename)
306 306 return False
307 307
308 308 if code is None:
309 309 # Case 2
310 310 return True
311 311
312 312 # Case 3
313 313 # Store code in self, so the execution thread can handle it
314 314 self.thread_ready.acquire()
315 315 self.code_to_run = code
316 316 self.thread_ready.wait() # Wait until processed in timeout interval
317 317 self.thread_ready.release()
318 318
319 319 return False
320 320
321 321 def runcode(self):
322 322 """Execute a code object.
323 323
324 324 Multithreaded wrapper around IPython's runcode()."""
325 325
326 326 # lock thread-protected stuff
327 327 self.thread_ready.acquire()
328 328
329 329 # Install sigint handler
330 330 try:
331 331 signal.signal(signal.SIGINT, sigint_handler)
332 332 except SystemError:
333 333 # This happens under Windows, which seems to have all sorts
334 334 # of problems with signal handling. Oh well...
335 335 pass
336 336
337 337 if self._kill:
338 338 print >>Term.cout, 'Closing threads...',
339 339 Term.cout.flush()
340 340 for tokill in self.on_kill:
341 341 tokill()
342 342 print >>Term.cout, 'Done.'
343 343
344 344 # Run pending code by calling parent class
345 345 if self.code_to_run is not None:
346 346 self.thread_ready.notify()
347 347 InteractiveShell.runcode(self,self.code_to_run)
348 348
349 349 # We're done with thread-protected variables
350 350 self.thread_ready.release()
351 351 # This MUST return true for gtk threading to work
352 352 return True
353 353
354 354 def kill (self):
355 355 """Kill the thread, returning when it has been shut down."""
356 356 self.thread_ready.acquire()
357 357 self._kill = True
358 358 self.thread_ready.release()
359 359
360 360 class MatplotlibShellBase:
361 361 """Mixin class to provide the necessary modifications to regular IPython
362 362 shell classes for matplotlib support.
363 363
364 364 Given Python's MRO, this should be used as the FIRST class in the
365 365 inheritance hierarchy, so that it overrides the relevant methods."""
366 366
367 367 def _matplotlib_config(self,name):
368 368 """Return various items needed to setup the user's shell with matplotlib"""
369 369
370 370 # Initialize matplotlib to interactive mode always
371 371 import matplotlib
372 372 from matplotlib import backends
373 373 matplotlib.interactive(True)
374 374
375 375 def use(arg):
376 376 """IPython wrapper for matplotlib's backend switcher.
377 377
378 378 In interactive use, we can not allow switching to a different
379 379 interactive backend, since thread conflicts will most likely crash
380 380 the python interpreter. This routine does a safety check first,
381 381 and refuses to perform a dangerous switch. It still allows
382 382 switching to non-interactive backends."""
383 383
384 384 if arg in backends.interactive_bk and arg != self.mpl_backend:
385 385 m=('invalid matplotlib backend switch.\n'
386 386 'This script attempted to switch to the interactive '
387 387 'backend: `%s`\n'
388 388 'Your current choice of interactive backend is: `%s`\n\n'
389 389 'Switching interactive matplotlib backends at runtime\n'
390 390 'would crash the python interpreter, '
391 391 'and IPython has blocked it.\n\n'
392 392 'You need to either change your choice of matplotlib backend\n'
393 393 'by editing your .matplotlibrc file, or run this script as a \n'
394 394 'standalone file from the command line, not using IPython.\n' %
395 395 (arg,self.mpl_backend) )
396 396 raise RuntimeError, m
397 397 else:
398 398 self.mpl_use(arg)
399 399 self.mpl_use._called = True
400 400
401 401 self.matplotlib = matplotlib
402 402 self.mpl_backend = matplotlib.rcParams['backend']
403 403
404 404 # we also need to block switching of interactive backends by use()
405 405 self.mpl_use = matplotlib.use
406 406 self.mpl_use._called = False
407 407 # overwrite the original matplotlib.use with our wrapper
408 408 matplotlib.use = use
409 409
410 410
411 411 # This must be imported last in the matplotlib series, after
412 412 # backend/interactivity choices have been made
413 413 try:
414 414 import matplotlib.pylab as pylab
415 415 self.pylab = pylab
416 416 self.pylab_name = 'pylab'
417 417 except ImportError:
418 418 import matplotlib.matlab as matlab
419 419 self.pylab = matlab
420 420 self.pylab_name = 'matlab'
421 421
422 422 self.pylab.show._needmain = False
423 423 # We need to detect at runtime whether show() is called by the user.
424 424 # For this, we wrap it into a decorator which adds a 'called' flag.
425 425 self.pylab.draw_if_interactive = flag_calls(self.pylab.draw_if_interactive)
426 426
427 427 # Build a user namespace initialized with matplotlib/matlab features.
428 428 user_ns = {'__name__':'__main__',
429 429 '__builtins__' : __builtin__ }
430 430
431 431 # Be careful not to remove the final \n in the code string below, or
432 432 # things will break badly with py22 (I think it's a python bug, 2.3 is
433 433 # OK).
434 434 pname = self.pylab_name # Python can't interpolate dotted var names
435 435 exec ("import matplotlib\n"
436 436 "import matplotlib.%(pname)s as %(pname)s\n"
437 437 "from matplotlib.%(pname)s import *\n" % locals()) in user_ns
438 438
439 439 # Build matplotlib info banner
440 440 b="""
441 441 Welcome to pylab, a matplotlib-based Python environment.
442 442 For more information, type 'help(pylab)'.
443 443 """
444 444 return user_ns,b
445 445
446 446 def mplot_exec(self,fname,*where,**kw):
447 447 """Execute a matplotlib script.
448 448
449 449 This is a call to execfile(), but wrapped in safeties to properly
450 450 handle interactive rendering and backend switching."""
451 451
452 452 #print '*** Matplotlib runner ***' # dbg
453 453 # turn off rendering until end of script
454 454 isInteractive = self.matplotlib.rcParams['interactive']
455 455 self.matplotlib.interactive(False)
456 456 self.safe_execfile(fname,*where,**kw)
457 457 self.matplotlib.interactive(isInteractive)
458 458 # make rendering call now, if the user tried to do it
459 459 if self.pylab.draw_if_interactive.called:
460 460 self.pylab.draw()
461 461 self.pylab.draw_if_interactive.called = False
462 462
463 463 # if a backend switch was performed, reverse it now
464 464 if self.mpl_use._called:
465 465 self.matplotlib.rcParams['backend'] = self.mpl_backend
466 466
467 467 def magic_run(self,parameter_s=''):
468 468 Magic.magic_run(self,parameter_s,runner=self.mplot_exec)
469 469
470 470 # Fix the docstring so users see the original as well
471 471 magic_run.__doc__ = "%s\n%s" % (Magic.magic_run.__doc__,
472 472 "\n *** Modified %run for Matplotlib,"
473 473 " with proper interactive handling ***")
474 474
475 475 # Now we provide 2 versions of a matplotlib-aware IPython base shells, single
476 476 # and multithreaded. Note that these are meant for internal use, the IPShell*
477 477 # classes below are the ones meant for public consumption.
478 478
479 479 class MatplotlibShell(MatplotlibShellBase,InteractiveShell):
480 480 """Single-threaded shell with matplotlib support."""
481 481
482 482 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
483 483 user_ns = None, **kw):
484 484 user_ns,b2 = self._matplotlib_config(name)
485 485 InteractiveShell.__init__(self,name,usage,rc,user_ns,banner2=b2,**kw)
486 486
487 487 class MatplotlibMTShell(MatplotlibShellBase,MTInteractiveShell):
488 488 """Multi-threaded shell with matplotlib support."""
489 489
490 490 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
491 491 user_ns = None, **kw):
492 492 user_ns,b2 = self._matplotlib_config(name)
493 493 MTInteractiveShell.__init__(self,name,usage,rc,user_ns,banner2=b2,**kw)
494 494
495 495 #-----------------------------------------------------------------------------
496 496 # Utility functions for the different GUI enabled IPShell* classes.
497 497
498 498 def get_tk():
499 499 """Tries to import Tkinter and returns a withdrawn Tkinter root
500 500 window. If Tkinter is already imported or not available, this
501 501 returns None. This function calls `hijack_tk` underneath.
502 502 """
503 503 if not USE_TK or sys.modules.has_key('Tkinter'):
504 504 return None
505 505 else:
506 506 try:
507 507 import Tkinter
508 508 except ImportError:
509 509 return None
510 510 else:
511 511 hijack_tk()
512 512 r = Tkinter.Tk()
513 513 r.withdraw()
514 514 return r
515 515
516 516 def hijack_tk():
517 517 """Modifies Tkinter's mainloop with a dummy so when a module calls
518 518 mainloop, it does not block.
519 519
520 520 """
521 521 def misc_mainloop(self, n=0):
522 522 pass
523 523 def tkinter_mainloop(n=0):
524 524 pass
525 525
526 526 import Tkinter
527 527 Tkinter.Misc.mainloop = misc_mainloop
528 528 Tkinter.mainloop = tkinter_mainloop
529 529
530 530 def update_tk(tk):
531 531 """Updates the Tkinter event loop. This is typically called from
532 532 the respective WX or GTK mainloops.
533 533 """
534 534 if tk:
535 535 tk.update()
536 536
537 537 def hijack_wx():
538 538 """Modifies wxPython's MainLoop with a dummy so user code does not
539 539 block IPython. The hijacked mainloop function is returned.
540 540 """
541 541 def dummy_mainloop(*args, **kw):
542 542 pass
543 543 import wxPython
544 544 ver = wxPython.__version__
545 545 orig_mainloop = None
546 546 if ver[:3] >= '2.5':
547 547 import wx
548 548 if hasattr(wx, '_core_'): core = getattr(wx, '_core_')
549 549 elif hasattr(wx, '_core'): core = getattr(wx, '_core')
550 550 else: raise AttributeError('Could not find wx core module')
551 551 orig_mainloop = core.PyApp_MainLoop
552 552 core.PyApp_MainLoop = dummy_mainloop
553 553 elif ver[:3] == '2.4':
554 554 orig_mainloop = wxPython.wxc.wxPyApp_MainLoop
555 555 wxPython.wxc.wxPyApp_MainLoop = dummy_mainloop
556 556 else:
557 557 warn("Unable to find either wxPython version 2.4 or >= 2.5.")
558 558 return orig_mainloop
559 559
560 560 def hijack_gtk():
561 561 """Modifies pyGTK's mainloop with a dummy so user code does not
562 562 block IPython. This function returns the original `gtk.mainloop`
563 563 function that has been hijacked.
564
565 NOTE: Make sure you import this *AFTER* you call
566 pygtk.require(...).
567 564 """
568 565 def dummy_mainloop(*args, **kw):
569 566 pass
570 567 import gtk
571 568 if gtk.pygtk_version >= (2,4,0): orig_mainloop = gtk.main
572 569 else: orig_mainloop = gtk.mainloop
573 570 gtk.mainloop = dummy_mainloop
574 571 gtk.main = dummy_mainloop
575 572 return orig_mainloop
576 573
577 574 #-----------------------------------------------------------------------------
578 575 # The IPShell* classes below are the ones meant to be run by external code as
579 576 # IPython instances. Note that unless a specific threading strategy is
580 577 # desired, the factory function start() below should be used instead (it
581 578 # selects the proper threaded class).
582 579
583 580 class IPShellGTK(threading.Thread):
584 581 """Run a gtk mainloop() in a separate thread.
585 582
586 583 Python commands can be passed to the thread where they will be executed.
587 584 This is implemented by periodically checking for passed code using a
588 585 GTK timeout callback."""
589 586
590 587 TIMEOUT = 100 # Millisecond interval between timeouts.
591 588
592 589 def __init__(self,argv=None,user_ns=None,debug=1,
593 590 shell_class=MTInteractiveShell):
594 591
595 import pygtk
596 pygtk.require("2.0")
597 592 import gtk
598 593
599 594 self.gtk = gtk
600 595 self.gtk_mainloop = hijack_gtk()
601 596
602 597 # Allows us to use both Tk and GTK.
603 598 self.tk = get_tk()
604 599
605 600 if gtk.pygtk_version >= (2,4,0): mainquit = self.gtk.main_quit
606 601 else: mainquit = self.gtk.mainquit
607 602
608 603 self.IP = make_IPython(argv,user_ns=user_ns,debug=debug,
609 604 shell_class=shell_class,
610 605 on_kill=[mainquit])
611 606 threading.Thread.__init__(self)
612 607
613 608 def run(self):
614 609 self.IP.mainloop()
615 610 self.IP.kill()
616 611
617 612 def mainloop(self):
618 613
619 614 if self.gtk.pygtk_version >= (2,4,0):
620 615 import gobject
621 616 gobject.timeout_add(self.TIMEOUT, self.on_timer)
622 617 else:
623 618 self.gtk.timeout_add(self.TIMEOUT, self.on_timer)
624 619
625 620 if sys.platform != 'win32':
626 621 try:
627 622 if self.gtk.gtk_version[0] >= 2:
628 623 self.gtk.threads_init()
629 624 except AttributeError:
630 625 pass
631 626 except RuntimeError:
632 627 error('Your pyGTK likely has not been compiled with '
633 628 'threading support.\n'
634 629 'The exception printout is below.\n'
635 630 'You can either rebuild pyGTK with threads, or '
636 631 'try using \n'
637 632 'matplotlib with a different backend (like Tk or WX).\n'
638 633 'Note that matplotlib will most likely not work in its '
639 634 'current state!')
640 635 self.IP.InteractiveTB()
641 636 self.start()
642 637 self.gtk.threads_enter()
643 638 self.gtk_mainloop()
644 639 self.gtk.threads_leave()
645 640 self.join()
646 641
647 642 def on_timer(self):
648 643 update_tk(self.tk)
649 644 return self.IP.runcode()
650 645
651 646
652 647 class IPShellWX(threading.Thread):
653 648 """Run a wx mainloop() in a separate thread.
654 649
655 650 Python commands can be passed to the thread where they will be executed.
656 651 This is implemented by periodically checking for passed code using a
657 652 GTK timeout callback."""
658 653
659 654 TIMEOUT = 100 # Millisecond interval between timeouts.
660 655
661 656 def __init__(self,argv=None,user_ns=None,debug=1,
662 657 shell_class=MTInteractiveShell):
663 658
664 659 import wxPython.wx as wx
665 660
666 661 threading.Thread.__init__(self)
667 662 self.wx = wx
668 663 self.wx_mainloop = hijack_wx()
669 664
670 665 # Allows us to use both Tk and GTK.
671 666 self.tk = get_tk()
672 667
673 668 self.IP = make_IPython(argv,user_ns=user_ns,debug=debug,
674 669 shell_class=shell_class,
675 670 on_kill=[self.wxexit])
676 671 self.app = None
677 672
678 673 def wxexit(self, *args):
679 674 if self.app is not None:
680 675 self.app.agent.timer.Stop()
681 676 self.app.ExitMainLoop()
682 677
683 678 def run(self):
684 679 self.IP.mainloop()
685 680 self.IP.kill()
686 681
687 682 def mainloop(self):
688 683
689 684 self.start()
690 685
691 686 class TimerAgent(self.wx.wxMiniFrame):
692 687 wx = self.wx
693 688 IP = self.IP
694 689 tk = self.tk
695 690 def __init__(self, parent, interval):
696 691 style = self.wx.wxDEFAULT_FRAME_STYLE | self.wx.wxTINY_CAPTION_HORIZ
697 692 self.wx.wxMiniFrame.__init__(self, parent, -1, ' ', pos=(200, 200),
698 693 size=(100, 100),style=style)
699 694 self.Show(False)
700 695 self.interval = interval
701 696 self.timerId = self.wx.wxNewId()
702 697
703 698 def StartWork(self):
704 699 self.timer = self.wx.wxTimer(self, self.timerId)
705 700 self.wx.EVT_TIMER(self, self.timerId, self.OnTimer)
706 701 self.timer.Start(self.interval)
707 702
708 703 def OnTimer(self, event):
709 704 update_tk(self.tk)
710 705 self.IP.runcode()
711 706
712 707 class App(self.wx.wxApp):
713 708 wx = self.wx
714 709 TIMEOUT = self.TIMEOUT
715 710 def OnInit(self):
716 711 'Create the main window and insert the custom frame'
717 712 self.agent = TimerAgent(None, self.TIMEOUT)
718 713 self.agent.Show(self.wx.false)
719 714 self.agent.StartWork()
720 715 return self.wx.true
721 716
722 717 self.app = App(redirect=False)
723 718 self.wx_mainloop(self.app)
724 719 self.join()
725 720
726 721
727 722 class IPShellQt(threading.Thread):
728 723 """Run a Qt event loop in a separate thread.
729 724
730 725 Python commands can be passed to the thread where they will be executed.
731 726 This is implemented by periodically checking for passed code using a
732 727 Qt timer / slot."""
733 728
734 729 TIMEOUT = 100 # Millisecond interval between timeouts.
735 730
736 731 def __init__(self,argv=None,user_ns=None,debug=0,
737 732 shell_class=MTInteractiveShell):
738 733
739 734 import qt
740 735
741 736 class newQApplication:
742 737 def __init__( self ):
743 738 self.QApplication = qt.QApplication
744 739
745 740 def __call__( *args, **kwargs ):
746 741 return qt.qApp
747 742
748 743 def exec_loop( *args, **kwargs ):
749 744 pass
750 745
751 746 def __getattr__( self, name ):
752 747 return getattr( self.QApplication, name )
753 748
754 749 qt.QApplication = newQApplication()
755 750
756 751 # Allows us to use both Tk and QT.
757 752 self.tk = get_tk()
758 753
759 754 self.IP = make_IPython(argv,user_ns=user_ns,debug=debug,
760 755 shell_class=shell_class,
761 756 on_kill=[qt.qApp.exit])
762 757
763 758 threading.Thread.__init__(self)
764 759
765 760 def run(self):
766 761 #sys.excepthook = self.IP.excepthook # dbg
767 762 self.IP.mainloop()
768 763 self.IP.kill()
769 764
770 765 def mainloop(self):
771 766 import qt, sys
772 767 if qt.QApplication.startingUp():
773 768 a = qt.QApplication.QApplication( sys.argv )
774 769 self.timer = qt.QTimer()
775 770 qt.QObject.connect( self.timer, qt.SIGNAL( 'timeout()' ), self.on_timer )
776 771
777 772 self.start()
778 773 self.timer.start( self.TIMEOUT, True )
779 774 while True:
780 775 if self.IP._kill: break
781 776 qt.qApp.exec_loop()
782 777 self.join()
783 778
784 779 def on_timer(self):
785 780 update_tk(self.tk)
786 781 result = self.IP.runcode()
787 782 self.timer.start( self.TIMEOUT, True )
788 783 return result
789 784
790 785 # A set of matplotlib public IPython shell classes, for single-threaded
791 786 # (Tk* and FLTK* backends) and multithreaded (GTK* and WX* backends) use.
792 787 class IPShellMatplotlib(IPShell):
793 788 """Subclass IPShell with MatplotlibShell as the internal shell.
794 789
795 790 Single-threaded class, meant for the Tk* and FLTK* backends.
796 791
797 792 Having this on a separate class simplifies the external driver code."""
798 793
799 794 def __init__(self,argv=None,user_ns=None,debug=1):
800 795 IPShell.__init__(self,argv,user_ns,debug,shell_class=MatplotlibShell)
801 796
802 797 class IPShellMatplotlibGTK(IPShellGTK):
803 798 """Subclass IPShellGTK with MatplotlibMTShell as the internal shell.
804 799
805 800 Multi-threaded class, meant for the GTK* backends."""
806 801
807 802 def __init__(self,argv=None,user_ns=None,debug=1):
808 803 IPShellGTK.__init__(self,argv,user_ns,debug,shell_class=MatplotlibMTShell)
809 804
810 805 class IPShellMatplotlibWX(IPShellWX):
811 806 """Subclass IPShellWX with MatplotlibMTShell as the internal shell.
812 807
813 808 Multi-threaded class, meant for the WX* backends."""
814 809
815 810 def __init__(self,argv=None,user_ns=None,debug=1):
816 811 IPShellWX.__init__(self,argv,user_ns,debug,shell_class=MatplotlibMTShell)
817 812
818 813 class IPShellMatplotlibQt(IPShellQt):
819 814 """Subclass IPShellQt with MatplotlibMTShell as the internal shell.
820 815
821 816 Multi-threaded class, meant for the Qt* backends."""
822 817
823 818 def __init__(self,argv=None,user_ns=None,debug=1):
824 819 IPShellQt.__init__(self,argv,user_ns,debug,shell_class=MatplotlibMTShell)
825 820
826 821 #-----------------------------------------------------------------------------
827 822 # Factory functions to actually start the proper thread-aware shell
828 823
829 824 def _matplotlib_shell_class():
830 825 """Factory function to handle shell class selection for matplotlib.
831 826
832 827 The proper shell class to use depends on the matplotlib backend, since
833 828 each backend requires a different threading strategy."""
834 829
835 830 try:
836 831 import matplotlib
837 832 except ImportError:
838 833 error('matplotlib could NOT be imported! Starting normal IPython.')
839 834 sh_class = IPShell
840 835 else:
841 836 backend = matplotlib.rcParams['backend']
842 837 if backend.startswith('GTK'):
843 838 sh_class = IPShellMatplotlibGTK
844 839 elif backend.startswith('WX'):
845 840 sh_class = IPShellMatplotlibWX
846 841 elif backend.startswith('Qt'):
847 842 sh_class = IPShellMatplotlibQt
848 843 else:
849 844 sh_class = IPShellMatplotlib
850 845 #print 'Using %s with the %s backend.' % (sh_class,backend) # dbg
851 846 return sh_class
852 847
853 848 # This is the one which should be called by external code.
854 849 def start():
855 850 """Return a running shell instance, dealing with threading options.
856 851
857 852 This is a factory function which will instantiate the proper IPython shell
858 853 based on the user's threading choice. Such a selector is needed because
859 854 different GUI toolkits require different thread handling details."""
860 855
861 856 global USE_TK
862 857 # Crude sys.argv hack to extract the threading options.
863 858 if len(sys.argv) > 1:
864 859 if len(sys.argv) > 2:
865 860 arg2 = sys.argv[2]
866 861 if arg2.endswith('-tk'):
867 862 USE_TK = True
868 863 arg1 = sys.argv[1]
869 864 if arg1.endswith('-gthread'):
870 865 shell = IPShellGTK
871 866 elif arg1.endswith( '-qthread' ):
872 867 shell = IPShellQt
873 868 elif arg1.endswith('-wthread'):
874 869 shell = IPShellWX
875 870 elif arg1.endswith('-pylab'):
876 871 shell = _matplotlib_shell_class()
877 872 else:
878 873 shell = IPShell
879 874 else:
880 875 shell = IPShell
881 876 return shell()
882 877
883 878 # Some aliases for backwards compatibility
884 879 IPythonShell = IPShell
885 880 IPythonShellEmbed = IPShellEmbed
886 881 #************************ End of file <Shell.py> ***************************
@@ -1,2041 +1,2047 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 IPython -- An enhanced Interactive Python
4 4
5 5 Requires Python 2.1 or newer.
6 6
7 7 This file contains all the classes and helper functions specific to IPython.
8 8
9 $Id: iplib.py 774 2005-09-01 00:27:53Z fperez $
9 $Id: iplib.py 802 2005-09-06 03:49:12Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
13 13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 14 # Copyright (C) 2001-2004 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, much of that class has been copied
21 21 # verbatim here for modifications which could not be accomplished by
22 22 # subclassing. The Python License (sec. 2) allows for this, but it's always
23 23 # nice to acknowledge credit where credit is due.
24 24 #*****************************************************************************
25 25
26 26 #****************************************************************************
27 27 # Modules and globals
28 28
29 29 from __future__ import generators # for 2.2 backwards-compatibility
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 exceptions
41 41 import keyword
42 42 import new
43 43 import os, sys, shutil
44 44 import code, glob, types, re
45 45 import string, StringIO
46 46 import inspect, pydoc
47 47 import bdb, pdb
48 48 import UserList # don't subclass list so this works with Python2.1
49 49 from pprint import pprint, pformat
50 50 import cPickle as pickle
51 51 import traceback
52 52
53 53 # IPython's own modules
54 54 import IPython
55 55 from IPython import OInspect,PyColorize,ultraTB
56 56 from IPython.ultraTB import ColorScheme,ColorSchemeTable # too long names
57 57 from IPython.Logger import Logger
58 58 from IPython.Magic import Magic,magic2python,shlex_split
59 59 from IPython.usage import cmd_line_usage,interactive_usage
60 60 from IPython.Struct import Struct
61 61 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
62 62 from IPython.FakeModule import FakeModule
63 63 from IPython.background_jobs import BackgroundJobManager
64 64 from IPython.genutils import *
65 65
66 66 # Global pointer to the running
67 67
68 68 # store the builtin raw_input globally, and use this always, in case user code
69 69 # overwrites it (like wx.py.PyShell does)
70 70 raw_input_original = raw_input
71 71
72 72 #****************************************************************************
73 73 # Some utility function definitions
74 74
75 75 class Bunch: pass
76 76
77 77 def esc_quotes(strng):
78 78 """Return the input string with single and double quotes escaped out"""
79 79
80 80 return strng.replace('"','\\"').replace("'","\\'")
81 81
82 82 def import_fail_info(mod_name,fns=None):
83 83 """Inform load failure for a module."""
84 84
85 85 if fns == None:
86 86 warn("Loading of %s failed.\n" % (mod_name,))
87 87 else:
88 88 warn("Loading of %s from %s failed.\n" % (fns,mod_name))
89 89
90 90 def qw_lol(indata):
91 91 """qw_lol('a b') -> [['a','b']],
92 92 otherwise it's just a call to qw().
93 93
94 94 We need this to make sure the modules_some keys *always* end up as a
95 95 list of lists."""
96 96
97 97 if type(indata) in StringTypes:
98 98 return [qw(indata)]
99 99 else:
100 100 return qw(indata)
101 101
102 102 def ipmagic(arg_s):
103 103 """Call a magic function by name.
104 104
105 105 Input: a string containing the name of the magic function to call and any
106 106 additional arguments to be passed to the magic.
107 107
108 108 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
109 109 prompt:
110 110
111 111 In[1]: %name -opt foo bar
112 112
113 113 To call a magic without arguments, simply use ipmagic('name').
114 114
115 115 This provides a proper Python function to call IPython's magics in any
116 116 valid Python code you can type at the interpreter, including loops and
117 117 compound statements. It is added by IPython to the Python builtin
118 118 namespace upon initialization."""
119 119
120 120 args = arg_s.split(' ',1)
121 121 magic_name = args[0]
122 122 if magic_name.startswith(__IPYTHON__.ESC_MAGIC):
123 123 magic_name = magic_name[1:]
124 124 try:
125 125 magic_args = args[1]
126 126 except IndexError:
127 127 magic_args = ''
128 128 fn = getattr(__IPYTHON__,'magic_'+magic_name,None)
129 129 if fn is None:
130 130 error("Magic function `%s` not found." % magic_name)
131 131 else:
132 132 magic_args = __IPYTHON__.var_expand(magic_args)
133 133 return fn(magic_args)
134 134
135 135 def ipalias(arg_s):
136 136 """Call an alias by name.
137 137
138 138 Input: a string containing the name of the alias to call and any
139 139 additional arguments to be passed to the magic.
140 140
141 141 ipalias('name -opt foo bar') is equivalent to typing at the ipython
142 142 prompt:
143 143
144 144 In[1]: name -opt foo bar
145 145
146 146 To call an alias without arguments, simply use ipalias('name').
147 147
148 148 This provides a proper Python function to call IPython's aliases in any
149 149 valid Python code you can type at the interpreter, including loops and
150 150 compound statements. It is added by IPython to the Python builtin
151 151 namespace upon initialization."""
152 152
153 153 args = arg_s.split(' ',1)
154 154 alias_name = args[0]
155 155 try:
156 156 alias_args = args[1]
157 157 except IndexError:
158 158 alias_args = ''
159 159 if alias_name in __IPYTHON__.alias_table:
160 160 __IPYTHON__.call_alias(alias_name,alias_args)
161 161 else:
162 162 error("Alias `%s` not found." % alias_name)
163 163
164 164 #-----------------------------------------------------------------------------
165 165 # Local use classes
166 166 try:
167 167 from IPython import FlexCompleter
168 168
169 169 class MagicCompleter(FlexCompleter.Completer):
170 170 """Extension of the completer class to work on %-prefixed lines."""
171 171
172 172 def __init__(self,shell,namespace=None,omit__names=0,alias_table=None):
173 173 """MagicCompleter() -> completer
174 174
175 175 Return a completer object suitable for use by the readline library
176 176 via readline.set_completer().
177 177
178 178 Inputs:
179 179
180 180 - shell: a pointer to the ipython shell itself. This is needed
181 181 because this completer knows about magic functions, and those can
182 182 only be accessed via the ipython instance.
183 183
184 184 - namespace: an optional dict where completions are performed.
185 185
186 186 - The optional omit__names parameter sets the completer to omit the
187 187 'magic' names (__magicname__) for python objects unless the text
188 188 to be completed explicitly starts with one or more underscores.
189 189
190 190 - If alias_table is supplied, it should be a dictionary of aliases
191 191 to complete. """
192 192
193 193 FlexCompleter.Completer.__init__(self,namespace)
194 194 self.magic_prefix = shell.name+'.magic_'
195 195 self.magic_escape = shell.ESC_MAGIC
196 196 self.readline = FlexCompleter.readline
197 197 delims = self.readline.get_completer_delims()
198 198 delims = delims.replace(self.magic_escape,'')
199 199 self.readline.set_completer_delims(delims)
200 200 self.get_line_buffer = self.readline.get_line_buffer
201 201 self.omit__names = omit__names
202 202 self.merge_completions = shell.rc.readline_merge_completions
203 203
204 204 if alias_table is None:
205 205 alias_table = {}
206 206 self.alias_table = alias_table
207 207 # Regexp to split filenames with spaces in them
208 208 self.space_name_re = re.compile(r'([^\\] )')
209 209 # Hold a local ref. to glob.glob for speed
210 210 self.glob = glob.glob
211 211 # Special handling of backslashes needed in win32 platforms
212 212 if sys.platform == "win32":
213 213 self.clean_glob = self._clean_glob_win32
214 214 else:
215 215 self.clean_glob = self._clean_glob
216 216 self.matchers = [self.python_matches,
217 217 self.file_matches,
218 218 self.alias_matches,
219 219 self.python_func_kw_matches]
220 220
221 221 # Code contributed by Alex Schmolck, for ipython/emacs integration
222 222 def all_completions(self, text):
223 223 """Return all possible completions for the benefit of emacs."""
224 224
225 225 completions = []
226 226 try:
227 227 for i in xrange(sys.maxint):
228 228 res = self.complete(text, i)
229 229
230 230 if not res: break
231 231
232 232 completions.append(res)
233 233 #XXX workaround for ``notDefined.<tab>``
234 234 except NameError:
235 235 pass
236 236 return completions
237 237 # /end Alex Schmolck code.
238 238
239 239 def _clean_glob(self,text):
240 240 return self.glob("%s*" % text)
241 241
242 242 def _clean_glob_win32(self,text):
243 243 return [f.replace("\\","/")
244 244 for f in self.glob("%s*" % text)]
245 245
246 246 def file_matches(self, text):
247 247 """Match filneames, expanding ~USER type strings.
248 248
249 249 Most of the seemingly convoluted logic in this completer is an
250 250 attempt to handle filenames with spaces in them. And yet it's not
251 251 quite perfect, because Python's readline doesn't expose all of the
252 252 GNU readline details needed for this to be done correctly.
253 253
254 254 For a filename with a space in it, the printed completions will be
255 255 only the parts after what's already been typed (instead of the
256 256 full completions, as is normally done). I don't think with the
257 257 current (as of Python 2.3) Python readline it's possible to do
258 258 better."""
259 259
260 260 #print 'Completer->file_matches: <%s>' % text # dbg
261 261
262 262 # chars that require escaping with backslash - i.e. chars
263 263 # that readline treats incorrectly as delimiters, but we
264 264 # don't want to treat as delimiters in filename matching
265 265 # when escaped with backslash
266 266
267 267 protectables = ' ()[]{}'
268 268
269 269 def protect_filename(s):
270 270 return "".join([(ch in protectables and '\\' + ch or ch)
271 271 for ch in s])
272 272
273 273 lbuf = self.get_line_buffer()[:self.readline.get_endidx()]
274 274 open_quotes = 0 # track strings with open quotes
275 275 try:
276 276 lsplit = shlex_split(lbuf)[-1]
277 277 except ValueError:
278 278 # typically an unmatched ", or backslash without escaped char.
279 279 if lbuf.count('"')==1:
280 280 open_quotes = 1
281 281 lsplit = lbuf.split('"')[-1]
282 282 elif lbuf.count("'")==1:
283 283 open_quotes = 1
284 284 lsplit = lbuf.split("'")[-1]
285 285 else:
286 286 return None
287 287 except IndexError:
288 288 # tab pressed on empty line
289 289 lsplit = ""
290 290
291 291 if lsplit != protect_filename(lsplit):
292 292 # if protectables are found, do matching on the whole escaped
293 293 # name
294 294 has_protectables = 1
295 295 text0,text = text,lsplit
296 296 else:
297 297 has_protectables = 0
298 298 text = os.path.expanduser(text)
299 299
300 300 if text == "":
301 301 return [protect_filename(f) for f in self.glob("*")]
302 302
303 303 m0 = self.clean_glob(text.replace('\\',''))
304 304 if has_protectables:
305 305 # If we had protectables, we need to revert our changes to the
306 306 # beginning of filename so that we don't double-write the part
307 307 # of the filename we have so far
308 308 len_lsplit = len(lsplit)
309 309 matches = [text0 + protect_filename(f[len_lsplit:]) for f in m0]
310 310 else:
311 311 if open_quotes:
312 312 # if we have a string with an open quote, we don't need to
313 313 # protect the names at all (and we _shouldn't_, as it
314 314 # would cause bugs when the filesystem call is made).
315 315 matches = m0
316 316 else:
317 317 matches = [protect_filename(f) for f in m0]
318 318 if len(matches) == 1 and os.path.isdir(matches[0]):
319 319 # Takes care of links to directories also. Use '/'
320 320 # explicitly, even under Windows, so that name completions
321 321 # don't end up escaped.
322 322 matches[0] += '/'
323 323 return matches
324 324
325 325 def alias_matches(self, text):
326 326 """Match internal system aliases"""
327 327 #print 'Completer->alias_matches:',text # dbg
328 328 text = os.path.expanduser(text)
329 329 aliases = self.alias_table.keys()
330 330 if text == "":
331 331 return aliases
332 332 else:
333 333 return [alias for alias in aliases if alias.startswith(text)]
334 334
335 335 def python_matches(self,text):
336 336 """Match attributes or global python names"""
337 337 #print 'Completer->python_matches' # dbg
338 338 if "." in text:
339 339 try:
340 340 matches = self.attr_matches(text)
341 341 if text.endswith('.') and self.omit__names:
342 342 if self.omit__names == 1:
343 343 # true if txt is _not_ a __ name, false otherwise:
344 344 no__name = (lambda txt:
345 345 re.match(r'.*\.__.*?__',txt) is None)
346 346 else:
347 347 # true if txt is _not_ a _ name, false otherwise:
348 348 no__name = (lambda txt:
349 349 re.match(r'.*\._.*?',txt) is None)
350 350 matches = filter(no__name, matches)
351 351 except NameError:
352 352 # catches <undefined attributes>.<tab>
353 353 matches = []
354 354 else:
355 355 matches = self.global_matches(text)
356 356 # this is so completion finds magics when automagic is on:
357 357 if matches == [] and not text.startswith(os.sep):
358 358 matches = self.attr_matches(self.magic_prefix+text)
359 359 return matches
360 360
361 361 def _default_arguments(self, obj):
362 362 """Return the list of default arguments of obj if it is callable,
363 363 or empty list otherwise."""
364 364
365 365 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
366 366 # for classes, check for __init__,__new__
367 367 if inspect.isclass(obj):
368 368 obj = (getattr(obj,'__init__',None) or
369 369 getattr(obj,'__new__',None))
370 370 # for all others, check if they are __call__able
371 371 elif hasattr(obj, '__call__'):
372 372 obj = obj.__call__
373 373 # XXX: is there a way to handle the builtins ?
374 374 try:
375 375 args,_,_1,defaults = inspect.getargspec(obj)
376 376 if defaults:
377 377 return args[-len(defaults):]
378 378 except TypeError: pass
379 379 return []
380 380
381 381 def python_func_kw_matches(self,text):
382 382 """Match named parameters (kwargs) of the last open function"""
383 383
384 384 if "." in text: # a parameter cannot be dotted
385 385 return []
386 386 try: regexp = self.__funcParamsRegex
387 387 except AttributeError:
388 388 regexp = self.__funcParamsRegex = re.compile(r'''
389 389 '.*?' | # single quoted strings or
390 390 ".*?" | # double quoted strings or
391 391 \w+ | # identifier
392 392 \S # other characters
393 393 ''', re.VERBOSE | re.DOTALL)
394 394 # 1. find the nearest identifier that comes before an unclosed
395 395 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
396 396 tokens = regexp.findall(self.get_line_buffer())
397 397 tokens.reverse()
398 398 iterTokens = iter(tokens); openPar = 0
399 399 for token in iterTokens:
400 400 if token == ')':
401 401 openPar -= 1
402 402 elif token == '(':
403 403 openPar += 1
404 404 if openPar > 0:
405 405 # found the last unclosed parenthesis
406 406 break
407 407 else:
408 408 return []
409 409 # 2. Concatenate any dotted names (e.g. "foo.bar" for "foo.bar(x, pa" )
410 410 ids = []
411 411 isId = re.compile(r'\w+$').match
412 412 while True:
413 413 try:
414 414 ids.append(iterTokens.next())
415 415 if not isId(ids[-1]):
416 416 ids.pop(); break
417 417 if not iterTokens.next() == '.':
418 418 break
419 419 except StopIteration:
420 420 break
421 421 # lookup the candidate callable matches either using global_matches
422 422 # or attr_matches for dotted names
423 423 if len(ids) == 1:
424 424 callableMatches = self.global_matches(ids[0])
425 425 else:
426 426 callableMatches = self.attr_matches('.'.join(ids[::-1]))
427 427 argMatches = []
428 428 for callableMatch in callableMatches:
429 429 try: namedArgs = self._default_arguments(eval(callableMatch,
430 430 self.namespace))
431 431 except: continue
432 432 for namedArg in namedArgs:
433 433 if namedArg.startswith(text):
434 434 argMatches.append("%s=" %namedArg)
435 435 return argMatches
436 436
437 437 def complete(self, text, state):
438 438 """Return the next possible completion for 'text'.
439 439
440 440 This is called successively with state == 0, 1, 2, ... until it
441 441 returns None. The completion should begin with 'text'. """
442 442
443 443 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
444 444 magic_escape = self.magic_escape
445 445 magic_prefix = self.magic_prefix
446 446
447 447 try:
448 448 if text.startswith(magic_escape):
449 449 text = text.replace(magic_escape,magic_prefix)
450 450 elif text.startswith('~'):
451 451 text = os.path.expanduser(text)
452 452 if state == 0:
453 453 # Extend the list of completions with the results of each
454 454 # matcher, so we return results to the user from all
455 455 # namespaces.
456 456 if self.merge_completions:
457 457 self.matches = []
458 458 for matcher in self.matchers:
459 459 self.matches.extend(matcher(text))
460 460 else:
461 461 for matcher in self.matchers:
462 462 self.matches = matcher(text)
463 463 if self.matches:
464 464 break
465 465
466 466 try:
467 467 return self.matches[state].replace(magic_prefix,magic_escape)
468 468 except IndexError:
469 469 return None
470 470 except:
471 471 # If completion fails, don't annoy the user.
472 472 pass
473 473
474 474 except ImportError:
475 475 pass # no readline support
476 476
477 477 except KeyError:
478 478 pass # Windows doesn't set TERM, it doesn't matter
479 479
480 480
481 481 class InputList(UserList.UserList):
482 482 """Class to store user input.
483 483
484 484 It's basically a list, but slices return a string instead of a list, thus
485 485 allowing things like (assuming 'In' is an instance):
486 486
487 487 exec In[4:7]
488 488
489 489 or
490 490
491 491 exec In[5:9] + In[14] + In[21:25]"""
492 492
493 493 def __getslice__(self,i,j):
494 494 return ''.join(UserList.UserList.__getslice__(self,i,j))
495 495
496 496 #****************************************************************************
497 497 # Local use exceptions
498 498 class SpaceInInput(exceptions.Exception):
499 499 pass
500 500
501 501 #****************************************************************************
502 502 # Main IPython class
503 503
504 504 class InteractiveShell(code.InteractiveConsole, Logger, Magic):
505 505 """An enhanced console for Python."""
506 506
507 507 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
508 508 user_ns = None,banner2='',
509 509 custom_exceptions=((),None)):
510 510
511 511 # Put a reference to self in builtins so that any form of embedded or
512 512 # imported code can test for being inside IPython.
513 513 __builtin__.__IPYTHON__ = self
514 514
515 515 # And load into builtins ipmagic/ipalias as well
516 516 __builtin__.ipmagic = ipmagic
517 517 __builtin__.ipalias = ipalias
518 518
519 519 # Add to __builtin__ other parts of IPython's public API
520 520 __builtin__.ip_set_hook = self.set_hook
521 521
522 522 # Keep in the builtins a flag for when IPython is active. We set it
523 523 # with setdefault so that multiple nested IPythons don't clobber one
524 524 # another. Each will increase its value by one upon being activated,
525 525 # which also gives us a way to determine the nesting level.
526 526 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
527 527
528 528 # Inform the user of ipython's fast exit magics.
529 529 _exit = ' Use %Exit or %Quit to exit without confirmation.'
530 530 __builtin__.exit += _exit
531 531 __builtin__.quit += _exit
532 532
533 533 # Create the namespace where the user will operate:
534 534
535 535 # FIXME. For some strange reason, __builtins__ is showing up at user
536 536 # level as a dict instead of a module. This is a manual fix, but I
537 537 # should really track down where the problem is coming from. Alex
538 538 # Schmolck reported this problem first.
539 539
540 540 # A useful post by Alex Martelli on this topic:
541 541 # Re: inconsistent value from __builtins__
542 542 # Von: Alex Martelli <aleaxit@yahoo.com>
543 543 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
544 544 # Gruppen: comp.lang.python
545 545 # Referenzen: 1
546 546
547 547 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
548 548 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
549 549 # > <type 'dict'>
550 550 # > >>> print type(__builtins__)
551 551 # > <type 'module'>
552 552 # > Is this difference in return value intentional?
553 553
554 554 # Well, it's documented that '__builtins__' can be either a dictionary
555 555 # or a module, and it's been that way for a long time. Whether it's
556 556 # intentional (or sensible), I don't know. In any case, the idea is that
557 557 # if you need to access the built-in namespace directly, you should start
558 558 # with "import __builtin__" (note, no 's') which will definitely give you
559 559 # a module. Yeah, it's somewhat confusing:-(.
560 560
561 561 if user_ns is None:
562 562 # Set __name__ to __main__ to better match the behavior of the
563 563 # normal interpreter.
564 564 self.user_ns = {'__name__' :'__main__',
565 565 '__builtins__' : __builtin__,
566 566 }
567 567 else:
568 568 self.user_ns = user_ns
569 569
570 570 # The user namespace MUST have a pointer to the shell itself.
571 571 self.user_ns[name] = self
572 572
573 573 # We need to insert into sys.modules something that looks like a
574 574 # module but which accesses the IPython namespace, for shelve and
575 575 # pickle to work interactively. Normally they rely on getting
576 576 # everything out of __main__, but for embedding purposes each IPython
577 577 # instance has its own private namespace, so we can't go shoving
578 578 # everything into __main__.
579 579
580 580 try:
581 581 main_name = self.user_ns['__name__']
582 582 except KeyError:
583 583 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
584 584 else:
585 585 #print "pickle hack in place" # dbg
586 586 sys.modules[main_name] = FakeModule(self.user_ns)
587 587
588 588 # List of input with multi-line handling.
589 589 # Fill its zero entry, user counter starts at 1
590 590 self.input_hist = InputList(['\n'])
591 591
592 592 # list of visited directories
593 self.dir_hist = [os.getcwd()]
593 try:
594 self.dir_hist = [os.getcwd()]
595 except IOError, e:
596 self.dir_hist = []
594 597
595 598 # dict of output history
596 599 self.output_hist = {}
597 600
598 601 # dict of names to be treated as system aliases. Each entry in the
599 602 # alias table must be a 2-tuple of the form (N,name), where N is the
600 603 # number of positional arguments of the alias.
601 604 self.alias_table = {}
602 605
603 # dict of things NOT to alias (keywords and builtins)
604 self.no_alias = {}
605 for key in keyword.kwlist:
606 self.no_alias[key] = 1
607 self.no_alias.update(__builtin__.__dict__)
606 # dict of things NOT to alias (keywords, builtins and some special magics)
607 no_alias = {}
608 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
609 for key in keyword.kwlist + no_alias_magics:
610 no_alias[key] = 1
611 no_alias.update(__builtin__.__dict__)
612 self.no_alias = no_alias
613
608 614
609 615 # make global variables for user access to these
610 616 self.user_ns['_ih'] = self.input_hist
611 617 self.user_ns['_oh'] = self.output_hist
612 618 self.user_ns['_dh'] = self.dir_hist
613 619
614 620 # user aliases to input and output histories
615 621 self.user_ns['In'] = self.input_hist
616 622 self.user_ns['Out'] = self.output_hist
617 623
618 624 # Store the actual shell's name
619 625 self.name = name
620 626
621 627 # Object variable to store code object waiting execution. This is
622 628 # used mainly by the multithreaded shells, but it can come in handy in
623 629 # other situations. No need to use a Queue here, since it's a single
624 630 # item which gets cleared once run.
625 631 self.code_to_run = None
626 632
627 633 # Job manager (for jobs run as background threads)
628 634 self.jobs = BackgroundJobManager()
629 635 # Put the job manager into builtins so it's always there.
630 636 __builtin__.jobs = self.jobs
631 637
632 638 # escapes for automatic behavior on the command line
633 639 self.ESC_SHELL = '!'
634 640 self.ESC_HELP = '?'
635 641 self.ESC_MAGIC = '%'
636 642 self.ESC_QUOTE = ','
637 643 self.ESC_QUOTE2 = ';'
638 644 self.ESC_PAREN = '/'
639 645
640 646 # And their associated handlers
641 647 self.esc_handlers = {self.ESC_PAREN:self.handle_auto,
642 648 self.ESC_QUOTE:self.handle_auto,
643 649 self.ESC_QUOTE2:self.handle_auto,
644 650 self.ESC_MAGIC:self.handle_magic,
645 651 self.ESC_HELP:self.handle_help,
646 652 self.ESC_SHELL:self.handle_shell_escape,
647 653 }
648 654
649 655 # class initializations
650 656 code.InteractiveConsole.__init__(self,locals = self.user_ns)
651 657 Logger.__init__(self,log_ns = self.user_ns)
652 658 Magic.__init__(self,self)
653 659
654 660 # an ugly hack to get a pointer to the shell, so I can start writing
655 661 # magic code via this pointer instead of the current mixin salad.
656 662 Magic.set_shell(self,self)
657 663
658 664 # hooks holds pointers used for user-side customizations
659 665 self.hooks = Struct()
660 666
661 667 # Set all default hooks, defined in the IPython.hooks module.
662 668 hooks = IPython.hooks
663 669 for hook_name in hooks.__all__:
664 670 self.set_hook(hook_name,getattr(hooks,hook_name))
665 671
666 672 # Flag to mark unconditional exit
667 673 self.exit_now = False
668 674
669 675 self.usage_min = """\
670 676 An enhanced console for Python.
671 677 Some of its features are:
672 678 - Readline support if the readline library is present.
673 679 - Tab completion in the local namespace.
674 680 - Logging of input, see command-line options.
675 681 - System shell escape via ! , eg !ls.
676 682 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
677 683 - Keeps track of locally defined variables via %who, %whos.
678 684 - Show object information with a ? eg ?x or x? (use ?? for more info).
679 685 """
680 686 if usage: self.usage = usage
681 687 else: self.usage = self.usage_min
682 688
683 689 # Storage
684 690 self.rc = rc # This will hold all configuration information
685 691 self.inputcache = []
686 692 self._boundcache = []
687 693 self.pager = 'less'
688 694 # temporary files used for various purposes. Deleted at exit.
689 695 self.tempfiles = []
690 696
691 697 # Keep track of readline usage (later set by init_readline)
692 698 self.has_readline = 0
693 699
694 700 # for pushd/popd management
695 701 try:
696 702 self.home_dir = get_home_dir()
697 703 except HomeDirError,msg:
698 704 fatal(msg)
699 705
700 706 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
701 707
702 708 # Functions to call the underlying shell.
703 709
704 710 # utility to expand user variables via Itpl
705 711 self.var_expand = lambda cmd: str(ItplNS(cmd.replace('#','\#'),
706 712 self.user_ns))
707 713 # The first is similar to os.system, but it doesn't return a value,
708 714 # and it allows interpolation of variables in the user's namespace.
709 715 self.system = lambda cmd: shell(self.var_expand(cmd),
710 716 header='IPython system call: ',
711 717 verbose=self.rc.system_verbose)
712 718 # These are for getoutput and getoutputerror:
713 719 self.getoutput = lambda cmd: \
714 720 getoutput(self.var_expand(cmd),
715 721 header='IPython system call: ',
716 722 verbose=self.rc.system_verbose)
717 723 self.getoutputerror = lambda cmd: \
718 724 getoutputerror(str(ItplNS(cmd.replace('#','\#'),
719 725 self.user_ns)),
720 726 header='IPython system call: ',
721 727 verbose=self.rc.system_verbose)
722 728
723 729 # RegExp for splitting line contents into pre-char//first
724 730 # word-method//rest. For clarity, each group in on one line.
725 731
726 732 # WARNING: update the regexp if the above escapes are changed, as they
727 733 # are hardwired in.
728 734
729 735 # Don't get carried away with trying to make the autocalling catch too
730 736 # much: it's better to be conservative rather than to trigger hidden
731 737 # evals() somewhere and end up causing side effects.
732 738
733 739 self.line_split = re.compile(r'^([\s*,;/])'
734 740 r'([\?\w\.]+\w*\s*)'
735 741 r'(\(?.*$)')
736 742
737 743 # Original re, keep around for a while in case changes break something
738 744 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
739 745 # r'(\s*[\?\w\.]+\w*\s*)'
740 746 # r'(\(?.*$)')
741 747
742 748 # RegExp to identify potential function names
743 749 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
744 750 # RegExp to exclude strings with this start from autocalling
745 751 self.re_exclude_auto = re.compile('^[!=()<>,\*/\+-]|^is ')
746 752 # try to catch also methods for stuff in lists/tuples/dicts: off
747 753 # (experimental). For this to work, the line_split regexp would need
748 754 # to be modified so it wouldn't break things at '['. That line is
749 755 # nasty enough that I shouldn't change it until I can test it _well_.
750 756 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
751 757
752 758 # keep track of where we started running (mainly for crash post-mortem)
753 759 self.starting_dir = os.getcwd()
754 760
755 761 # Attributes for Logger mixin class, make defaults here
756 762 self._dolog = 0
757 763 self.LOG = ''
758 764 self.LOGDEF = '.InteractiveShell.log'
759 765 self.LOGMODE = 'over'
760 766 self.LOGHEAD = Itpl(
761 767 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
762 768 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
763 769 #log# opts = $self.rc.opts
764 770 #log# args = $self.rc.args
765 771 #log# It is safe to make manual edits below here.
766 772 #log#-----------------------------------------------------------------------
767 773 """)
768 774 # Various switches which can be set
769 775 self.CACHELENGTH = 5000 # this is cheap, it's just text
770 776 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
771 777 self.banner2 = banner2
772 778
773 779 # TraceBack handlers:
774 780 # Need two, one for syntax errors and one for other exceptions.
775 781 self.SyntaxTB = ultraTB.ListTB(color_scheme='NoColor')
776 782 # This one is initialized with an offset, meaning we always want to
777 783 # remove the topmost item in the traceback, which is our own internal
778 784 # code. Valid modes: ['Plain','Context','Verbose']
779 785 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
780 786 color_scheme='NoColor',
781 787 tb_offset = 1)
782 788 # and add any custom exception handlers the user may have specified
783 789 self.set_custom_exc(*custom_exceptions)
784 790
785 791 # Object inspector
786 792 ins_colors = OInspect.InspectColors
787 793 code_colors = PyColorize.ANSICodeColors
788 794 self.inspector = OInspect.Inspector(ins_colors,code_colors,'NoColor')
789 795 self.autoindent = 0
790 796
791 797 # Make some aliases automatically
792 798 # Prepare list of shell aliases to auto-define
793 799 if os.name == 'posix':
794 800 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
795 801 'mv mv -i','rm rm -i','cp cp -i',
796 802 'cat cat','less less','clear clear',
797 803 # a better ls
798 804 'ls ls -F',
799 805 # long ls
800 806 'll ls -lF',
801 807 # color ls
802 808 'lc ls -F -o --color',
803 809 # ls normal files only
804 810 'lf ls -F -o --color %l | grep ^-',
805 811 # ls symbolic links
806 812 'lk ls -F -o --color %l | grep ^l',
807 813 # directories or links to directories,
808 814 'ldir ls -F -o --color %l | grep /$',
809 815 # things which are executable
810 816 'lx ls -F -o --color %l | grep ^-..x',
811 817 )
812 818 elif os.name in ['nt','dos']:
813 819 auto_alias = ('dir dir /on', 'ls dir /on',
814 820 'ddir dir /ad /on', 'ldir dir /ad /on',
815 821 'mkdir mkdir','rmdir rmdir','echo echo',
816 822 'ren ren','cls cls','copy copy')
817 823 else:
818 824 auto_alias = ()
819 825 self.auto_alias = map(lambda s:s.split(None,1),auto_alias)
820 826 # Call the actual (public) initializer
821 827 self.init_auto_alias()
822 828 # end __init__
823 829
824 830 def set_hook(self,name,hook):
825 831 """set_hook(name,hook) -> sets an internal IPython hook.
826 832
827 833 IPython exposes some of its internal API as user-modifiable hooks. By
828 834 resetting one of these hooks, you can modify IPython's behavior to
829 835 call at runtime your own routines."""
830 836
831 837 # At some point in the future, this should validate the hook before it
832 838 # accepts it. Probably at least check that the hook takes the number
833 839 # of args it's supposed to.
834 840 setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
835 841
836 842 def set_custom_exc(self,exc_tuple,handler):
837 843 """set_custom_exc(exc_tuple,handler)
838 844
839 845 Set a custom exception handler, which will be called if any of the
840 846 exceptions in exc_tuple occur in the mainloop (specifically, in the
841 847 runcode() method.
842 848
843 849 Inputs:
844 850
845 851 - exc_tuple: a *tuple* of valid exceptions to call the defined
846 852 handler for. It is very important that you use a tuple, and NOT A
847 853 LIST here, because of the way Python's except statement works. If
848 854 you only want to trap a single exception, use a singleton tuple:
849 855
850 856 exc_tuple == (MyCustomException,)
851 857
852 858 - handler: this must be defined as a function with the following
853 859 basic interface: def my_handler(self,etype,value,tb).
854 860
855 861 This will be made into an instance method (via new.instancemethod)
856 862 of IPython itself, and it will be called if any of the exceptions
857 863 listed in the exc_tuple are caught. If the handler is None, an
858 864 internal basic one is used, which just prints basic info.
859 865
860 866 WARNING: by putting in your own exception handler into IPython's main
861 867 execution loop, you run a very good chance of nasty crashes. This
862 868 facility should only be used if you really know what you are doing."""
863 869
864 870 assert type(exc_tuple)==type(()) , \
865 871 "The custom exceptions must be given AS A TUPLE."
866 872
867 873 def dummy_handler(self,etype,value,tb):
868 874 print '*** Simple custom exception handler ***'
869 875 print 'Exception type :',etype
870 876 print 'Exception value:',value
871 877 print 'Traceback :',tb
872 878 print 'Source code :','\n'.join(self.buffer)
873 879
874 880 if handler is None: handler = dummy_handler
875 881
876 882 self.CustomTB = new.instancemethod(handler,self,self.__class__)
877 883 self.custom_exceptions = exc_tuple
878 884
879 885 def set_custom_completer(self,completer,pos=0):
880 886 """set_custom_completer(completer,pos=0)
881 887
882 888 Adds a new custom completer function.
883 889
884 890 The position argument (defaults to 0) is the index in the completers
885 891 list where you want the completer to be inserted."""
886 892
887 893 newcomp = new.instancemethod(completer,self.Completer,
888 894 self.Completer.__class__)
889 895 self.Completer.matchers.insert(pos,newcomp)
890 896
891 897 def complete(self,text):
892 898 """Return a sorted list of all possible completions on text.
893 899
894 900 Inputs:
895 901
896 902 - text: a string of text to be completed on.
897 903
898 904 This is a wrapper around the completion mechanism, similar to what
899 905 readline does at the command line when the TAB key is hit. By
900 906 exposing it as a method, it can be used by other non-readline
901 907 environments (such as GUIs) for text completion.
902 908
903 909 Simple usage example:
904 910
905 911 In [1]: x = 'hello'
906 912
907 913 In [2]: __IP.complete('x.l')
908 914 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
909 915
910 916 complete = self.Completer.complete
911 917 state = 0
912 918 # use a dict so we get unique keys, since ipyhton's multiple
913 919 # completers can return duplicates.
914 920 comps = {}
915 921 while True:
916 922 newcomp = complete(text,state)
917 923 if newcomp is None:
918 924 break
919 925 comps[newcomp] = 1
920 926 state += 1
921 927 outcomps = comps.keys()
922 928 outcomps.sort()
923 929 return outcomps
924 930
925 931 def post_config_initialization(self):
926 932 """Post configuration init method
927 933
928 934 This is called after the configuration files have been processed to
929 935 'finalize' the initialization."""
930 936
931 937 # dynamic data that survives through sessions
932 938 # XXX make the filename a config option?
933 939 persist_base = 'persist'
934 940 if self.rc.profile:
935 941 persist_base += '_%s' % self.rc.profile
936 942 self.persist_fname = os.path.join(self.rc.ipythondir,persist_base)
937 943
938 944 try:
939 945 self.persist = pickle.load(file(self.persist_fname))
940 946 except:
941 947 self.persist = {}
942 948
943 949 def init_auto_alias(self):
944 950 """Define some aliases automatically.
945 951
946 952 These are ALL parameter-less aliases"""
947 953 for alias,cmd in self.auto_alias:
948 954 self.alias_table[alias] = (0,cmd)
949 955
950 956 def alias_table_validate(self,verbose=0):
951 957 """Update information about the alias table.
952 958
953 959 In particular, make sure no Python keywords/builtins are in it."""
954 960
955 961 no_alias = self.no_alias
956 for k in self.alias_table.keys():
962 for k in self.alias_table:
957 963 if k in no_alias:
958 964 del self.alias_table[k]
959 965 if verbose:
960 966 print ("Deleting alias <%s>, it's a Python "
961 967 "keyword or builtin." % k)
962 968
963 969 def set_autoindent(self,value=None):
964 970 """Set the autoindent flag, checking for readline support.
965 971
966 972 If called with no arguments, it acts as a toggle."""
967 973
968 974 if not self.has_readline:
969 975 if os.name == 'posix':
970 976 warn("The auto-indent feature requires the readline library")
971 977 self.autoindent = 0
972 978 return
973 979 if value is None:
974 980 self.autoindent = not self.autoindent
975 981 else:
976 982 self.autoindent = value
977 983
978 984 def rc_set_toggle(self,rc_field,value=None):
979 985 """Set or toggle a field in IPython's rc config. structure.
980 986
981 987 If called with no arguments, it acts as a toggle.
982 988
983 989 If called with a non-existent field, the resulting AttributeError
984 990 exception will propagate out."""
985 991
986 992 rc_val = getattr(self.rc,rc_field)
987 993 if value is None:
988 994 value = not rc_val
989 995 setattr(self.rc,rc_field,value)
990 996
991 997 def user_setup(self,ipythondir,rc_suffix,mode='install'):
992 998 """Install the user configuration directory.
993 999
994 1000 Can be called when running for the first time or to upgrade the user's
995 1001 .ipython/ directory with the mode parameter. Valid modes are 'install'
996 1002 and 'upgrade'."""
997 1003
998 1004 def wait():
999 1005 try:
1000 1006 raw_input("Please press <RETURN> to start IPython.")
1001 1007 except EOFError:
1002 1008 print >> Term.cout
1003 1009 print '*'*70
1004 1010
1005 1011 cwd = os.getcwd() # remember where we started
1006 1012 glb = glob.glob
1007 1013 print '*'*70
1008 1014 if mode == 'install':
1009 1015 print \
1010 1016 """Welcome to IPython. I will try to create a personal configuration directory
1011 1017 where you can customize many aspects of IPython's functionality in:\n"""
1012 1018 else:
1013 1019 print 'I am going to upgrade your configuration in:'
1014 1020
1015 1021 print ipythondir
1016 1022
1017 1023 rcdirend = os.path.join('IPython','UserConfig')
1018 1024 cfg = lambda d: os.path.join(d,rcdirend)
1019 1025 try:
1020 1026 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1021 1027 except IOError:
1022 1028 warning = """
1023 1029 Installation error. IPython's directory was not found.
1024 1030
1025 1031 Check the following:
1026 1032
1027 1033 The ipython/IPython directory should be in a directory belonging to your
1028 1034 PYTHONPATH environment variable (that is, it should be in a directory
1029 1035 belonging to sys.path). You can copy it explicitly there or just link to it.
1030 1036
1031 1037 IPython will proceed with builtin defaults.
1032 1038 """
1033 1039 warn(warning)
1034 1040 wait()
1035 1041 return
1036 1042
1037 1043 if mode == 'install':
1038 1044 try:
1039 1045 shutil.copytree(rcdir,ipythondir)
1040 1046 os.chdir(ipythondir)
1041 1047 rc_files = glb("ipythonrc*")
1042 1048 for rc_file in rc_files:
1043 1049 os.rename(rc_file,rc_file+rc_suffix)
1044 1050 except:
1045 1051 warning = """
1046 1052
1047 1053 There was a problem with the installation:
1048 1054 %s
1049 1055 Try to correct it or contact the developers if you think it's a bug.
1050 1056 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1051 1057 warn(warning)
1052 1058 wait()
1053 1059 return
1054 1060
1055 1061 elif mode == 'upgrade':
1056 1062 try:
1057 1063 os.chdir(ipythondir)
1058 1064 except:
1059 1065 print """
1060 1066 Can not upgrade: changing to directory %s failed. Details:
1061 1067 %s
1062 1068 """ % (ipythondir,sys.exc_info()[1])
1063 1069 wait()
1064 1070 return
1065 1071 else:
1066 1072 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1067 1073 for new_full_path in sources:
1068 1074 new_filename = os.path.basename(new_full_path)
1069 1075 if new_filename.startswith('ipythonrc'):
1070 1076 new_filename = new_filename + rc_suffix
1071 1077 # The config directory should only contain files, skip any
1072 1078 # directories which may be there (like CVS)
1073 1079 if os.path.isdir(new_full_path):
1074 1080 continue
1075 1081 if os.path.exists(new_filename):
1076 1082 old_file = new_filename+'.old'
1077 1083 if os.path.exists(old_file):
1078 1084 os.remove(old_file)
1079 1085 os.rename(new_filename,old_file)
1080 1086 shutil.copy(new_full_path,new_filename)
1081 1087 else:
1082 1088 raise ValueError,'unrecognized mode for install:',`mode`
1083 1089
1084 1090 # Fix line-endings to those native to each platform in the config
1085 1091 # directory.
1086 1092 try:
1087 1093 os.chdir(ipythondir)
1088 1094 except:
1089 1095 print """
1090 1096 Problem: changing to directory %s failed.
1091 1097 Details:
1092 1098 %s
1093 1099
1094 1100 Some configuration files may have incorrect line endings. This should not
1095 1101 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1096 1102 wait()
1097 1103 else:
1098 1104 for fname in glb('ipythonrc*'):
1099 1105 try:
1100 1106 native_line_ends(fname,backup=0)
1101 1107 except IOError:
1102 1108 pass
1103 1109
1104 1110 if mode == 'install':
1105 1111 print """
1106 1112 Successful installation!
1107 1113
1108 1114 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1109 1115 IPython manual (there are both HTML and PDF versions supplied with the
1110 1116 distribution) to make sure that your system environment is properly configured
1111 1117 to take advantage of IPython's features."""
1112 1118 else:
1113 1119 print """
1114 1120 Successful upgrade!
1115 1121
1116 1122 All files in your directory:
1117 1123 %(ipythondir)s
1118 1124 which would have been overwritten by the upgrade were backed up with a .old
1119 1125 extension. If you had made particular customizations in those files you may
1120 1126 want to merge them back into the new files.""" % locals()
1121 1127 wait()
1122 1128 os.chdir(cwd)
1123 1129 # end user_setup()
1124 1130
1125 1131 def atexit_operations(self):
1126 1132 """This will be executed at the time of exit.
1127 1133
1128 1134 Saving of persistent data should be performed here. """
1129 1135
1130 1136 # input history
1131 1137 self.savehist()
1132 1138
1133 1139 # Cleanup all tempfiles left around
1134 1140 for tfile in self.tempfiles:
1135 1141 try:
1136 1142 os.unlink(tfile)
1137 1143 except OSError:
1138 1144 pass
1139 1145
1140 1146 # save the "persistent data" catch-all dictionary
1141 1147 try:
1142 1148 pickle.dump(self.persist, open(self.persist_fname,"w"))
1143 1149 except:
1144 1150 print "*** ERROR *** persistent data saving failed."
1145 1151
1146 1152 def savehist(self):
1147 1153 """Save input history to a file (via readline library)."""
1148 1154 try:
1149 1155 self.readline.write_history_file(self.histfile)
1150 1156 except:
1151 1157 print 'Unable to save IPython command history to file: ' + \
1152 1158 `self.histfile`
1153 1159
1154 1160 def pre_readline(self):
1155 1161 """readline hook to be used at the start of each line.
1156 1162
1157 1163 Currently it handles auto-indent only."""
1158 1164
1159 1165 self.readline.insert_text(' '* self.readline_indent)
1160 1166
1161 1167 def init_readline(self):
1162 1168 """Command history completion/saving/reloading."""
1163 1169 try:
1164 1170 import readline
1165 1171 self.Completer = MagicCompleter(self,
1166 1172 self.user_ns,
1167 1173 self.rc.readline_omit__names,
1168 1174 self.alias_table)
1169 1175 except ImportError,NameError:
1170 1176 # If FlexCompleter failed to import, MagicCompleter won't be
1171 1177 # defined. This can happen because of a problem with readline
1172 1178 self.has_readline = 0
1173 1179 # no point in bugging windows users with this every time:
1174 1180 if os.name == 'posix':
1175 1181 warn('Readline services not available on this platform.')
1176 1182 else:
1177 1183 import atexit
1178 1184
1179 1185 # Platform-specific configuration
1180 1186 if os.name == 'nt':
1181 1187 # readline under Windows modifies the default exit behavior
1182 1188 # from being Ctrl-Z/Return to the Unix Ctrl-D one.
1183 1189 __builtin__.exit = __builtin__.quit = \
1184 1190 ('Use Ctrl-D (i.e. EOF) to exit. '
1185 1191 'Use %Exit or %Quit to exit without confirmation.')
1186 1192 self.readline_startup_hook = readline.set_pre_input_hook
1187 1193 else:
1188 1194 self.readline_startup_hook = readline.set_startup_hook
1189 1195
1190 1196 # Load user's initrc file (readline config)
1191 1197 inputrc_name = os.environ.get('INPUTRC')
1192 1198 if inputrc_name is None:
1193 1199 home_dir = get_home_dir()
1194 1200 if home_dir is not None:
1195 1201 inputrc_name = os.path.join(home_dir,'.inputrc')
1196 1202 if os.path.isfile(inputrc_name):
1197 1203 try:
1198 1204 readline.read_init_file(inputrc_name)
1199 1205 except:
1200 1206 warn('Problems reading readline initialization file <%s>'
1201 1207 % inputrc_name)
1202 1208
1203 1209 self.has_readline = 1
1204 1210 self.readline = readline
1205 1211 self.readline_indent = 0 # for auto-indenting via readline
1206 1212 # save this in sys so embedded copies can restore it properly
1207 1213 sys.ipcompleter = self.Completer.complete
1208 1214 readline.set_completer(self.Completer.complete)
1209 1215
1210 1216 # Configure readline according to user's prefs
1211 1217 for rlcommand in self.rc.readline_parse_and_bind:
1212 1218 readline.parse_and_bind(rlcommand)
1213 1219
1214 1220 # remove some chars from the delimiters list
1215 1221 delims = readline.get_completer_delims()
1216 1222 delims = delims.translate(string._idmap,
1217 1223 self.rc.readline_remove_delims)
1218 1224 readline.set_completer_delims(delims)
1219 1225 # otherwise we end up with a monster history after a while:
1220 1226 readline.set_history_length(1000)
1221 1227 try:
1222 1228 #print '*** Reading readline history' # dbg
1223 1229 readline.read_history_file(self.histfile)
1224 1230 except IOError:
1225 1231 pass # It doesn't exist yet.
1226 1232
1227 1233 atexit.register(self.atexit_operations)
1228 1234 del atexit
1229 1235
1230 1236 # Configure auto-indent for all platforms
1231 1237 self.set_autoindent(self.rc.autoindent)
1232 1238
1233 1239 def showsyntaxerror(self, filename=None):
1234 1240 """Display the syntax error that just occurred.
1235 1241
1236 1242 This doesn't display a stack trace because there isn't one.
1237 1243
1238 1244 If a filename is given, it is stuffed in the exception instead
1239 1245 of what was there before (because Python's parser always uses
1240 1246 "<string>" when reading from a string).
1241 1247 """
1242 1248 type, value, sys.last_traceback = sys.exc_info()
1243 1249 sys.last_type = type
1244 1250 sys.last_value = value
1245 1251 if filename and type is SyntaxError:
1246 1252 # Work hard to stuff the correct filename in the exception
1247 1253 try:
1248 1254 msg, (dummy_filename, lineno, offset, line) = value
1249 1255 except:
1250 1256 # Not the format we expect; leave it alone
1251 1257 pass
1252 1258 else:
1253 1259 # Stuff in the right filename
1254 1260 try:
1255 1261 # Assume SyntaxError is a class exception
1256 1262 value = SyntaxError(msg, (filename, lineno, offset, line))
1257 1263 except:
1258 1264 # If that failed, assume SyntaxError is a string
1259 1265 value = msg, (filename, lineno, offset, line)
1260 1266 self.SyntaxTB(type,value,[])
1261 1267
1262 1268 def debugger(self):
1263 1269 """Call the pdb debugger."""
1264 1270
1265 1271 if not self.rc.pdb:
1266 1272 return
1267 1273 pdb.pm()
1268 1274
1269 1275 def showtraceback(self,exc_tuple = None):
1270 1276 """Display the exception that just occurred."""
1271 1277
1272 1278 # Though this won't be called by syntax errors in the input line,
1273 1279 # there may be SyntaxError cases whith imported code.
1274 1280 if exc_tuple is None:
1275 1281 type, value, tb = sys.exc_info()
1276 1282 else:
1277 1283 type, value, tb = exc_tuple
1278 1284 if type is SyntaxError:
1279 1285 self.showsyntaxerror()
1280 1286 else:
1281 1287 sys.last_type = type
1282 1288 sys.last_value = value
1283 1289 sys.last_traceback = tb
1284 1290 self.InteractiveTB()
1285 1291 if self.InteractiveTB.call_pdb and self.has_readline:
1286 1292 # pdb mucks up readline, fix it back
1287 1293 self.readline.set_completer(self.Completer.complete)
1288 1294
1289 1295 def update_cache(self, line):
1290 1296 """puts line into cache"""
1291 1297 self.inputcache.insert(0, line) # This copies the cache every time ... :-(
1292 1298 if len(self.inputcache) >= self.CACHELENGTH:
1293 1299 self.inputcache.pop() # This not :-)
1294 1300
1295 1301 def name_space_init(self):
1296 1302 """Create local namespace."""
1297 1303 # We want this to be a method to facilitate embedded initialization.
1298 1304 code.InteractiveConsole.__init__(self,self.user_ns)
1299 1305
1300 1306 def mainloop(self,banner=None):
1301 1307 """Creates the local namespace and starts the mainloop.
1302 1308
1303 1309 If an optional banner argument is given, it will override the
1304 1310 internally created default banner."""
1305 1311
1306 1312 self.name_space_init()
1307 1313 if self.rc.c: # Emulate Python's -c option
1308 1314 self.exec_init_cmd()
1309 1315 if banner is None:
1310 1316 if self.rc.banner:
1311 1317 banner = self.BANNER+self.banner2
1312 1318 else:
1313 1319 banner = ''
1314 1320 self.interact(banner)
1315 1321
1316 1322 def exec_init_cmd(self):
1317 1323 """Execute a command given at the command line.
1318 1324
1319 1325 This emulates Python's -c option."""
1320 1326
1321 1327 sys.argv = ['-c']
1322 1328 self.push(self.rc.c)
1323 1329
1324 1330 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1325 1331 """Embeds IPython into a running python program.
1326 1332
1327 1333 Input:
1328 1334
1329 1335 - header: An optional header message can be specified.
1330 1336
1331 1337 - local_ns, global_ns: working namespaces. If given as None, the
1332 1338 IPython-initialized one is updated with __main__.__dict__, so that
1333 1339 program variables become visible but user-specific configuration
1334 1340 remains possible.
1335 1341
1336 1342 - stack_depth: specifies how many levels in the stack to go to
1337 1343 looking for namespaces (when local_ns and global_ns are None). This
1338 1344 allows an intermediate caller to make sure that this function gets
1339 1345 the namespace from the intended level in the stack. By default (0)
1340 1346 it will get its locals and globals from the immediate caller.
1341 1347
1342 1348 Warning: it's possible to use this in a program which is being run by
1343 1349 IPython itself (via %run), but some funny things will happen (a few
1344 1350 globals get overwritten). In the future this will be cleaned up, as
1345 1351 there is no fundamental reason why it can't work perfectly."""
1346 1352
1347 1353 # Patch for global embedding to make sure that things don't overwrite
1348 1354 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1349 1355 # FIXME. Test this a bit more carefully (the if.. is new)
1350 1356 if local_ns is None and global_ns is None:
1351 1357 self.user_ns.update(__main__.__dict__)
1352 1358
1353 1359 # Get locals and globals from caller
1354 1360 if local_ns is None or global_ns is None:
1355 1361 call_frame = sys._getframe(stack_depth).f_back
1356 1362
1357 1363 if local_ns is None:
1358 1364 local_ns = call_frame.f_locals
1359 1365 if global_ns is None:
1360 1366 global_ns = call_frame.f_globals
1361 1367
1362 1368 # Update namespaces and fire up interpreter
1363 1369 self.user_ns.update(local_ns)
1364 1370 self.interact(header)
1365 1371
1366 1372 # Remove locals from namespace
1367 1373 for k in local_ns:
1368 1374 del self.user_ns[k]
1369 1375
1370 1376 def interact(self, banner=None):
1371 1377 """Closely emulate the interactive Python console.
1372 1378
1373 1379 The optional banner argument specify the banner to print
1374 1380 before the first interaction; by default it prints a banner
1375 1381 similar to the one printed by the real Python interpreter,
1376 1382 followed by the current class name in parentheses (so as not
1377 1383 to confuse this with the real interpreter -- since it's so
1378 1384 close!).
1379 1385
1380 1386 """
1381 1387 cprt = 'Type "copyright", "credits" or "license" for more information.'
1382 1388 if banner is None:
1383 1389 self.write("Python %s on %s\n%s\n(%s)\n" %
1384 1390 (sys.version, sys.platform, cprt,
1385 1391 self.__class__.__name__))
1386 1392 else:
1387 1393 self.write(banner)
1388 1394
1389 1395 more = 0
1390 1396
1391 1397 # Mark activity in the builtins
1392 1398 __builtin__.__dict__['__IPYTHON__active'] += 1
1393 1399
1394 1400 # exit_now is set by a call to %Exit or %Quit
1395 1401 while not self.exit_now:
1396 1402 try:
1397 1403 if more:
1398 1404 prompt = self.outputcache.prompt2
1399 1405 if self.autoindent:
1400 1406 self.readline_startup_hook(self.pre_readline)
1401 1407 else:
1402 1408 prompt = self.outputcache.prompt1
1403 1409 try:
1404 1410 line = self.raw_input(prompt)
1405 1411 if self.autoindent:
1406 1412 self.readline_startup_hook(None)
1407 1413 except EOFError:
1408 1414 if self.autoindent:
1409 1415 self.readline_startup_hook(None)
1410 1416 self.write("\n")
1411 1417 if self.rc.confirm_exit:
1412 1418 if ask_yes_no('Do you really want to exit ([y]/n)?','y'):
1413 1419 break
1414 1420 else:
1415 1421 break
1416 1422 else:
1417 1423 more = self.push(line)
1418 1424 # Auto-indent management
1419 1425 if self.autoindent:
1420 1426 if line:
1421 1427 ini_spaces = re.match('^(\s+)',line)
1422 1428 if ini_spaces:
1423 1429 nspaces = ini_spaces.end()
1424 1430 else:
1425 1431 nspaces = 0
1426 1432 self.readline_indent = nspaces
1427 1433
1428 1434 if line[-1] == ':':
1429 1435 self.readline_indent += 4
1430 1436 elif re.match(r'^\s+raise|^\s+return',line):
1431 1437 self.readline_indent -= 4
1432 1438 else:
1433 1439 self.readline_indent = 0
1434 1440
1435 1441 except KeyboardInterrupt:
1436 1442 self.write("\nKeyboardInterrupt\n")
1437 1443 self.resetbuffer()
1438 1444 more = 0
1439 1445 # keep cache in sync with the prompt counter:
1440 1446 self.outputcache.prompt_count -= 1
1441 1447
1442 1448 if self.autoindent:
1443 1449 self.readline_indent = 0
1444 1450
1445 1451 except bdb.BdbQuit:
1446 1452 warn("The Python debugger has exited with a BdbQuit exception.\n"
1447 1453 "Because of how pdb handles the stack, it is impossible\n"
1448 1454 "for IPython to properly format this particular exception.\n"
1449 1455 "IPython will resume normal operation.")
1450 1456
1451 1457 # We are off again...
1452 1458 __builtin__.__dict__['__IPYTHON__active'] -= 1
1453 1459
1454 1460 def excepthook(self, type, value, tb):
1455 1461 """One more defense for GUI apps that call sys.excepthook.
1456 1462
1457 1463 GUI frameworks like wxPython trap exceptions and call
1458 1464 sys.excepthook themselves. I guess this is a feature that
1459 1465 enables them to keep running after exceptions that would
1460 1466 otherwise kill their mainloop. This is a bother for IPython
1461 1467 which excepts to catch all of the program exceptions with a try:
1462 1468 except: statement.
1463 1469
1464 1470 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1465 1471 any app directly invokes sys.excepthook, it will look to the user like
1466 1472 IPython crashed. In order to work around this, we can disable the
1467 1473 CrashHandler and replace it with this excepthook instead, which prints a
1468 1474 regular traceback using our InteractiveTB. In this fashion, apps which
1469 1475 call sys.excepthook will generate a regular-looking exception from
1470 1476 IPython, and the CrashHandler will only be triggered by real IPython
1471 1477 crashes.
1472 1478
1473 1479 This hook should be used sparingly, only in places which are not likely
1474 1480 to be true IPython errors.
1475 1481 """
1476 1482
1477 1483 self.InteractiveTB(type, value, tb, tb_offset=0)
1478 1484 if self.InteractiveTB.call_pdb and self.has_readline:
1479 1485 self.readline.set_completer(self.Completer.complete)
1480 1486
1481 1487 def call_alias(self,alias,rest=''):
1482 1488 """Call an alias given its name and the rest of the line.
1483 1489
1484 1490 This function MUST be given a proper alias, because it doesn't make
1485 1491 any checks when looking up into the alias table. The caller is
1486 1492 responsible for invoking it only with a valid alias."""
1487 1493
1488 1494 #print 'ALIAS: <%s>+<%s>' % (alias,rest) # dbg
1489 1495 nargs,cmd = self.alias_table[alias]
1490 1496 # Expand the %l special to be the user's input line
1491 1497 if cmd.find('%l') >= 0:
1492 1498 cmd = cmd.replace('%l',rest)
1493 1499 rest = ''
1494 1500 if nargs==0:
1495 1501 # Simple, argument-less aliases
1496 1502 cmd = '%s %s' % (cmd,rest)
1497 1503 else:
1498 1504 # Handle aliases with positional arguments
1499 1505 args = rest.split(None,nargs)
1500 1506 if len(args)< nargs:
1501 1507 error('Alias <%s> requires %s arguments, %s given.' %
1502 1508 (alias,nargs,len(args)))
1503 1509 return
1504 1510 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1505 1511 # Now call the macro, evaluating in the user's namespace
1506 1512 try:
1507 1513 self.system(cmd)
1508 1514 except:
1509 1515 self.showtraceback()
1510 1516
1511 1517 def runlines(self,lines):
1512 1518 """Run a string of one or more lines of source.
1513 1519
1514 1520 This method is capable of running a string containing multiple source
1515 1521 lines, as if they had been entered at the IPython prompt. Since it
1516 1522 exposes IPython's processing machinery, the given strings can contain
1517 1523 magic calls (%magic), special shell access (!cmd), etc."""
1518 1524
1519 1525 # We must start with a clean buffer, in case this is run from an
1520 1526 # interactive IPython session (via a magic, for example).
1521 1527 self.resetbuffer()
1522 1528 lines = lines.split('\n')
1523 1529 more = 0
1524 1530 for line in lines:
1525 1531 # skip blank lines so we don't mess up the prompt counter, but do
1526 1532 # NOT skip even a blank line if we are in a code block (more is
1527 1533 # true)
1528 1534 if line or more:
1529 1535 more = self.push((self.prefilter(line,more)))
1530 1536 # IPython's runsource returns None if there was an error
1531 1537 # compiling the code. This allows us to stop processing right
1532 1538 # away, so the user gets the error message at the right place.
1533 1539 if more is None:
1534 1540 break
1535 1541 # final newline in case the input didn't have it, so that the code
1536 1542 # actually does get executed
1537 1543 if more:
1538 1544 self.push('\n')
1539 1545
1540 1546 def runsource(self, source, filename="<input>", symbol="single"):
1541 1547 """Compile and run some source in the interpreter.
1542 1548
1543 1549 Arguments are as for compile_command().
1544 1550
1545 1551 One several things can happen:
1546 1552
1547 1553 1) The input is incorrect; compile_command() raised an
1548 1554 exception (SyntaxError or OverflowError). A syntax traceback
1549 1555 will be printed by calling the showsyntaxerror() method.
1550 1556
1551 1557 2) The input is incomplete, and more input is required;
1552 1558 compile_command() returned None. Nothing happens.
1553 1559
1554 1560 3) The input is complete; compile_command() returned a code
1555 1561 object. The code is executed by calling self.runcode() (which
1556 1562 also handles run-time exceptions, except for SystemExit).
1557 1563
1558 1564 The return value is:
1559 1565
1560 1566 - True in case 2
1561 1567
1562 1568 - False in the other cases, unless an exception is raised, where
1563 1569 None is returned instead. This can be used by external callers to
1564 1570 know whether to continue feeding input or not.
1565 1571
1566 1572 The return value can be used to decide whether to use sys.ps1 or
1567 1573 sys.ps2 to prompt the next line."""
1568 1574
1569 1575 try:
1570 1576 code = self.compile(source, filename, symbol)
1571 1577 except (OverflowError, SyntaxError, ValueError):
1572 1578 # Case 1
1573 1579 self.showsyntaxerror(filename)
1574 1580 return None
1575 1581
1576 1582 if code is None:
1577 1583 # Case 2
1578 1584 return True
1579 1585
1580 1586 # Case 3
1581 1587 # We store the code object so that threaded shells and
1582 1588 # custom exception handlers can access all this info if needed.
1583 1589 # The source corresponding to this can be obtained from the
1584 1590 # buffer attribute as '\n'.join(self.buffer).
1585 1591 self.code_to_run = code
1586 1592 # now actually execute the code object
1587 1593 if self.runcode(code) == 0:
1588 1594 return False
1589 1595 else:
1590 1596 return None
1591 1597
1592 1598 def runcode(self,code_obj):
1593 1599 """Execute a code object.
1594 1600
1595 1601 When an exception occurs, self.showtraceback() is called to display a
1596 1602 traceback.
1597 1603
1598 1604 Return value: a flag indicating whether the code to be run completed
1599 1605 successfully:
1600 1606
1601 1607 - 0: successful execution.
1602 1608 - 1: an error occurred.
1603 1609 """
1604 1610
1605 1611 # Set our own excepthook in case the user code tries to call it
1606 1612 # directly, so that the IPython crash handler doesn't get triggered
1607 1613 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1608 1614 outflag = 1 # happens in more places, so it's easier as default
1609 1615 try:
1610 1616 try:
1611 1617 exec code_obj in self.locals
1612 1618 finally:
1613 1619 # Reset our crash handler in place
1614 1620 sys.excepthook = old_excepthook
1615 1621 except SystemExit:
1616 1622 self.resetbuffer()
1617 1623 self.showtraceback()
1618 1624 warn( __builtin__.exit,level=1)
1619 1625 except self.custom_exceptions:
1620 1626 etype,value,tb = sys.exc_info()
1621 1627 self.CustomTB(etype,value,tb)
1622 1628 except:
1623 1629 self.showtraceback()
1624 1630 else:
1625 1631 outflag = 0
1626 1632 if code.softspace(sys.stdout, 0):
1627 1633 print
1628 1634 # Flush out code object which has been run (and source)
1629 1635 self.code_to_run = None
1630 1636 return outflag
1631 1637
1632 1638 def raw_input(self, prompt=""):
1633 1639 """Write a prompt and read a line.
1634 1640
1635 1641 The returned line does not include the trailing newline.
1636 1642 When the user enters the EOF key sequence, EOFError is raised.
1637 1643
1638 1644 The base implementation uses the built-in function
1639 1645 raw_input(); a subclass may replace this with a different
1640 1646 implementation.
1641 1647 """
1642 1648 return self.prefilter(raw_input_original(prompt),
1643 1649 prompt==self.outputcache.prompt2)
1644 1650
1645 1651 def split_user_input(self,line):
1646 1652 """Split user input into pre-char, function part and rest."""
1647 1653
1648 1654 lsplit = self.line_split.match(line)
1649 1655 if lsplit is None: # no regexp match returns None
1650 1656 try:
1651 1657 iFun,theRest = line.split(None,1)
1652 1658 except ValueError:
1653 1659 iFun,theRest = line,''
1654 1660 pre = re.match('^(\s*)(.*)',line).groups()[0]
1655 1661 else:
1656 1662 pre,iFun,theRest = lsplit.groups()
1657 1663
1658 1664 #print 'line:<%s>' % line # dbg
1659 1665 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
1660 1666 return pre,iFun.strip(),theRest
1661 1667
1662 1668 def _prefilter(self, line, continue_prompt):
1663 1669 """Calls different preprocessors, depending on the form of line."""
1664 1670
1665 1671 # All handlers *must* return a value, even if it's blank ('').
1666 1672
1667 1673 # Lines are NOT logged here. Handlers should process the line as
1668 1674 # needed, update the cache AND log it (so that the input cache array
1669 1675 # stays synced).
1670 1676
1671 1677 # This function is _very_ delicate, and since it's also the one which
1672 1678 # determines IPython's response to user input, it must be as efficient
1673 1679 # as possible. For this reason it has _many_ returns in it, trying
1674 1680 # always to exit as quickly as it can figure out what it needs to do.
1675 1681
1676 1682 # This function is the main responsible for maintaining IPython's
1677 1683 # behavior respectful of Python's semantics. So be _very_ careful if
1678 1684 # making changes to anything here.
1679 1685
1680 1686 #.....................................................................
1681 1687 # Code begins
1682 1688
1683 1689 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
1684 1690
1685 1691 # save the line away in case we crash, so the post-mortem handler can
1686 1692 # record it
1687 1693 self._last_input_line = line
1688 1694
1689 1695 #print '***line: <%s>' % line # dbg
1690 1696
1691 1697 # the input history needs to track even empty lines
1692 1698 if not line.strip():
1693 1699 if not continue_prompt:
1694 1700 self.outputcache.prompt_count -= 1
1695 1701 return self.handle_normal('',continue_prompt)
1696 1702
1697 1703 # print '***cont',continue_prompt # dbg
1698 1704 # special handlers are only allowed for single line statements
1699 1705 if continue_prompt and not self.rc.multi_line_specials:
1700 1706 return self.handle_normal(line,continue_prompt)
1701 1707
1702 1708 # For the rest, we need the structure of the input
1703 1709 pre,iFun,theRest = self.split_user_input(line)
1704 1710 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1705 1711
1706 1712 # First check for explicit escapes in the last/first character
1707 1713 handler = None
1708 1714 if line[-1] == self.ESC_HELP:
1709 1715 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
1710 1716 if handler is None:
1711 1717 # look at the first character of iFun, NOT of line, so we skip
1712 1718 # leading whitespace in multiline input
1713 1719 handler = self.esc_handlers.get(iFun[0:1])
1714 1720 if handler is not None:
1715 1721 return handler(line,continue_prompt,pre,iFun,theRest)
1716 1722 # Emacs ipython-mode tags certain input lines
1717 1723 if line.endswith('# PYTHON-MODE'):
1718 1724 return self.handle_emacs(line,continue_prompt)
1719 1725
1720 1726 # Next, check if we can automatically execute this thing
1721 1727
1722 1728 # Allow ! in multi-line statements if multi_line_specials is on:
1723 1729 if continue_prompt and self.rc.multi_line_specials and \
1724 1730 iFun.startswith(self.ESC_SHELL):
1725 1731 return self.handle_shell_escape(line,continue_prompt,
1726 1732 pre=pre,iFun=iFun,
1727 1733 theRest=theRest)
1728 1734
1729 1735 # Let's try to find if the input line is a magic fn
1730 1736 oinfo = None
1731 1737 if hasattr(self,'magic_'+iFun):
1732 1738 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1733 1739 if oinfo['ismagic']:
1734 1740 # Be careful not to call magics when a variable assignment is
1735 1741 # being made (ls='hi', for example)
1736 1742 if self.rc.automagic and \
1737 1743 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
1738 1744 (self.rc.multi_line_specials or not continue_prompt):
1739 1745 return self.handle_magic(line,continue_prompt,
1740 1746 pre,iFun,theRest)
1741 1747 else:
1742 1748 return self.handle_normal(line,continue_prompt)
1743 1749
1744 1750 # If the rest of the line begins with an (in)equality, assginment or
1745 1751 # function call, we should not call _ofind but simply execute it.
1746 1752 # This avoids spurious geattr() accesses on objects upon assignment.
1747 1753 #
1748 1754 # It also allows users to assign to either alias or magic names true
1749 1755 # python variables (the magic/alias systems always take second seat to
1750 1756 # true python code).
1751 1757 if theRest and theRest[0] in '!=()':
1752 1758 return self.handle_normal(line,continue_prompt)
1753 1759
1754 1760 if oinfo is None:
1755 1761 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1756 1762
1757 1763 if not oinfo['found']:
1758 1764 return self.handle_normal(line,continue_prompt)
1759 1765 else:
1760 1766 #print 'iFun <%s> rest <%s>' % (iFun,theRest) # dbg
1761 1767 if oinfo['isalias']:
1762 1768 return self.handle_alias(line,continue_prompt,
1763 1769 pre,iFun,theRest)
1764 1770
1765 1771 if self.rc.autocall and \
1766 1772 not self.re_exclude_auto.match(theRest) and \
1767 1773 self.re_fun_name.match(iFun) and \
1768 1774 callable(oinfo['obj']) :
1769 1775 #print 'going auto' # dbg
1770 1776 return self.handle_auto(line,continue_prompt,pre,iFun,theRest)
1771 1777 else:
1772 1778 #print 'was callable?', callable(oinfo['obj']) # dbg
1773 1779 return self.handle_normal(line,continue_prompt)
1774 1780
1775 1781 # If we get here, we have a normal Python line. Log and return.
1776 1782 return self.handle_normal(line,continue_prompt)
1777 1783
1778 1784 def _prefilter_dumb(self, line, continue_prompt):
1779 1785 """simple prefilter function, for debugging"""
1780 1786 return self.handle_normal(line,continue_prompt)
1781 1787
1782 1788 # Set the default prefilter() function (this can be user-overridden)
1783 1789 prefilter = _prefilter
1784 1790
1785 1791 def handle_normal(self,line,continue_prompt=None,
1786 1792 pre=None,iFun=None,theRest=None):
1787 1793 """Handle normal input lines. Use as a template for handlers."""
1788 1794
1789 1795 self.log(line,continue_prompt)
1790 1796 self.update_cache(line)
1791 1797 return line
1792 1798
1793 1799 def handle_alias(self,line,continue_prompt=None,
1794 1800 pre=None,iFun=None,theRest=None):
1795 1801 """Handle alias input lines. """
1796 1802
1797 1803 theRest = esc_quotes(theRest)
1798 1804 line_out = "%s%s.call_alias('%s','%s')" % (pre,self.name,iFun,theRest)
1799 1805 self.log(line_out,continue_prompt)
1800 1806 self.update_cache(line_out)
1801 1807 return line_out
1802 1808
1803 1809 def handle_shell_escape(self, line, continue_prompt=None,
1804 1810 pre=None,iFun=None,theRest=None):
1805 1811 """Execute the line in a shell, empty return value"""
1806 1812
1807 1813 #print 'line in :', `line` # dbg
1808 1814 # Example of a special handler. Others follow a similar pattern.
1809 1815 if continue_prompt: # multi-line statements
1810 1816 if iFun.startswith('!!'):
1811 1817 print 'SyntaxError: !! is not allowed in multiline statements'
1812 1818 return pre
1813 1819 else:
1814 1820 cmd = ("%s %s" % (iFun[1:],theRest)).replace('"','\\"')
1815 1821 line_out = '%s%s.system("%s")' % (pre,self.name,cmd)
1816 1822 #line_out = ('%s%s.system(' % (pre,self.name)) + repr(cmd) + ')'
1817 1823 else: # single-line input
1818 1824 if line.startswith('!!'):
1819 1825 # rewrite iFun/theRest to properly hold the call to %sx and
1820 1826 # the actual command to be executed, so handle_magic can work
1821 1827 # correctly
1822 1828 theRest = '%s %s' % (iFun[2:],theRest)
1823 1829 iFun = 'sx'
1824 1830 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,line[2:]),
1825 1831 continue_prompt,pre,iFun,theRest)
1826 1832 else:
1827 1833 cmd = esc_quotes(line[1:])
1828 1834 line_out = '%s.system("%s")' % (self.name,cmd)
1829 1835 #line_out = ('%s.system(' % self.name) + repr(cmd)+ ')'
1830 1836 # update cache/log and return
1831 1837 self.log(line_out,continue_prompt)
1832 1838 self.update_cache(line_out) # readline cache gets normal line
1833 1839 #print 'line out r:', `line_out` # dbg
1834 1840 #print 'line out s:', line_out # dbg
1835 1841 return line_out
1836 1842
1837 1843 def handle_magic(self, line, continue_prompt=None,
1838 1844 pre=None,iFun=None,theRest=None):
1839 1845 """Execute magic functions.
1840 1846
1841 1847 Also log them with a prepended # so the log is clean Python."""
1842 1848
1843 1849 cmd = '%sipmagic("%s")' % (pre,esc_quotes('%s %s' % (iFun,theRest)))
1844 1850 self.log(cmd,continue_prompt)
1845 1851 self.update_cache(line)
1846 1852 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
1847 1853 return cmd
1848 1854
1849 1855 def handle_auto(self, line, continue_prompt=None,
1850 1856 pre=None,iFun=None,theRest=None):
1851 1857 """Hande lines which can be auto-executed, quoting if requested."""
1852 1858
1853 1859 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1854 1860
1855 1861 # This should only be active for single-line input!
1856 1862 if continue_prompt:
1857 1863 return line
1858 1864
1859 1865 if pre == self.ESC_QUOTE:
1860 1866 # Auto-quote splitting on whitespace
1861 1867 newcmd = '%s("%s")\n' % (iFun,'", "'.join(theRest.split()) )
1862 1868 elif pre == self.ESC_QUOTE2:
1863 1869 # Auto-quote whole string
1864 1870 newcmd = '%s("%s")\n' % (iFun,theRest)
1865 1871 else:
1866 1872 # Auto-paren
1867 1873 if theRest[0:1] in ('=','['):
1868 1874 # Don't autocall in these cases. They can be either
1869 1875 # rebindings of an existing callable's name, or item access
1870 1876 # for an object which is BOTH callable and implements
1871 1877 # __getitem__.
1872 1878 return '%s %s\n' % (iFun,theRest)
1873 1879 if theRest.endswith(';'):
1874 1880 newcmd = '%s(%s);\n' % (iFun.rstrip(),theRest[:-1])
1875 1881 else:
1876 1882 newcmd = '%s(%s)\n' % (iFun.rstrip(),theRest)
1877 1883
1878 1884 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd,
1879 1885 # log what is now valid Python, not the actual user input (without the
1880 1886 # final newline)
1881 1887 self.log(newcmd.strip(),continue_prompt)
1882 1888 return newcmd
1883 1889
1884 1890 def handle_help(self, line, continue_prompt=None,
1885 1891 pre=None,iFun=None,theRest=None):
1886 1892 """Try to get some help for the object.
1887 1893
1888 1894 obj? or ?obj -> basic information.
1889 1895 obj?? or ??obj -> more details.
1890 1896 """
1891 1897
1892 1898 # We need to make sure that we don't process lines which would be
1893 1899 # otherwise valid python, such as "x=1 # what?"
1894 1900 try:
1895 1901 code.compile_command(line)
1896 1902 except SyntaxError:
1897 1903 # We should only handle as help stuff which is NOT valid syntax
1898 1904 if line[0]==self.ESC_HELP:
1899 1905 line = line[1:]
1900 1906 elif line[-1]==self.ESC_HELP:
1901 1907 line = line[:-1]
1902 1908 self.log('#?'+line)
1903 1909 self.update_cache(line)
1904 1910 if line:
1905 1911 self.magic_pinfo(line)
1906 1912 else:
1907 1913 page(self.usage,screen_lines=self.rc.screen_length)
1908 1914 return '' # Empty string is needed here!
1909 1915 except:
1910 1916 # Pass any other exceptions through to the normal handler
1911 1917 return self.handle_normal(line,continue_prompt)
1912 1918 else:
1913 1919 # If the code compiles ok, we should handle it normally
1914 1920 return self.handle_normal(line,continue_prompt)
1915 1921
1916 1922 def handle_emacs(self,line,continue_prompt=None,
1917 1923 pre=None,iFun=None,theRest=None):
1918 1924 """Handle input lines marked by python-mode."""
1919 1925
1920 1926 # Currently, nothing is done. Later more functionality can be added
1921 1927 # here if needed.
1922 1928
1923 1929 # The input cache shouldn't be updated
1924 1930
1925 1931 return line
1926 1932
1927 1933 def write(self,data):
1928 1934 """Write a string to the default output"""
1929 1935 Term.cout.write(data)
1930 1936
1931 1937 def write_err(self,data):
1932 1938 """Write a string to the default error output"""
1933 1939 Term.cerr.write(data)
1934 1940
1935 1941 def safe_execfile(self,fname,*where,**kw):
1936 1942 fname = os.path.expanduser(fname)
1937 1943
1938 1944 # find things also in current directory
1939 1945 dname = os.path.dirname(fname)
1940 1946 if not sys.path.count(dname):
1941 1947 sys.path.append(dname)
1942 1948
1943 1949 try:
1944 1950 xfile = open(fname)
1945 1951 except:
1946 1952 print >> Term.cerr, \
1947 1953 'Could not open file <%s> for safe execution.' % fname
1948 1954 return None
1949 1955
1950 1956 kw.setdefault('islog',0)
1951 1957 kw.setdefault('quiet',1)
1952 1958 kw.setdefault('exit_ignore',0)
1953 1959 first = xfile.readline()
1954 1960 _LOGHEAD = str(self.LOGHEAD).split('\n',1)[0].strip()
1955 1961 xfile.close()
1956 1962 # line by line execution
1957 1963 if first.startswith(_LOGHEAD) or kw['islog']:
1958 1964 print 'Loading log file <%s> one line at a time...' % fname
1959 1965 if kw['quiet']:
1960 1966 stdout_save = sys.stdout
1961 1967 sys.stdout = StringIO.StringIO()
1962 1968 try:
1963 1969 globs,locs = where[0:2]
1964 1970 except:
1965 1971 try:
1966 1972 globs = locs = where[0]
1967 1973 except:
1968 1974 globs = locs = globals()
1969 1975 badblocks = []
1970 1976
1971 1977 # we also need to identify indented blocks of code when replaying
1972 1978 # logs and put them together before passing them to an exec
1973 1979 # statement. This takes a bit of regexp and look-ahead work in the
1974 1980 # file. It's easiest if we swallow the whole thing in memory
1975 1981 # first, and manually walk through the lines list moving the
1976 1982 # counter ourselves.
1977 1983 indent_re = re.compile('\s+\S')
1978 1984 xfile = open(fname)
1979 1985 filelines = xfile.readlines()
1980 1986 xfile.close()
1981 1987 nlines = len(filelines)
1982 1988 lnum = 0
1983 1989 while lnum < nlines:
1984 1990 line = filelines[lnum]
1985 1991 lnum += 1
1986 1992 # don't re-insert logger status info into cache
1987 1993 if line.startswith('#log#'):
1988 1994 continue
1989 1995 elif line.startswith('#%s'% self.ESC_MAGIC):
1990 1996 self.update_cache(line[1:])
1991 1997 line = magic2python(line)
1992 1998 elif line.startswith('#!'):
1993 1999 self.update_cache(line[1:])
1994 2000 else:
1995 2001 # build a block of code (maybe a single line) for execution
1996 2002 block = line
1997 2003 try:
1998 2004 next = filelines[lnum] # lnum has already incremented
1999 2005 except:
2000 2006 next = None
2001 2007 while next and indent_re.match(next):
2002 2008 block += next
2003 2009 lnum += 1
2004 2010 try:
2005 2011 next = filelines[lnum]
2006 2012 except:
2007 2013 next = None
2008 2014 # now execute the block of one or more lines
2009 2015 try:
2010 2016 exec block in globs,locs
2011 2017 self.update_cache(block.rstrip())
2012 2018 except SystemExit:
2013 2019 pass
2014 2020 except:
2015 2021 badblocks.append(block.rstrip())
2016 2022 if kw['quiet']: # restore stdout
2017 2023 sys.stdout.close()
2018 2024 sys.stdout = stdout_save
2019 2025 print 'Finished replaying log file <%s>' % fname
2020 2026 if badblocks:
2021 2027 print >> sys.stderr, \
2022 2028 '\nThe following lines/blocks in file <%s> reported errors:' \
2023 2029 % fname
2024 2030 for badline in badblocks:
2025 2031 print >> sys.stderr, badline
2026 2032 else: # regular file execution
2027 2033 try:
2028 2034 execfile(fname,*where)
2029 2035 except SyntaxError:
2030 2036 etype, evalue = sys.exc_info()[0:2]
2031 2037 self.SyntaxTB(etype,evalue,[])
2032 2038 warn('Failure executing file: <%s>' % fname)
2033 2039 except SystemExit,status:
2034 2040 if not kw['exit_ignore']:
2035 2041 self.InteractiveTB()
2036 2042 warn('Failure executing file: <%s>' % fname)
2037 2043 except:
2038 2044 self.InteractiveTB()
2039 2045 warn('Failure executing file: <%s>' % fname)
2040 2046
2041 2047 #************************* end of file <iplib.py> *****************************
@@ -1,725 +1,725 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 IPython -- An enhanced Interactive Python
4 4
5 5 Requires Python 2.1 or better.
6 6
7 7 This file contains the main make_IPython() starter function.
8 8
9 $Id: ipmaker.py 638 2005-07-18 03:01:41Z fperez $"""
9 $Id: ipmaker.py 802 2005-09-06 03:49:12Z fperez $"""
10 10
11 11 #*****************************************************************************
12 12 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #*****************************************************************************
17 17
18 18 from IPython import Release
19 19 __author__ = '%s <%s>' % Release.authors['Fernando']
20 20 __license__ = Release.license
21 21 __version__ = Release.version
22 22
23 23 credits._Printer__data = """
24 24 Python: %s
25 25
26 26 IPython: Fernando Perez, Janko Hauser, Nathan Gray, and many users.
27 27 See http://ipython.scipy.org for more information.""" \
28 28 % credits._Printer__data
29 29
30 30 copyright._Printer__data += """
31 31
32 32 Copyright (c) 2001-2004 Fernando Perez, Janko Hauser, Nathan Gray.
33 33 All Rights Reserved."""
34 34
35 35 #****************************************************************************
36 36 # Required modules
37 37
38 38 # From the standard library
39 39 import __main__, __builtin__
40 40 import os,sys,types,re
41 41 from pprint import pprint,pformat
42 42
43 43 # Our own
44 44 from IPython import DPyGetOpt
45 45 from IPython.Struct import Struct
46 46 from IPython.OutputTrap import OutputTrap
47 47 from IPython.ConfigLoader import ConfigLoader
48 48 from IPython.iplib import InteractiveShell,qw_lol,import_fail_info
49 49 from IPython.usage import cmd_line_usage,interactive_usage
50 50 from IPython.Prompts import CachedOutput
51 51 from IPython.genutils import *
52 52
53 53 #-----------------------------------------------------------------------------
54 54 def make_IPython(argv=None,user_ns=None,debug=1,rc_override=None,
55 55 shell_class=InteractiveShell,embedded=False,**kw):
56 56 """This is a dump of IPython into a single function.
57 57
58 58 Later it will have to be broken up in a sensible manner.
59 59
60 60 Arguments:
61 61
62 62 - argv: a list similar to sys.argv[1:]. It should NOT contain the desired
63 63 script name, b/c DPyGetOpt strips the first argument only for the real
64 64 sys.argv.
65 65
66 66 - user_ns: a dict to be used as the user's namespace."""
67 67
68 68 #----------------------------------------------------------------------
69 69 # Defaults and initialization
70 70
71 71 # For developer debugging, deactivates crash handler and uses pdb.
72 72 DEVDEBUG = False
73 73
74 74 if argv is None:
75 75 argv = sys.argv
76 76
77 77 # __IP is the main global that lives throughout and represents the whole
78 78 # application. If the user redefines it, all bets are off as to what
79 79 # happens.
80 80
81 81 # __IP is the name of he global which the caller will have accessible as
82 82 # __IP.name. We set its name via the first parameter passed to
83 83 # InteractiveShell:
84 84
85 85 IP = shell_class('__IP',user_ns=user_ns,**kw)
86 86
87 87 # Put 'help' in the user namespace
88 88 from site import _Helper
89 89 IP.user_ns['help'] = _Helper()
90 90
91 91 if DEVDEBUG:
92 92 # For developer debugging only (global flag)
93 93 from IPython import ultraTB
94 94 sys.excepthook = ultraTB.VerboseTB(call_pdb=1)
95 95 else:
96 96 # IPython itself shouldn't crash. This will produce a detailed
97 97 # post-mortem if it does
98 98 from IPython import CrashHandler
99 99 sys.excepthook = CrashHandler.CrashHandler(IP)
100 100
101 101 IP.BANNER_PARTS = ['Python %s\n'
102 102 'Type "copyright", "credits" or "license" '
103 103 'for more information.\n'
104 104 % (sys.version.split('\n')[0],),
105 105 "IPython %s -- An enhanced Interactive Python."
106 106 % (__version__,),
107 107 """? -> Introduction to IPython's features.
108 108 %magic -> Information about IPython's 'magic' % functions.
109 109 help -> Python's own help system.
110 110 object? -> Details about 'object'. ?object also works, ?? prints more.
111 111 """ ]
112 112
113 113 IP.usage = interactive_usage
114 114
115 115 # Platform-dependent suffix and directory names
116 116 if os.name == 'posix':
117 117 rc_suffix = ''
118 118 ipdir_def = '.ipython'
119 119 else:
120 120 rc_suffix = '.ini'
121 121 ipdir_def = '_ipython'
122 122
123 123 # default directory for configuration
124 124 ipythondir = os.path.abspath(os.environ.get('IPYTHONDIR',
125 125 os.path.join(IP.home_dir,ipdir_def)))
126 126
127 127 # we need the directory where IPython itself is installed
128 128 import IPython
129 129 IPython_dir = os.path.dirname(IPython.__file__)
130 130 del IPython
131 131
132 132 #-------------------------------------------------------------------------
133 133 # Command line handling
134 134
135 135 # Valid command line options (uses DPyGetOpt syntax, like Perl's
136 136 # GetOpt::Long)
137 137
138 138 # Any key not listed here gets deleted even if in the file (like session
139 139 # or profile). That's deliberate, to maintain the rc namespace clean.
140 140
141 141 # Each set of options appears twice: under _conv only the names are
142 142 # listed, indicating which type they must be converted to when reading the
143 143 # ipythonrc file. And under DPyGetOpt they are listed with the regular
144 144 # DPyGetOpt syntax (=s,=i,:f,etc).
145 145
146 146 # Make sure there's a space before each end of line (they get auto-joined!)
147 147 cmdline_opts = ('autocall! autoindent! automagic! banner! cache_size|cs=i '
148 148 'c=s classic|cl color_info! colors=s confirm_exit! '
149 149 'debug! deep_reload! editor=s log|l messages! nosep pdb! '
150 150 'pprint! prompt_in1|pi1=s prompt_in2|pi2=s prompt_out|po=s '
151 151 'quick screen_length|sl=i prompts_pad_left=i '
152 152 'logfile|lf=s logplay|lp=s profile|p=s '
153 153 'readline! readline_merge_completions! '
154 154 'readline_omit__names! '
155 155 'rcfile=s separate_in|si=s separate_out|so=s '
156 156 'separate_out2|so2=s xmode=s '
157 157 'magic_docstrings system_verbose! '
158 158 'multi_line_specials!')
159 159
160 160 # Options that can *only* appear at the cmd line (not in rcfiles).
161 161
162 162 # The "ignore" option is a kludge so that Emacs buffers don't crash, since
163 163 # the 'C-c !' command in emacs automatically appends a -i option at the end.
164 164 cmdline_only = ('help ignore|i ipythondir=s Version upgrade '
165 165 'gthread! qthread! wthread! pylab! tk!')
166 166
167 167 # Build the actual name list to be used by DPyGetOpt
168 168 opts_names = qw(cmdline_opts) + qw(cmdline_only)
169 169
170 170 # Set sensible command line defaults.
171 171 # This should have everything from cmdline_opts and cmdline_only
172 172 opts_def = Struct(autocall = 1,
173 173 autoindent=0,
174 174 automagic = 1,
175 175 banner = 1,
176 176 cache_size = 1000,
177 177 c = '',
178 178 classic = 0,
179 179 colors = 'NoColor',
180 180 color_info = 0,
181 181 confirm_exit = 1,
182 182 debug = 0,
183 183 deep_reload = 0,
184 184 editor = '0',
185 185 help = 0,
186 186 ignore = 0,
187 187 ipythondir = ipythondir,
188 188 log = 0,
189 189 logfile = '',
190 190 logplay = '',
191 191 multi_line_specials = 1,
192 192 messages = 1,
193 193 nosep = 0,
194 194 pdb = 0,
195 195 pprint = 0,
196 196 profile = '',
197 prompt_in1 = 'In [\\#]:',
198 prompt_in2 = ' .\\D.:',
199 prompt_out = 'Out[\\#]:',
197 prompt_in1 = 'In [\\#]: ',
198 prompt_in2 = ' .\\D.: ',
199 prompt_out = 'Out[\\#]: ',
200 200 prompts_pad_left = 1,
201 201 quick = 0,
202 202 readline = 1,
203 203 readline_merge_completions = 1,
204 204 readline_omit__names = 0,
205 205 rcfile = 'ipythonrc' + rc_suffix,
206 206 screen_length = 0,
207 207 separate_in = '\n',
208 208 separate_out = '\n',
209 209 separate_out2 = '',
210 210 system_verbose = 0,
211 211 gthread = 0,
212 212 qthread = 0,
213 213 wthread = 0,
214 214 pylab = 0,
215 215 tk = 0,
216 216 upgrade = 0,
217 217 Version = 0,
218 218 xmode = 'Verbose',
219 219 magic_docstrings = 0, # undocumented, for doc generation
220 220 )
221 221
222 222 # Things that will *only* appear in rcfiles (not at the command line).
223 223 # Make sure there's a space before each end of line (they get auto-joined!)
224 224 rcfile_opts = { qwflat: 'include import_mod import_all execfile ',
225 225 qw_lol: 'import_some ',
226 226 # for things with embedded whitespace:
227 227 list_strings:'execute alias readline_parse_and_bind ',
228 228 # Regular strings need no conversion:
229 229 None:'readline_remove_delims ',
230 230 }
231 231 # Default values for these
232 232 rc_def = Struct(include = [],
233 233 import_mod = [],
234 234 import_all = [],
235 235 import_some = [[]],
236 236 execute = [],
237 237 execfile = [],
238 238 alias = [],
239 239 readline_parse_and_bind = [],
240 240 readline_remove_delims = '',
241 241 )
242 242
243 243 # Build the type conversion dictionary from the above tables:
244 244 typeconv = rcfile_opts.copy()
245 245 typeconv.update(optstr2types(cmdline_opts))
246 246
247 247 # FIXME: the None key appears in both, put that back together by hand. Ugly!
248 248 typeconv[None] += ' ' + rcfile_opts[None]
249 249
250 250 # Remove quotes at ends of all strings (used to protect spaces)
251 251 typeconv[unquote_ends] = typeconv[None]
252 252 del typeconv[None]
253 253
254 254 # Build the list we'll use to make all config decisions with defaults:
255 255 opts_all = opts_def.copy()
256 256 opts_all.update(rc_def)
257 257
258 258 # Build conflict resolver for recursive loading of config files:
259 259 # - preserve means the outermost file maintains the value, it is not
260 260 # overwritten if an included file has the same key.
261 261 # - add_flip applies + to the two values, so it better make sense to add
262 262 # those types of keys. But it flips them first so that things loaded
263 263 # deeper in the inclusion chain have lower precedence.
264 264 conflict = {'preserve': ' '.join([ typeconv[int],
265 265 typeconv[unquote_ends] ]),
266 266 'add_flip': ' '.join([ typeconv[qwflat],
267 267 typeconv[qw_lol],
268 268 typeconv[list_strings] ])
269 269 }
270 270
271 271 # Now actually process the command line
272 272 getopt = DPyGetOpt.DPyGetOpt()
273 273 getopt.setIgnoreCase(0)
274 274
275 275 getopt.parseConfiguration(opts_names)
276 276
277 277 try:
278 278 getopt.processArguments(argv)
279 279 except:
280 280 print cmd_line_usage
281 281 warn('\nError in Arguments: ' + `sys.exc_value`)
282 282 sys.exit()
283 283
284 284 # convert the options dict to a struct for much lighter syntax later
285 285 opts = Struct(getopt.optionValues)
286 286 args = getopt.freeValues
287 287
288 288 # this is the struct (which has default values at this point) with which
289 289 # we make all decisions:
290 290 opts_all.update(opts)
291 291
292 292 # Options that force an immediate exit
293 293 if opts_all.help:
294 294 page(cmd_line_usage)
295 295 sys.exit()
296 296
297 297 if opts_all.Version:
298 298 print __version__
299 299 sys.exit()
300 300
301 301 if opts_all.magic_docstrings:
302 302 IP.magic_magic('-latex')
303 303 sys.exit()
304 304
305 305 # Create user config directory if it doesn't exist. This must be done
306 306 # *after* getting the cmd line options.
307 307 if not os.path.isdir(opts_all.ipythondir):
308 308 IP.user_setup(opts_all.ipythondir,rc_suffix,'install')
309 309
310 310 # upgrade user config files while preserving a copy of the originals
311 311 if opts_all.upgrade:
312 312 IP.user_setup(opts_all.ipythondir,rc_suffix,'upgrade')
313 313
314 314 # check mutually exclusive options in the *original* command line
315 315 mutex_opts(opts,[qw('log logfile'),qw('rcfile profile'),
316 316 qw('classic profile'),qw('classic rcfile')])
317 317
318 318 # default logfilename used when -log is called.
319 319 IP.LOGDEF = 'ipython.log'
320 320
321 321 #---------------------------------------------------------------------------
322 322 # Log replay
323 323
324 324 # if -logplay, we need to 'become' the other session. That basically means
325 325 # replacing the current command line environment with that of the old
326 326 # session and moving on.
327 327
328 328 # this is needed so that later we know we're in session reload mode, as
329 329 # opts_all will get overwritten:
330 330 load_logplay = 0
331 331
332 332 if opts_all.logplay:
333 333 load_logplay = opts_all.logplay
334 334 opts_debug_save = opts_all.debug
335 335 try:
336 336 logplay = open(opts_all.logplay)
337 337 except IOError:
338 338 if opts_all.debug: IP.InteractiveTB()
339 339 warn('Could not open logplay file '+`opts_all.logplay`)
340 340 # restore state as if nothing had happened and move on, but make
341 341 # sure that later we don't try to actually load the session file
342 342 logplay = None
343 343 load_logplay = 0
344 344 del opts_all.logplay
345 345 else:
346 346 try:
347 347 logplay.readline()
348 348 logplay.readline();
349 349 # this reloads that session's command line
350 350 cmd = logplay.readline()[6:]
351 351 exec cmd
352 352 # restore the true debug flag given so that the process of
353 353 # session loading itself can be monitored.
354 354 opts.debug = opts_debug_save
355 355 # save the logplay flag so later we don't overwrite the log
356 356 opts.logplay = load_logplay
357 357 # now we must update our own structure with defaults
358 358 opts_all.update(opts)
359 359 # now load args
360 360 cmd = logplay.readline()[6:]
361 361 exec cmd
362 362 logplay.close()
363 363 except:
364 364 logplay.close()
365 365 if opts_all.debug: IP.InteractiveTB()
366 366 warn("Logplay file lacking full configuration information.\n"
367 367 "I'll try to read it, but some things may not work.")
368 368
369 369 #-------------------------------------------------------------------------
370 370 # set up output traps: catch all output from files, being run, modules
371 371 # loaded, etc. Then give it to the user in a clean form at the end.
372 372
373 373 msg_out = 'Output messages. '
374 374 msg_err = 'Error messages. '
375 375 msg_sep = '\n'
376 376 msg = Struct(config = OutputTrap('Configuration Loader',msg_out,
377 377 msg_err,msg_sep,debug,
378 378 quiet_out=1),
379 379 user_exec = OutputTrap('User File Execution',msg_out,
380 380 msg_err,msg_sep,debug),
381 381 logplay = OutputTrap('Log Loader',msg_out,
382 382 msg_err,msg_sep,debug),
383 383 summary = ''
384 384 )
385 385
386 386 #-------------------------------------------------------------------------
387 387 # Process user ipythonrc-type configuration files
388 388
389 389 # turn on output trapping and log to msg.config
390 390 # remember that with debug on, trapping is actually disabled
391 391 msg.config.trap_all()
392 392
393 393 # look for rcfile in current or default directory
394 394 try:
395 395 opts_all.rcfile = filefind(opts_all.rcfile,opts_all.ipythondir)
396 396 except IOError:
397 397 if opts_all.debug: IP.InteractiveTB()
398 398 warn('Configuration file %s not found. Ignoring request.'
399 399 % (opts_all.rcfile) )
400 400
401 401 # 'profiles' are a shorthand notation for config filenames
402 402 if opts_all.profile:
403 403 try:
404 404 opts_all.rcfile = filefind('ipythonrc-' + opts_all.profile
405 405 + rc_suffix,
406 406 opts_all.ipythondir)
407 407 except IOError:
408 408 if opts_all.debug: IP.InteractiveTB()
409 409 opts.profile = '' # remove profile from options if invalid
410 410 warn('Profile configuration file %s not found. Ignoring request.'
411 411 % (opts_all.profile) )
412 412
413 413 # load the config file
414 414 rcfiledata = None
415 415 if opts_all.quick:
416 416 print 'Launching IPython in quick mode. No config file read.'
417 417 elif opts_all.classic:
418 418 print 'Launching IPython in classic mode. No config file read.'
419 419 elif opts_all.rcfile:
420 420 try:
421 421 cfg_loader = ConfigLoader(conflict)
422 422 rcfiledata = cfg_loader.load(opts_all.rcfile,typeconv,
423 423 'include',opts_all.ipythondir,
424 424 purge = 1,
425 425 unique = conflict['preserve'])
426 426 except:
427 427 IP.InteractiveTB()
428 428 warn('Problems loading configuration file '+
429 429 `opts_all.rcfile`+
430 430 '\nStarting with default -bare bones- configuration.')
431 431 else:
432 432 warn('No valid configuration file found in either currrent directory\n'+
433 433 'or in the IPython config. directory: '+`opts_all.ipythondir`+
434 434 '\nProceeding with internal defaults.')
435 435
436 436 #------------------------------------------------------------------------
437 437 # Set exception handlers in mode requested by user.
438 438 otrap = OutputTrap(trap_out=1) # trap messages from magic_xmode
439 439 IP.magic_xmode(opts_all.xmode)
440 440 otrap.release_out()
441 441
442 442 #------------------------------------------------------------------------
443 443 # Execute user config
444 444
445 445 # first, create a valid config structure with the right precedence order:
446 446 # defaults < rcfile < command line
447 447 IP.rc = rc_def.copy()
448 448 IP.rc.update(opts_def)
449 449 if rcfiledata:
450 450 # now we can update
451 451 IP.rc.update(rcfiledata)
452 452 IP.rc.update(opts)
453 453 IP.rc.update(rc_override)
454 454
455 455 # Store the original cmd line for reference:
456 456 IP.rc.opts = opts
457 457 IP.rc.args = args
458 458
459 459 # create a *runtime* Struct like rc for holding parameters which may be
460 460 # created and/or modified by runtime user extensions.
461 461 IP.runtime_rc = Struct()
462 462
463 463 # from this point on, all config should be handled through IP.rc,
464 464 # opts* shouldn't be used anymore.
465 465
466 466 # add personal .ipython dir to sys.path so that users can put things in
467 467 # there for customization
468 468 sys.path.append(IP.rc.ipythondir)
469 469 sys.path.insert(0, '') # add . to sys.path. Fix from Prabhu Ramachandran
470 470
471 471 # update IP.rc with some special things that need manual
472 472 # tweaks. Basically options which affect other options. I guess this
473 473 # should just be written so that options are fully orthogonal and we
474 474 # wouldn't worry about this stuff!
475 475
476 476 if IP.rc.classic:
477 477 IP.rc.quick = 1
478 478 IP.rc.cache_size = 0
479 479 IP.rc.pprint = 0
480 480 IP.rc.prompt_in1 = '>>> '
481 481 IP.rc.prompt_in2 = '... '
482 482 IP.rc.prompt_out = ''
483 483 IP.rc.separate_in = IP.rc.separate_out = IP.rc.separate_out2 = '0'
484 484 IP.rc.colors = 'NoColor'
485 485 IP.rc.xmode = 'Plain'
486 486
487 487 # configure readline
488 488 # Define the history file for saving commands in between sessions
489 489 if IP.rc.profile:
490 490 histfname = 'history-%s' % IP.rc.profile
491 491 else:
492 492 histfname = 'history'
493 493 IP.histfile = os.path.join(opts_all.ipythondir,histfname)
494 494 # Load readline proper
495 495 if IP.rc.readline:
496 496 IP.init_readline()
497 497
498 498 # update exception handlers with rc file status
499 499 otrap.trap_out() # I don't want these messages ever.
500 500 IP.magic_xmode(IP.rc.xmode)
501 501 otrap.release_out()
502 502
503 503 # activate logging if requested and not reloading a log
504 504 if IP.rc.logplay:
505 505 IP.magic_logstart(IP.rc.logplay + ' append')
506 506 elif IP.rc.logfile:
507 507 IP.magic_logstart(IP.rc.logfile)
508 508 elif IP.rc.log:
509 509 IP.magic_logstart()
510 510
511 511 # find user editor so that it we don't have to look it up constantly
512 512 if IP.rc.editor.strip()=='0':
513 513 try:
514 514 ed = os.environ['EDITOR']
515 515 except KeyError:
516 516 if os.name == 'posix':
517 517 ed = 'vi' # the only one guaranteed to be there!
518 518 else:
519 519 ed = 'notepad' # same in Windows!
520 520 IP.rc.editor = ed
521 521
522 522 # Recursive reload
523 523 try:
524 524 from IPython import deep_reload
525 525 if IP.rc.deep_reload:
526 526 __builtin__.reload = deep_reload.reload
527 527 else:
528 528 __builtin__.dreload = deep_reload.reload
529 529 del deep_reload
530 530 except ImportError:
531 531 pass
532 532
533 533 # Save the current state of our namespace so that the interactive shell
534 534 # can later know which variables have been created by us from config files
535 535 # and loading. This way, loading a file (in any way) is treated just like
536 536 # defining things on the command line, and %who works as expected.
537 537
538 538 # DON'T do anything that affects the namespace beyond this point!
539 539 IP.internal_ns = __main__.__dict__.copy()
540 540
541 541 #IP.internal_ns.update(locals()) # so our stuff doesn't show up in %who
542 542
543 543 # Now run through the different sections of the users's config
544 544 if IP.rc.debug:
545 545 print 'Trying to execute the following configuration structure:'
546 546 print '(Things listed first are deeper in the inclusion tree and get'
547 547 print 'loaded first).\n'
548 548 pprint(IP.rc.__dict__)
549 549
550 550 for mod in IP.rc.import_mod:
551 551 try:
552 552 exec 'import '+mod in IP.user_ns
553 553 except :
554 554 IP.InteractiveTB()
555 555 import_fail_info(mod)
556 556
557 557 for mod_fn in IP.rc.import_some:
558 558 if mod_fn == []: break
559 559 mod,fn = mod_fn[0],','.join(mod_fn[1:])
560 560 try:
561 561 exec 'from '+mod+' import '+fn in IP.user_ns
562 562 except :
563 563 IP.InteractiveTB()
564 564 import_fail_info(mod,fn)
565 565
566 566 for mod in IP.rc.import_all:
567 567 try:
568 568 exec 'from '+mod+' import *' in IP.user_ns
569 569 except :
570 570 IP.InteractiveTB()
571 571 import_fail_info(mod)
572 572
573 573 for code in IP.rc.execute:
574 574 try:
575 575 exec code in IP.user_ns
576 576 except:
577 577 IP.InteractiveTB()
578 578 warn('Failure executing code: ' + `code`)
579 579
580 580 # Execute the files the user wants in ipythonrc
581 581 for file in IP.rc.execfile:
582 582 try:
583 583 file = filefind(file,sys.path+[IPython_dir])
584 584 except IOError:
585 585 warn(itpl('File $file not found. Skipping it.'))
586 586 else:
587 587 IP.safe_execfile(os.path.expanduser(file),IP.user_ns)
588 588
589 589 # Load user aliases
590 590 for alias in IP.rc.alias:
591 591 IP.magic_alias(alias)
592 592
593 593 # release stdout and stderr and save config log into a global summary
594 594 msg.config.release_all()
595 595 if IP.rc.messages:
596 596 msg.summary += msg.config.summary_all()
597 597
598 598 #------------------------------------------------------------------------
599 599 # Setup interactive session
600 600
601 601 # Now we should be fully configured. We can then execute files or load
602 602 # things only needed for interactive use. Then we'll open the shell.
603 603
604 604 # Take a snapshot of the user namespace before opening the shell. That way
605 605 # we'll be able to identify which things were interactively defined and
606 606 # which were defined through config files.
607 607 IP.user_config_ns = IP.user_ns.copy()
608 608
609 609 # Force reading a file as if it were a session log. Slower but safer.
610 610 if load_logplay:
611 611 print 'Replaying log...'
612 612 try:
613 613 if IP.rc.debug:
614 614 logplay_quiet = 0
615 615 else:
616 616 logplay_quiet = 1
617 617
618 618 msg.logplay.trap_all()
619 619 IP.safe_execfile(load_logplay,IP.user_ns,
620 620 islog = 1, quiet = logplay_quiet)
621 621 msg.logplay.release_all()
622 622 if IP.rc.messages:
623 623 msg.summary += msg.logplay.summary_all()
624 624 except:
625 625 warn('Problems replaying logfile %s.' % load_logplay)
626 626 IP.InteractiveTB()
627 627
628 628 # Load remaining files in command line
629 629 msg.user_exec.trap_all()
630 630
631 631 # Do NOT execute files named in the command line as scripts to be loaded
632 632 # by embedded instances. Doing so has the potential for an infinite
633 633 # recursion if there are exceptions thrown in the process.
634 634
635 635 # XXX FIXME: the execution of user files should be moved out to after
636 636 # ipython is fully initialized, just as if they were run via %run at the
637 637 # ipython prompt. This would also give them the benefit of ipython's
638 638 # nice tracebacks.
639 639
640 640 if not embedded and IP.rc.args:
641 641 name_save = IP.user_ns['__name__']
642 642 IP.user_ns['__name__'] = '__main__'
643 643 try:
644 644 # Set our own excepthook in case the user code tries to call it
645 645 # directly. This prevents triggering the IPython crash handler.
646 646 old_excepthook,sys.excepthook = sys.excepthook, IP.excepthook
647 647 for run in args:
648 648 IP.safe_execfile(run,IP.user_ns)
649 649 finally:
650 650 # Reset our crash handler in place
651 651 sys.excepthook = old_excepthook
652 652
653 653 IP.user_ns['__name__'] = name_save
654 654
655 655 msg.user_exec.release_all()
656 656 if IP.rc.messages:
657 657 msg.summary += msg.user_exec.summary_all()
658 658
659 659 # since we can't specify a null string on the cmd line, 0 is the equivalent:
660 660 if IP.rc.nosep:
661 661 IP.rc.separate_in = IP.rc.separate_out = IP.rc.separate_out2 = '0'
662 662 if IP.rc.separate_in == '0': IP.rc.separate_in = ''
663 663 if IP.rc.separate_out == '0': IP.rc.separate_out = ''
664 664 if IP.rc.separate_out2 == '0': IP.rc.separate_out2 = ''
665 665 IP.rc.separate_in = IP.rc.separate_in.replace('\\n','\n')
666 666 IP.rc.separate_out = IP.rc.separate_out.replace('\\n','\n')
667 667 IP.rc.separate_out2 = IP.rc.separate_out2.replace('\\n','\n')
668 668
669 669 # Determine how many lines at the bottom of the screen are needed for
670 670 # showing prompts, so we can know wheter long strings are to be printed or
671 671 # paged:
672 672 num_lines_bot = IP.rc.separate_in.count('\n')+1
673 673 IP.rc.screen_length = IP.rc.screen_length - num_lines_bot
674 674 # Initialize cache, set in/out prompts and printing system
675 675 IP.outputcache = CachedOutput(IP.rc.cache_size,
676 676 IP.rc.pprint,
677 677 input_sep = IP.rc.separate_in,
678 678 output_sep = IP.rc.separate_out,
679 679 output_sep2 = IP.rc.separate_out2,
680 680 ps1 = IP.rc.prompt_in1,
681 681 ps2 = IP.rc.prompt_in2,
682 682 ps_out = IP.rc.prompt_out,
683 683 user_ns = IP.user_ns,
684 684 input_hist = IP.input_hist,
685 685 pad_left = IP.rc.prompts_pad_left)
686 686
687 687 # Set user colors (don't do it in the constructor above so that it doesn't
688 688 # crash if colors option is invalid)
689 689 IP.magic_colors(IP.rc.colors)
690 690
691 691 # user may have over-ridden the default print hook:
692 692 try:
693 693 IP.outputcache.__class__.display = IP.hooks.display
694 694 except AttributeError:
695 695 pass
696 696
697 697 # Set calling of pdb on exceptions
698 698 IP.InteractiveTB.call_pdb = IP.rc.pdb
699 699
700 700 # I don't like assigning globally to sys, because it means when embedding
701 701 # instances, each embedded instance overrides the previous choice. But
702 702 # sys.displayhook seems to be called internally by exec, so I don't see a
703 703 # way around it.
704 704 sys.displayhook = IP.outputcache
705 705
706 706 # we need to know globally if we're caching i/o or not
707 707 IP.do_full_cache = IP.outputcache.do_full_cache
708 708
709 709 # configure startup banner
710 710 if IP.rc.c: # regular python doesn't print the banner with -c
711 711 IP.rc.banner = 0
712 712 if IP.rc.banner:
713 713 IP.BANNER = '\n'.join(IP.BANNER_PARTS)
714 714 else:
715 715 IP.BANNER = ''
716 716
717 717 if IP.rc.profile: IP.BANNER += '\nIPython profile: '+IP.rc.profile+'\n'
718 718
719 719 # add message log (possibly empty)
720 720 IP.BANNER += msg.summary
721 721
722 722 IP.post_config_initialization()
723 723
724 724 return IP
725 725 #************************ end of file <ipmaker.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