Show More
@@ -1,7 +1,7 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Magic functions for InteractiveShell. |
|
3 | 3 | |
|
4 |
$Id: Magic.py 96 |
|
|
4 | $Id: Magic.py 965 2005-12-28 23:23:09Z fperez $""" | |
|
5 | 5 | |
|
6 | 6 | #***************************************************************************** |
|
7 | 7 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and |
@@ -1049,14 +1049,21 b' Currently the magic system has the following functions:\\n"""' | |||
|
1049 | 1049 | try: |
|
1050 | 1050 | pdb = {'off':0,'0':0,'on':1,'1':1}[par] |
|
1051 | 1051 | except KeyError: |
|
1052 | print 'Incorrect argument. Use on/1, off/0 or nothing for a toggle.' | |
|
1052 | print 'Incorrect argument. Use on/1, off/0, or nothing for a toggle.' | |
|
1053 | 1053 | return |
|
1054 | 1054 | else: |
|
1055 | 1055 | self.shell.InteractiveTB.call_pdb = pdb |
|
1056 | 1056 | else: |
|
1057 |
|
|
|
1058 | print 'Automatic pdb calling has been turned',\ | |
|
1059 |
|
|
|
1057 | new_pdb = not self.shell.InteractiveTB.call_pdb | |
|
1058 | self.shell.InteractiveTB.call_pdb = new_pdb | |
|
1059 | if self.shell.isthreaded: | |
|
1060 | try: | |
|
1061 | self.sys_excepthook.call_pdb = new_pdb | |
|
1062 | except: | |
|
1063 | warn('Failed to activate pdb for threaded exception handler') | |
|
1064 | ||
|
1065 | print 'Automatic pdb calling has been turned',on_off(new_pdb) | |
|
1066 | ||
|
1060 | 1067 | |
|
1061 | 1068 | |
|
1062 | 1069 | def magic_prun(self, parameter_s ='',user_mode=1, |
@@ -1895,12 +1902,23 b' Currently the magic system has the following functions:\\n"""' | |||
|
1895 | 1902 | |
|
1896 | 1903 | If called without arguments, acts as a toggle.""" |
|
1897 | 1904 | |
|
1905 | def xmode_switch_err(name): | |
|
1906 | warn('Error changing %s exception modes.\n%s' % | |
|
1907 | (name,sys.exc_info()[1])) | |
|
1908 | ||
|
1898 | 1909 | new_mode = parameter_s.strip().capitalize() |
|
1899 | 1910 | try: |
|
1900 |
self.InteractiveTB.set_mode(mode |
|
|
1911 | self.InteractiveTB.set_mode(mode=new_mode) | |
|
1901 | 1912 | print 'Exception reporting mode:',self.InteractiveTB.mode |
|
1902 | 1913 | except: |
|
1903 | warn('Error changing exception modes.\n' + str(sys.exc_info()[1])) | |
|
1914 | xmode_switch_err('user') | |
|
1915 | ||
|
1916 | # threaded shells use a special handler in sys.excepthook | |
|
1917 | if self.isthreaded: | |
|
1918 | try: | |
|
1919 | self.shell.sys_excepthook.set_mode(mode=new_mode) | |
|
1920 | except: | |
|
1921 | xmode_switch_err('threaded') | |
|
1904 | 1922 | |
|
1905 | 1923 | def magic_colors(self,parameter_s = ''): |
|
1906 | 1924 | """Switch color scheme for prompts, info system and exception handlers. |
@@ -1908,6 +1926,11 b' Currently the magic system has the following functions:\\n"""' | |||
|
1908 | 1926 | Currently implemented schemes: NoColor, Linux, LightBG. |
|
1909 | 1927 | |
|
1910 | 1928 | Color scheme names are not case-sensitive.""" |
|
1929 | ||
|
1930 | def color_switch_err(name): | |
|
1931 | warn('Error changing %s color schemes.\n%s' % | |
|
1932 | (name,sys.exc_info()[1])) | |
|
1933 | ||
|
1911 | 1934 | |
|
1912 | 1935 | new_scheme = parameter_s.strip() |
|
1913 | 1936 | if not new_scheme: |
@@ -1943,8 +1966,7 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
1943 | 1966 | try: |
|
1944 | 1967 | self.shell.outputcache.set_colors(new_scheme) |
|
1945 | 1968 | except: |
|
1946 | warn('Error changing prompt color schemes.\n' | |
|
1947 | + str(sys.exc_info()[1])) | |
|
1969 | color_switch_err('prompt') | |
|
1948 | 1970 | else: |
|
1949 | 1971 | self.shell.rc.colors = \ |
|
1950 | 1972 | self.shell.outputcache.color_table.active_scheme_name |
@@ -1953,15 +1975,21 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
1953 | 1975 | self.shell.InteractiveTB.set_colors(scheme = new_scheme) |
|
1954 | 1976 | self.shell.SyntaxTB.set_colors(scheme = new_scheme) |
|
1955 | 1977 | except: |
|
1956 | warn('Error changing exception color schemes.\n' | |
|
1957 | + str(sys.exc_info()[1])) | |
|
1978 | color_switch_err('exception') | |
|
1979 | ||
|
1980 | # threaded shells use a verbose traceback in sys.excepthook | |
|
1981 | if self.isthreaded: | |
|
1982 | try: | |
|
1983 | self.shell.sys_excepthook.set_colors(scheme=new_scheme) | |
|
1984 | except: | |
|
1985 | color_switch_err('system exception handler') | |
|
1986 | ||
|
1958 | 1987 | # Set info (for 'object?') colors |
|
1959 | 1988 | if self.shell.rc.color_info: |
|
1960 | 1989 | try: |
|
1961 | 1990 | self.shell.inspector.set_active_scheme(new_scheme) |
|
1962 | 1991 | except: |
|
1963 |
|
|
|
1964 | + str(sys.exc_info()[1])) | |
|
1992 | color_switch_err('object inspector') | |
|
1965 | 1993 | else: |
|
1966 | 1994 | self.shell.inspector.set_active_scheme('NoColor') |
|
1967 | 1995 |
@@ -4,7 +4,7 b'' | |||
|
4 | 4 | All the matplotlib support code was co-developed with John Hunter, |
|
5 | 5 | matplotlib's author. |
|
6 | 6 | |
|
7 |
$Id: Shell.py 96 |
|
|
7 | $Id: Shell.py 965 2005-12-28 23:23:09Z fperez $""" | |
|
8 | 8 | |
|
9 | 9 | #***************************************************************************** |
|
10 | 10 | # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu> |
@@ -260,6 +260,10 b' class MTInteractiveShell(InteractiveShell):' | |||
|
260 | 260 | # McErlean and John Finlay. Modified with corrections by Antoon Pardon, |
|
261 | 261 | # from the pygtk mailing list, to avoid lockups with system calls. |
|
262 | 262 | |
|
263 | # class attribute to indicate whether the class supports threads or not. | |
|
264 | # Subclasses with thread support should override this as needed. | |
|
265 | isthreaded = True | |
|
266 | ||
|
263 | 267 | def __init__(self,name,usage=None,rc=Struct(opts=None,args=None), |
|
264 | 268 | user_ns=None,user_global_ns=None,banner2='',**kw): |
|
265 | 269 | """Similar to the normal InteractiveShell, but with threading control""" |
@@ -6,7 +6,7 b' Requires Python 2.1 or newer.' | |||
|
6 | 6 | |
|
7 | 7 | This file contains all the classes and helper functions specific to IPython. |
|
8 | 8 | |
|
9 |
$Id: iplib.py 96 |
|
|
9 | $Id: iplib.py 965 2005-12-28 23:23:09Z fperez $ | |
|
10 | 10 | """ |
|
11 | 11 | |
|
12 | 12 | #***************************************************************************** |
@@ -232,6 +232,10 b' class SyntaxTB(ultraTB.ListTB):' | |||
|
232 | 232 | class InteractiveShell(Logger, Magic): |
|
233 | 233 | """An enhanced console for Python.""" |
|
234 | 234 | |
|
235 | # class attribute to indicate whether the class supports threads or not. | |
|
236 | # Subclasses with thread support should override this as needed. | |
|
237 | isthreaded = False | |
|
238 | ||
|
235 | 239 | def __init__(self,name,usage=None,rc=Struct(opts=None,args=None), |
|
236 | 240 | user_ns = None,user_global_ns=None,banner2='', |
|
237 | 241 | custom_exceptions=((),None),embedded=False): |
@@ -268,6 +272,9 b' class InteractiveShell(Logger, Magic):' | |||
|
268 | 272 | except AttributeError: |
|
269 | 273 | pass |
|
270 | 274 | |
|
275 | # Store the actual shell's name | |
|
276 | self.name = name | |
|
277 | ||
|
271 | 278 | # We need to know whether the instance is meant for embedding, since |
|
272 | 279 | # global/local namespaces need to be handled differently in that case |
|
273 | 280 | self.embedded = embedded |
@@ -405,9 +412,6 b' class InteractiveShell(Logger, Magic):' | |||
|
405 | 412 | self.user_ns['In'] = self.input_hist |
|
406 | 413 | self.user_ns['Out'] = self.output_hist |
|
407 | 414 | |
|
408 | # Store the actual shell's name | |
|
409 | self.name = name | |
|
410 | ||
|
411 | 415 | # Object variable to store code object waiting execution. This is |
|
412 | 416 | # used mainly by the multithreaded shells, but it can come in handy in |
|
413 | 417 | # other situations. No need to use a Queue here, since it's a single |
@@ -565,14 +569,35 b' class InteractiveShell(Logger, Magic):' | |||
|
565 | 569 | self.banner2 = banner2 |
|
566 | 570 | |
|
567 | 571 | # TraceBack handlers: |
|
568 | # Need two, one for syntax errors and one for other exceptions. | |
|
572 | ||
|
573 | # Syntax error handler. | |
|
569 | 574 | self.SyntaxTB = SyntaxTB(color_scheme='NoColor') |
|
575 | ||
|
570 | 576 | # The interactive one is initialized with an offset, meaning we always |
|
571 | 577 | # want to remove the topmost item in the traceback, which is our own |
|
572 | 578 | # internal code. Valid modes: ['Plain','Context','Verbose'] |
|
573 | 579 | self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain', |
|
574 | 580 | color_scheme='NoColor', |
|
575 | 581 | tb_offset = 1) |
|
582 | ||
|
583 | # IPython itself shouldn't crash. This will produce a detailed | |
|
584 | # post-mortem if it does. But we only install the crash handler for | |
|
585 | # non-threaded shells, the threaded ones use a normal verbose reporter | |
|
586 | # and lose the crash handler. This is because exceptions in the main | |
|
587 | # thread (such as in GUI code) propagate directly to sys.excepthook, | |
|
588 | # and there's no point in printing crash dumps for every user exception. | |
|
589 | if self.isthreaded: | |
|
590 | sys.excepthook = ultraTB.FormattedTB() | |
|
591 | else: | |
|
592 | from IPython import CrashHandler | |
|
593 | sys.excepthook = CrashHandler.CrashHandler(self) | |
|
594 | ||
|
595 | # The instance will store a pointer to this, so that runtime code | |
|
596 | # (such as magics) can access it. This is because during the | |
|
597 | # read-eval loop, it gets temporarily overwritten (to deal with GUI | |
|
598 | # frameworks). | |
|
599 | self.sys_excepthook = sys.excepthook | |
|
600 | ||
|
576 | 601 | # and add any custom exception handlers the user may have specified |
|
577 | 602 | self.set_custom_exc(*custom_exceptions) |
|
578 | 603 | |
@@ -618,6 +643,38 b' class InteractiveShell(Logger, Magic):' | |||
|
618 | 643 | self.init_auto_alias() |
|
619 | 644 | # end __init__ |
|
620 | 645 | |
|
646 | def post_config_initialization(self): | |
|
647 | """Post configuration init method | |
|
648 | ||
|
649 | This is called after the configuration files have been processed to | |
|
650 | 'finalize' the initialization.""" | |
|
651 | ||
|
652 | rc = self.rc | |
|
653 | ||
|
654 | # Load readline proper | |
|
655 | if rc.readline: | |
|
656 | self.init_readline() | |
|
657 | ||
|
658 | # Set user colors (don't do it in the constructor above so that it | |
|
659 | # doesn't crash if colors option is invalid) | |
|
660 | self.magic_colors(rc.colors) | |
|
661 | ||
|
662 | # Load user aliases | |
|
663 | for alias in rc.alias: | |
|
664 | self.magic_alias(alias) | |
|
665 | ||
|
666 | # dynamic data that survives through sessions | |
|
667 | # XXX make the filename a config option? | |
|
668 | persist_base = 'persist' | |
|
669 | if rc.profile: | |
|
670 | persist_base += '_%s' % rc.profile | |
|
671 | self.persist_fname = os.path.join(rc.ipythondir,persist_base) | |
|
672 | ||
|
673 | try: | |
|
674 | self.persist = pickle.load(file(self.persist_fname)) | |
|
675 | except: | |
|
676 | self.persist = {} | |
|
677 | ||
|
621 | 678 | def set_hook(self,name,hook): |
|
622 | 679 | """set_hook(name,hook) -> sets an internal IPython hook. |
|
623 | 680 | |
@@ -727,38 +784,6 b' class InteractiveShell(Logger, Magic):' | |||
|
727 | 784 | self.Completer.namespace = self.user_ns |
|
728 | 785 | self.Completer.global_namespace = self.user_global_ns |
|
729 | 786 | |
|
730 | def post_config_initialization(self): | |
|
731 | """Post configuration init method | |
|
732 | ||
|
733 | This is called after the configuration files have been processed to | |
|
734 | 'finalize' the initialization.""" | |
|
735 | ||
|
736 | rc = self.rc | |
|
737 | ||
|
738 | # Load readline proper | |
|
739 | if rc.readline: | |
|
740 | self.init_readline() | |
|
741 | ||
|
742 | # Set user colors (don't do it in the constructor above so that it | |
|
743 | # doesn't crash if colors option is invalid) | |
|
744 | self.magic_colors(rc.colors) | |
|
745 | ||
|
746 | # Load user aliases | |
|
747 | for alias in rc.alias: | |
|
748 | self.magic_alias(alias) | |
|
749 | ||
|
750 | # dynamic data that survives through sessions | |
|
751 | # XXX make the filename a config option? | |
|
752 | persist_base = 'persist' | |
|
753 | if rc.profile: | |
|
754 | persist_base += '_%s' % rc.profile | |
|
755 | self.persist_fname = os.path.join(rc.ipythondir,persist_base) | |
|
756 | ||
|
757 | try: | |
|
758 | self.persist = pickle.load(file(self.persist_fname)) | |
|
759 | except: | |
|
760 | self.persist = {} | |
|
761 | ||
|
762 | 787 | def init_auto_alias(self): |
|
763 | 788 | """Define some aliases automatically. |
|
764 | 789 | |
@@ -1462,6 +1487,10 b' want to merge them back into the new files.""" % locals()' | |||
|
1462 | 1487 | # Set our own excepthook in case the user code tries to call it |
|
1463 | 1488 | # directly, so that the IPython crash handler doesn't get triggered |
|
1464 | 1489 | old_excepthook,sys.excepthook = sys.excepthook, self.excepthook |
|
1490 | ||
|
1491 | # we save the original sys.excepthook in the instance, in case config | |
|
1492 | # code (such as magics) needs access to it. | |
|
1493 | self.sys_excepthook = old_excepthook | |
|
1465 | 1494 | outflag = 1 # happens in more places, so it's easier as default |
|
1466 | 1495 | try: |
|
1467 | 1496 | try: |
@@ -1954,7 +1983,7 b' want to merge them back into the new files.""" % locals()' | |||
|
1954 | 1983 | try: |
|
1955 | 1984 | execfile(fname,*where) |
|
1956 | 1985 | except SyntaxError: |
|
1957 |
etype, |
|
|
1986 | etype,evalue = sys.exc_info()[:2] | |
|
1958 | 1987 | self.SyntaxTB(etype,evalue,[]) |
|
1959 | 1988 | warn('Failure executing file: <%s>' % fname) |
|
1960 | 1989 | except SystemExit,status: |
@@ -6,7 +6,7 b' Requires Python 2.1 or better.' | |||
|
6 | 6 | |
|
7 | 7 | This file contains the main make_IPython() starter function. |
|
8 | 8 | |
|
9 |
$Id: ipmaker.py 96 |
|
|
9 | $Id: ipmaker.py 965 2005-12-28 23:23:09Z fperez $""" | |
|
10 | 10 | |
|
11 | 11 | #***************************************************************************** |
|
12 | 12 | # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu> |
@@ -94,15 +94,11 b' def make_IPython(argv=None,user_ns=None,user_global_ns=None,debug=1,' | |||
|
94 | 94 | from site import _Helper |
|
95 | 95 | IP.user_ns['help'] = _Helper() |
|
96 | 96 | |
|
97 | ||
|
97 | 98 | if DEVDEBUG: |
|
98 | 99 | # For developer debugging only (global flag) |
|
99 | 100 | from IPython import ultraTB |
|
100 | 101 | sys.excepthook = ultraTB.VerboseTB(call_pdb=1) |
|
101 | else: | |
|
102 | # IPython itself shouldn't crash. This will produce a detailed | |
|
103 | # post-mortem if it does | |
|
104 | from IPython import CrashHandler | |
|
105 | sys.excepthook = CrashHandler.CrashHandler(IP) | |
|
106 | 102 | |
|
107 | 103 | IP.BANNER_PARTS = ['Python %s\n' |
|
108 | 104 | 'Type "copyright", "credits" or "license" ' |
@@ -60,7 +60,7 b' You can implement other color schemes easily, the syntax is fairly' | |||
|
60 | 60 | self-explanatory. Please send back new schemes you develop to the author for |
|
61 | 61 | possible inclusion in future releases. |
|
62 | 62 | |
|
63 |
$Id: ultraTB.py 95 |
|
|
63 | $Id: ultraTB.py 965 2005-12-28 23:23:09Z fperez $""" | |
|
64 | 64 | |
|
65 | 65 | #***************************************************************************** |
|
66 | 66 | # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu> |
@@ -621,10 +621,10 b' class VerboseTB(TBTools):' | |||
|
621 | 621 | # out the right info on its own. |
|
622 | 622 | def __call__(self, etype=None, evalue=None, etb=None): |
|
623 | 623 | """This hook can replace sys.excepthook (for Python 2.1 or higher).""" |
|
624 |
if etb is |
|
|
625 | self.handler((etype, evalue, etb)) | |
|
626 | else: | |
|
624 | if etb is None: | |
|
627 | 625 | self.handler() |
|
626 | else: | |
|
627 | self.handler((etype, evalue, etb)) | |
|
628 | 628 | self.debugger() |
|
629 | 629 | |
|
630 | 630 | #---------------------------------------------------------------------------- |
@@ -5,8 +5,20 b'' | |||
|
5 | 5 | questions part 2 - \/ characters revisited' on the iypthon user |
|
6 | 6 | list: |
|
7 | 7 | http://scipy.net/pipermail/ipython-user/2005-June/000907.html |
|
8 | ||
|
8 | 9 | (InteractiveShell.__init__): fix tab-completion bug in threaded shells. |
|
9 | 10 | |
|
11 | (InteractiveShell.__init__): change threaded shells to not use the | |
|
12 | ipython crash handler. This was causing more problems than not, | |
|
13 | as exceptions in the main thread (GUI code, typically) would | |
|
14 | always show up as a 'crash', when they really weren't. | |
|
15 | ||
|
16 | The colors and exception mode commands (%colors/%xmode) have been | |
|
17 | synchronized to also take this into account, so users can get | |
|
18 | verbose exceptions for their threaded code as well. I also added | |
|
19 | support for activating pdb inside this exception handler as well, | |
|
20 | so now GUI authors can use IPython's enhanced pdb at runtime. | |
|
21 | ||
|
10 | 22 | * IPython/ipmaker.py (make_IPython): make the autoedit_syntax flag |
|
11 | 23 | true by default, and add it to the shipped ipythonrc file. Since |
|
12 | 24 | this asks the user before proceeding, I think it's OK to make it |
General Comments 0
You need to be logged in to leave comments.
Login now