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