##// END OF EJS Templates
- Fix autoindent which I had broken......
fperez -
Show More

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

@@ -1,2071 +1,2056 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 977 2005-12-30 01:23:52Z fperez $
9 $Id: iplib.py 978 2005-12-30 02:37:15Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
13 13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 14 # Copyright (C) 2001-2005 Fernando Perez. <fperez@colorado.edu>
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #
19 19 # Note: this code originally subclassed code.InteractiveConsole from the
20 20 # Python standard library. Over time, all of that class has been copied
21 21 # verbatim here for modifications which could not be accomplished by
22 22 # subclassing. At this point, there are no dependencies at all on the code
23 23 # module anymore (it is not even imported). The Python License (sec. 2)
24 24 # allows for this, but it's always nice to acknowledge credit where credit is
25 25 # due.
26 26 #*****************************************************************************
27 27
28 28 #****************************************************************************
29 29 # Modules and globals
30 30
31 31 from __future__ import generators # for 2.2 backwards-compatibility
32 32
33 33 from IPython import Release
34 34 __author__ = '%s <%s>\n%s <%s>' % \
35 35 ( Release.authors['Janko'] + Release.authors['Fernando'] )
36 36 __license__ = Release.license
37 37 __version__ = Release.version
38 38
39 39 # Python standard modules
40 40 import __main__
41 41 import __builtin__
42 42 import StringIO
43 43 import bdb
44 44 import cPickle as pickle
45 45 import codeop
46 46 import exceptions
47 47 import glob
48 48 import inspect
49 49 import keyword
50 50 import new
51 51 import os
52 52 import pdb
53 53 import pydoc
54 54 import re
55 55 import shutil
56 56 import string
57 57 import sys
58 58 import traceback
59 59 import types
60 60
61 61 from pprint import pprint, pformat
62 62
63 63 # IPython's own modules
64 64 import IPython
65 65 from IPython import OInspect,PyColorize,ultraTB
66 66 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
67 67 from IPython.FakeModule import FakeModule
68 68 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
69 69 from IPython.Logger import Logger
70 70 from IPython.Magic import Magic
71 71 from IPython.Prompts import CachedOutput
72 72 from IPython.Struct import Struct
73 73 from IPython.background_jobs import BackgroundJobManager
74 74 from IPython.usage import cmd_line_usage,interactive_usage
75 75 from IPython.genutils import *
76 76
77 77 # store the builtin raw_input globally, and use this always, in case user code
78 78 # overwrites it (like wx.py.PyShell does)
79 79 raw_input_original = raw_input
80 80
81 81 # compiled regexps for autoindent management
82 82 ini_spaces_re = re.compile(r'^(\s+)')
83 83 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
84 84
85 85 #****************************************************************************
86 86 # Some utility function definitions
87 87
88 88 def softspace(file, newvalue):
89 89 """Copied from code.py, to remove the dependency"""
90 90 oldvalue = 0
91 91 try:
92 92 oldvalue = file.softspace
93 93 except AttributeError:
94 94 pass
95 95 try:
96 96 file.softspace = newvalue
97 97 except (AttributeError, TypeError):
98 98 # "attribute-less object" or "read-only attributes"
99 99 pass
100 100 return oldvalue
101 101
102 102 #****************************************************************************
103 103 # These special functions get installed in the builtin namespace, to provide
104 # programmatic (pure python) access to magics and aliases. This is important
105 # for logging, user scripting, and more.
104 # programmatic (pure python) access to magics, aliases and system calls. This
105 # is important for logging, user scripting, and more.
106
107 # We are basically exposing, via normal python functions, the three mechanisms
108 # in which ipython offers special call modes (magics for internal control,
109 # aliases for direct system access via pre-selected names, and !cmd for
110 # calling arbitrary system commands).
106 111
107 112 def ipmagic(arg_s):
108 113 """Call a magic function by name.
109 114
110 115 Input: a string containing the name of the magic function to call and any
111 116 additional arguments to be passed to the magic.
112 117
113 118 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
114 119 prompt:
115 120
116 121 In[1]: %name -opt foo bar
117 122
118 123 To call a magic without arguments, simply use ipmagic('name').
119 124
120 125 This provides a proper Python function to call IPython's magics in any
121 126 valid Python code you can type at the interpreter, including loops and
122 127 compound statements. It is added by IPython to the Python builtin
123 128 namespace upon initialization."""
124 129
125 130 args = arg_s.split(' ',1)
126 131 magic_name = args[0]
127 132 if magic_name.startswith(__IPYTHON__.ESC_MAGIC):
128 133 magic_name = magic_name[1:]
129 134 try:
130 135 magic_args = args[1]
131 136 except IndexError:
132 137 magic_args = ''
133 138 fn = getattr(__IPYTHON__,'magic_'+magic_name,None)
134 139 if fn is None:
135 140 error("Magic function `%s` not found." % magic_name)
136 141 else:
137 142 magic_args = __IPYTHON__.var_expand(magic_args)
138 143 return fn(magic_args)
139 144
140 145 def ipalias(arg_s):
141 146 """Call an alias by name.
142 147
143 148 Input: a string containing the name of the alias to call and any
144 149 additional arguments to be passed to the magic.
145 150
146 151 ipalias('name -opt foo bar') is equivalent to typing at the ipython
147 152 prompt:
148 153
149 154 In[1]: name -opt foo bar
150 155
151 156 To call an alias without arguments, simply use ipalias('name').
152 157
153 158 This provides a proper Python function to call IPython's aliases in any
154 159 valid Python code you can type at the interpreter, including loops and
155 160 compound statements. It is added by IPython to the Python builtin
156 161 namespace upon initialization."""
157 162
158 163 args = arg_s.split(' ',1)
159 164 alias_name = args[0]
160 165 try:
161 166 alias_args = args[1]
162 167 except IndexError:
163 168 alias_args = ''
164 169 if alias_name in __IPYTHON__.alias_table:
165 170 __IPYTHON__.call_alias(alias_name,alias_args)
166 171 else:
167 172 error("Alias `%s` not found." % alias_name)
168 173
174 def ipsystem(arg_s):
175 """Make a system call, using IPython."""
176 __IPYTHON__.system(arg_s)
177
178
169 179 #****************************************************************************
170 180 # Local use exceptions
171 181 class SpaceInInput(exceptions.Exception): pass
172 182
173 183 #****************************************************************************
174 184 # Local use classes
175 185 class Bunch: pass
176 186
177 187 class InputList(list):
178 188 """Class to store user input.
179 189
180 190 It's basically a list, but slices return a string instead of a list, thus
181 191 allowing things like (assuming 'In' is an instance):
182 192
183 193 exec In[4:7]
184 194
185 195 or
186 196
187 197 exec In[5:9] + In[14] + In[21:25]"""
188 198
189 199 def __getslice__(self,i,j):
190 200 return ''.join(list.__getslice__(self,i,j))
191 201
192 202 class SyntaxTB(ultraTB.ListTB):
193 203 """Extension which holds some state: the last exception value"""
194 204
195 205 def __init__(self,color_scheme = 'NoColor'):
196 206 ultraTB.ListTB.__init__(self,color_scheme)
197 207 self.last_syntax_error = None
198 208
199 209 def __call__(self, etype, value, elist):
200 210 self.last_syntax_error = value
201 211 ultraTB.ListTB.__call__(self,etype,value,elist)
202 212
203 213 def clear_err_state(self):
204 214 """Return the current error state and clear it"""
205 215 e = self.last_syntax_error
206 216 self.last_syntax_error = None
207 217 return e
208 218
209 219 #****************************************************************************
210 220 # Main IPython class
211 221
212 222 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
213 223 # until a full rewrite is made. I've cleaned all cross-class uses of
214 224 # attributes and methods, but too much user code out there relies on the
215 225 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
216 226 #
217 227 # But at least now, all the pieces have been separated and we could, in
218 228 # principle, stop using the mixin. This will ease the transition to the
219 229 # chainsaw branch.
220 230
221 231 # For reference, the following is the list of 'self.foo' uses in the Magic
222 232 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
223 233 # class, to prevent clashes.
224 234
225 235 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
226 236 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
227 237 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
228 238 # 'self.value']
229 239
230 240 class InteractiveShell(Magic):
231 241 """An enhanced console for Python."""
232 242
233 243 # class attribute to indicate whether the class supports threads or not.
234 244 # Subclasses with thread support should override this as needed.
235 245 isthreaded = False
236 246
237 247 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
238 248 user_ns = None,user_global_ns=None,banner2='',
239 249 custom_exceptions=((),None),embedded=False):
240 250
241 251 # some minimal strict typechecks. For some core data structures, I
242 252 # want actual basic python types, not just anything that looks like
243 253 # one. This is especially true for namespaces.
244 254 for ns in (user_ns,user_global_ns):
245 255 if ns is not None and type(ns) != types.DictType:
246 256 raise TypeError,'namespace must be a dictionary'
247 257
248 258 # Put a reference to self in builtins so that any form of embedded or
249 259 # imported code can test for being inside IPython.
250 260 __builtin__.__IPYTHON__ = self
251 261
252 # And load into builtins ipmagic/ipalias as well
253 __builtin__.ipmagic = ipmagic
254 __builtin__.ipalias = ipalias
262 # And load into builtins ipmagic/ipalias/ipsystem as well
263 __builtin__.ipmagic = ipmagic
264 __builtin__.ipalias = ipalias
265 __builtin__.ipsystem = ipsystem
255 266
256 267 # Add to __builtin__ other parts of IPython's public API
257 268 __builtin__.ip_set_hook = self.set_hook
258 269
259 270 # Keep in the builtins a flag for when IPython is active. We set it
260 271 # with setdefault so that multiple nested IPythons don't clobber one
261 272 # another. Each will increase its value by one upon being activated,
262 273 # which also gives us a way to determine the nesting level.
263 274 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
264 275
265 276 # Do the intuitively correct thing for quit/exit: we remove the
266 277 # builtins if they exist, and our own prefilter routine will handle
267 278 # these special cases
268 279 try:
269 280 del __builtin__.exit, __builtin__.quit
270 281 except AttributeError:
271 282 pass
272 283
273 284 # Store the actual shell's name
274 285 self.name = name
275 286
276 287 # We need to know whether the instance is meant for embedding, since
277 288 # global/local namespaces need to be handled differently in that case
278 289 self.embedded = embedded
279 290
280 291 # command compiler
281 292 self.compile = codeop.CommandCompiler()
282 293
283 294 # User input buffer
284 295 self.buffer = []
285 296
286 297 # Default name given in compilation of code
287 298 self.filename = '<ipython console>'
288 299
289 300 # Create the namespace where the user will operate. user_ns is
290 301 # normally the only one used, and it is passed to the exec calls as
291 302 # the locals argument. But we do carry a user_global_ns namespace
292 303 # given as the exec 'globals' argument, This is useful in embedding
293 304 # situations where the ipython shell opens in a context where the
294 305 # distinction between locals and globals is meaningful.
295 306
296 307 # FIXME. For some strange reason, __builtins__ is showing up at user
297 308 # level as a dict instead of a module. This is a manual fix, but I
298 309 # should really track down where the problem is coming from. Alex
299 310 # Schmolck reported this problem first.
300 311
301 312 # A useful post by Alex Martelli on this topic:
302 313 # Re: inconsistent value from __builtins__
303 314 # Von: Alex Martelli <aleaxit@yahoo.com>
304 315 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
305 316 # Gruppen: comp.lang.python
306 317
307 318 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
308 319 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
309 320 # > <type 'dict'>
310 321 # > >>> print type(__builtins__)
311 322 # > <type 'module'>
312 323 # > Is this difference in return value intentional?
313 324
314 325 # Well, it's documented that '__builtins__' can be either a dictionary
315 326 # or a module, and it's been that way for a long time. Whether it's
316 327 # intentional (or sensible), I don't know. In any case, the idea is
317 328 # that if you need to access the built-in namespace directly, you
318 329 # should start with "import __builtin__" (note, no 's') which will
319 330 # definitely give you a module. Yeah, it's somewhat confusing:-(.
320 331
321 332 if user_ns is None:
322 333 # Set __name__ to __main__ to better match the behavior of the
323 334 # normal interpreter.
324 335 user_ns = {'__name__' :'__main__',
325 336 '__builtins__' : __builtin__,
326 337 }
327 338
328 339 if user_global_ns is None:
329 340 user_global_ns = {}
330 341
331 342 # Assign namespaces
332 343 # This is the namespace where all normal user variables live
333 344 self.user_ns = user_ns
334 345 # Embedded instances require a separate namespace for globals.
335 346 # Normally this one is unused by non-embedded instances.
336 347 self.user_global_ns = user_global_ns
337 348 # A namespace to keep track of internal data structures to prevent
338 349 # them from cluttering user-visible stuff. Will be updated later
339 350 self.internal_ns = {}
340 351
341 352 # Namespace of system aliases. Each entry in the alias
342 353 # table must be a 2-tuple of the form (N,name), where N is the number
343 354 # of positional arguments of the alias.
344 355 self.alias_table = {}
345 356
346 357 # A table holding all the namespaces IPython deals with, so that
347 358 # introspection facilities can search easily.
348 359 self.ns_table = {'user':user_ns,
349 360 'user_global':user_global_ns,
350 361 'alias':self.alias_table,
351 362 'internal':self.internal_ns,
352 363 'builtin':__builtin__.__dict__
353 364 }
354 365
355 366 # The user namespace MUST have a pointer to the shell itself.
356 367 self.user_ns[name] = self
357 368
358 369 # We need to insert into sys.modules something that looks like a
359 370 # module but which accesses the IPython namespace, for shelve and
360 371 # pickle to work interactively. Normally they rely on getting
361 372 # everything out of __main__, but for embedding purposes each IPython
362 373 # instance has its own private namespace, so we can't go shoving
363 374 # everything into __main__.
364 375
365 376 # note, however, that we should only do this for non-embedded
366 377 # ipythons, which really mimic the __main__.__dict__ with their own
367 378 # namespace. Embedded instances, on the other hand, should not do
368 379 # this because they need to manage the user local/global namespaces
369 380 # only, but they live within a 'normal' __main__ (meaning, they
370 381 # shouldn't overtake the execution environment of the script they're
371 382 # embedded in).
372 383
373 384 if not embedded:
374 385 try:
375 386 main_name = self.user_ns['__name__']
376 387 except KeyError:
377 388 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
378 389 else:
379 390 #print "pickle hack in place" # dbg
380 391 sys.modules[main_name] = FakeModule(self.user_ns)
381 392
382 393 # List of input with multi-line handling.
383 394 # Fill its zero entry, user counter starts at 1
384 395 self.input_hist = InputList(['\n'])
385 396
386 397 # list of visited directories
387 398 try:
388 399 self.dir_hist = [os.getcwd()]
389 400 except IOError, e:
390 401 self.dir_hist = []
391 402
392 403 # dict of output history
393 404 self.output_hist = {}
394 405
395 406 # dict of things NOT to alias (keywords, builtins and some magics)
396 407 no_alias = {}
397 408 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
398 409 for key in keyword.kwlist + no_alias_magics:
399 410 no_alias[key] = 1
400 411 no_alias.update(__builtin__.__dict__)
401 412 self.no_alias = no_alias
402 413
403 414 # make global variables for user access to these
404 415 self.user_ns['_ih'] = self.input_hist
405 416 self.user_ns['_oh'] = self.output_hist
406 417 self.user_ns['_dh'] = self.dir_hist
407 418
408 419 # user aliases to input and output histories
409 420 self.user_ns['In'] = self.input_hist
410 421 self.user_ns['Out'] = self.output_hist
411 422
412 423 # Object variable to store code object waiting execution. This is
413 424 # used mainly by the multithreaded shells, but it can come in handy in
414 425 # other situations. No need to use a Queue here, since it's a single
415 426 # item which gets cleared once run.
416 427 self.code_to_run = None
417 428
418 429 # Job manager (for jobs run as background threads)
419 430 self.jobs = BackgroundJobManager()
420 431 # Put the job manager into builtins so it's always there.
421 432 __builtin__.jobs = self.jobs
422 433
423 434 # escapes for automatic behavior on the command line
424 435 self.ESC_SHELL = '!'
425 436 self.ESC_HELP = '?'
426 437 self.ESC_MAGIC = '%'
427 438 self.ESC_QUOTE = ','
428 439 self.ESC_QUOTE2 = ';'
429 440 self.ESC_PAREN = '/'
430 441
431 442 # And their associated handlers
432 443 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
433 444 self.ESC_QUOTE : self.handle_auto,
434 445 self.ESC_QUOTE2 : self.handle_auto,
435 446 self.ESC_MAGIC : self.handle_magic,
436 447 self.ESC_HELP : self.handle_help,
437 448 self.ESC_SHELL : self.handle_shell_escape,
438 449 }
439 450
440 451 # class initializations
441 452 Magic.__init__(self,self)
442 453
443 454 # Python source parser/formatter for syntax highlighting
444 455 pyformat = PyColorize.Parser().format
445 456 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
446 457
447 458 # hooks holds pointers used for user-side customizations
448 459 self.hooks = Struct()
449 460
450 461 # Set all default hooks, defined in the IPython.hooks module.
451 462 hooks = IPython.hooks
452 463 for hook_name in hooks.__all__:
453 464 self.set_hook(hook_name,getattr(hooks,hook_name))
454 465
455 466 # Flag to mark unconditional exit
456 467 self.exit_now = False
457 468
458 469 self.usage_min = """\
459 470 An enhanced console for Python.
460 471 Some of its features are:
461 472 - Readline support if the readline library is present.
462 473 - Tab completion in the local namespace.
463 474 - Logging of input, see command-line options.
464 475 - System shell escape via ! , eg !ls.
465 476 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
466 477 - Keeps track of locally defined variables via %who, %whos.
467 478 - Show object information with a ? eg ?x or x? (use ?? for more info).
468 479 """
469 480 if usage: self.usage = usage
470 481 else: self.usage = self.usage_min
471 482
472 483 # Storage
473 484 self.rc = rc # This will hold all configuration information
474 self.inputcache = []
475 self._boundcache = []
476 485 self.pager = 'less'
477 486 # temporary files used for various purposes. Deleted at exit.
478 487 self.tempfiles = []
479 488
480 489 # Keep track of readline usage (later set by init_readline)
481 490 self.has_readline = False
482 491
483 492 # template for logfile headers. It gets resolved at runtime by the
484 493 # logstart method.
485 494 self.loghead_tpl = \
486 495 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
487 496 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
488 497 #log# opts = %s
489 498 #log# args = %s
490 499 #log# It is safe to make manual edits below here.
491 500 #log#-----------------------------------------------------------------------
492 501 """
493 502 # for pushd/popd management
494 503 try:
495 504 self.home_dir = get_home_dir()
496 505 except HomeDirError,msg:
497 506 fatal(msg)
498 507
499 508 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
500 509
501 510 # Functions to call the underlying shell.
502 511
503 512 # utility to expand user variables via Itpl
504 513 self.var_expand = lambda cmd: str(ItplNS(cmd.replace('#','\#'),
505 514 self.user_ns))
506 515 # The first is similar to os.system, but it doesn't return a value,
507 516 # and it allows interpolation of variables in the user's namespace.
508 517 self.system = lambda cmd: shell(self.var_expand(cmd),
509 518 header='IPython system call: ',
510 519 verbose=self.rc.system_verbose)
511 520 # These are for getoutput and getoutputerror:
512 521 self.getoutput = lambda cmd: \
513 522 getoutput(self.var_expand(cmd),
514 523 header='IPython system call: ',
515 524 verbose=self.rc.system_verbose)
516 525 self.getoutputerror = lambda cmd: \
517 526 getoutputerror(str(ItplNS(cmd.replace('#','\#'),
518 527 self.user_ns)),
519 528 header='IPython system call: ',
520 529 verbose=self.rc.system_verbose)
521 530
522 531 # RegExp for splitting line contents into pre-char//first
523 532 # word-method//rest. For clarity, each group in on one line.
524 533
525 534 # WARNING: update the regexp if the above escapes are changed, as they
526 535 # are hardwired in.
527 536
528 537 # Don't get carried away with trying to make the autocalling catch too
529 538 # much: it's better to be conservative rather than to trigger hidden
530 539 # evals() somewhere and end up causing side effects.
531 540
532 541 self.line_split = re.compile(r'^([\s*,;/])'
533 542 r'([\?\w\.]+\w*\s*)'
534 543 r'(\(?.*$)')
535 544
536 545 # Original re, keep around for a while in case changes break something
537 546 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
538 547 # r'(\s*[\?\w\.]+\w*\s*)'
539 548 # r'(\(?.*$)')
540 549
541 550 # RegExp to identify potential function names
542 551 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
543 552 # RegExp to exclude strings with this start from autocalling
544 553 self.re_exclude_auto = re.compile('^[!=()<>,\*/\+-]|^is ')
545 554
546 555 # try to catch also methods for stuff in lists/tuples/dicts: off
547 556 # (experimental). For this to work, the line_split regexp would need
548 557 # to be modified so it wouldn't break things at '['. That line is
549 558 # nasty enough that I shouldn't change it until I can test it _well_.
550 559 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
551 560
552 561 # keep track of where we started running (mainly for crash post-mortem)
553 562 self.starting_dir = os.getcwd()
554 563
555 564 # Various switches which can be set
556 565 self.CACHELENGTH = 5000 # this is cheap, it's just text
557 566 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
558 567 self.banner2 = banner2
559 568
560 569 # TraceBack handlers:
561 570
562 571 # Syntax error handler.
563 572 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
564 573
565 574 # The interactive one is initialized with an offset, meaning we always
566 575 # want to remove the topmost item in the traceback, which is our own
567 576 # internal code. Valid modes: ['Plain','Context','Verbose']
568 577 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
569 578 color_scheme='NoColor',
570 579 tb_offset = 1)
571 580
572 581 # IPython itself shouldn't crash. This will produce a detailed
573 582 # post-mortem if it does. But we only install the crash handler for
574 583 # non-threaded shells, the threaded ones use a normal verbose reporter
575 584 # and lose the crash handler. This is because exceptions in the main
576 585 # thread (such as in GUI code) propagate directly to sys.excepthook,
577 586 # and there's no point in printing crash dumps for every user exception.
578 587 if self.isthreaded:
579 588 sys.excepthook = ultraTB.FormattedTB()
580 589 else:
581 590 from IPython import CrashHandler
582 591 sys.excepthook = CrashHandler.CrashHandler(self)
583 592
584 593 # The instance will store a pointer to this, so that runtime code
585 594 # (such as magics) can access it. This is because during the
586 595 # read-eval loop, it gets temporarily overwritten (to deal with GUI
587 596 # frameworks).
588 597 self.sys_excepthook = sys.excepthook
589 598
590 599 # and add any custom exception handlers the user may have specified
591 600 self.set_custom_exc(*custom_exceptions)
592 601
593 602 # Object inspector
594 603 self.inspector = OInspect.Inspector(OInspect.InspectColors,
595 604 PyColorize.ANSICodeColors,
596 605 'NoColor')
597 606 # indentation management
598 607 self.autoindent = False
599 608 self.indent_current_nsp = 0
600 609 self.indent_current = '' # actual indent string
601 610
602 611 # Make some aliases automatically
603 612 # Prepare list of shell aliases to auto-define
604 613 if os.name == 'posix':
605 614 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
606 615 'mv mv -i','rm rm -i','cp cp -i',
607 616 'cat cat','less less','clear clear',
608 617 # a better ls
609 618 'ls ls -F',
610 619 # long ls
611 620 'll ls -lF',
612 621 # color ls
613 622 'lc ls -F -o --color',
614 623 # ls normal files only
615 624 'lf ls -F -o --color %l | grep ^-',
616 625 # ls symbolic links
617 626 'lk ls -F -o --color %l | grep ^l',
618 627 # directories or links to directories,
619 628 'ldir ls -F -o --color %l | grep /$',
620 629 # things which are executable
621 630 'lx ls -F -o --color %l | grep ^-..x',
622 631 )
623 632 elif os.name in ['nt','dos']:
624 633 auto_alias = ('dir dir /on', 'ls dir /on',
625 634 'ddir dir /ad /on', 'ldir dir /ad /on',
626 635 'mkdir mkdir','rmdir rmdir','echo echo',
627 636 'ren ren','cls cls','copy copy')
628 637 else:
629 638 auto_alias = ()
630 639 self.auto_alias = map(lambda s:s.split(None,1),auto_alias)
631 640 # Call the actual (public) initializer
632 641 self.init_auto_alias()
633 642 # end __init__
634 643
635 644 def post_config_initialization(self):
636 645 """Post configuration init method
637 646
638 647 This is called after the configuration files have been processed to
639 648 'finalize' the initialization."""
640 649
641 650 rc = self.rc
642 651
643 652 # Load readline proper
644 653 if rc.readline:
645 654 self.init_readline()
646 655
647 656 # log system
648 657 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
649 658 # local shortcut, this is used a LOT
650 659 self.log = self.logger.log
651 660
652 661 # Initialize cache, set in/out prompts and printing system
653 662 self.outputcache = CachedOutput(self,
654 663 rc.cache_size,
655 664 rc.pprint,
656 665 input_sep = rc.separate_in,
657 666 output_sep = rc.separate_out,
658 667 output_sep2 = rc.separate_out2,
659 668 ps1 = rc.prompt_in1,
660 669 ps2 = rc.prompt_in2,
661 670 ps_out = rc.prompt_out,
662 671 pad_left = rc.prompts_pad_left)
663 672
664 673 # user may have over-ridden the default print hook:
665 674 try:
666 675 self.outputcache.__class__.display = self.hooks.display
667 676 except AttributeError:
668 677 pass
669 678
670 679 # I don't like assigning globally to sys, because it means when embedding
671 680 # instances, each embedded instance overrides the previous choice. But
672 681 # sys.displayhook seems to be called internally by exec, so I don't see a
673 682 # way around it.
674 683 sys.displayhook = self.outputcache
675 684
676 685 # Set user colors (don't do it in the constructor above so that it
677 686 # doesn't crash if colors option is invalid)
678 687 self.magic_colors(rc.colors)
679 688
680 689 # Set calling of pdb on exceptions
681 690 self.call_pdb = rc.pdb
682 691
683 692 # Load user aliases
684 693 for alias in rc.alias:
685 694 self.magic_alias(alias)
686 695
687 696 # dynamic data that survives through sessions
688 697 # XXX make the filename a config option?
689 698 persist_base = 'persist'
690 699 if rc.profile:
691 700 persist_base += '_%s' % rc.profile
692 701 self.persist_fname = os.path.join(rc.ipythondir,persist_base)
693 702
694 703 try:
695 704 self.persist = pickle.load(file(self.persist_fname))
696 705 except:
697 706 self.persist = {}
698 707
699 708
700 709 for (key, value) in [(k[2:],v) for (k,v) in self.persist.items() if k.startswith('S:')]:
701 710 try:
702 711 obj = pickle.loads(value)
703 712 except:
704 713
705 714 print "Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % key
706 715 print "The error was:",sys.exc_info()[0]
707 716 continue
708 717
709 718
710 719 self.user_ns[key] = obj
711 720
712 721
713 722
714 723
715 724 def set_hook(self,name,hook):
716 725 """set_hook(name,hook) -> sets an internal IPython hook.
717 726
718 727 IPython exposes some of its internal API as user-modifiable hooks. By
719 728 resetting one of these hooks, you can modify IPython's behavior to
720 729 call at runtime your own routines."""
721 730
722 731 # At some point in the future, this should validate the hook before it
723 732 # accepts it. Probably at least check that the hook takes the number
724 733 # of args it's supposed to.
725 734 setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
726 735
727 736 def set_custom_exc(self,exc_tuple,handler):
728 737 """set_custom_exc(exc_tuple,handler)
729 738
730 739 Set a custom exception handler, which will be called if any of the
731 740 exceptions in exc_tuple occur in the mainloop (specifically, in the
732 741 runcode() method.
733 742
734 743 Inputs:
735 744
736 745 - exc_tuple: a *tuple* of valid exceptions to call the defined
737 746 handler for. It is very important that you use a tuple, and NOT A
738 747 LIST here, because of the way Python's except statement works. If
739 748 you only want to trap a single exception, use a singleton tuple:
740 749
741 750 exc_tuple == (MyCustomException,)
742 751
743 752 - handler: this must be defined as a function with the following
744 753 basic interface: def my_handler(self,etype,value,tb).
745 754
746 755 This will be made into an instance method (via new.instancemethod)
747 756 of IPython itself, and it will be called if any of the exceptions
748 757 listed in the exc_tuple are caught. If the handler is None, an
749 758 internal basic one is used, which just prints basic info.
750 759
751 760 WARNING: by putting in your own exception handler into IPython's main
752 761 execution loop, you run a very good chance of nasty crashes. This
753 762 facility should only be used if you really know what you are doing."""
754 763
755 764 assert type(exc_tuple)==type(()) , \
756 765 "The custom exceptions must be given AS A TUPLE."
757 766
758 767 def dummy_handler(self,etype,value,tb):
759 768 print '*** Simple custom exception handler ***'
760 769 print 'Exception type :',etype
761 770 print 'Exception value:',value
762 771 print 'Traceback :',tb
763 772 print 'Source code :','\n'.join(self.buffer)
764 773
765 774 if handler is None: handler = dummy_handler
766 775
767 776 self.CustomTB = new.instancemethod(handler,self,self.__class__)
768 777 self.custom_exceptions = exc_tuple
769 778
770 779 def set_custom_completer(self,completer,pos=0):
771 780 """set_custom_completer(completer,pos=0)
772 781
773 782 Adds a new custom completer function.
774 783
775 784 The position argument (defaults to 0) is the index in the completers
776 785 list where you want the completer to be inserted."""
777 786
778 787 newcomp = new.instancemethod(completer,self.Completer,
779 788 self.Completer.__class__)
780 789 self.Completer.matchers.insert(pos,newcomp)
781 790
782 791 def _get_call_pdb(self):
783 792 return self._call_pdb
784 793
785 794 def _set_call_pdb(self,val):
786 795
787 796 if val not in (0,1,False,True):
788 797 raise ValueError,'new call_pdb value must be boolean'
789 798
790 799 # store value in instance
791 800 self._call_pdb = val
792 801
793 802 # notify the actual exception handlers
794 803 self.InteractiveTB.call_pdb = val
795 804 if self.isthreaded:
796 805 try:
797 806 self.sys_excepthook.call_pdb = val
798 807 except:
799 808 warn('Failed to activate pdb for threaded exception handler')
800 809
801 810 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
802 811 'Control auto-activation of pdb at exceptions')
803 812
804 813 def complete(self,text):
805 814 """Return a sorted list of all possible completions on text.
806 815
807 816 Inputs:
808 817
809 818 - text: a string of text to be completed on.
810 819
811 820 This is a wrapper around the completion mechanism, similar to what
812 821 readline does at the command line when the TAB key is hit. By
813 822 exposing it as a method, it can be used by other non-readline
814 823 environments (such as GUIs) for text completion.
815 824
816 825 Simple usage example:
817 826
818 827 In [1]: x = 'hello'
819 828
820 829 In [2]: __IP.complete('x.l')
821 830 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
822 831
823 832 complete = self.Completer.complete
824 833 state = 0
825 834 # use a dict so we get unique keys, since ipyhton's multiple
826 835 # completers can return duplicates.
827 836 comps = {}
828 837 while True:
829 838 newcomp = complete(text,state)
830 839 if newcomp is None:
831 840 break
832 841 comps[newcomp] = 1
833 842 state += 1
834 843 outcomps = comps.keys()
835 844 outcomps.sort()
836 845 return outcomps
837 846
838 847 def set_completer_frame(self, frame):
839 848 if frame:
840 849 self.Completer.namespace = frame.f_locals
841 850 self.Completer.global_namespace = frame.f_globals
842 851 else:
843 852 self.Completer.namespace = self.user_ns
844 853 self.Completer.global_namespace = self.user_global_ns
845 854
846 855 def init_auto_alias(self):
847 856 """Define some aliases automatically.
848 857
849 858 These are ALL parameter-less aliases"""
850 859 for alias,cmd in self.auto_alias:
851 860 self.alias_table[alias] = (0,cmd)
852 861
853 862 def alias_table_validate(self,verbose=0):
854 863 """Update information about the alias table.
855 864
856 865 In particular, make sure no Python keywords/builtins are in it."""
857 866
858 867 no_alias = self.no_alias
859 868 for k in self.alias_table.keys():
860 869 if k in no_alias:
861 870 del self.alias_table[k]
862 871 if verbose:
863 872 print ("Deleting alias <%s>, it's a Python "
864 873 "keyword or builtin." % k)
865 874
866 875 def set_autoindent(self,value=None):
867 876 """Set the autoindent flag, checking for readline support.
868 877
869 878 If called with no arguments, it acts as a toggle."""
870 879
871 880 if not self.has_readline:
872 881 if os.name == 'posix':
873 882 warn("The auto-indent feature requires the readline library")
874 883 self.autoindent = 0
875 884 return
876 885 if value is None:
877 886 self.autoindent = not self.autoindent
878 887 else:
879 888 self.autoindent = value
880 889
881 890 def rc_set_toggle(self,rc_field,value=None):
882 891 """Set or toggle a field in IPython's rc config. structure.
883 892
884 893 If called with no arguments, it acts as a toggle.
885 894
886 895 If called with a non-existent field, the resulting AttributeError
887 896 exception will propagate out."""
888 897
889 898 rc_val = getattr(self.rc,rc_field)
890 899 if value is None:
891 900 value = not rc_val
892 901 setattr(self.rc,rc_field,value)
893 902
894 903 def user_setup(self,ipythondir,rc_suffix,mode='install'):
895 904 """Install the user configuration directory.
896 905
897 906 Can be called when running for the first time or to upgrade the user's
898 907 .ipython/ directory with the mode parameter. Valid modes are 'install'
899 908 and 'upgrade'."""
900 909
901 910 def wait():
902 911 try:
903 912 raw_input("Please press <RETURN> to start IPython.")
904 913 except EOFError:
905 914 print >> Term.cout
906 915 print '*'*70
907 916
908 917 cwd = os.getcwd() # remember where we started
909 918 glb = glob.glob
910 919 print '*'*70
911 920 if mode == 'install':
912 921 print \
913 922 """Welcome to IPython. I will try to create a personal configuration directory
914 923 where you can customize many aspects of IPython's functionality in:\n"""
915 924 else:
916 925 print 'I am going to upgrade your configuration in:'
917 926
918 927 print ipythondir
919 928
920 929 rcdirend = os.path.join('IPython','UserConfig')
921 930 cfg = lambda d: os.path.join(d,rcdirend)
922 931 try:
923 932 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
924 933 except IOError:
925 934 warning = """
926 935 Installation error. IPython's directory was not found.
927 936
928 937 Check the following:
929 938
930 939 The ipython/IPython directory should be in a directory belonging to your
931 940 PYTHONPATH environment variable (that is, it should be in a directory
932 941 belonging to sys.path). You can copy it explicitly there or just link to it.
933 942
934 943 IPython will proceed with builtin defaults.
935 944 """
936 945 warn(warning)
937 946 wait()
938 947 return
939 948
940 949 if mode == 'install':
941 950 try:
942 951 shutil.copytree(rcdir,ipythondir)
943 952 os.chdir(ipythondir)
944 953 rc_files = glb("ipythonrc*")
945 954 for rc_file in rc_files:
946 955 os.rename(rc_file,rc_file+rc_suffix)
947 956 except:
948 957 warning = """
949 958
950 959 There was a problem with the installation:
951 960 %s
952 961 Try to correct it or contact the developers if you think it's a bug.
953 962 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
954 963 warn(warning)
955 964 wait()
956 965 return
957 966
958 967 elif mode == 'upgrade':
959 968 try:
960 969 os.chdir(ipythondir)
961 970 except:
962 971 print """
963 972 Can not upgrade: changing to directory %s failed. Details:
964 973 %s
965 974 """ % (ipythondir,sys.exc_info()[1])
966 975 wait()
967 976 return
968 977 else:
969 978 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
970 979 for new_full_path in sources:
971 980 new_filename = os.path.basename(new_full_path)
972 981 if new_filename.startswith('ipythonrc'):
973 982 new_filename = new_filename + rc_suffix
974 983 # The config directory should only contain files, skip any
975 984 # directories which may be there (like CVS)
976 985 if os.path.isdir(new_full_path):
977 986 continue
978 987 if os.path.exists(new_filename):
979 988 old_file = new_filename+'.old'
980 989 if os.path.exists(old_file):
981 990 os.remove(old_file)
982 991 os.rename(new_filename,old_file)
983 992 shutil.copy(new_full_path,new_filename)
984 993 else:
985 994 raise ValueError,'unrecognized mode for install:',`mode`
986 995
987 996 # Fix line-endings to those native to each platform in the config
988 997 # directory.
989 998 try:
990 999 os.chdir(ipythondir)
991 1000 except:
992 1001 print """
993 1002 Problem: changing to directory %s failed.
994 1003 Details:
995 1004 %s
996 1005
997 1006 Some configuration files may have incorrect line endings. This should not
998 1007 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
999 1008 wait()
1000 1009 else:
1001 1010 for fname in glb('ipythonrc*'):
1002 1011 try:
1003 1012 native_line_ends(fname,backup=0)
1004 1013 except IOError:
1005 1014 pass
1006 1015
1007 1016 if mode == 'install':
1008 1017 print """
1009 1018 Successful installation!
1010 1019
1011 1020 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1012 1021 IPython manual (there are both HTML and PDF versions supplied with the
1013 1022 distribution) to make sure that your system environment is properly configured
1014 1023 to take advantage of IPython's features."""
1015 1024 else:
1016 1025 print """
1017 1026 Successful upgrade!
1018 1027
1019 1028 All files in your directory:
1020 1029 %(ipythondir)s
1021 1030 which would have been overwritten by the upgrade were backed up with a .old
1022 1031 extension. If you had made particular customizations in those files you may
1023 1032 want to merge them back into the new files.""" % locals()
1024 1033 wait()
1025 1034 os.chdir(cwd)
1026 1035 # end user_setup()
1027 1036
1028 1037 def atexit_operations(self):
1029 1038 """This will be executed at the time of exit.
1030 1039
1031 1040 Saving of persistent data should be performed here. """
1032 1041
1033 1042 # input history
1034 1043 self.savehist()
1035 1044
1036 1045 # Cleanup all tempfiles left around
1037 1046 for tfile in self.tempfiles:
1038 1047 try:
1039 1048 os.unlink(tfile)
1040 1049 except OSError:
1041 1050 pass
1042 1051
1043 1052 # save the "persistent data" catch-all dictionary
1044 1053 try:
1045 1054 pickle.dump(self.persist, open(self.persist_fname,"w"))
1046 1055 except:
1047 1056 print "*** ERROR *** persistent data saving failed."
1048 1057
1049 1058 def savehist(self):
1050 1059 """Save input history to a file (via readline library)."""
1051 1060 try:
1052 1061 self.readline.write_history_file(self.histfile)
1053 1062 except:
1054 1063 print 'Unable to save IPython command history to file: ' + \
1055 1064 `self.histfile`
1056 1065
1057 1066 def pre_readline(self):
1058 1067 """readline hook to be used at the start of each line.
1059 1068
1060 1069 Currently it handles auto-indent only."""
1061 1070
1062 1071 self.readline.insert_text(self.indent_current)
1063 1072
1064 1073 def init_readline(self):
1065 1074 """Command history completion/saving/reloading."""
1066 1075 try:
1067 1076 import readline
1068 1077 except ImportError:
1069 1078 self.has_readline = 0
1070 1079 self.readline = None
1071 1080 # no point in bugging windows users with this every time:
1072 1081 if os.name == 'posix':
1073 1082 warn('Readline services not available on this platform.')
1074 1083 else:
1075 1084 import atexit
1076 1085 from IPython.completer import IPCompleter
1077 1086 self.Completer = IPCompleter(self,
1078 1087 self.user_ns,
1079 1088 self.user_global_ns,
1080 1089 self.rc.readline_omit__names,
1081 1090 self.alias_table)
1082 1091
1083 1092 # Platform-specific configuration
1084 1093 if os.name == 'nt':
1085 1094 self.readline_startup_hook = readline.set_pre_input_hook
1086 1095 else:
1087 1096 self.readline_startup_hook = readline.set_startup_hook
1088 1097
1089 1098 # Load user's initrc file (readline config)
1090 1099 inputrc_name = os.environ.get('INPUTRC')
1091 1100 if inputrc_name is None:
1092 1101 home_dir = get_home_dir()
1093 1102 if home_dir is not None:
1094 1103 inputrc_name = os.path.join(home_dir,'.inputrc')
1095 1104 if os.path.isfile(inputrc_name):
1096 1105 try:
1097 1106 readline.read_init_file(inputrc_name)
1098 1107 except:
1099 1108 warn('Problems reading readline initialization file <%s>'
1100 1109 % inputrc_name)
1101 1110
1102 1111 self.has_readline = 1
1103 1112 self.readline = readline
1104 1113 # save this in sys so embedded copies can restore it properly
1105 1114 sys.ipcompleter = self.Completer.complete
1106 1115 readline.set_completer(self.Completer.complete)
1107 1116
1108 1117 # Configure readline according to user's prefs
1109 1118 for rlcommand in self.rc.readline_parse_and_bind:
1110 1119 readline.parse_and_bind(rlcommand)
1111 1120
1112 1121 # remove some chars from the delimiters list
1113 1122 delims = readline.get_completer_delims()
1114 1123 delims = delims.translate(string._idmap,
1115 1124 self.rc.readline_remove_delims)
1116 1125 readline.set_completer_delims(delims)
1117 1126 # otherwise we end up with a monster history after a while:
1118 1127 readline.set_history_length(1000)
1119 1128 try:
1120 1129 #print '*** Reading readline history' # dbg
1121 1130 readline.read_history_file(self.histfile)
1122 1131 except IOError:
1123 1132 pass # It doesn't exist yet.
1124 1133
1125 1134 atexit.register(self.atexit_operations)
1126 1135 del atexit
1127 1136
1128 1137 # Configure auto-indent for all platforms
1129 1138 self.set_autoindent(self.rc.autoindent)
1130 1139
1131 1140 def _should_recompile(self,e):
1132 1141 """Utility routine for edit_syntax_error"""
1133 1142
1134 1143 if e.filename in ('<ipython console>','<input>','<string>',
1135 1144 '<console>'):
1136 1145 return False
1137 1146 try:
1138 1147 if not ask_yes_no('Return to editor to correct syntax error? '
1139 1148 '[Y/n] ','y'):
1140 1149 return False
1141 1150 except EOFError:
1142 1151 return False
1143 1152 self.hooks.fix_error_editor(e.filename,e.lineno,e.offset,e.msg)
1144 1153 return True
1145 1154
1146 1155 def edit_syntax_error(self):
1147 1156 """The bottom half of the syntax error handler called in the main loop.
1148 1157
1149 1158 Loop until syntax error is fixed or user cancels.
1150 1159 """
1151 1160
1152 1161 while self.SyntaxTB.last_syntax_error:
1153 1162 # copy and clear last_syntax_error
1154 1163 err = self.SyntaxTB.clear_err_state()
1155 1164 if not self._should_recompile(err):
1156 1165 return
1157 1166 try:
1158 1167 # may set last_syntax_error again if a SyntaxError is raised
1159 1168 self.safe_execfile(err.filename,self.shell.user_ns)
1160 1169 except:
1161 1170 self.showtraceback()
1162 1171 else:
1163 1172 f = file(err.filename)
1164 1173 try:
1165 1174 sys.displayhook(f.read())
1166 1175 finally:
1167 1176 f.close()
1168 1177
1169 1178 def showsyntaxerror(self, filename=None):
1170 1179 """Display the syntax error that just occurred.
1171 1180
1172 1181 This doesn't display a stack trace because there isn't one.
1173 1182
1174 1183 If a filename is given, it is stuffed in the exception instead
1175 1184 of what was there before (because Python's parser always uses
1176 1185 "<string>" when reading from a string).
1177 1186 """
1178 1187 etype, value, last_traceback = sys.exc_info()
1179 1188 if filename and etype is SyntaxError:
1180 1189 # Work hard to stuff the correct filename in the exception
1181 1190 try:
1182 1191 msg, (dummy_filename, lineno, offset, line) = value
1183 1192 except:
1184 1193 # Not the format we expect; leave it alone
1185 1194 pass
1186 1195 else:
1187 1196 # Stuff in the right filename
1188 1197 try:
1189 1198 # Assume SyntaxError is a class exception
1190 1199 value = SyntaxError(msg, (filename, lineno, offset, line))
1191 1200 except:
1192 1201 # If that failed, assume SyntaxError is a string
1193 1202 value = msg, (filename, lineno, offset, line)
1194 1203 self.SyntaxTB(etype,value,[])
1195 1204
1196 1205 def debugger(self):
1197 1206 """Call the pdb debugger."""
1198 1207
1199 1208 if not self.rc.pdb:
1200 1209 return
1201 1210 pdb.pm()
1202 1211
1203 1212 def showtraceback(self,exc_tuple = None,filename=None):
1204 1213 """Display the exception that just occurred."""
1205 1214
1206 1215 # Though this won't be called by syntax errors in the input line,
1207 1216 # there may be SyntaxError cases whith imported code.
1208 1217 if exc_tuple is None:
1209 1218 type, value, tb = sys.exc_info()
1210 1219 else:
1211 1220 type, value, tb = exc_tuple
1212 1221 if type is SyntaxError:
1213 1222 self.showsyntaxerror(filename)
1214 1223 else:
1215 1224 self.InteractiveTB()
1216 1225 if self.InteractiveTB.call_pdb and self.has_readline:
1217 1226 # pdb mucks up readline, fix it back
1218 1227 self.readline.set_completer(self.Completer.complete)
1219 1228
1220 def update_cache(self, line):
1221 """puts line into cache"""
1222 return # dbg
1223
1224 # This copies the cache every time ... :-(
1225 self.inputcache.insert(0, line)
1226 if len(self.inputcache) >= self.CACHELENGTH:
1227 self.inputcache.pop() # This doesn't :-)
1228
1229 1229 def mainloop(self,banner=None):
1230 1230 """Creates the local namespace and starts the mainloop.
1231 1231
1232 1232 If an optional banner argument is given, it will override the
1233 1233 internally created default banner."""
1234 1234
1235 1235 if self.rc.c: # Emulate Python's -c option
1236 1236 self.exec_init_cmd()
1237 1237 if banner is None:
1238 1238 if self.rc.banner:
1239 1239 banner = self.BANNER+self.banner2
1240 1240 else:
1241 1241 banner = ''
1242 1242 self.interact(banner)
1243 1243
1244 1244 def exec_init_cmd(self):
1245 1245 """Execute a command given at the command line.
1246 1246
1247 1247 This emulates Python's -c option."""
1248 1248
1249 1249 sys.argv = ['-c']
1250 1250 self.push(self.rc.c)
1251 1251
1252 1252 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1253 1253 """Embeds IPython into a running python program.
1254 1254
1255 1255 Input:
1256 1256
1257 1257 - header: An optional header message can be specified.
1258 1258
1259 1259 - local_ns, global_ns: working namespaces. If given as None, the
1260 1260 IPython-initialized one is updated with __main__.__dict__, so that
1261 1261 program variables become visible but user-specific configuration
1262 1262 remains possible.
1263 1263
1264 1264 - stack_depth: specifies how many levels in the stack to go to
1265 1265 looking for namespaces (when local_ns and global_ns are None). This
1266 1266 allows an intermediate caller to make sure that this function gets
1267 1267 the namespace from the intended level in the stack. By default (0)
1268 1268 it will get its locals and globals from the immediate caller.
1269 1269
1270 1270 Warning: it's possible to use this in a program which is being run by
1271 1271 IPython itself (via %run), but some funny things will happen (a few
1272 1272 globals get overwritten). In the future this will be cleaned up, as
1273 1273 there is no fundamental reason why it can't work perfectly."""
1274 1274
1275 1275 # Get locals and globals from caller
1276 1276 if local_ns is None or global_ns is None:
1277 1277 call_frame = sys._getframe(stack_depth).f_back
1278 1278
1279 1279 if local_ns is None:
1280 1280 local_ns = call_frame.f_locals
1281 1281 if global_ns is None:
1282 1282 global_ns = call_frame.f_globals
1283 1283
1284 1284 # Update namespaces and fire up interpreter
1285 1285 self.user_ns = local_ns
1286 1286 self.user_global_ns = global_ns
1287 1287
1288 1288 # Patch for global embedding to make sure that things don't overwrite
1289 1289 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1290 1290 # FIXME. Test this a bit more carefully (the if.. is new)
1291 1291 if local_ns is None and global_ns is None:
1292 1292 self.user_global_ns.update(__main__.__dict__)
1293 1293
1294 1294 # make sure the tab-completer has the correct frame information, so it
1295 1295 # actually completes using the frame's locals/globals
1296 1296 self.set_completer_frame(call_frame)
1297 1297
1298 1298 self.interact(header)
1299 1299
1300 1300 def interact(self, banner=None):
1301 1301 """Closely emulate the interactive Python console.
1302 1302
1303 1303 The optional banner argument specify the banner to print
1304 1304 before the first interaction; by default it prints a banner
1305 1305 similar to the one printed by the real Python interpreter,
1306 1306 followed by the current class name in parentheses (so as not
1307 1307 to confuse this with the real interpreter -- since it's so
1308 1308 close!).
1309 1309
1310 1310 """
1311 1311 cprt = 'Type "copyright", "credits" or "license" for more information.'
1312 1312 if banner is None:
1313 1313 self.write("Python %s on %s\n%s\n(%s)\n" %
1314 1314 (sys.version, sys.platform, cprt,
1315 1315 self.__class__.__name__))
1316 1316 else:
1317 1317 self.write(banner)
1318 1318
1319 1319 more = 0
1320 1320
1321 1321 # Mark activity in the builtins
1322 1322 __builtin__.__dict__['__IPYTHON__active'] += 1
1323 1323
1324 1324 # exit_now is set by a call to %Exit or %Quit
1325 1325 while not self.exit_now:
1326 1326 try:
1327 1327 if more:
1328 1328 prompt = self.outputcache.prompt2
1329 1329 if self.autoindent:
1330 1330 self.readline_startup_hook(self.pre_readline)
1331 1331 else:
1332 1332 prompt = self.outputcache.prompt1
1333 1333 try:
1334 1334 line = self.raw_input(prompt,more)
1335 1335 if self.autoindent:
1336 1336 self.readline_startup_hook(None)
1337 1337 except EOFError:
1338 1338 if self.autoindent:
1339 1339 self.readline_startup_hook(None)
1340 1340 self.write("\n")
1341 1341 self.exit()
1342 1342 else:
1343 1343 more = self.push(line)
1344 1344
1345 1345 if (self.SyntaxTB.last_syntax_error and
1346 1346 self.rc.autoedit_syntax):
1347 1347 self.edit_syntax_error()
1348 1348
1349 1349 except KeyboardInterrupt:
1350 1350 self.write("\nKeyboardInterrupt\n")
1351 1351 self.resetbuffer()
1352 1352 more = 0
1353 1353 # keep cache in sync with the prompt counter:
1354 1354 self.outputcache.prompt_count -= 1
1355 1355
1356 1356 if self.autoindent:
1357 1357 self.indent_current_nsp = 0
1358 1358 self.indent_current = ' '* self.indent_current_nsp
1359 1359
1360 1360 except bdb.BdbQuit:
1361 1361 warn("The Python debugger has exited with a BdbQuit exception.\n"
1362 1362 "Because of how pdb handles the stack, it is impossible\n"
1363 1363 "for IPython to properly format this particular exception.\n"
1364 1364 "IPython will resume normal operation.")
1365 1365
1366 1366 # We are off again...
1367 1367 __builtin__.__dict__['__IPYTHON__active'] -= 1
1368 1368
1369 1369 def excepthook(self, type, value, tb):
1370 1370 """One more defense for GUI apps that call sys.excepthook.
1371 1371
1372 1372 GUI frameworks like wxPython trap exceptions and call
1373 1373 sys.excepthook themselves. I guess this is a feature that
1374 1374 enables them to keep running after exceptions that would
1375 1375 otherwise kill their mainloop. This is a bother for IPython
1376 1376 which excepts to catch all of the program exceptions with a try:
1377 1377 except: statement.
1378 1378
1379 1379 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1380 1380 any app directly invokes sys.excepthook, it will look to the user like
1381 1381 IPython crashed. In order to work around this, we can disable the
1382 1382 CrashHandler and replace it with this excepthook instead, which prints a
1383 1383 regular traceback using our InteractiveTB. In this fashion, apps which
1384 1384 call sys.excepthook will generate a regular-looking exception from
1385 1385 IPython, and the CrashHandler will only be triggered by real IPython
1386 1386 crashes.
1387 1387
1388 1388 This hook should be used sparingly, only in places which are not likely
1389 1389 to be true IPython errors.
1390 1390 """
1391 1391
1392 1392 self.InteractiveTB(type, value, tb, tb_offset=0)
1393 1393 if self.InteractiveTB.call_pdb and self.has_readline:
1394 1394 self.readline.set_completer(self.Completer.complete)
1395 1395
1396 1396 def call_alias(self,alias,rest=''):
1397 1397 """Call an alias given its name and the rest of the line.
1398 1398
1399 1399 This function MUST be given a proper alias, because it doesn't make
1400 1400 any checks when looking up into the alias table. The caller is
1401 1401 responsible for invoking it only with a valid alias."""
1402 1402
1403 1403 #print 'ALIAS: <%s>+<%s>' % (alias,rest) # dbg
1404 1404 nargs,cmd = self.alias_table[alias]
1405 1405 # Expand the %l special to be the user's input line
1406 1406 if cmd.find('%l') >= 0:
1407 1407 cmd = cmd.replace('%l',rest)
1408 1408 rest = ''
1409 1409 if nargs==0:
1410 1410 # Simple, argument-less aliases
1411 1411 cmd = '%s %s' % (cmd,rest)
1412 1412 else:
1413 1413 # Handle aliases with positional arguments
1414 1414 args = rest.split(None,nargs)
1415 1415 if len(args)< nargs:
1416 1416 error('Alias <%s> requires %s arguments, %s given.' %
1417 1417 (alias,nargs,len(args)))
1418 1418 return
1419 1419 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1420 1420 # Now call the macro, evaluating in the user's namespace
1421 1421 try:
1422 1422 self.system(cmd)
1423 1423 except:
1424 1424 self.showtraceback()
1425 1425
1426 1426 def autoindent_update(self,line):
1427 1427 """Keep track of the indent level."""
1428 1428 if self.autoindent:
1429 1429 if line:
1430 1430 ini_spaces = ini_spaces_re.match(line)
1431 1431 if ini_spaces:
1432 1432 nspaces = ini_spaces.end()
1433 1433 else:
1434 1434 nspaces = 0
1435 1435 self.indent_current_nsp = nspaces
1436 1436
1437 1437 if line[-1] == ':':
1438 1438 self.indent_current_nsp += 4
1439 1439 elif dedent_re.match(line):
1440 1440 self.indent_current_nsp -= 4
1441 1441 else:
1442 1442 self.indent_current_nsp = 0
1443 1443
1444 1444 # indent_current is the actual string to be inserted
1445 1445 # by the readline hooks for indentation
1446 1446 self.indent_current = ' '* self.indent_current_nsp
1447 1447
1448 1448 def runlines(self,lines):
1449 1449 """Run a string of one or more lines of source.
1450 1450
1451 1451 This method is capable of running a string containing multiple source
1452 1452 lines, as if they had been entered at the IPython prompt. Since it
1453 1453 exposes IPython's processing machinery, the given strings can contain
1454 1454 magic calls (%magic), special shell access (!cmd), etc."""
1455 1455
1456 1456 # We must start with a clean buffer, in case this is run from an
1457 1457 # interactive IPython session (via a magic, for example).
1458 1458 self.resetbuffer()
1459 1459 lines = lines.split('\n')
1460 1460 more = 0
1461 1461 for line in lines:
1462 1462 # skip blank lines so we don't mess up the prompt counter, but do
1463 1463 # NOT skip even a blank line if we are in a code block (more is
1464 1464 # true)
1465 #print 'rl line:<%s>' % line # dbg
1466 1465 if line or more:
1467 #print 'doit' # dbg
1468 newline = self.prefilter(line,more)
1469 more = self.push(newline)
1466 more = self.push(self.prefilter(line,more))
1470 1467 # IPython's runsource returns None if there was an error
1471 1468 # compiling the code. This allows us to stop processing right
1472 1469 # away, so the user gets the error message at the right place.
1473 1470 if more is None:
1474 1471 break
1475 1472 # final newline in case the input didn't have it, so that the code
1476 1473 # actually does get executed
1477 1474 if more:
1478 1475 self.push('\n')
1479 1476
1480 1477 def runsource(self, source, filename='<input>', symbol='single'):
1481 1478 """Compile and run some source in the interpreter.
1482 1479
1483 1480 Arguments are as for compile_command().
1484 1481
1485 1482 One several things can happen:
1486 1483
1487 1484 1) The input is incorrect; compile_command() raised an
1488 1485 exception (SyntaxError or OverflowError). A syntax traceback
1489 1486 will be printed by calling the showsyntaxerror() method.
1490 1487
1491 1488 2) The input is incomplete, and more input is required;
1492 1489 compile_command() returned None. Nothing happens.
1493 1490
1494 1491 3) The input is complete; compile_command() returned a code
1495 1492 object. The code is executed by calling self.runcode() (which
1496 1493 also handles run-time exceptions, except for SystemExit).
1497 1494
1498 1495 The return value is:
1499 1496
1500 1497 - True in case 2
1501 1498
1502 1499 - False in the other cases, unless an exception is raised, where
1503 1500 None is returned instead. This can be used by external callers to
1504 1501 know whether to continue feeding input or not.
1505 1502
1506 1503 The return value can be used to decide whether to use sys.ps1 or
1507 1504 sys.ps2 to prompt the next line."""
1508 1505
1509 1506 try:
1510 1507 code = self.compile(source,filename,symbol)
1511 1508 except (OverflowError, SyntaxError, ValueError):
1512 1509 # Case 1
1513 1510 self.showsyntaxerror(filename)
1514 1511 return None
1515 1512
1516 1513 if code is None:
1517 1514 # Case 2
1518 1515 return True
1519 1516
1520 1517 # Case 3
1521 1518 # We store the code object so that threaded shells and
1522 1519 # custom exception handlers can access all this info if needed.
1523 1520 # The source corresponding to this can be obtained from the
1524 1521 # buffer attribute as '\n'.join(self.buffer).
1525 1522 self.code_to_run = code
1526 1523 # now actually execute the code object
1527 1524 if self.runcode(code) == 0:
1528 1525 return False
1529 1526 else:
1530 1527 return None
1531 1528
1532 1529 def runcode(self,code_obj):
1533 1530 """Execute a code object.
1534 1531
1535 1532 When an exception occurs, self.showtraceback() is called to display a
1536 1533 traceback.
1537 1534
1538 1535 Return value: a flag indicating whether the code to be run completed
1539 1536 successfully:
1540 1537
1541 1538 - 0: successful execution.
1542 1539 - 1: an error occurred.
1543 1540 """
1544 1541
1545 1542 # Set our own excepthook in case the user code tries to call it
1546 1543 # directly, so that the IPython crash handler doesn't get triggered
1547 1544 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1548 1545
1549 1546 # we save the original sys.excepthook in the instance, in case config
1550 1547 # code (such as magics) needs access to it.
1551 1548 self.sys_excepthook = old_excepthook
1552 1549 outflag = 1 # happens in more places, so it's easier as default
1553 1550 try:
1554 1551 try:
1555 1552 # Embedded instances require separate global/local namespaces
1556 1553 # so they can see both the surrounding (local) namespace and
1557 1554 # the module-level globals when called inside another function.
1558 1555 if self.embedded:
1559 1556 exec code_obj in self.user_global_ns, self.user_ns
1560 1557 # Normal (non-embedded) instances should only have a single
1561 1558 # namespace for user code execution, otherwise functions won't
1562 1559 # see interactive top-level globals.
1563 1560 else:
1564 1561 exec code_obj in self.user_ns
1565 1562 finally:
1566 1563 # Reset our crash handler in place
1567 1564 sys.excepthook = old_excepthook
1568 1565 except SystemExit:
1569 1566 self.resetbuffer()
1570 1567 self.showtraceback()
1571 1568 warn("Type exit or quit to exit IPython "
1572 1569 "(%Exit or %Quit do so unconditionally).",level=1)
1573 1570 except self.custom_exceptions:
1574 1571 etype,value,tb = sys.exc_info()
1575 1572 self.CustomTB(etype,value,tb)
1576 1573 except:
1577 1574 self.showtraceback()
1578 1575 else:
1579 1576 outflag = 0
1580 1577 if softspace(sys.stdout, 0):
1581 1578 print
1582 1579 # Flush out code object which has been run (and source)
1583 1580 self.code_to_run = None
1584 1581 return outflag
1585 1582
1586 1583 def push(self, line):
1587 1584 """Push a line to the interpreter.
1588 1585
1589 1586 The line should not have a trailing newline; it may have
1590 1587 internal newlines. The line is appended to a buffer and the
1591 1588 interpreter's runsource() method is called with the
1592 1589 concatenated contents of the buffer as source. If this
1593 1590 indicates that the command was executed or invalid, the buffer
1594 1591 is reset; otherwise, the command is incomplete, and the buffer
1595 1592 is left as it was after the line was appended. The return
1596 1593 value is 1 if more input is required, 0 if the line was dealt
1597 1594 with in some way (this is the same as runsource()).
1598
1599 1595 """
1596
1597 # autoindent management should be done here, and not in the
1598 # interactive loop, since that one is only seen by keyboard input. We
1599 # need this done correctly even for code run via runlines (which uses
1600 # push).
1601 self.autoindent_update(line)
1602
1600 1603 self.buffer.append(line)
1601 1604 more = self.runsource('\n'.join(self.buffer), self.filename)
1602 1605 if not more:
1603 1606 self.resetbuffer()
1604 1607 return more
1605 1608
1606 1609 def resetbuffer(self):
1607 1610 """Reset the input buffer."""
1608 1611 self.buffer[:] = []
1609 1612
1610 1613 def raw_input(self,prompt='',continue_prompt=False):
1611 1614 """Write a prompt and read a line.
1612 1615
1613 1616 The returned line does not include the trailing newline.
1614 1617 When the user enters the EOF key sequence, EOFError is raised.
1615 1618
1616 1619 Optional inputs:
1617 1620
1618 1621 - prompt(''): a string to be printed to prompt the user.
1619 1622
1620 1623 - continue_prompt(False): whether this line is the first one or a
1621 1624 continuation in a sequence of inputs.
1622 1625 """
1623 1626
1624 1627 line = raw_input_original(prompt)
1625 1628 # Try to be reasonably smart about not re-indenting pasted input more
1626 1629 # than necessary. We do this by trimming out the auto-indent initial
1627 1630 # spaces, if the user's actual input started itself with whitespace.
1628 1631 if self.autoindent:
1629 1632 line2 = line[self.indent_current_nsp:]
1630 1633 if line2[0:1] in (' ','\t'):
1631 1634 line = line2
1632 1635 return self.prefilter(line,continue_prompt)
1633 1636
1634 1637 def split_user_input(self,line):
1635 1638 """Split user input into pre-char, function part and rest."""
1636 1639
1637 1640 lsplit = self.line_split.match(line)
1638 1641 if lsplit is None: # no regexp match returns None
1639 1642 try:
1640 1643 iFun,theRest = line.split(None,1)
1641 1644 except ValueError:
1642 1645 iFun,theRest = line,''
1643 1646 pre = re.match('^(\s*)(.*)',line).groups()[0]
1644 1647 else:
1645 1648 pre,iFun,theRest = lsplit.groups()
1646 1649
1647 1650 #print 'line:<%s>' % line # dbg
1648 1651 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
1649 1652 return pre,iFun.strip(),theRest
1650 1653
1651 1654 def _prefilter(self, line, continue_prompt):
1652 1655 """Calls different preprocessors, depending on the form of line."""
1653 1656
1654 1657 # All handlers *must* return a value, even if it's blank ('').
1655 1658
1656 1659 # Lines are NOT logged here. Handlers should process the line as
1657 1660 # needed, update the cache AND log it (so that the input cache array
1658 1661 # stays synced).
1659 1662
1660 1663 # This function is _very_ delicate, and since it's also the one which
1661 1664 # determines IPython's response to user input, it must be as efficient
1662 1665 # as possible. For this reason it has _many_ returns in it, trying
1663 1666 # always to exit as quickly as it can figure out what it needs to do.
1664 1667
1665 1668 # This function is the main responsible for maintaining IPython's
1666 1669 # behavior respectful of Python's semantics. So be _very_ careful if
1667 1670 # making changes to anything here.
1668 1671
1669 1672 #.....................................................................
1670 1673 # Code begins
1671 1674
1672 1675 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
1673 1676
1674 1677 # save the line away in case we crash, so the post-mortem handler can
1675 1678 # record it
1676 1679 self._last_input_line = line
1677 1680
1678 1681 #print '***line: <%s>' % line # dbg
1679 self.autoindent_update(line)
1680 1682
1681 1683 # the input history needs to track even empty lines
1682 1684 if not line.strip():
1683 1685 if not continue_prompt:
1684 1686 self.outputcache.prompt_count -= 1
1685 1687 return self.handle_normal(line,continue_prompt)
1686 1688 #return self.handle_normal('',continue_prompt)
1687 1689
1688 1690 # print '***cont',continue_prompt # dbg
1689 1691 # special handlers are only allowed for single line statements
1690 1692 if continue_prompt and not self.rc.multi_line_specials:
1691 1693 return self.handle_normal(line,continue_prompt)
1692 1694
1693 1695 # For the rest, we need the structure of the input
1694 1696 pre,iFun,theRest = self.split_user_input(line)
1695 1697 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1696 1698
1697 1699 # First check for explicit escapes in the last/first character
1698 1700 handler = None
1699 1701 if line[-1] == self.ESC_HELP:
1700 1702 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
1701 1703 if handler is None:
1702 1704 # look at the first character of iFun, NOT of line, so we skip
1703 1705 # leading whitespace in multiline input
1704 1706 handler = self.esc_handlers.get(iFun[0:1])
1705 1707 if handler is not None:
1706 1708 return handler(line,continue_prompt,pre,iFun,theRest)
1707 1709 # Emacs ipython-mode tags certain input lines
1708 1710 if line.endswith('# PYTHON-MODE'):
1709 1711 return self.handle_emacs(line,continue_prompt)
1710 1712
1711 1713 # Next, check if we can automatically execute this thing
1712 1714
1713 1715 # Allow ! in multi-line statements if multi_line_specials is on:
1714 1716 if continue_prompt and self.rc.multi_line_specials and \
1715 1717 iFun.startswith(self.ESC_SHELL):
1716 1718 return self.handle_shell_escape(line,continue_prompt,
1717 1719 pre=pre,iFun=iFun,
1718 1720 theRest=theRest)
1719 1721
1720 1722 # Let's try to find if the input line is a magic fn
1721 1723 oinfo = None
1722 1724 if hasattr(self,'magic_'+iFun):
1723 1725 # WARNING: _ofind uses getattr(), so it can consume generators and
1724 1726 # cause other side effects.
1725 1727 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1726 1728 if oinfo['ismagic']:
1727 1729 # Be careful not to call magics when a variable assignment is
1728 1730 # being made (ls='hi', for example)
1729 1731 if self.rc.automagic and \
1730 1732 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
1731 1733 (self.rc.multi_line_specials or not continue_prompt):
1732 1734 return self.handle_magic(line,continue_prompt,
1733 1735 pre,iFun,theRest)
1734 1736 else:
1735 1737 return self.handle_normal(line,continue_prompt)
1736 1738
1737 1739 # If the rest of the line begins with an (in)equality, assginment or
1738 1740 # function call, we should not call _ofind but simply execute it.
1739 1741 # This avoids spurious geattr() accesses on objects upon assignment.
1740 1742 #
1741 1743 # It also allows users to assign to either alias or magic names true
1742 1744 # python variables (the magic/alias systems always take second seat to
1743 1745 # true python code).
1744 1746 if theRest and theRest[0] in '!=()':
1745 1747 return self.handle_normal(line,continue_prompt)
1746 1748
1747 1749 if oinfo is None:
1748 1750 # let's try to ensure that _oinfo is ONLY called when autocall is
1749 1751 # on. Since it has inevitable potential side effects, at least
1750 1752 # having autocall off should be a guarantee to the user that no
1751 1753 # weird things will happen.
1752 1754
1753 1755 if self.rc.autocall:
1754 1756 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1755 1757 else:
1756 1758 # in this case, all that's left is either an alias or
1757 1759 # processing the line normally.
1758 1760 if iFun in self.alias_table:
1759 1761 return self.handle_alias(line,continue_prompt,
1760 1762 pre,iFun,theRest)
1761 1763 else:
1762 1764 return self.handle_normal(line,continue_prompt)
1763 1765
1764 1766 if not oinfo['found']:
1765 1767 return self.handle_normal(line,continue_prompt)
1766 1768 else:
1767 1769 #print 'iFun <%s> rest <%s>' % (iFun,theRest) # dbg
1768 1770 if oinfo['isalias']:
1769 1771 return self.handle_alias(line,continue_prompt,
1770 1772 pre,iFun,theRest)
1771 1773
1772 1774 if self.rc.autocall and \
1773 1775 not self.re_exclude_auto.match(theRest) and \
1774 1776 self.re_fun_name.match(iFun) and \
1775 1777 callable(oinfo['obj']) :
1776 1778 #print 'going auto' # dbg
1777 1779 return self.handle_auto(line,continue_prompt,pre,iFun,theRest)
1778 1780 else:
1779 1781 #print 'was callable?', callable(oinfo['obj']) # dbg
1780 1782 return self.handle_normal(line,continue_prompt)
1781 1783
1782 1784 # If we get here, we have a normal Python line. Log and return.
1783 1785 return self.handle_normal(line,continue_prompt)
1784 1786
1785 1787 def _prefilter_dumb(self, line, continue_prompt):
1786 1788 """simple prefilter function, for debugging"""
1787 1789 return self.handle_normal(line,continue_prompt)
1788 1790
1789 1791 # Set the default prefilter() function (this can be user-overridden)
1790 1792 prefilter = _prefilter
1791 1793
1792 1794 def handle_normal(self,line,continue_prompt=None,
1793 1795 pre=None,iFun=None,theRest=None):
1794 1796 """Handle normal input lines. Use as a template for handlers."""
1795 1797
1796 1798 # With autoindent on, we need some way to exit the input loop, and I
1797 1799 # don't want to force the user to have to backspace all the way to
1798 1800 # clear the line. The rule will be in this case, that either two
1799 1801 # lines of pure whitespace in a row, or a line of pure whitespace but
1800 1802 # of a size different to the indent level, will exit the input loop.
1803
1801 1804 if (continue_prompt and self.autoindent and isspace(line) and
1802 1805 (line != self.indent_current or isspace(self.buffer[-1]))):
1803 1806 line = ''
1804 1807
1805 1808 self.log(line,continue_prompt)
1806 self.update_cache(line)
1807 1809 return line
1808 1810
1809 1811 def handle_alias(self,line,continue_prompt=None,
1810 1812 pre=None,iFun=None,theRest=None):
1811 1813 """Handle alias input lines. """
1812 1814
1813 theRest = esc_quotes(theRest)
1814 # log the ipalias form, which doesn't depend on the instance name
1815 line_log = 'ipalias("%s %s")' % (iFun,theRest)
1816 self.log(line_log,continue_prompt)
1817 self.update_cache(line_log)
1818 # this is what actually gets executed
1819 return "%s%s.call_alias('%s','%s')" % (pre,self.name,iFun,theRest)
1815 line_out = 'ipalias("%s %s")' % (iFun,esc_quotes(theRest))
1816 self.log(line_out,continue_prompt)
1817 return line_out
1820 1818
1821 1819 def handle_shell_escape(self, line, continue_prompt=None,
1822 1820 pre=None,iFun=None,theRest=None):
1823 1821 """Execute the line in a shell, empty return value"""
1824 1822
1825 1823 #print 'line in :', `line` # dbg
1826 1824 # Example of a special handler. Others follow a similar pattern.
1827 1825 if continue_prompt: # multi-line statements
1828 1826 if iFun.startswith('!!'):
1829 1827 print 'SyntaxError: !! is not allowed in multiline statements'
1830 1828 return pre
1831 1829 else:
1832 cmd = ("%s %s" % (iFun[1:],theRest)) #.replace('"','\\"')
1833 #line_out = '%s%s.system("%s")' % (pre,self.name,cmd)
1834 line_out = '%s%s.system(r"""%s"""[:-1])' % (pre,self.name,cmd + "_")
1835 #line_out = ('%s%s.system(' % (pre,self.name)) + repr(cmd) + ')'
1830 cmd = ("%s %s" % (iFun[1:],theRest))
1831 line_out = 'ipsystem(r"""%s"""[:-1])' % (cmd + "_")
1836 1832 else: # single-line input
1837 1833 if line.startswith('!!'):
1838 1834 # rewrite iFun/theRest to properly hold the call to %sx and
1839 1835 # the actual command to be executed, so handle_magic can work
1840 1836 # correctly
1841 1837 theRest = '%s %s' % (iFun[2:],theRest)
1842 1838 iFun = 'sx'
1843 1839 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,line[2:]),
1844 1840 continue_prompt,pre,iFun,theRest)
1845 1841 else:
1846 #cmd = esc_quotes(line[1:])
1847 1842 cmd=line[1:]
1848 #line_out = '%s.system("%s")' % (self.name,cmd)
1849 line_out = '%s.system(r"""%s"""[:-1])' % (self.name,cmd +"_")
1850 #line_out = ('%s.system(' % self.name) + repr(cmd)+ ')'
1843 line_out = 'ipsystem(r"""%s"""[:-1])' % (cmd +"_")
1851 1844 # update cache/log and return
1852 1845 self.log(line_out,continue_prompt)
1853 self.update_cache(line_out) # readline cache gets normal line
1854 #print 'line out r:', `line_out` # dbg
1855 #print 'line out s:', line_out # dbg
1856 1846 return line_out
1857 1847
1858 1848 def handle_magic(self, line, continue_prompt=None,
1859 1849 pre=None,iFun=None,theRest=None):
1860 1850 """Execute magic functions.
1861 1851
1862 1852 Also log them with a prepended # so the log is clean Python."""
1863 1853
1864 1854 cmd = '%sipmagic("%s")' % (pre,esc_quotes('%s %s' % (iFun,theRest)))
1865 1855 self.log(cmd,continue_prompt)
1866 self.update_cache(line)
1867 1856 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
1868 1857 return cmd
1869 1858
1870 1859 def handle_auto(self, line, continue_prompt=None,
1871 1860 pre=None,iFun=None,theRest=None):
1872 1861 """Hande lines which can be auto-executed, quoting if requested."""
1873 1862
1874 1863 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
1875 1864
1876 1865 # This should only be active for single-line input!
1877 1866 if continue_prompt:
1878 1867 return line
1879 1868
1880 1869 if pre == self.ESC_QUOTE:
1881 1870 # Auto-quote splitting on whitespace
1882 1871 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
1883 1872 elif pre == self.ESC_QUOTE2:
1884 1873 # Auto-quote whole string
1885 1874 newcmd = '%s("%s")' % (iFun,theRest)
1886 1875 else:
1887 1876 # Auto-paren
1888 1877 if theRest[0:1] in ('=','['):
1889 1878 # Don't autocall in these cases. They can be either
1890 1879 # rebindings of an existing callable's name, or item access
1891 1880 # for an object which is BOTH callable and implements
1892 1881 # __getitem__.
1893 1882 return '%s %s' % (iFun,theRest)
1894 1883 if theRest.endswith(';'):
1895 1884 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
1896 1885 else:
1897 1886 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
1898 1887
1899 1888 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
1900 1889 # log what is now valid Python, not the actual user input (without the
1901 1890 # final newline)
1902 1891 self.log(newcmd,continue_prompt)
1903 1892 return newcmd
1904 1893
1905 1894 def handle_help(self, line, continue_prompt=None,
1906 1895 pre=None,iFun=None,theRest=None):
1907 1896 """Try to get some help for the object.
1908 1897
1909 1898 obj? or ?obj -> basic information.
1910 1899 obj?? or ??obj -> more details.
1911 1900 """
1912 1901
1913 1902 # We need to make sure that we don't process lines which would be
1914 1903 # otherwise valid python, such as "x=1 # what?"
1915 1904 try:
1916 1905 codeop.compile_command(line)
1917 1906 except SyntaxError:
1918 1907 # We should only handle as help stuff which is NOT valid syntax
1919 1908 if line[0]==self.ESC_HELP:
1920 1909 line = line[1:]
1921 1910 elif line[-1]==self.ESC_HELP:
1922 1911 line = line[:-1]
1923 1912 self.log('#?'+line)
1924 self.update_cache(line)
1925 1913 if line:
1926 1914 self.magic_pinfo(line)
1927 1915 else:
1928 1916 page(self.usage,screen_lines=self.rc.screen_length)
1929 1917 return '' # Empty string is needed here!
1930 1918 except:
1931 1919 # Pass any other exceptions through to the normal handler
1932 1920 return self.handle_normal(line,continue_prompt)
1933 1921 else:
1934 1922 # If the code compiles ok, we should handle it normally
1935 1923 return self.handle_normal(line,continue_prompt)
1936 1924
1937 1925 def handle_emacs(self,line,continue_prompt=None,
1938 1926 pre=None,iFun=None,theRest=None):
1939 1927 """Handle input lines marked by python-mode."""
1940 1928
1941 1929 # Currently, nothing is done. Later more functionality can be added
1942 1930 # here if needed.
1943 1931
1944 1932 # The input cache shouldn't be updated
1945 1933
1946 1934 return line
1947 1935
1948 1936 def write(self,data):
1949 1937 """Write a string to the default output"""
1950 1938 Term.cout.write(data)
1951 1939
1952 1940 def write_err(self,data):
1953 1941 """Write a string to the default error output"""
1954 1942 Term.cerr.write(data)
1955 1943
1956 1944 def exit(self):
1957 1945 """Handle interactive exit.
1958 1946
1959 1947 This method sets the exit_now attribute."""
1960 1948
1961 1949 if self.rc.confirm_exit:
1962 1950 if ask_yes_no('Do you really want to exit ([y]/n)?','y'):
1963 1951 self.exit_now = True
1964 1952 else:
1965 1953 self.exit_now = True
1966 1954 return self.exit_now
1967 1955
1968 1956 def safe_execfile(self,fname,*where,**kw):
1969 1957 fname = os.path.expanduser(fname)
1970 1958
1971 1959 # find things also in current directory
1972 1960 dname = os.path.dirname(fname)
1973 1961 if not sys.path.count(dname):
1974 1962 sys.path.append(dname)
1975 1963
1976 1964 try:
1977 1965 xfile = open(fname)
1978 1966 except:
1979 1967 print >> Term.cerr, \
1980 1968 'Could not open file <%s> for safe execution.' % fname
1981 1969 return None
1982 1970
1983 1971 kw.setdefault('islog',0)
1984 1972 kw.setdefault('quiet',1)
1985 1973 kw.setdefault('exit_ignore',0)
1986 1974 first = xfile.readline()
1987 1975 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
1988 1976 xfile.close()
1989 1977 # line by line execution
1990 1978 if first.startswith(loghead) or kw['islog']:
1991 1979 print 'Loading log file <%s> one line at a time...' % fname
1992 1980 if kw['quiet']:
1993 1981 stdout_save = sys.stdout
1994 1982 sys.stdout = StringIO.StringIO()
1995 1983 try:
1996 1984 globs,locs = where[0:2]
1997 1985 except:
1998 1986 try:
1999 1987 globs = locs = where[0]
2000 1988 except:
2001 1989 globs = locs = globals()
2002 1990 badblocks = []
2003 1991
2004 1992 # we also need to identify indented blocks of code when replaying
2005 1993 # logs and put them together before passing them to an exec
2006 1994 # statement. This takes a bit of regexp and look-ahead work in the
2007 1995 # file. It's easiest if we swallow the whole thing in memory
2008 1996 # first, and manually walk through the lines list moving the
2009 1997 # counter ourselves.
2010 1998 indent_re = re.compile('\s+\S')
2011 1999 xfile = open(fname)
2012 2000 filelines = xfile.readlines()
2013 2001 xfile.close()
2014 2002 nlines = len(filelines)
2015 2003 lnum = 0
2016 2004 while lnum < nlines:
2017 2005 line = filelines[lnum]
2018 2006 lnum += 1
2019 2007 # don't re-insert logger status info into cache
2020 2008 if line.startswith('#log#'):
2021 2009 continue
2022 elif line.startswith('#!'):
2023 self.update_cache(line[1:])
2024 2010 else:
2025 2011 # build a block of code (maybe a single line) for execution
2026 2012 block = line
2027 2013 try:
2028 2014 next = filelines[lnum] # lnum has already incremented
2029 2015 except:
2030 2016 next = None
2031 2017 while next and indent_re.match(next):
2032 2018 block += next
2033 2019 lnum += 1
2034 2020 try:
2035 2021 next = filelines[lnum]
2036 2022 except:
2037 2023 next = None
2038 2024 # now execute the block of one or more lines
2039 2025 try:
2040 2026 exec block in globs,locs
2041 self.update_cache(block.rstrip())
2042 2027 except SystemExit:
2043 2028 pass
2044 2029 except:
2045 2030 badblocks.append(block.rstrip())
2046 2031 if kw['quiet']: # restore stdout
2047 2032 sys.stdout.close()
2048 2033 sys.stdout = stdout_save
2049 2034 print 'Finished replaying log file <%s>' % fname
2050 2035 if badblocks:
2051 2036 print >> sys.stderr, ('\nThe following lines/blocks in file '
2052 2037 '<%s> reported errors:' % fname)
2053 2038
2054 2039 for badline in badblocks:
2055 2040 print >> sys.stderr, badline
2056 2041 else: # regular file execution
2057 2042 try:
2058 2043 execfile(fname,*where)
2059 2044 except SyntaxError:
2060 2045 etype,evalue = sys.exc_info()[:2]
2061 2046 self.SyntaxTB(etype,evalue,[])
2062 2047 warn('Failure executing file: <%s>' % fname)
2063 2048 except SystemExit,status:
2064 2049 if not kw['exit_ignore']:
2065 2050 self.InteractiveTB()
2066 2051 warn('Failure executing file: <%s>' % fname)
2067 2052 except:
2068 2053 self.InteractiveTB()
2069 2054 warn('Failure executing file: <%s>' % fname)
2070 2055
2071 2056 #************************* end of file <iplib.py> *****************************
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now