##// END OF EJS Templates
deprecate ipmagic, ipalias and ipsystem
vivainio -
Show More
@@ -1,2524 +1,2524 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 1934 2006-11-26 20:37:01Z vivainio $
9 $Id: iplib.py 1935 2006-11-26 20:42:29Z 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 # The first is similar to os.system, but it doesn't return a value,
464 464 # and it allows interpolation of variables in the user's namespace.
465 465 self.system = lambda cmd: \
466 466 shell(self.var_expand(cmd,depth=2),
467 467 header=self.rc.system_header,
468 468 verbose=self.rc.system_verbose)
469 469
470 470 # These are for getoutput and getoutputerror:
471 471 self.getoutput = lambda cmd: \
472 472 getoutput(self.var_expand(cmd,depth=2),
473 473 header=self.rc.system_header,
474 474 verbose=self.rc.system_verbose)
475 475
476 476 self.getoutputerror = lambda cmd: \
477 477 getoutputerror(self.var_expand(cmd,depth=2),
478 478 header=self.rc.system_header,
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 var_expand(self,cmd,depth=0):
620 620 """Expand python variables in a string.
621 621
622 622 The depth argument indicates how many frames above the caller should
623 623 be walked to look for the local namespace where to expand variables.
624 624
625 625 The global namespace for expansion is always the user's interactive
626 626 namespace.
627 627 """
628 628
629 629 return str(ItplNS(cmd.replace('#','\#'),
630 630 self.user_ns, # globals
631 631 # Skip our own frame in searching for locals:
632 632 sys._getframe(depth+1).f_locals # locals
633 633 ))
634 634
635 635 def pre_config_initialization(self):
636 636 """Pre-configuration init method
637 637
638 638 This is called before the configuration files are processed to
639 639 prepare the services the config files might need.
640 640
641 641 self.rc already has reasonable default values at this point.
642 642 """
643 643 rc = self.rc
644 644
645 645 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
646 646
647 647 def post_config_initialization(self):
648 648 """Post configuration init method
649 649
650 650 This is called after the configuration files have been processed to
651 651 'finalize' the initialization."""
652 652
653 653 rc = self.rc
654 654
655 655 # Object inspector
656 656 self.inspector = OInspect.Inspector(OInspect.InspectColors,
657 657 PyColorize.ANSICodeColors,
658 658 'NoColor',
659 659 rc.object_info_string_level)
660 660
661 661 # Load readline proper
662 662 if rc.readline:
663 663 self.init_readline()
664 664
665 665 # local shortcut, this is used a LOT
666 666 self.log = self.logger.log
667 667
668 668 # Initialize cache, set in/out prompts and printing system
669 669 self.outputcache = CachedOutput(self,
670 670 rc.cache_size,
671 671 rc.pprint,
672 672 input_sep = rc.separate_in,
673 673 output_sep = rc.separate_out,
674 674 output_sep2 = rc.separate_out2,
675 675 ps1 = rc.prompt_in1,
676 676 ps2 = rc.prompt_in2,
677 677 ps_out = rc.prompt_out,
678 678 pad_left = rc.prompts_pad_left)
679 679
680 680 # user may have over-ridden the default print hook:
681 681 try:
682 682 self.outputcache.__class__.display = self.hooks.display
683 683 except AttributeError:
684 684 pass
685 685
686 686 # I don't like assigning globally to sys, because it means when
687 687 # embedding instances, each embedded instance overrides the previous
688 688 # choice. But sys.displayhook seems to be called internally by exec,
689 689 # so I don't see a way around it. We first save the original and then
690 690 # overwrite it.
691 691 self.sys_displayhook = sys.displayhook
692 692 sys.displayhook = self.outputcache
693 693
694 694 # Set user colors (don't do it in the constructor above so that it
695 695 # doesn't crash if colors option is invalid)
696 696 self.magic_colors(rc.colors)
697 697
698 698 # Set calling of pdb on exceptions
699 699 self.call_pdb = rc.pdb
700 700
701 701 # Load user aliases
702 702 for alias in rc.alias:
703 703 self.magic_alias(alias)
704 704 self.hooks.late_startup_hook()
705 705
706 706 batchrun = False
707 707 for batchfile in [path(arg) for arg in self.rc.args
708 708 if arg.lower().endswith('.ipy')]:
709 709 if not batchfile.isfile():
710 710 print "No such batch file:", batchfile
711 711 continue
712 712 self.api.runlines(batchfile.text())
713 713 batchrun = True
714 714 if batchrun:
715 715 self.exit_now = True
716 716
717 717 def add_builtins(self):
718 718 """Store ipython references into the builtin namespace.
719 719
720 720 Some parts of ipython operate via builtins injected here, which hold a
721 721 reference to IPython itself."""
722 722
723 723 # TODO: deprecate all except _ip; 'jobs' should be installed
724 724 # by an extension and the rest are under _ip, ipalias is redundant
725 725 builtins_new = dict(__IPYTHON__ = self,
726 ip_set_hook = self.set_hook,
727 jobs = self.jobs,
728 ipmagic = self.ipmagic,
729 ipalias = self.ipalias,
730 ipsystem = self.ipsystem,
731 _ip = self.api
732 )
726 ip_set_hook = self.set_hook,
727 jobs = self.jobs,
728 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
729 ipalias = wrap_deprecated(self.ipalias),
730 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
731 _ip = self.api
732 )
733 733 for biname,bival in builtins_new.items():
734 734 try:
735 735 # store the orignal value so we can restore it
736 736 self.builtins_added[biname] = __builtin__.__dict__[biname]
737 737 except KeyError:
738 738 # or mark that it wasn't defined, and we'll just delete it at
739 739 # cleanup
740 740 self.builtins_added[biname] = Undefined
741 741 __builtin__.__dict__[biname] = bival
742 742
743 743 # Keep in the builtins a flag for when IPython is active. We set it
744 744 # with setdefault so that multiple nested IPythons don't clobber one
745 745 # another. Each will increase its value by one upon being activated,
746 746 # which also gives us a way to determine the nesting level.
747 747 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
748 748
749 749 def clean_builtins(self):
750 750 """Remove any builtins which might have been added by add_builtins, or
751 751 restore overwritten ones to their previous values."""
752 752 for biname,bival in self.builtins_added.items():
753 753 if bival is Undefined:
754 754 del __builtin__.__dict__[biname]
755 755 else:
756 756 __builtin__.__dict__[biname] = bival
757 757 self.builtins_added.clear()
758 758
759 759 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
760 760 """set_hook(name,hook) -> sets an internal IPython hook.
761 761
762 762 IPython exposes some of its internal API as user-modifiable hooks. By
763 763 adding your function to one of these hooks, you can modify IPython's
764 764 behavior to call at runtime your own routines."""
765 765
766 766 # At some point in the future, this should validate the hook before it
767 767 # accepts it. Probably at least check that the hook takes the number
768 768 # of args it's supposed to.
769 769
770 770 f = new.instancemethod(hook,self,self.__class__)
771 771
772 772 # check if the hook is for strdispatcher first
773 773 if str_key is not None:
774 774 sdp = self.strdispatchers.get(name, StrDispatch())
775 775 sdp.add_s(str_key, f, priority )
776 776 self.strdispatchers[name] = sdp
777 777 return
778 778 if re_key is not None:
779 779 sdp = self.strdispatchers.get(name, StrDispatch())
780 780 sdp.add_re(re.compile(re_key), f, priority )
781 781 self.strdispatchers[name] = sdp
782 782 return
783 783
784 784 dp = getattr(self.hooks, name, None)
785 785 if name not in IPython.hooks.__all__:
786 786 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
787 787 if not dp:
788 788 dp = IPython.hooks.CommandChainDispatcher()
789 789
790 790 try:
791 791 dp.add(f,priority)
792 792 except AttributeError:
793 793 # it was not commandchain, plain old func - replace
794 794 dp = f
795 795
796 796 setattr(self.hooks,name, dp)
797 797
798 798
799 799 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
800 800
801 801 def set_crash_handler(self,crashHandler):
802 802 """Set the IPython crash handler.
803 803
804 804 This must be a callable with a signature suitable for use as
805 805 sys.excepthook."""
806 806
807 807 # Install the given crash handler as the Python exception hook
808 808 sys.excepthook = crashHandler
809 809
810 810 # The instance will store a pointer to this, so that runtime code
811 811 # (such as magics) can access it. This is because during the
812 812 # read-eval loop, it gets temporarily overwritten (to deal with GUI
813 813 # frameworks).
814 814 self.sys_excepthook = sys.excepthook
815 815
816 816
817 817 def set_custom_exc(self,exc_tuple,handler):
818 818 """set_custom_exc(exc_tuple,handler)
819 819
820 820 Set a custom exception handler, which will be called if any of the
821 821 exceptions in exc_tuple occur in the mainloop (specifically, in the
822 822 runcode() method.
823 823
824 824 Inputs:
825 825
826 826 - exc_tuple: a *tuple* of valid exceptions to call the defined
827 827 handler for. It is very important that you use a tuple, and NOT A
828 828 LIST here, because of the way Python's except statement works. If
829 829 you only want to trap a single exception, use a singleton tuple:
830 830
831 831 exc_tuple == (MyCustomException,)
832 832
833 833 - handler: this must be defined as a function with the following
834 834 basic interface: def my_handler(self,etype,value,tb).
835 835
836 836 This will be made into an instance method (via new.instancemethod)
837 837 of IPython itself, and it will be called if any of the exceptions
838 838 listed in the exc_tuple are caught. If the handler is None, an
839 839 internal basic one is used, which just prints basic info.
840 840
841 841 WARNING: by putting in your own exception handler into IPython's main
842 842 execution loop, you run a very good chance of nasty crashes. This
843 843 facility should only be used if you really know what you are doing."""
844 844
845 845 assert type(exc_tuple)==type(()) , \
846 846 "The custom exceptions must be given AS A TUPLE."
847 847
848 848 def dummy_handler(self,etype,value,tb):
849 849 print '*** Simple custom exception handler ***'
850 850 print 'Exception type :',etype
851 851 print 'Exception value:',value
852 852 print 'Traceback :',tb
853 853 print 'Source code :','\n'.join(self.buffer)
854 854
855 855 if handler is None: handler = dummy_handler
856 856
857 857 self.CustomTB = new.instancemethod(handler,self,self.__class__)
858 858 self.custom_exceptions = exc_tuple
859 859
860 860 def set_custom_completer(self,completer,pos=0):
861 861 """set_custom_completer(completer,pos=0)
862 862
863 863 Adds a new custom completer function.
864 864
865 865 The position argument (defaults to 0) is the index in the completers
866 866 list where you want the completer to be inserted."""
867 867
868 868 newcomp = new.instancemethod(completer,self.Completer,
869 869 self.Completer.__class__)
870 870 self.Completer.matchers.insert(pos,newcomp)
871 871
872 872 def _get_call_pdb(self):
873 873 return self._call_pdb
874 874
875 875 def _set_call_pdb(self,val):
876 876
877 877 if val not in (0,1,False,True):
878 878 raise ValueError,'new call_pdb value must be boolean'
879 879
880 880 # store value in instance
881 881 self._call_pdb = val
882 882
883 883 # notify the actual exception handlers
884 884 self.InteractiveTB.call_pdb = val
885 885 if self.isthreaded:
886 886 try:
887 887 self.sys_excepthook.call_pdb = val
888 888 except:
889 889 warn('Failed to activate pdb for threaded exception handler')
890 890
891 891 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
892 892 'Control auto-activation of pdb at exceptions')
893 893
894 894
895 895 # These special functions get installed in the builtin namespace, to
896 896 # provide programmatic (pure python) access to magics, aliases and system
897 897 # calls. This is important for logging, user scripting, and more.
898 898
899 899 # We are basically exposing, via normal python functions, the three
900 900 # mechanisms in which ipython offers special call modes (magics for
901 901 # internal control, aliases for direct system access via pre-selected
902 902 # names, and !cmd for calling arbitrary system commands).
903 903
904 904 def ipmagic(self,arg_s):
905 905 """Call a magic function by name.
906 906
907 907 Input: a string containing the name of the magic function to call and any
908 908 additional arguments to be passed to the magic.
909 909
910 910 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
911 911 prompt:
912 912
913 913 In[1]: %name -opt foo bar
914 914
915 915 To call a magic without arguments, simply use ipmagic('name').
916 916
917 917 This provides a proper Python function to call IPython's magics in any
918 918 valid Python code you can type at the interpreter, including loops and
919 919 compound statements. It is added by IPython to the Python builtin
920 920 namespace upon initialization."""
921 921
922 922 args = arg_s.split(' ',1)
923 923 magic_name = args[0]
924 924 magic_name = magic_name.lstrip(self.ESC_MAGIC)
925 925
926 926 try:
927 927 magic_args = args[1]
928 928 except IndexError:
929 929 magic_args = ''
930 930 fn = getattr(self,'magic_'+magic_name,None)
931 931 if fn is None:
932 932 error("Magic function `%s` not found." % magic_name)
933 933 else:
934 934 magic_args = self.var_expand(magic_args,1)
935 935 return fn(magic_args)
936 936
937 937 def ipalias(self,arg_s):
938 938 """Call an alias by name.
939 939
940 940 Input: a string containing the name of the alias to call and any
941 941 additional arguments to be passed to the magic.
942 942
943 943 ipalias('name -opt foo bar') is equivalent to typing at the ipython
944 944 prompt:
945 945
946 946 In[1]: name -opt foo bar
947 947
948 948 To call an alias without arguments, simply use ipalias('name').
949 949
950 950 This provides a proper Python function to call IPython's aliases in any
951 951 valid Python code you can type at the interpreter, including loops and
952 952 compound statements. It is added by IPython to the Python builtin
953 953 namespace upon initialization."""
954 954
955 955 args = arg_s.split(' ',1)
956 956 alias_name = args[0]
957 957 try:
958 958 alias_args = args[1]
959 959 except IndexError:
960 960 alias_args = ''
961 961 if alias_name in self.alias_table:
962 962 self.call_alias(alias_name,alias_args)
963 963 else:
964 964 error("Alias `%s` not found." % alias_name)
965 965
966 966 def ipsystem(self,arg_s):
967 967 """Make a system call, using IPython."""
968 968
969 969 self.system(arg_s)
970 970
971 971 def complete(self,text):
972 972 """Return a sorted list of all possible completions on text.
973 973
974 974 Inputs:
975 975
976 976 - text: a string of text to be completed on.
977 977
978 978 This is a wrapper around the completion mechanism, similar to what
979 979 readline does at the command line when the TAB key is hit. By
980 980 exposing it as a method, it can be used by other non-readline
981 981 environments (such as GUIs) for text completion.
982 982
983 983 Simple usage example:
984 984
985 985 In [1]: x = 'hello'
986 986
987 987 In [2]: __IP.complete('x.l')
988 988 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
989 989
990 990 complete = self.Completer.complete
991 991 state = 0
992 992 # use a dict so we get unique keys, since ipyhton's multiple
993 993 # completers can return duplicates.
994 994 comps = {}
995 995 while True:
996 996 newcomp = complete(text,state)
997 997 if newcomp is None:
998 998 break
999 999 comps[newcomp] = 1
1000 1000 state += 1
1001 1001 outcomps = comps.keys()
1002 1002 outcomps.sort()
1003 1003 return outcomps
1004 1004
1005 1005 def set_completer_frame(self, frame=None):
1006 1006 if frame:
1007 1007 self.Completer.namespace = frame.f_locals
1008 1008 self.Completer.global_namespace = frame.f_globals
1009 1009 else:
1010 1010 self.Completer.namespace = self.user_ns
1011 1011 self.Completer.global_namespace = self.user_global_ns
1012 1012
1013 1013 def init_auto_alias(self):
1014 1014 """Define some aliases automatically.
1015 1015
1016 1016 These are ALL parameter-less aliases"""
1017 1017
1018 1018 for alias,cmd in self.auto_alias:
1019 1019 self.alias_table[alias] = (0,cmd)
1020 1020
1021 1021 def alias_table_validate(self,verbose=0):
1022 1022 """Update information about the alias table.
1023 1023
1024 1024 In particular, make sure no Python keywords/builtins are in it."""
1025 1025
1026 1026 no_alias = self.no_alias
1027 1027 for k in self.alias_table.keys():
1028 1028 if k in no_alias:
1029 1029 del self.alias_table[k]
1030 1030 if verbose:
1031 1031 print ("Deleting alias <%s>, it's a Python "
1032 1032 "keyword or builtin." % k)
1033 1033
1034 1034 def set_autoindent(self,value=None):
1035 1035 """Set the autoindent flag, checking for readline support.
1036 1036
1037 1037 If called with no arguments, it acts as a toggle."""
1038 1038
1039 1039 if not self.has_readline:
1040 1040 if os.name == 'posix':
1041 1041 warn("The auto-indent feature requires the readline library")
1042 1042 self.autoindent = 0
1043 1043 return
1044 1044 if value is None:
1045 1045 self.autoindent = not self.autoindent
1046 1046 else:
1047 1047 self.autoindent = value
1048 1048
1049 1049 def rc_set_toggle(self,rc_field,value=None):
1050 1050 """Set or toggle a field in IPython's rc config. structure.
1051 1051
1052 1052 If called with no arguments, it acts as a toggle.
1053 1053
1054 1054 If called with a non-existent field, the resulting AttributeError
1055 1055 exception will propagate out."""
1056 1056
1057 1057 rc_val = getattr(self.rc,rc_field)
1058 1058 if value is None:
1059 1059 value = not rc_val
1060 1060 setattr(self.rc,rc_field,value)
1061 1061
1062 1062 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1063 1063 """Install the user configuration directory.
1064 1064
1065 1065 Can be called when running for the first time or to upgrade the user's
1066 1066 .ipython/ directory with the mode parameter. Valid modes are 'install'
1067 1067 and 'upgrade'."""
1068 1068
1069 1069 def wait():
1070 1070 try:
1071 1071 raw_input("Please press <RETURN> to start IPython.")
1072 1072 except EOFError:
1073 1073 print >> Term.cout
1074 1074 print '*'*70
1075 1075
1076 1076 cwd = os.getcwd() # remember where we started
1077 1077 glb = glob.glob
1078 1078 print '*'*70
1079 1079 if mode == 'install':
1080 1080 print \
1081 1081 """Welcome to IPython. I will try to create a personal configuration directory
1082 1082 where you can customize many aspects of IPython's functionality in:\n"""
1083 1083 else:
1084 1084 print 'I am going to upgrade your configuration in:'
1085 1085
1086 1086 print ipythondir
1087 1087
1088 1088 rcdirend = os.path.join('IPython','UserConfig')
1089 1089 cfg = lambda d: os.path.join(d,rcdirend)
1090 1090 try:
1091 1091 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1092 1092 except IOError:
1093 1093 warning = """
1094 1094 Installation error. IPython's directory was not found.
1095 1095
1096 1096 Check the following:
1097 1097
1098 1098 The ipython/IPython directory should be in a directory belonging to your
1099 1099 PYTHONPATH environment variable (that is, it should be in a directory
1100 1100 belonging to sys.path). You can copy it explicitly there or just link to it.
1101 1101
1102 1102 IPython will proceed with builtin defaults.
1103 1103 """
1104 1104 warn(warning)
1105 1105 wait()
1106 1106 return
1107 1107
1108 1108 if mode == 'install':
1109 1109 try:
1110 1110 shutil.copytree(rcdir,ipythondir)
1111 1111 os.chdir(ipythondir)
1112 1112 rc_files = glb("ipythonrc*")
1113 1113 for rc_file in rc_files:
1114 1114 os.rename(rc_file,rc_file+rc_suffix)
1115 1115 except:
1116 1116 warning = """
1117 1117
1118 1118 There was a problem with the installation:
1119 1119 %s
1120 1120 Try to correct it or contact the developers if you think it's a bug.
1121 1121 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1122 1122 warn(warning)
1123 1123 wait()
1124 1124 return
1125 1125
1126 1126 elif mode == 'upgrade':
1127 1127 try:
1128 1128 os.chdir(ipythondir)
1129 1129 except:
1130 1130 print """
1131 1131 Can not upgrade: changing to directory %s failed. Details:
1132 1132 %s
1133 1133 """ % (ipythondir,sys.exc_info()[1])
1134 1134 wait()
1135 1135 return
1136 1136 else:
1137 1137 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1138 1138 for new_full_path in sources:
1139 1139 new_filename = os.path.basename(new_full_path)
1140 1140 if new_filename.startswith('ipythonrc'):
1141 1141 new_filename = new_filename + rc_suffix
1142 1142 # The config directory should only contain files, skip any
1143 1143 # directories which may be there (like CVS)
1144 1144 if os.path.isdir(new_full_path):
1145 1145 continue
1146 1146 if os.path.exists(new_filename):
1147 1147 old_file = new_filename+'.old'
1148 1148 if os.path.exists(old_file):
1149 1149 os.remove(old_file)
1150 1150 os.rename(new_filename,old_file)
1151 1151 shutil.copy(new_full_path,new_filename)
1152 1152 else:
1153 1153 raise ValueError,'unrecognized mode for install:',`mode`
1154 1154
1155 1155 # Fix line-endings to those native to each platform in the config
1156 1156 # directory.
1157 1157 try:
1158 1158 os.chdir(ipythondir)
1159 1159 except:
1160 1160 print """
1161 1161 Problem: changing to directory %s failed.
1162 1162 Details:
1163 1163 %s
1164 1164
1165 1165 Some configuration files may have incorrect line endings. This should not
1166 1166 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1167 1167 wait()
1168 1168 else:
1169 1169 for fname in glb('ipythonrc*'):
1170 1170 try:
1171 1171 native_line_ends(fname,backup=0)
1172 1172 except IOError:
1173 1173 pass
1174 1174
1175 1175 if mode == 'install':
1176 1176 print """
1177 1177 Successful installation!
1178 1178
1179 1179 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1180 1180 IPython manual (there are both HTML and PDF versions supplied with the
1181 1181 distribution) to make sure that your system environment is properly configured
1182 1182 to take advantage of IPython's features.
1183 1183
1184 1184 Important note: the configuration system has changed! The old system is
1185 1185 still in place, but its setting may be partly overridden by the settings in
1186 1186 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1187 1187 if some of the new settings bother you.
1188 1188
1189 1189 """
1190 1190 else:
1191 1191 print """
1192 1192 Successful upgrade!
1193 1193
1194 1194 All files in your directory:
1195 1195 %(ipythondir)s
1196 1196 which would have been overwritten by the upgrade were backed up with a .old
1197 1197 extension. If you had made particular customizations in those files you may
1198 1198 want to merge them back into the new files.""" % locals()
1199 1199 wait()
1200 1200 os.chdir(cwd)
1201 1201 # end user_setup()
1202 1202
1203 1203 def atexit_operations(self):
1204 1204 """This will be executed at the time of exit.
1205 1205
1206 1206 Saving of persistent data should be performed here. """
1207 1207
1208 1208 #print '*** IPython exit cleanup ***' # dbg
1209 1209 # input history
1210 1210 self.savehist()
1211 1211
1212 1212 # Cleanup all tempfiles left around
1213 1213 for tfile in self.tempfiles:
1214 1214 try:
1215 1215 os.unlink(tfile)
1216 1216 except OSError:
1217 1217 pass
1218 1218
1219 1219 # save the "persistent data" catch-all dictionary
1220 1220 self.hooks.shutdown_hook()
1221 1221
1222 1222 def savehist(self):
1223 1223 """Save input history to a file (via readline library)."""
1224 1224 try:
1225 1225 self.readline.write_history_file(self.histfile)
1226 1226 except:
1227 1227 print 'Unable to save IPython command history to file: ' + \
1228 1228 `self.histfile`
1229 1229
1230 1230 def history_saving_wrapper(self, func):
1231 1231 """ Wrap func for readline history saving
1232 1232
1233 1233 Convert func into callable that saves & restores
1234 1234 history around the call """
1235 1235
1236 1236 if not self.has_readline:
1237 1237 return func
1238 1238
1239 1239 def wrapper():
1240 1240 self.savehist()
1241 1241 try:
1242 1242 func()
1243 1243 finally:
1244 1244 readline.read_history_file(self.histfile)
1245 1245 return wrapper
1246 1246
1247 1247
1248 1248 def pre_readline(self):
1249 1249 """readline hook to be used at the start of each line.
1250 1250
1251 1251 Currently it handles auto-indent only."""
1252 1252
1253 1253 #debugx('self.indent_current_nsp','pre_readline:')
1254 1254 self.readline.insert_text(self.indent_current_str())
1255 1255
1256 1256 def init_readline(self):
1257 1257 """Command history completion/saving/reloading."""
1258 1258
1259 1259 import IPython.rlineimpl as readline
1260 1260 if not readline.have_readline:
1261 1261 self.has_readline = 0
1262 1262 self.readline = None
1263 1263 # no point in bugging windows users with this every time:
1264 1264 warn('Readline services not available on this platform.')
1265 1265 else:
1266 1266 sys.modules['readline'] = readline
1267 1267 import atexit
1268 1268 from IPython.completer import IPCompleter
1269 1269 self.Completer = IPCompleter(self,
1270 1270 self.user_ns,
1271 1271 self.user_global_ns,
1272 1272 self.rc.readline_omit__names,
1273 1273 self.alias_table)
1274 1274 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1275 1275 self.strdispatchers['complete_command'] = sdisp
1276 1276 self.Completer.custom_completers = sdisp
1277 1277 # Platform-specific configuration
1278 1278 if os.name == 'nt':
1279 1279 self.readline_startup_hook = readline.set_pre_input_hook
1280 1280 else:
1281 1281 self.readline_startup_hook = readline.set_startup_hook
1282 1282
1283 1283 # Load user's initrc file (readline config)
1284 1284 inputrc_name = os.environ.get('INPUTRC')
1285 1285 if inputrc_name is None:
1286 1286 home_dir = get_home_dir()
1287 1287 if home_dir is not None:
1288 1288 inputrc_name = os.path.join(home_dir,'.inputrc')
1289 1289 if os.path.isfile(inputrc_name):
1290 1290 try:
1291 1291 readline.read_init_file(inputrc_name)
1292 1292 except:
1293 1293 warn('Problems reading readline initialization file <%s>'
1294 1294 % inputrc_name)
1295 1295
1296 1296 self.has_readline = 1
1297 1297 self.readline = readline
1298 1298 # save this in sys so embedded copies can restore it properly
1299 1299 sys.ipcompleter = self.Completer.complete
1300 1300 readline.set_completer(self.Completer.complete)
1301 1301
1302 1302 # Configure readline according to user's prefs
1303 1303 for rlcommand in self.rc.readline_parse_and_bind:
1304 1304 readline.parse_and_bind(rlcommand)
1305 1305
1306 1306 # remove some chars from the delimiters list
1307 1307 delims = readline.get_completer_delims()
1308 1308 delims = delims.translate(string._idmap,
1309 1309 self.rc.readline_remove_delims)
1310 1310 readline.set_completer_delims(delims)
1311 1311 # otherwise we end up with a monster history after a while:
1312 1312 readline.set_history_length(1000)
1313 1313 try:
1314 1314 #print '*** Reading readline history' # dbg
1315 1315 readline.read_history_file(self.histfile)
1316 1316 except IOError:
1317 1317 pass # It doesn't exist yet.
1318 1318
1319 1319 atexit.register(self.atexit_operations)
1320 1320 del atexit
1321 1321
1322 1322 # Configure auto-indent for all platforms
1323 1323 self.set_autoindent(self.rc.autoindent)
1324 1324
1325 1325 def ask_yes_no(self,prompt,default=True):
1326 1326 if self.rc.quiet:
1327 1327 return True
1328 1328 return ask_yes_no(prompt,default)
1329 1329
1330 1330 def _should_recompile(self,e):
1331 1331 """Utility routine for edit_syntax_error"""
1332 1332
1333 1333 if e.filename in ('<ipython console>','<input>','<string>',
1334 1334 '<console>','<BackgroundJob compilation>',
1335 1335 None):
1336 1336
1337 1337 return False
1338 1338 try:
1339 1339 if (self.rc.autoedit_syntax and
1340 1340 not self.ask_yes_no('Return to editor to correct syntax error? '
1341 1341 '[Y/n] ','y')):
1342 1342 return False
1343 1343 except EOFError:
1344 1344 return False
1345 1345
1346 1346 def int0(x):
1347 1347 try:
1348 1348 return int(x)
1349 1349 except TypeError:
1350 1350 return 0
1351 1351 # always pass integer line and offset values to editor hook
1352 1352 self.hooks.fix_error_editor(e.filename,
1353 1353 int0(e.lineno),int0(e.offset),e.msg)
1354 1354 return True
1355 1355
1356 1356 def edit_syntax_error(self):
1357 1357 """The bottom half of the syntax error handler called in the main loop.
1358 1358
1359 1359 Loop until syntax error is fixed or user cancels.
1360 1360 """
1361 1361
1362 1362 while self.SyntaxTB.last_syntax_error:
1363 1363 # copy and clear last_syntax_error
1364 1364 err = self.SyntaxTB.clear_err_state()
1365 1365 if not self._should_recompile(err):
1366 1366 return
1367 1367 try:
1368 1368 # may set last_syntax_error again if a SyntaxError is raised
1369 1369 self.safe_execfile(err.filename,self.user_ns)
1370 1370 except:
1371 1371 self.showtraceback()
1372 1372 else:
1373 1373 try:
1374 1374 f = file(err.filename)
1375 1375 try:
1376 1376 sys.displayhook(f.read())
1377 1377 finally:
1378 1378 f.close()
1379 1379 except:
1380 1380 self.showtraceback()
1381 1381
1382 1382 def showsyntaxerror(self, filename=None):
1383 1383 """Display the syntax error that just occurred.
1384 1384
1385 1385 This doesn't display a stack trace because there isn't one.
1386 1386
1387 1387 If a filename is given, it is stuffed in the exception instead
1388 1388 of what was there before (because Python's parser always uses
1389 1389 "<string>" when reading from a string).
1390 1390 """
1391 1391 etype, value, last_traceback = sys.exc_info()
1392 1392
1393 1393 # See note about these variables in showtraceback() below
1394 1394 sys.last_type = etype
1395 1395 sys.last_value = value
1396 1396 sys.last_traceback = last_traceback
1397 1397
1398 1398 if filename and etype is SyntaxError:
1399 1399 # Work hard to stuff the correct filename in the exception
1400 1400 try:
1401 1401 msg, (dummy_filename, lineno, offset, line) = value
1402 1402 except:
1403 1403 # Not the format we expect; leave it alone
1404 1404 pass
1405 1405 else:
1406 1406 # Stuff in the right filename
1407 1407 try:
1408 1408 # Assume SyntaxError is a class exception
1409 1409 value = SyntaxError(msg, (filename, lineno, offset, line))
1410 1410 except:
1411 1411 # If that failed, assume SyntaxError is a string
1412 1412 value = msg, (filename, lineno, offset, line)
1413 1413 self.SyntaxTB(etype,value,[])
1414 1414
1415 1415 def debugger(self):
1416 1416 """Call the pydb/pdb debugger."""
1417 1417
1418 1418 if not self.rc.pdb:
1419 1419 return
1420 1420 have_pydb = False
1421 1421 if sys.version[:3] >= '2.5':
1422 1422 try:
1423 1423 from pydb import pm
1424 1424 have_pydb = True
1425 1425 except ImportError:
1426 1426 pass
1427 1427 if not have_pydb:
1428 1428 from pdb import pm
1429 1429 self.history_saving_wrapper(pm)()
1430 1430
1431 1431 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1432 1432 """Display the exception that just occurred.
1433 1433
1434 1434 If nothing is known about the exception, this is the method which
1435 1435 should be used throughout the code for presenting user tracebacks,
1436 1436 rather than directly invoking the InteractiveTB object.
1437 1437
1438 1438 A specific showsyntaxerror() also exists, but this method can take
1439 1439 care of calling it if needed, so unless you are explicitly catching a
1440 1440 SyntaxError exception, don't try to analyze the stack manually and
1441 1441 simply call this method."""
1442 1442
1443 1443 # Though this won't be called by syntax errors in the input line,
1444 1444 # there may be SyntaxError cases whith imported code.
1445 1445 if exc_tuple is None:
1446 1446 etype, value, tb = sys.exc_info()
1447 1447 else:
1448 1448 etype, value, tb = exc_tuple
1449 1449 if etype is SyntaxError:
1450 1450 self.showsyntaxerror(filename)
1451 1451 else:
1452 1452 # WARNING: these variables are somewhat deprecated and not
1453 1453 # necessarily safe to use in a threaded environment, but tools
1454 1454 # like pdb depend on their existence, so let's set them. If we
1455 1455 # find problems in the field, we'll need to revisit their use.
1456 1456 sys.last_type = etype
1457 1457 sys.last_value = value
1458 1458 sys.last_traceback = tb
1459 1459
1460 1460 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1461 1461 if self.InteractiveTB.call_pdb and self.has_readline:
1462 1462 # pdb mucks up readline, fix it back
1463 1463 self.readline.set_completer(self.Completer.complete)
1464 1464
1465 1465 def mainloop(self,banner=None):
1466 1466 """Creates the local namespace and starts the mainloop.
1467 1467
1468 1468 If an optional banner argument is given, it will override the
1469 1469 internally created default banner."""
1470 1470
1471 1471 if self.rc.c: # Emulate Python's -c option
1472 1472 self.exec_init_cmd()
1473 1473 if banner is None:
1474 1474 if not self.rc.banner:
1475 1475 banner = ''
1476 1476 # banner is string? Use it directly!
1477 1477 elif isinstance(self.rc.banner,basestring):
1478 1478 banner = self.rc.banner
1479 1479 else:
1480 1480 banner = self.BANNER+self.banner2
1481 1481
1482 1482 self.interact(banner)
1483 1483
1484 1484 def exec_init_cmd(self):
1485 1485 """Execute a command given at the command line.
1486 1486
1487 1487 This emulates Python's -c option."""
1488 1488
1489 1489 #sys.argv = ['-c']
1490 1490 self.push(self.rc.c)
1491 1491
1492 1492 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1493 1493 """Embeds IPython into a running python program.
1494 1494
1495 1495 Input:
1496 1496
1497 1497 - header: An optional header message can be specified.
1498 1498
1499 1499 - local_ns, global_ns: working namespaces. If given as None, the
1500 1500 IPython-initialized one is updated with __main__.__dict__, so that
1501 1501 program variables become visible but user-specific configuration
1502 1502 remains possible.
1503 1503
1504 1504 - stack_depth: specifies how many levels in the stack to go to
1505 1505 looking for namespaces (when local_ns and global_ns are None). This
1506 1506 allows an intermediate caller to make sure that this function gets
1507 1507 the namespace from the intended level in the stack. By default (0)
1508 1508 it will get its locals and globals from the immediate caller.
1509 1509
1510 1510 Warning: it's possible to use this in a program which is being run by
1511 1511 IPython itself (via %run), but some funny things will happen (a few
1512 1512 globals get overwritten). In the future this will be cleaned up, as
1513 1513 there is no fundamental reason why it can't work perfectly."""
1514 1514
1515 1515 # Get locals and globals from caller
1516 1516 if local_ns is None or global_ns is None:
1517 1517 call_frame = sys._getframe(stack_depth).f_back
1518 1518
1519 1519 if local_ns is None:
1520 1520 local_ns = call_frame.f_locals
1521 1521 if global_ns is None:
1522 1522 global_ns = call_frame.f_globals
1523 1523
1524 1524 # Update namespaces and fire up interpreter
1525 1525
1526 1526 # The global one is easy, we can just throw it in
1527 1527 self.user_global_ns = global_ns
1528 1528
1529 1529 # but the user/local one is tricky: ipython needs it to store internal
1530 1530 # data, but we also need the locals. We'll copy locals in the user
1531 1531 # one, but will track what got copied so we can delete them at exit.
1532 1532 # This is so that a later embedded call doesn't see locals from a
1533 1533 # previous call (which most likely existed in a separate scope).
1534 1534 local_varnames = local_ns.keys()
1535 1535 self.user_ns.update(local_ns)
1536 1536
1537 1537 # Patch for global embedding to make sure that things don't overwrite
1538 1538 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1539 1539 # FIXME. Test this a bit more carefully (the if.. is new)
1540 1540 if local_ns is None and global_ns is None:
1541 1541 self.user_global_ns.update(__main__.__dict__)
1542 1542
1543 1543 # make sure the tab-completer has the correct frame information, so it
1544 1544 # actually completes using the frame's locals/globals
1545 1545 self.set_completer_frame()
1546 1546
1547 1547 # before activating the interactive mode, we need to make sure that
1548 1548 # all names in the builtin namespace needed by ipython point to
1549 1549 # ourselves, and not to other instances.
1550 1550 self.add_builtins()
1551 1551
1552 1552 self.interact(header)
1553 1553
1554 1554 # now, purge out the user namespace from anything we might have added
1555 1555 # from the caller's local namespace
1556 1556 delvar = self.user_ns.pop
1557 1557 for var in local_varnames:
1558 1558 delvar(var,None)
1559 1559 # and clean builtins we may have overridden
1560 1560 self.clean_builtins()
1561 1561
1562 1562 def interact(self, banner=None):
1563 1563 """Closely emulate the interactive Python console.
1564 1564
1565 1565 The optional banner argument specify the banner to print
1566 1566 before the first interaction; by default it prints a banner
1567 1567 similar to the one printed by the real Python interpreter,
1568 1568 followed by the current class name in parentheses (so as not
1569 1569 to confuse this with the real interpreter -- since it's so
1570 1570 close!).
1571 1571
1572 1572 """
1573 1573
1574 1574 if self.exit_now:
1575 1575 # batch run -> do not interact
1576 1576 return
1577 1577 cprt = 'Type "copyright", "credits" or "license" for more information.'
1578 1578 if banner is None:
1579 1579 self.write("Python %s on %s\n%s\n(%s)\n" %
1580 1580 (sys.version, sys.platform, cprt,
1581 1581 self.__class__.__name__))
1582 1582 else:
1583 1583 self.write(banner)
1584 1584
1585 1585 more = 0
1586 1586
1587 1587 # Mark activity in the builtins
1588 1588 __builtin__.__dict__['__IPYTHON__active'] += 1
1589 1589
1590 1590 # exit_now is set by a call to %Exit or %Quit
1591 1591 while not self.exit_now:
1592 1592 if more:
1593 1593 prompt = self.hooks.generate_prompt(True)
1594 1594 if self.autoindent:
1595 1595 self.readline_startup_hook(self.pre_readline)
1596 1596 else:
1597 1597 prompt = self.hooks.generate_prompt(False)
1598 1598 try:
1599 1599 line = self.raw_input(prompt,more)
1600 1600 if self.exit_now:
1601 1601 # quick exit on sys.std[in|out] close
1602 1602 break
1603 1603 if self.autoindent:
1604 1604 self.readline_startup_hook(None)
1605 1605 except KeyboardInterrupt:
1606 1606 self.write('\nKeyboardInterrupt\n')
1607 1607 self.resetbuffer()
1608 1608 # keep cache in sync with the prompt counter:
1609 1609 self.outputcache.prompt_count -= 1
1610 1610
1611 1611 if self.autoindent:
1612 1612 self.indent_current_nsp = 0
1613 1613 more = 0
1614 1614 except EOFError:
1615 1615 if self.autoindent:
1616 1616 self.readline_startup_hook(None)
1617 1617 self.write('\n')
1618 1618 self.exit()
1619 1619 except bdb.BdbQuit:
1620 1620 warn('The Python debugger has exited with a BdbQuit exception.\n'
1621 1621 'Because of how pdb handles the stack, it is impossible\n'
1622 1622 'for IPython to properly format this particular exception.\n'
1623 1623 'IPython will resume normal operation.')
1624 1624 except:
1625 1625 # exceptions here are VERY RARE, but they can be triggered
1626 1626 # asynchronously by signal handlers, for example.
1627 1627 self.showtraceback()
1628 1628 else:
1629 1629 more = self.push(line)
1630 1630 if (self.SyntaxTB.last_syntax_error and
1631 1631 self.rc.autoedit_syntax):
1632 1632 self.edit_syntax_error()
1633 1633
1634 1634 # We are off again...
1635 1635 __builtin__.__dict__['__IPYTHON__active'] -= 1
1636 1636
1637 1637 def excepthook(self, etype, value, tb):
1638 1638 """One more defense for GUI apps that call sys.excepthook.
1639 1639
1640 1640 GUI frameworks like wxPython trap exceptions and call
1641 1641 sys.excepthook themselves. I guess this is a feature that
1642 1642 enables them to keep running after exceptions that would
1643 1643 otherwise kill their mainloop. This is a bother for IPython
1644 1644 which excepts to catch all of the program exceptions with a try:
1645 1645 except: statement.
1646 1646
1647 1647 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1648 1648 any app directly invokes sys.excepthook, it will look to the user like
1649 1649 IPython crashed. In order to work around this, we can disable the
1650 1650 CrashHandler and replace it with this excepthook instead, which prints a
1651 1651 regular traceback using our InteractiveTB. In this fashion, apps which
1652 1652 call sys.excepthook will generate a regular-looking exception from
1653 1653 IPython, and the CrashHandler will only be triggered by real IPython
1654 1654 crashes.
1655 1655
1656 1656 This hook should be used sparingly, only in places which are not likely
1657 1657 to be true IPython errors.
1658 1658 """
1659 1659 self.showtraceback((etype,value,tb),tb_offset=0)
1660 1660
1661 1661 def expand_aliases(self,fn,rest):
1662 1662 """ Expand multiple levels of aliases:
1663 1663
1664 1664 if:
1665 1665
1666 1666 alias foo bar /tmp
1667 1667 alias baz foo
1668 1668
1669 1669 then:
1670 1670
1671 1671 baz huhhahhei -> bar /tmp huhhahhei
1672 1672
1673 1673 """
1674 1674 line = fn + " " + rest
1675 1675
1676 1676 done = Set()
1677 1677 while 1:
1678 1678 pre,fn,rest = self.split_user_input(line)
1679 1679 if fn in self.alias_table:
1680 1680 if fn in done:
1681 1681 warn("Cyclic alias definition, repeated '%s'" % fn)
1682 1682 return ""
1683 1683 done.add(fn)
1684 1684
1685 1685 l2 = self.transform_alias(fn,rest)
1686 1686 # dir -> dir
1687 1687 # print "alias",line, "->",l2 #dbg
1688 1688 if l2 == line:
1689 1689 break
1690 1690 # ls -> ls -F should not recurse forever
1691 1691 if l2.split(None,1)[0] == line.split(None,1)[0]:
1692 1692 line = l2
1693 1693 break
1694 1694
1695 1695 line=l2
1696 1696
1697 1697
1698 1698 # print "al expand to",line #dbg
1699 1699 else:
1700 1700 break
1701 1701
1702 1702 return line
1703 1703
1704 1704 def transform_alias(self, alias,rest=''):
1705 1705 """ Transform alias to system command string.
1706 1706 """
1707 1707 nargs,cmd = self.alias_table[alias]
1708 1708 if ' ' in cmd and os.path.isfile(cmd):
1709 1709 cmd = '"%s"' % cmd
1710 1710
1711 1711 # Expand the %l special to be the user's input line
1712 1712 if cmd.find('%l') >= 0:
1713 1713 cmd = cmd.replace('%l',rest)
1714 1714 rest = ''
1715 1715 if nargs==0:
1716 1716 # Simple, argument-less aliases
1717 1717 cmd = '%s %s' % (cmd,rest)
1718 1718 else:
1719 1719 # Handle aliases with positional arguments
1720 1720 args = rest.split(None,nargs)
1721 1721 if len(args)< nargs:
1722 1722 error('Alias <%s> requires %s arguments, %s given.' %
1723 1723 (alias,nargs,len(args)))
1724 1724 return None
1725 1725 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1726 1726 # Now call the macro, evaluating in the user's namespace
1727 1727 #print 'new command: <%r>' % cmd # dbg
1728 1728 return cmd
1729 1729
1730 1730 def call_alias(self,alias,rest=''):
1731 1731 """Call an alias given its name and the rest of the line.
1732 1732
1733 1733 This is only used to provide backwards compatibility for users of
1734 1734 ipalias(), use of which is not recommended for anymore."""
1735 1735
1736 1736 # Now call the macro, evaluating in the user's namespace
1737 1737 cmd = self.transform_alias(alias, rest)
1738 1738 try:
1739 1739 self.system(cmd)
1740 1740 except:
1741 1741 self.showtraceback()
1742 1742
1743 1743 def indent_current_str(self):
1744 1744 """return the current level of indentation as a string"""
1745 1745 return self.indent_current_nsp * ' '
1746 1746
1747 1747 def autoindent_update(self,line):
1748 1748 """Keep track of the indent level."""
1749 1749
1750 1750 #debugx('line')
1751 1751 #debugx('self.indent_current_nsp')
1752 1752 if self.autoindent:
1753 1753 if line:
1754 1754 inisp = num_ini_spaces(line)
1755 1755 if inisp < self.indent_current_nsp:
1756 1756 self.indent_current_nsp = inisp
1757 1757
1758 1758 if line[-1] == ':':
1759 1759 self.indent_current_nsp += 4
1760 1760 elif dedent_re.match(line):
1761 1761 self.indent_current_nsp -= 4
1762 1762 else:
1763 1763 self.indent_current_nsp = 0
1764 1764
1765 1765 def runlines(self,lines):
1766 1766 """Run a string of one or more lines of source.
1767 1767
1768 1768 This method is capable of running a string containing multiple source
1769 1769 lines, as if they had been entered at the IPython prompt. Since it
1770 1770 exposes IPython's processing machinery, the given strings can contain
1771 1771 magic calls (%magic), special shell access (!cmd), etc."""
1772 1772
1773 1773 # We must start with a clean buffer, in case this is run from an
1774 1774 # interactive IPython session (via a magic, for example).
1775 1775 self.resetbuffer()
1776 1776 lines = lines.split('\n')
1777 1777 more = 0
1778 1778 for line in lines:
1779 1779 # skip blank lines so we don't mess up the prompt counter, but do
1780 1780 # NOT skip even a blank line if we are in a code block (more is
1781 1781 # true)
1782 1782 if line or more:
1783 1783 more = self.push(self.prefilter(line,more))
1784 1784 # IPython's runsource returns None if there was an error
1785 1785 # compiling the code. This allows us to stop processing right
1786 1786 # away, so the user gets the error message at the right place.
1787 1787 if more is None:
1788 1788 break
1789 1789 # final newline in case the input didn't have it, so that the code
1790 1790 # actually does get executed
1791 1791 if more:
1792 1792 self.push('\n')
1793 1793
1794 1794 def runsource(self, source, filename='<input>', symbol='single'):
1795 1795 """Compile and run some source in the interpreter.
1796 1796
1797 1797 Arguments are as for compile_command().
1798 1798
1799 1799 One several things can happen:
1800 1800
1801 1801 1) The input is incorrect; compile_command() raised an
1802 1802 exception (SyntaxError or OverflowError). A syntax traceback
1803 1803 will be printed by calling the showsyntaxerror() method.
1804 1804
1805 1805 2) The input is incomplete, and more input is required;
1806 1806 compile_command() returned None. Nothing happens.
1807 1807
1808 1808 3) The input is complete; compile_command() returned a code
1809 1809 object. The code is executed by calling self.runcode() (which
1810 1810 also handles run-time exceptions, except for SystemExit).
1811 1811
1812 1812 The return value is:
1813 1813
1814 1814 - True in case 2
1815 1815
1816 1816 - False in the other cases, unless an exception is raised, where
1817 1817 None is returned instead. This can be used by external callers to
1818 1818 know whether to continue feeding input or not.
1819 1819
1820 1820 The return value can be used to decide whether to use sys.ps1 or
1821 1821 sys.ps2 to prompt the next line."""
1822 1822
1823 1823 # if the source code has leading blanks, add 'if 1:\n' to it
1824 1824 # this allows execution of indented pasted code. It is tempting
1825 1825 # to add '\n' at the end of source to run commands like ' a=1'
1826 1826 # directly, but this fails for more complicated scenarios
1827 1827 if source[:1] in [' ', '\t']:
1828 1828 source = 'if 1:\n%s' % source
1829 1829
1830 1830 try:
1831 1831 code = self.compile(source,filename,symbol)
1832 1832 except (OverflowError, SyntaxError, ValueError):
1833 1833 # Case 1
1834 1834 self.showsyntaxerror(filename)
1835 1835 return None
1836 1836
1837 1837 if code is None:
1838 1838 # Case 2
1839 1839 return True
1840 1840
1841 1841 # Case 3
1842 1842 # We store the code object so that threaded shells and
1843 1843 # custom exception handlers can access all this info if needed.
1844 1844 # The source corresponding to this can be obtained from the
1845 1845 # buffer attribute as '\n'.join(self.buffer).
1846 1846 self.code_to_run = code
1847 1847 # now actually execute the code object
1848 1848 if self.runcode(code) == 0:
1849 1849 return False
1850 1850 else:
1851 1851 return None
1852 1852
1853 1853 def runcode(self,code_obj):
1854 1854 """Execute a code object.
1855 1855
1856 1856 When an exception occurs, self.showtraceback() is called to display a
1857 1857 traceback.
1858 1858
1859 1859 Return value: a flag indicating whether the code to be run completed
1860 1860 successfully:
1861 1861
1862 1862 - 0: successful execution.
1863 1863 - 1: an error occurred.
1864 1864 """
1865 1865
1866 1866 # Set our own excepthook in case the user code tries to call it
1867 1867 # directly, so that the IPython crash handler doesn't get triggered
1868 1868 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1869 1869
1870 1870 # we save the original sys.excepthook in the instance, in case config
1871 1871 # code (such as magics) needs access to it.
1872 1872 self.sys_excepthook = old_excepthook
1873 1873 outflag = 1 # happens in more places, so it's easier as default
1874 1874 try:
1875 1875 try:
1876 1876 # Embedded instances require separate global/local namespaces
1877 1877 # so they can see both the surrounding (local) namespace and
1878 1878 # the module-level globals when called inside another function.
1879 1879 if self.embedded:
1880 1880 exec code_obj in self.user_global_ns, self.user_ns
1881 1881 # Normal (non-embedded) instances should only have a single
1882 1882 # namespace for user code execution, otherwise functions won't
1883 1883 # see interactive top-level globals.
1884 1884 else:
1885 1885 exec code_obj in self.user_ns
1886 1886 finally:
1887 1887 # Reset our crash handler in place
1888 1888 sys.excepthook = old_excepthook
1889 1889 except SystemExit:
1890 1890 self.resetbuffer()
1891 1891 self.showtraceback()
1892 1892 warn("Type %exit or %quit to exit IPython "
1893 1893 "(%Exit or %Quit do so unconditionally).",level=1)
1894 1894 except self.custom_exceptions:
1895 1895 etype,value,tb = sys.exc_info()
1896 1896 self.CustomTB(etype,value,tb)
1897 1897 except:
1898 1898 self.showtraceback()
1899 1899 else:
1900 1900 outflag = 0
1901 1901 if softspace(sys.stdout, 0):
1902 1902 print
1903 1903 # Flush out code object which has been run (and source)
1904 1904 self.code_to_run = None
1905 1905 return outflag
1906 1906
1907 1907 def push(self, line):
1908 1908 """Push a line to the interpreter.
1909 1909
1910 1910 The line should not have a trailing newline; it may have
1911 1911 internal newlines. The line is appended to a buffer and the
1912 1912 interpreter's runsource() method is called with the
1913 1913 concatenated contents of the buffer as source. If this
1914 1914 indicates that the command was executed or invalid, the buffer
1915 1915 is reset; otherwise, the command is incomplete, and the buffer
1916 1916 is left as it was after the line was appended. The return
1917 1917 value is 1 if more input is required, 0 if the line was dealt
1918 1918 with in some way (this is the same as runsource()).
1919 1919 """
1920 1920
1921 1921 # autoindent management should be done here, and not in the
1922 1922 # interactive loop, since that one is only seen by keyboard input. We
1923 1923 # need this done correctly even for code run via runlines (which uses
1924 1924 # push).
1925 1925
1926 1926 #print 'push line: <%s>' % line # dbg
1927 1927 for subline in line.splitlines():
1928 1928 self.autoindent_update(subline)
1929 1929 self.buffer.append(line)
1930 1930 more = self.runsource('\n'.join(self.buffer), self.filename)
1931 1931 if not more:
1932 1932 self.resetbuffer()
1933 1933 return more
1934 1934
1935 1935 def resetbuffer(self):
1936 1936 """Reset the input buffer."""
1937 1937 self.buffer[:] = []
1938 1938
1939 1939 def raw_input(self,prompt='',continue_prompt=False):
1940 1940 """Write a prompt and read a line.
1941 1941
1942 1942 The returned line does not include the trailing newline.
1943 1943 When the user enters the EOF key sequence, EOFError is raised.
1944 1944
1945 1945 Optional inputs:
1946 1946
1947 1947 - prompt(''): a string to be printed to prompt the user.
1948 1948
1949 1949 - continue_prompt(False): whether this line is the first one or a
1950 1950 continuation in a sequence of inputs.
1951 1951 """
1952 1952
1953 1953 try:
1954 1954 line = raw_input_original(prompt)
1955 1955 except ValueError:
1956 1956 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1957 1957 self.exit_now = True
1958 1958 return ""
1959 1959
1960 1960
1961 1961 # Try to be reasonably smart about not re-indenting pasted input more
1962 1962 # than necessary. We do this by trimming out the auto-indent initial
1963 1963 # spaces, if the user's actual input started itself with whitespace.
1964 1964 #debugx('self.buffer[-1]')
1965 1965
1966 1966 if self.autoindent:
1967 1967 if num_ini_spaces(line) > self.indent_current_nsp:
1968 1968 line = line[self.indent_current_nsp:]
1969 1969 self.indent_current_nsp = 0
1970 1970
1971 1971 # store the unfiltered input before the user has any chance to modify
1972 1972 # it.
1973 1973 if line.strip():
1974 1974 if continue_prompt:
1975 1975 self.input_hist_raw[-1] += '%s\n' % line
1976 1976 if self.has_readline: # and some config option is set?
1977 1977 try:
1978 1978 histlen = self.readline.get_current_history_length()
1979 1979 newhist = self.input_hist_raw[-1].rstrip()
1980 1980 self.readline.remove_history_item(histlen-1)
1981 1981 self.readline.replace_history_item(histlen-2,newhist)
1982 1982 except AttributeError:
1983 1983 pass # re{move,place}_history_item are new in 2.4.
1984 1984 else:
1985 1985 self.input_hist_raw.append('%s\n' % line)
1986 1986
1987 1987 try:
1988 1988 lineout = self.prefilter(line,continue_prompt)
1989 1989 except:
1990 1990 # blanket except, in case a user-defined prefilter crashes, so it
1991 1991 # can't take all of ipython with it.
1992 1992 self.showtraceback()
1993 1993 return ''
1994 1994 else:
1995 1995 return lineout
1996 1996
1997 1997 def split_user_input(self,line):
1998 1998 """Split user input into pre-char, function part and rest."""
1999 1999
2000 2000 lsplit = self.line_split.match(line)
2001 2001 if lsplit is None: # no regexp match returns None
2002 2002 try:
2003 2003 iFun,theRest = line.split(None,1)
2004 2004 except ValueError:
2005 2005 iFun,theRest = line,''
2006 2006 pre = re.match('^(\s*)(.*)',line).groups()[0]
2007 2007 else:
2008 2008 pre,iFun,theRest = lsplit.groups()
2009 2009
2010 2010 #print 'line:<%s>' % line # dbg
2011 2011 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2012 2012 return pre,iFun.strip(),theRest
2013 2013
2014 2014 def _prefilter(self, line, continue_prompt):
2015 2015 """Calls different preprocessors, depending on the form of line."""
2016 2016
2017 2017 # All handlers *must* return a value, even if it's blank ('').
2018 2018
2019 2019 # Lines are NOT logged here. Handlers should process the line as
2020 2020 # needed, update the cache AND log it (so that the input cache array
2021 2021 # stays synced).
2022 2022
2023 2023 # This function is _very_ delicate, and since it's also the one which
2024 2024 # determines IPython's response to user input, it must be as efficient
2025 2025 # as possible. For this reason it has _many_ returns in it, trying
2026 2026 # always to exit as quickly as it can figure out what it needs to do.
2027 2027
2028 2028 # This function is the main responsible for maintaining IPython's
2029 2029 # behavior respectful of Python's semantics. So be _very_ careful if
2030 2030 # making changes to anything here.
2031 2031
2032 2032 #.....................................................................
2033 2033 # Code begins
2034 2034
2035 2035 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2036 2036
2037 2037 # save the line away in case we crash, so the post-mortem handler can
2038 2038 # record it
2039 2039 self._last_input_line = line
2040 2040
2041 2041 #print '***line: <%s>' % line # dbg
2042 2042
2043 2043 # the input history needs to track even empty lines
2044 2044 stripped = line.strip()
2045 2045
2046 2046 if not stripped:
2047 2047 if not continue_prompt:
2048 2048 self.outputcache.prompt_count -= 1
2049 2049 return self.handle_normal(line,continue_prompt)
2050 2050 #return self.handle_normal('',continue_prompt)
2051 2051
2052 2052 # print '***cont',continue_prompt # dbg
2053 2053 # special handlers are only allowed for single line statements
2054 2054 if continue_prompt and not self.rc.multi_line_specials:
2055 2055 return self.handle_normal(line,continue_prompt)
2056 2056
2057 2057
2058 2058 # For the rest, we need the structure of the input
2059 2059 pre,iFun,theRest = self.split_user_input(line)
2060 2060
2061 2061 # See whether any pre-existing handler can take care of it
2062 2062
2063 2063 rewritten = self.hooks.input_prefilter(stripped)
2064 2064 if rewritten != stripped: # ok, some prefilter did something
2065 2065 rewritten = pre + rewritten # add indentation
2066 2066 return self.handle_normal(rewritten)
2067 2067
2068 2068 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2069 2069
2070 2070 # First check for explicit escapes in the last/first character
2071 2071 handler = None
2072 2072 if line[-1] == self.ESC_HELP:
2073 2073 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2074 2074 if handler is None:
2075 2075 # look at the first character of iFun, NOT of line, so we skip
2076 2076 # leading whitespace in multiline input
2077 2077 handler = self.esc_handlers.get(iFun[0:1])
2078 2078 if handler is not None:
2079 2079 return handler(line,continue_prompt,pre,iFun,theRest)
2080 2080 # Emacs ipython-mode tags certain input lines
2081 2081 if line.endswith('# PYTHON-MODE'):
2082 2082 return self.handle_emacs(line,continue_prompt)
2083 2083
2084 2084 # Next, check if we can automatically execute this thing
2085 2085
2086 2086 # Allow ! in multi-line statements if multi_line_specials is on:
2087 2087 if continue_prompt and self.rc.multi_line_specials and \
2088 2088 iFun.startswith(self.ESC_SHELL):
2089 2089 return self.handle_shell_escape(line,continue_prompt,
2090 2090 pre=pre,iFun=iFun,
2091 2091 theRest=theRest)
2092 2092
2093 2093 # Let's try to find if the input line is a magic fn
2094 2094 oinfo = None
2095 2095 if hasattr(self,'magic_'+iFun):
2096 2096 # WARNING: _ofind uses getattr(), so it can consume generators and
2097 2097 # cause other side effects.
2098 2098 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2099 2099 if oinfo['ismagic']:
2100 2100 # Be careful not to call magics when a variable assignment is
2101 2101 # being made (ls='hi', for example)
2102 2102 if self.rc.automagic and \
2103 2103 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2104 2104 (self.rc.multi_line_specials or not continue_prompt):
2105 2105 return self.handle_magic(line,continue_prompt,
2106 2106 pre,iFun,theRest)
2107 2107 else:
2108 2108 return self.handle_normal(line,continue_prompt)
2109 2109
2110 2110 # If the rest of the line begins with an (in)equality, assginment or
2111 2111 # function call, we should not call _ofind but simply execute it.
2112 2112 # This avoids spurious geattr() accesses on objects upon assignment.
2113 2113 #
2114 2114 # It also allows users to assign to either alias or magic names true
2115 2115 # python variables (the magic/alias systems always take second seat to
2116 2116 # true python code).
2117 2117 if theRest and theRest[0] in '!=()':
2118 2118 return self.handle_normal(line,continue_prompt)
2119 2119
2120 2120 if oinfo is None:
2121 2121 # let's try to ensure that _oinfo is ONLY called when autocall is
2122 2122 # on. Since it has inevitable potential side effects, at least
2123 2123 # having autocall off should be a guarantee to the user that no
2124 2124 # weird things will happen.
2125 2125
2126 2126 if self.rc.autocall:
2127 2127 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2128 2128 else:
2129 2129 # in this case, all that's left is either an alias or
2130 2130 # processing the line normally.
2131 2131 if iFun in self.alias_table:
2132 2132 # if autocall is off, by not running _ofind we won't know
2133 2133 # whether the given name may also exist in one of the
2134 2134 # user's namespace. At this point, it's best to do a
2135 2135 # quick check just to be sure that we don't let aliases
2136 2136 # shadow variables.
2137 2137 head = iFun.split('.',1)[0]
2138 2138 if head in self.user_ns or head in self.internal_ns \
2139 2139 or head in __builtin__.__dict__:
2140 2140 return self.handle_normal(line,continue_prompt)
2141 2141 else:
2142 2142 return self.handle_alias(line,continue_prompt,
2143 2143 pre,iFun,theRest)
2144 2144
2145 2145 else:
2146 2146 return self.handle_normal(line,continue_prompt)
2147 2147
2148 2148 if not oinfo['found']:
2149 2149 return self.handle_normal(line,continue_prompt)
2150 2150 else:
2151 2151 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2152 2152 if oinfo['isalias']:
2153 2153 return self.handle_alias(line,continue_prompt,
2154 2154 pre,iFun,theRest)
2155 2155
2156 2156 if (self.rc.autocall
2157 2157 and
2158 2158 (
2159 2159 #only consider exclusion re if not "," or ";" autoquoting
2160 2160 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2161 2161 or pre == self.ESC_PAREN) or
2162 2162 (not self.re_exclude_auto.match(theRest)))
2163 2163 and
2164 2164 self.re_fun_name.match(iFun) and
2165 2165 callable(oinfo['obj'])) :
2166 2166 #print 'going auto' # dbg
2167 2167 return self.handle_auto(line,continue_prompt,
2168 2168 pre,iFun,theRest,oinfo['obj'])
2169 2169 else:
2170 2170 #print 'was callable?', callable(oinfo['obj']) # dbg
2171 2171 return self.handle_normal(line,continue_prompt)
2172 2172
2173 2173 # If we get here, we have a normal Python line. Log and return.
2174 2174 return self.handle_normal(line,continue_prompt)
2175 2175
2176 2176 def _prefilter_dumb(self, line, continue_prompt):
2177 2177 """simple prefilter function, for debugging"""
2178 2178 return self.handle_normal(line,continue_prompt)
2179 2179
2180 2180
2181 2181 def multiline_prefilter(self, line, continue_prompt):
2182 2182 """ Run _prefilter for each line of input
2183 2183
2184 2184 Covers cases where there are multiple lines in the user entry,
2185 2185 which is the case when the user goes back to a multiline history
2186 2186 entry and presses enter.
2187 2187
2188 2188 """
2189 2189 out = []
2190 2190 for l in line.rstrip('\n').split('\n'):
2191 2191 out.append(self._prefilter(l, continue_prompt))
2192 2192 return '\n'.join(out)
2193 2193
2194 2194 # Set the default prefilter() function (this can be user-overridden)
2195 2195 prefilter = multiline_prefilter
2196 2196
2197 2197 def handle_normal(self,line,continue_prompt=None,
2198 2198 pre=None,iFun=None,theRest=None):
2199 2199 """Handle normal input lines. Use as a template for handlers."""
2200 2200
2201 2201 # With autoindent on, we need some way to exit the input loop, and I
2202 2202 # don't want to force the user to have to backspace all the way to
2203 2203 # clear the line. The rule will be in this case, that either two
2204 2204 # lines of pure whitespace in a row, or a line of pure whitespace but
2205 2205 # of a size different to the indent level, will exit the input loop.
2206 2206
2207 2207 if (continue_prompt and self.autoindent and line.isspace() and
2208 2208 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2209 2209 (self.buffer[-1]).isspace() )):
2210 2210 line = ''
2211 2211
2212 2212 self.log(line,line,continue_prompt)
2213 2213 return line
2214 2214
2215 2215 def handle_alias(self,line,continue_prompt=None,
2216 2216 pre=None,iFun=None,theRest=None):
2217 2217 """Handle alias input lines. """
2218 2218
2219 2219 # pre is needed, because it carries the leading whitespace. Otherwise
2220 2220 # aliases won't work in indented sections.
2221 2221 transformed = self.expand_aliases(iFun, theRest)
2222 2222 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2223 2223 self.log(line,line_out,continue_prompt)
2224 2224 #print 'line out:',line_out # dbg
2225 2225 return line_out
2226 2226
2227 2227 def handle_shell_escape(self, line, continue_prompt=None,
2228 2228 pre=None,iFun=None,theRest=None):
2229 2229 """Execute the line in a shell, empty return value"""
2230 2230
2231 2231 #print 'line in :', `line` # dbg
2232 2232 # Example of a special handler. Others follow a similar pattern.
2233 2233 if line.lstrip().startswith('!!'):
2234 2234 # rewrite iFun/theRest to properly hold the call to %sx and
2235 2235 # the actual command to be executed, so handle_magic can work
2236 2236 # correctly
2237 2237 theRest = '%s %s' % (iFun[2:],theRest)
2238 2238 iFun = 'sx'
2239 2239 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2240 2240 line.lstrip()[2:]),
2241 2241 continue_prompt,pre,iFun,theRest)
2242 2242 else:
2243 2243 cmd=line.lstrip().lstrip('!')
2244 2244 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2245 2245 # update cache/log and return
2246 2246 self.log(line,line_out,continue_prompt)
2247 2247 return line_out
2248 2248
2249 2249 def handle_magic(self, line, continue_prompt=None,
2250 2250 pre=None,iFun=None,theRest=None):
2251 2251 """Execute magic functions."""
2252 2252
2253 2253
2254 2254 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2255 2255 self.log(line,cmd,continue_prompt)
2256 2256 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2257 2257 return cmd
2258 2258
2259 2259 def handle_auto(self, line, continue_prompt=None,
2260 2260 pre=None,iFun=None,theRest=None,obj=None):
2261 2261 """Hande lines which can be auto-executed, quoting if requested."""
2262 2262
2263 2263 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2264 2264
2265 2265 # This should only be active for single-line input!
2266 2266 if continue_prompt:
2267 2267 self.log(line,line,continue_prompt)
2268 2268 return line
2269 2269
2270 2270 auto_rewrite = True
2271 2271
2272 2272 if pre == self.ESC_QUOTE:
2273 2273 # Auto-quote splitting on whitespace
2274 2274 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2275 2275 elif pre == self.ESC_QUOTE2:
2276 2276 # Auto-quote whole string
2277 2277 newcmd = '%s("%s")' % (iFun,theRest)
2278 2278 elif pre == self.ESC_PAREN:
2279 2279 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2280 2280 else:
2281 2281 # Auto-paren.
2282 2282 # We only apply it to argument-less calls if the autocall
2283 2283 # parameter is set to 2. We only need to check that autocall is <
2284 2284 # 2, since this function isn't called unless it's at least 1.
2285 2285 if not theRest and (self.rc.autocall < 2):
2286 2286 newcmd = '%s %s' % (iFun,theRest)
2287 2287 auto_rewrite = False
2288 2288 else:
2289 2289 if theRest.startswith('['):
2290 2290 if hasattr(obj,'__getitem__'):
2291 2291 # Don't autocall in this case: item access for an object
2292 2292 # which is BOTH callable and implements __getitem__.
2293 2293 newcmd = '%s %s' % (iFun,theRest)
2294 2294 auto_rewrite = False
2295 2295 else:
2296 2296 # if the object doesn't support [] access, go ahead and
2297 2297 # autocall
2298 2298 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2299 2299 elif theRest.endswith(';'):
2300 2300 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2301 2301 else:
2302 2302 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2303 2303
2304 2304 if auto_rewrite:
2305 2305 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2306 2306 # log what is now valid Python, not the actual user input (without the
2307 2307 # final newline)
2308 2308 self.log(line,newcmd,continue_prompt)
2309 2309 return newcmd
2310 2310
2311 2311 def handle_help(self, line, continue_prompt=None,
2312 2312 pre=None,iFun=None,theRest=None):
2313 2313 """Try to get some help for the object.
2314 2314
2315 2315 obj? or ?obj -> basic information.
2316 2316 obj?? or ??obj -> more details.
2317 2317 """
2318 2318
2319 2319 # We need to make sure that we don't process lines which would be
2320 2320 # otherwise valid python, such as "x=1 # what?"
2321 2321 try:
2322 2322 codeop.compile_command(line)
2323 2323 except SyntaxError:
2324 2324 # We should only handle as help stuff which is NOT valid syntax
2325 2325 if line[0]==self.ESC_HELP:
2326 2326 line = line[1:]
2327 2327 elif line[-1]==self.ESC_HELP:
2328 2328 line = line[:-1]
2329 2329 self.log(line,'#?'+line,continue_prompt)
2330 2330 if line:
2331 2331 self.magic_pinfo(line)
2332 2332 else:
2333 2333 page(self.usage,screen_lines=self.rc.screen_length)
2334 2334 return '' # Empty string is needed here!
2335 2335 except:
2336 2336 # Pass any other exceptions through to the normal handler
2337 2337 return self.handle_normal(line,continue_prompt)
2338 2338 else:
2339 2339 # If the code compiles ok, we should handle it normally
2340 2340 return self.handle_normal(line,continue_prompt)
2341 2341
2342 2342 def getapi(self):
2343 2343 """ Get an IPApi object for this shell instance
2344 2344
2345 2345 Getting an IPApi object is always preferable to accessing the shell
2346 2346 directly, but this holds true especially for extensions.
2347 2347
2348 2348 It should always be possible to implement an extension with IPApi
2349 2349 alone. If not, contact maintainer to request an addition.
2350 2350
2351 2351 """
2352 2352 return self.api
2353 2353
2354 2354 def handle_emacs(self,line,continue_prompt=None,
2355 2355 pre=None,iFun=None,theRest=None):
2356 2356 """Handle input lines marked by python-mode."""
2357 2357
2358 2358 # Currently, nothing is done. Later more functionality can be added
2359 2359 # here if needed.
2360 2360
2361 2361 # The input cache shouldn't be updated
2362 2362
2363 2363 return line
2364 2364
2365 2365 def mktempfile(self,data=None):
2366 2366 """Make a new tempfile and return its filename.
2367 2367
2368 2368 This makes a call to tempfile.mktemp, but it registers the created
2369 2369 filename internally so ipython cleans it up at exit time.
2370 2370
2371 2371 Optional inputs:
2372 2372
2373 2373 - data(None): if data is given, it gets written out to the temp file
2374 2374 immediately, and the file is closed again."""
2375 2375
2376 2376 filename = tempfile.mktemp('.py','ipython_edit_')
2377 2377 self.tempfiles.append(filename)
2378 2378
2379 2379 if data:
2380 2380 tmp_file = open(filename,'w')
2381 2381 tmp_file.write(data)
2382 2382 tmp_file.close()
2383 2383 return filename
2384 2384
2385 2385 def write(self,data):
2386 2386 """Write a string to the default output"""
2387 2387 Term.cout.write(data)
2388 2388
2389 2389 def write_err(self,data):
2390 2390 """Write a string to the default error output"""
2391 2391 Term.cerr.write(data)
2392 2392
2393 2393 def exit(self):
2394 2394 """Handle interactive exit.
2395 2395
2396 2396 This method sets the exit_now attribute."""
2397 2397
2398 2398 if self.rc.confirm_exit:
2399 2399 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2400 2400 self.exit_now = True
2401 2401 else:
2402 2402 self.exit_now = True
2403 2403
2404 2404 def safe_execfile(self,fname,*where,**kw):
2405 2405 """A safe version of the builtin execfile().
2406 2406
2407 2407 This version will never throw an exception, and knows how to handle
2408 2408 ipython logs as well."""
2409 2409
2410 2410 def syspath_cleanup():
2411 2411 """Internal cleanup routine for sys.path."""
2412 2412 if add_dname:
2413 2413 try:
2414 2414 sys.path.remove(dname)
2415 2415 except ValueError:
2416 2416 # For some reason the user has already removed it, ignore.
2417 2417 pass
2418 2418
2419 2419 fname = os.path.expanduser(fname)
2420 2420
2421 2421 # Find things also in current directory. This is needed to mimic the
2422 2422 # behavior of running a script from the system command line, where
2423 2423 # Python inserts the script's directory into sys.path
2424 2424 dname = os.path.dirname(os.path.abspath(fname))
2425 2425 add_dname = False
2426 2426 if dname not in sys.path:
2427 2427 sys.path.insert(0,dname)
2428 2428 add_dname = True
2429 2429
2430 2430 try:
2431 2431 xfile = open(fname)
2432 2432 except:
2433 2433 print >> Term.cerr, \
2434 2434 'Could not open file <%s> for safe execution.' % fname
2435 2435 syspath_cleanup()
2436 2436 return None
2437 2437
2438 2438 kw.setdefault('islog',0)
2439 2439 kw.setdefault('quiet',1)
2440 2440 kw.setdefault('exit_ignore',0)
2441 2441 first = xfile.readline()
2442 2442 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2443 2443 xfile.close()
2444 2444 # line by line execution
2445 2445 if first.startswith(loghead) or kw['islog']:
2446 2446 print 'Loading log file <%s> one line at a time...' % fname
2447 2447 if kw['quiet']:
2448 2448 stdout_save = sys.stdout
2449 2449 sys.stdout = StringIO.StringIO()
2450 2450 try:
2451 2451 globs,locs = where[0:2]
2452 2452 except:
2453 2453 try:
2454 2454 globs = locs = where[0]
2455 2455 except:
2456 2456 globs = locs = globals()
2457 2457 badblocks = []
2458 2458
2459 2459 # we also need to identify indented blocks of code when replaying
2460 2460 # logs and put them together before passing them to an exec
2461 2461 # statement. This takes a bit of regexp and look-ahead work in the
2462 2462 # file. It's easiest if we swallow the whole thing in memory
2463 2463 # first, and manually walk through the lines list moving the
2464 2464 # counter ourselves.
2465 2465 indent_re = re.compile('\s+\S')
2466 2466 xfile = open(fname)
2467 2467 filelines = xfile.readlines()
2468 2468 xfile.close()
2469 2469 nlines = len(filelines)
2470 2470 lnum = 0
2471 2471 while lnum < nlines:
2472 2472 line = filelines[lnum]
2473 2473 lnum += 1
2474 2474 # don't re-insert logger status info into cache
2475 2475 if line.startswith('#log#'):
2476 2476 continue
2477 2477 else:
2478 2478 # build a block of code (maybe a single line) for execution
2479 2479 block = line
2480 2480 try:
2481 2481 next = filelines[lnum] # lnum has already incremented
2482 2482 except:
2483 2483 next = None
2484 2484 while next and indent_re.match(next):
2485 2485 block += next
2486 2486 lnum += 1
2487 2487 try:
2488 2488 next = filelines[lnum]
2489 2489 except:
2490 2490 next = None
2491 2491 # now execute the block of one or more lines
2492 2492 try:
2493 2493 exec block in globs,locs
2494 2494 except SystemExit:
2495 2495 pass
2496 2496 except:
2497 2497 badblocks.append(block.rstrip())
2498 2498 if kw['quiet']: # restore stdout
2499 2499 sys.stdout.close()
2500 2500 sys.stdout = stdout_save
2501 2501 print 'Finished replaying log file <%s>' % fname
2502 2502 if badblocks:
2503 2503 print >> sys.stderr, ('\nThe following lines/blocks in file '
2504 2504 '<%s> reported errors:' % fname)
2505 2505
2506 2506 for badline in badblocks:
2507 2507 print >> sys.stderr, badline
2508 2508 else: # regular file execution
2509 2509 try:
2510 2510 execfile(fname,*where)
2511 2511 except SyntaxError:
2512 2512 self.showsyntaxerror()
2513 2513 warn('Failure executing file: <%s>' % fname)
2514 2514 except SystemExit,status:
2515 2515 if not kw['exit_ignore']:
2516 2516 self.showtraceback()
2517 2517 warn('Failure executing file: <%s>' % fname)
2518 2518 except:
2519 2519 self.showtraceback()
2520 2520 warn('Failure executing file: <%s>' % fname)
2521 2521
2522 2522 syspath_cleanup()
2523 2523
2524 2524 #************************* end of file <iplib.py> *****************************
General Comments 0
You need to be logged in to leave comments. Login now