##// END OF EJS Templates
Fixed logical flaw (harmless so far) in handle_shell_escape
vivainio -
Show More

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

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