Show More
@@ -2,7 +2,7 b'' | |||
|
2 | 2 | """ |
|
3 | 3 | Logger class for IPython's logging facilities. |
|
4 | 4 | |
|
5 |
$Id: Logger.py 98 |
|
|
5 | $Id: Logger.py 988 2006-01-02 21:21:47Z fperez $ | |
|
6 | 6 | """ |
|
7 | 7 | |
|
8 | 8 | #***************************************************************************** |
@@ -172,7 +172,12 b' which already exists. But you must first start the logging process with' | |||
|
172 | 172 | # update the auto _i tables |
|
173 | 173 | #print '***logging line',line # dbg |
|
174 | 174 | #print '***cache_count', self.shell.outputcache.prompt_count # dbg |
|
175 | input_hist = self.shell.user_ns['_ih'] | |
|
175 | try: | |
|
176 | input_hist = self.shell.user_ns['_ih'] | |
|
177 | except: | |
|
178 | print 'userns:',self.shell.user_ns.keys() | |
|
179 | return | |
|
180 | ||
|
176 | 181 | if not continuation and line: |
|
177 | 182 | self._iii = self._ii |
|
178 | 183 | self._ii = self._i |
@@ -1,7 +1,7 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Magic functions for InteractiveShell. |
|
3 | 3 | |
|
4 |
$Id: Magic.py 98 |
|
|
4 | $Id: Magic.py 988 2006-01-02 21:21:47Z fperez $""" | |
|
5 | 5 | |
|
6 | 6 | #***************************************************************************** |
|
7 | 7 | # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and |
@@ -742,12 +742,14 b' Currently the magic system has the following functions:\\n"""' | |||
|
742 | 742 | arguments are returned.""" |
|
743 | 743 | |
|
744 | 744 | user_ns = self.shell.user_ns |
|
745 | internal_ns = self.shell.internal_ns | |
|
746 | user_config_ns = self.shell.user_config_ns | |
|
745 | 747 | out = [] |
|
746 | 748 | typelist = parameter_s.split() |
|
747 | for i in self.shell.user_ns.keys(): | |
|
749 | ||
|
750 | for i in user_ns: | |
|
748 | 751 | if not (i.startswith('_') or i.startswith('_i')) \ |
|
749 |
and not ( |
|
|
750 | self.shell.user_config_ns.has_key(i)): | |
|
752 | and not (i in internal_ns or i in user_config_ns): | |
|
751 | 753 | if typelist: |
|
752 | 754 | if type(user_ns[i]).__name__ in typelist: |
|
753 | 755 | out.append(i) |
@@ -1638,11 +1640,22 b' Currently the magic system has the following functions:\\n"""' | |||
|
1638 | 1640 | print 'The following commands were written to file `%s`:' % fname |
|
1639 | 1641 | print cmds |
|
1640 | 1642 | |
|
1641 | def magic_ed(self,parameter_s = ''): | |
|
1643 | def _edit_macro(self,mname,macro): | |
|
1644 | """open an editor with the macro data in a file""" | |
|
1645 | filename = self.shell.mktempfile(macro.value) | |
|
1646 | self.shell.hooks.editor(filename) | |
|
1647 | ||
|
1648 | # and make a new macro object, to replace the old one | |
|
1649 | mfile = open(filename) | |
|
1650 | mvalue = mfile.read() | |
|
1651 | mfile.close() | |
|
1652 | self.shell.user_ns[mname] = Macro(mvalue) | |
|
1653 | ||
|
1654 | def magic_ed(self,parameter_s=''): | |
|
1642 | 1655 | """Alias to %edit.""" |
|
1643 | 1656 | return self.magic_edit(parameter_s) |
|
1644 | 1657 | |
|
1645 |
def magic_edit(self,parameter_s |
|
|
1658 | def magic_edit(self,parameter_s='',last_call=['','']): | |
|
1646 | 1659 | """Bring up an editor and execute the resulting code. |
|
1647 | 1660 | |
|
1648 | 1661 | Usage: |
@@ -1695,6 +1708,10 b' Currently the magic system has the following functions:\\n"""' | |||
|
1695 | 1708 | to load an editor exactly at the point where 'function' is defined, |
|
1696 | 1709 | edit it and have the file be executed automatically. |
|
1697 | 1710 | |
|
1711 | If the object is a macro (see %macro for details), this opens up your | |
|
1712 | specified editor with a temporary file containing the macro's data. | |
|
1713 | Upon exit, the macro is reloaded with the contents of the file. | |
|
1714 | ||
|
1698 | 1715 | Note: opening at an exact line is only supported under Unix, and some |
|
1699 | 1716 | editors (like kedit and gedit up to Gnome 2.8) do not understand the |
|
1700 | 1717 | '+NUMBER' parameter necessary for this feature. Good editors like |
@@ -1826,6 +1843,7 b' Currently the magic system has the following functions:\\n"""' | |||
|
1826 | 1843 | data = eval(args,self.shell.user_ns) |
|
1827 | 1844 | if not type(data) in StringTypes: |
|
1828 | 1845 | raise DataIsObject |
|
1846 | ||
|
1829 | 1847 | except (NameError,SyntaxError): |
|
1830 | 1848 | # given argument is not a variable, try as a filename |
|
1831 | 1849 | filename = make_filename(args) |
@@ -1833,9 +1851,16 b' Currently the magic system has the following functions:\\n"""' | |||
|
1833 | 1851 | warn("Argument given (%s) can't be found as a variable " |
|
1834 | 1852 | "or as a filename." % args) |
|
1835 | 1853 | return |
|
1854 | ||
|
1836 | 1855 | data = '' |
|
1837 | 1856 | use_temp = 0 |
|
1838 | 1857 | except DataIsObject: |
|
1858 | ||
|
1859 | # macros have a special edit function | |
|
1860 | if isinstance(data,Macro): | |
|
1861 | self._edit_macro(args,data) | |
|
1862 | return | |
|
1863 | ||
|
1839 | 1864 | # For objects, try to edit the file where they are defined |
|
1840 | 1865 | try: |
|
1841 | 1866 | filename = inspect.getabsfile(data) |
@@ -1861,13 +1886,7 b' Currently the magic system has the following functions:\\n"""' | |||
|
1861 | 1886 | data = '' |
|
1862 | 1887 | |
|
1863 | 1888 | if use_temp: |
|
1864 |
filename = |
|
|
1865 | self.shell.tempfiles.append(filename) | |
|
1866 | ||
|
1867 | if data and use_temp: | |
|
1868 | tmp_file = open(filename,'w') | |
|
1869 | tmp_file.write(data) | |
|
1870 | tmp_file.close() | |
|
1889 | filename = self.shell.mktempfile(data) | |
|
1871 | 1890 | |
|
1872 | 1891 | # do actual editing here |
|
1873 | 1892 | print 'Editing...', |
@@ -1887,9 +1906,6 b' Currently the magic system has the following functions:\\n"""' | |||
|
1887 | 1906 | self.shell.showtraceback() |
|
1888 | 1907 | except: |
|
1889 | 1908 | self.shell.showtraceback() |
|
1890 | if use_temp: | |
|
1891 | contents = open(filename).read() | |
|
1892 | return contents | |
|
1893 | 1909 | |
|
1894 | 1910 | def magic_xmode(self,parameter_s = ''): |
|
1895 | 1911 | """Switch modes for the exception handlers. |
@@ -2568,10 +2584,10 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
2568 | 2584 | |
|
2569 | 2585 | Usage: |
|
2570 | 2586 | |
|
2571 | %store - Show list of all variables and their current values\\ | |
|
2572 | %store <var> - Store the *current* value of the variable to disk\\ | |
|
2573 |
%store -d |
|
|
2574 | %store -r - Remove all variables from storage | |
|
2587 | %store - Show list of all variables and their current values\\ | |
|
2588 | %store <var> - Store the *current* value of the variable to disk\\ | |
|
2589 | %store -d <var> - Remove the variable and its value from storage\\ | |
|
2590 | %store -r - Remove all variables from storage | |
|
2575 | 2591 | |
|
2576 | 2592 | It should be noted that if you change the value of a variable, you |
|
2577 | 2593 | need to %store it again if you want to persist the new value. |
@@ -1,7 +1,7 b'' | |||
|
1 | 1 | # -*- coding: utf-8 -*- |
|
2 | 2 | """Release data for the IPython project. |
|
3 | 3 | |
|
4 |
$Id: Release.py 98 |
|
|
4 | $Id: Release.py 988 2006-01-02 21:21:47Z fperez $""" | |
|
5 | 5 | |
|
6 | 6 | #***************************************************************************** |
|
7 | 7 | # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu> |
@@ -22,9 +22,9 b" name = 'ipython'" | |||
|
22 | 22 | # because bdist_rpm does not accept dashes (an RPM) convention, and |
|
23 | 23 | # bdist_deb does not accept underscores (a Debian convention). |
|
24 | 24 | |
|
25 |
version = '0.7.0.rc |
|
|
25 | version = '0.7.0.rc7' | |
|
26 | 26 | |
|
27 |
revision = '$Revision: 98 |
|
|
27 | revision = '$Revision: 988 $' | |
|
28 | 28 | |
|
29 | 29 | description = "An enhanced interactive Python shell." |
|
30 | 30 |
@@ -192,14 +192,10 b' class Completer:' | |||
|
192 | 192 | except: |
|
193 | 193 | object = eval(expr, self.global_namespace) |
|
194 | 194 | |
|
195 | # for modules which define __all__, complete only on those. | |
|
196 |
if |
|
|
197 |
words |
|
|
198 | else: | |
|
199 | words = dir(object) | |
|
200 | if hasattr(object,'__class__'): | |
|
201 | words.append('__class__') | |
|
202 | words.extend(get_class_members(object.__class__)) | |
|
195 | words = dir(object) | |
|
196 | if hasattr(object,'__class__'): | |
|
197 | words.append('__class__') | |
|
198 | words.extend(get_class_members(object.__class__)) | |
|
203 | 199 | |
|
204 | 200 | # filter out non-string attributes which may be stuffed by dir() calls |
|
205 | 201 | # and poor coding in third-party modules |
@@ -32,7 +32,7 b" ip_set_hook('editor',myiphooks.calljed)" | |||
|
32 | 32 | The ip_set_hook function is put by IPython into the builtin namespace, so it |
|
33 | 33 | is always available from all running code. |
|
34 | 34 | |
|
35 |
$Id: hooks.py 9 |
|
|
35 | $Id: hooks.py 988 2006-01-02 21:21:47Z fperez $""" | |
|
36 | 36 | |
|
37 | 37 | #***************************************************************************** |
|
38 | 38 | # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu> |
@@ -52,7 +52,7 b' import os' | |||
|
52 | 52 | # but over time we'll move here all the public API for user-accessible things. |
|
53 | 53 | __all__ = ['editor', 'fix_error_editor'] |
|
54 | 54 | |
|
55 | def editor(self,filename, linenum): | |
|
55 | def editor(self,filename, linenum=None): | |
|
56 | 56 | """Open the default editor at the given filename and linenumber. |
|
57 | 57 | |
|
58 | 58 | This is IPython's default editor hook, you can use it as an example to |
@@ -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 98 |
|
|
9 | $Id: iplib.py 988 2006-01-02 21:21:47Z fperez $ | |
|
10 | 10 | """ |
|
11 | 11 | |
|
12 | 12 | #***************************************************************************** |
@@ -55,6 +55,7 b' import re' | |||
|
55 | 55 | import shutil |
|
56 | 56 | import string |
|
57 | 57 | import sys |
|
58 | import tempfile | |
|
58 | 59 | import traceback |
|
59 | 60 | import types |
|
60 | 61 | |
@@ -100,80 +101,6 b' def softspace(file, newvalue):' | |||
|
100 | 101 | return oldvalue |
|
101 | 102 | |
|
102 | 103 | #**************************************************************************** |
|
103 | # These special functions get installed in the builtin namespace, to provide | |
|
104 | # programmatic (pure python) access to magics, aliases and system calls. This | |
|
105 | # is important for logging, user scripting, and more. | |
|
106 | ||
|
107 | # We are basically exposing, via normal python functions, the three mechanisms | |
|
108 | # in which ipython offers special call modes (magics for internal control, | |
|
109 | # aliases for direct system access via pre-selected names, and !cmd for | |
|
110 | # calling arbitrary system commands). | |
|
111 | ||
|
112 | def ipmagic(arg_s): | |
|
113 | """Call a magic function by name. | |
|
114 | ||
|
115 | Input: a string containing the name of the magic function to call and any | |
|
116 | additional arguments to be passed to the magic. | |
|
117 | ||
|
118 | ipmagic('name -opt foo bar') is equivalent to typing at the ipython | |
|
119 | prompt: | |
|
120 | ||
|
121 | In[1]: %name -opt foo bar | |
|
122 | ||
|
123 | To call a magic without arguments, simply use ipmagic('name'). | |
|
124 | ||
|
125 | This provides a proper Python function to call IPython's magics in any | |
|
126 | valid Python code you can type at the interpreter, including loops and | |
|
127 | compound statements. It is added by IPython to the Python builtin | |
|
128 | namespace upon initialization.""" | |
|
129 | ||
|
130 | args = arg_s.split(' ',1) | |
|
131 | magic_name = args[0] | |
|
132 | if magic_name.startswith(__IPYTHON__.ESC_MAGIC): | |
|
133 | magic_name = magic_name[1:] | |
|
134 | try: | |
|
135 | magic_args = args[1] | |
|
136 | except IndexError: | |
|
137 | magic_args = '' | |
|
138 | fn = getattr(__IPYTHON__,'magic_'+magic_name,None) | |
|
139 | if fn is None: | |
|
140 | error("Magic function `%s` not found." % magic_name) | |
|
141 | else: | |
|
142 | magic_args = __IPYTHON__.var_expand(magic_args) | |
|
143 | return fn(magic_args) | |
|
144 | ||
|
145 | def ipalias(arg_s): | |
|
146 | """Call an alias by name. | |
|
147 | ||
|
148 | Input: a string containing the name of the alias to call and any | |
|
149 | additional arguments to be passed to the magic. | |
|
150 | ||
|
151 | ipalias('name -opt foo bar') is equivalent to typing at the ipython | |
|
152 | prompt: | |
|
153 | ||
|
154 | In[1]: name -opt foo bar | |
|
155 | ||
|
156 | To call an alias without arguments, simply use ipalias('name'). | |
|
157 | ||
|
158 | This provides a proper Python function to call IPython's aliases in any | |
|
159 | valid Python code you can type at the interpreter, including loops and | |
|
160 | compound statements. It is added by IPython to the Python builtin | |
|
161 | namespace upon initialization.""" | |
|
162 | ||
|
163 | args = arg_s.split(' ',1) | |
|
164 | alias_name = args[0] | |
|
165 | try: | |
|
166 | alias_args = args[1] | |
|
167 | except IndexError: | |
|
168 | alias_args = '' | |
|
169 | if alias_name in __IPYTHON__.alias_table: | |
|
170 | __IPYTHON__.call_alias(alias_name,alias_args) | |
|
171 | else: | |
|
172 | error("Alias `%s` not found." % alias_name) | |
|
173 | ||
|
174 | def ipsystem(arg_s): | |
|
175 | """Make a system call, using IPython.""" | |
|
176 | __IPYTHON__.system(arg_s) | |
|
177 | 104 | |
|
178 | 105 | |
|
179 | 106 | #**************************************************************************** |
@@ -184,6 +111,8 b' class SpaceInInput(exceptions.Exception): pass' | |||
|
184 | 111 | # Local use classes |
|
185 | 112 | class Bunch: pass |
|
186 | 113 | |
|
114 | class Undefined: pass | |
|
115 | ||
|
187 | 116 | class InputList(list): |
|
188 | 117 | """Class to store user input. |
|
189 | 118 | |
@@ -255,27 +184,17 b' class InteractiveShell(object,Magic):' | |||
|
255 | 184 | if ns is not None and type(ns) != types.DictType: |
|
256 | 185 | raise TypeError,'namespace must be a dictionary' |
|
257 | 186 | |
|
258 | # Put a reference to self in builtins so that any form of embedded or | |
|
259 | # imported code can test for being inside IPython. | |
|
260 | __builtin__.__IPYTHON__ = self | |
|
261 | ||
|
262 | # And load into builtins ipmagic/ipalias/ipsystem as well | |
|
263 | __builtin__.ipmagic = ipmagic | |
|
264 | __builtin__.ipalias = ipalias | |
|
265 | __builtin__.ipsystem = ipsystem | |
|
266 | ||
|
267 | # Add to __builtin__ other parts of IPython's public API | |
|
268 | __builtin__.ip_set_hook = self.set_hook | |
|
187 | # Job manager (for jobs run as background threads) | |
|
188 | self.jobs = BackgroundJobManager() | |
|
269 | 189 | |
|
270 | # Keep in the builtins a flag for when IPython is active. We set it | |
|
271 | # with setdefault so that multiple nested IPythons don't clobber one | |
|
272 | # another. Each will increase its value by one upon being activated, | |
|
273 | # which also gives us a way to determine the nesting level. | |
|
274 | __builtin__.__dict__.setdefault('__IPYTHON__active',0) | |
|
190 | # track which builtins we add, so we can clean up later | |
|
191 | self.builtins_added = {} | |
|
192 | # This method will add the necessary builtins for operation, but | |
|
193 | # tracking what it did via the builtins_added dict. | |
|
194 | self.add_builtins() | |
|
275 | 195 | |
|
276 | 196 | # Do the intuitively correct thing for quit/exit: we remove the |
|
277 |
# builtins if they exist, and our own |
|
|
278 | # these special cases | |
|
197 | # builtins if they exist, and our own magics will deal with this | |
|
279 | 198 | try: |
|
280 | 199 | del __builtin__.exit, __builtin__.quit |
|
281 | 200 | except AttributeError: |
@@ -434,11 +353,6 b' class InteractiveShell(object,Magic):' | |||
|
434 | 353 | # item which gets cleared once run. |
|
435 | 354 | self.code_to_run = None |
|
436 | 355 | |
|
437 | # Job manager (for jobs run as background threads) | |
|
438 | self.jobs = BackgroundJobManager() | |
|
439 | # Put the job manager into builtins so it's always there. | |
|
440 | __builtin__.jobs = self.jobs | |
|
441 | ||
|
442 | 356 | # escapes for automatic behavior on the command line |
|
443 | 357 | self.ESC_SHELL = '!' |
|
444 | 358 | self.ESC_HELP = '?' |
@@ -725,6 +639,45 b' class InteractiveShell(object,Magic):' | |||
|
725 | 639 | |
|
726 | 640 | |
|
727 | 641 | self.user_ns[key] = obj |
|
642 | ||
|
643 | def add_builtins(self): | |
|
644 | """Store ipython references into the builtin namespace. | |
|
645 | ||
|
646 | Some parts of ipython operate via builtins injected here, which hold a | |
|
647 | reference to IPython itself.""" | |
|
648 | ||
|
649 | builtins_new = dict(__IPYTHON__ = self, | |
|
650 | ip_set_hook = self.set_hook, | |
|
651 | jobs = self.jobs, | |
|
652 | ipmagic = self.ipmagic, | |
|
653 | ipalias = self.ipalias, | |
|
654 | ipsystem = self.ipsystem, | |
|
655 | ) | |
|
656 | for biname,bival in builtins_new.items(): | |
|
657 | try: | |
|
658 | # store the orignal value so we can restore it | |
|
659 | self.builtins_added[biname] = __builtin__.__dict__[biname] | |
|
660 | except KeyError: | |
|
661 | # or mark that it wasn't defined, and we'll just delete it at | |
|
662 | # cleanup | |
|
663 | self.builtins_added[biname] = Undefined | |
|
664 | __builtin__.__dict__[biname] = bival | |
|
665 | ||
|
666 | # Keep in the builtins a flag for when IPython is active. We set it | |
|
667 | # with setdefault so that multiple nested IPythons don't clobber one | |
|
668 | # another. Each will increase its value by one upon being activated, | |
|
669 | # which also gives us a way to determine the nesting level. | |
|
670 | __builtin__.__dict__.setdefault('__IPYTHON__active',0) | |
|
671 | ||
|
672 | def clean_builtins(self): | |
|
673 | """Remove any builtins which might have been added by add_builtins, or | |
|
674 | restore overwritten ones to their previous values.""" | |
|
675 | for biname,bival in self.builtins_added.items(): | |
|
676 | if bival is Undefined: | |
|
677 | del __builtin__.__dict__[biname] | |
|
678 | else: | |
|
679 | __builtin__.__dict__[biname] = bival | |
|
680 | self.builtins_added.clear() | |
|
728 | 681 | |
|
729 | 682 | def set_hook(self,name,hook): |
|
730 | 683 | """set_hook(name,hook) -> sets an internal IPython hook. |
@@ -815,6 +768,82 b' class InteractiveShell(object,Magic):' | |||
|
815 | 768 | call_pdb = property(_get_call_pdb,_set_call_pdb,None, |
|
816 | 769 | 'Control auto-activation of pdb at exceptions') |
|
817 | 770 | |
|
771 | ||
|
772 | # These special functions get installed in the builtin namespace, to | |
|
773 | # provide programmatic (pure python) access to magics, aliases and system | |
|
774 | # calls. This is important for logging, user scripting, and more. | |
|
775 | ||
|
776 | # We are basically exposing, via normal python functions, the three | |
|
777 | # mechanisms in which ipython offers special call modes (magics for | |
|
778 | # internal control, aliases for direct system access via pre-selected | |
|
779 | # names, and !cmd for calling arbitrary system commands). | |
|
780 | ||
|
781 | def ipmagic(self,arg_s): | |
|
782 | """Call a magic function by name. | |
|
783 | ||
|
784 | Input: a string containing the name of the magic function to call and any | |
|
785 | additional arguments to be passed to the magic. | |
|
786 | ||
|
787 | ipmagic('name -opt foo bar') is equivalent to typing at the ipython | |
|
788 | prompt: | |
|
789 | ||
|
790 | In[1]: %name -opt foo bar | |
|
791 | ||
|
792 | To call a magic without arguments, simply use ipmagic('name'). | |
|
793 | ||
|
794 | This provides a proper Python function to call IPython's magics in any | |
|
795 | valid Python code you can type at the interpreter, including loops and | |
|
796 | compound statements. It is added by IPython to the Python builtin | |
|
797 | namespace upon initialization.""" | |
|
798 | ||
|
799 | args = arg_s.split(' ',1) | |
|
800 | magic_name = args[0] | |
|
801 | if magic_name.startswith(self.ESC_MAGIC): | |
|
802 | magic_name = magic_name[1:] | |
|
803 | try: | |
|
804 | magic_args = args[1] | |
|
805 | except IndexError: | |
|
806 | magic_args = '' | |
|
807 | fn = getattr(self,'magic_'+magic_name,None) | |
|
808 | if fn is None: | |
|
809 | error("Magic function `%s` not found." % magic_name) | |
|
810 | else: | |
|
811 | magic_args = self.var_expand(magic_args) | |
|
812 | return fn(magic_args) | |
|
813 | ||
|
814 | def ipalias(self,arg_s): | |
|
815 | """Call an alias by name. | |
|
816 | ||
|
817 | Input: a string containing the name of the alias to call and any | |
|
818 | additional arguments to be passed to the magic. | |
|
819 | ||
|
820 | ipalias('name -opt foo bar') is equivalent to typing at the ipython | |
|
821 | prompt: | |
|
822 | ||
|
823 | In[1]: name -opt foo bar | |
|
824 | ||
|
825 | To call an alias without arguments, simply use ipalias('name'). | |
|
826 | ||
|
827 | This provides a proper Python function to call IPython's aliases in any | |
|
828 | valid Python code you can type at the interpreter, including loops and | |
|
829 | compound statements. It is added by IPython to the Python builtin | |
|
830 | namespace upon initialization.""" | |
|
831 | ||
|
832 | args = arg_s.split(' ',1) | |
|
833 | alias_name = args[0] | |
|
834 | try: | |
|
835 | alias_args = args[1] | |
|
836 | except IndexError: | |
|
837 | alias_args = '' | |
|
838 | if alias_name in self.alias_table: | |
|
839 | self.call_alias(alias_name,alias_args) | |
|
840 | else: | |
|
841 | error("Alias `%s` not found." % alias_name) | |
|
842 | ||
|
843 | def ipsystem(self,arg_s): | |
|
844 | """Make a system call, using IPython.""" | |
|
845 | self.system(arg_s) | |
|
846 | ||
|
818 | 847 | def complete(self,text): |
|
819 | 848 | """Return a sorted list of all possible completions on text. |
|
820 | 849 | |
@@ -1287,9 +1316,18 b' want to merge them back into the new files.""" % locals()' | |||
|
1287 | 1316 | global_ns = call_frame.f_globals |
|
1288 | 1317 | |
|
1289 | 1318 | # Update namespaces and fire up interpreter |
|
1290 | self.user_ns = local_ns | |
|
1319 | ||
|
1320 | # The global one is easy, we can just throw it in | |
|
1291 | 1321 | self.user_global_ns = global_ns |
|
1292 | 1322 | |
|
1323 | # but the user/local one is tricky: ipython needs it to store internal | |
|
1324 | # data, but we also need the locals. We'll copy locals in the user | |
|
1325 | # one, but will track what got copied so we can delete them at exit. | |
|
1326 | # This is so that a later embedded call doesn't see locals from a | |
|
1327 | # previous call (which most likely existed in a separate scope). | |
|
1328 | local_varnames = local_ns.keys() | |
|
1329 | self.user_ns.update(local_ns) | |
|
1330 | ||
|
1293 | 1331 | # Patch for global embedding to make sure that things don't overwrite |
|
1294 | 1332 | # user globals accidentally. Thanks to Richard <rxe@renre-europe.com> |
|
1295 | 1333 | # FIXME. Test this a bit more carefully (the if.. is new) |
@@ -1299,8 +1337,21 b' want to merge them back into the new files.""" % locals()' | |||
|
1299 | 1337 | # make sure the tab-completer has the correct frame information, so it |
|
1300 | 1338 | # actually completes using the frame's locals/globals |
|
1301 | 1339 | self.set_completer_frame(call_frame) |
|
1340 | ||
|
1341 | # before activating the interactive mode, we need to make sure that | |
|
1342 | # all names in the builtin namespace needed by ipython point to | |
|
1343 | # ourselves, and not to other instances. | |
|
1344 | self.add_builtins() | |
|
1302 | 1345 | |
|
1303 | 1346 | self.interact(header) |
|
1347 | ||
|
1348 | # now, purge out the user namespace from anything we might have added | |
|
1349 | # from the caller's local namespace | |
|
1350 | delvar = self.user_ns.pop | |
|
1351 | for var in local_varnames: | |
|
1352 | delvar(var,None) | |
|
1353 | # and clean builtins we may have overridden | |
|
1354 | self.clean_builtins() | |
|
1304 | 1355 | |
|
1305 | 1356 | def interact(self, banner=None): |
|
1306 | 1357 | """Closely emulate the interactive Python console. |
@@ -1327,7 +1378,9 b' want to merge them back into the new files.""" % locals()' | |||
|
1327 | 1378 | __builtin__.__dict__['__IPYTHON__active'] += 1 |
|
1328 | 1379 | |
|
1329 | 1380 | # exit_now is set by a call to %Exit or %Quit |
|
1381 | self.exit_now = False | |
|
1330 | 1382 | while not self.exit_now: |
|
1383 | ||
|
1331 | 1384 | try: |
|
1332 | 1385 | if more: |
|
1333 | 1386 | prompt = self.outputcache.prompt2 |
@@ -1942,6 +1995,26 b' want to merge them back into the new files.""" % locals()' | |||
|
1942 | 1995 | |
|
1943 | 1996 | return line |
|
1944 | 1997 | |
|
1998 | def mktempfile(self,data=None): | |
|
1999 | """Make a new tempfile and return its filename. | |
|
2000 | ||
|
2001 | This makes a call to tempfile.mktemp, but it registers the created | |
|
2002 | filename internally so ipython cleans it up at exit time. | |
|
2003 | ||
|
2004 | Optional inputs: | |
|
2005 | ||
|
2006 | - data(None): if data is given, it gets written out to the temp file | |
|
2007 | immediately, and the file is closed again.""" | |
|
2008 | ||
|
2009 | filename = tempfile.mktemp('.py') | |
|
2010 | self.tempfiles.append(filename) | |
|
2011 | ||
|
2012 | if data: | |
|
2013 | tmp_file = open(filename,'w') | |
|
2014 | tmp_file.write(data) | |
|
2015 | tmp_file.close() | |
|
2016 | return filename | |
|
2017 | ||
|
1945 | 2018 | def write(self,data): |
|
1946 | 2019 | """Write a string to the default output""" |
|
1947 | 2020 | Term.cout.write(data) |
@@ -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 9 |
|
|
63 | $Id: ultraTB.py 988 2006-01-02 21:21:47Z fperez $""" | |
|
64 | 64 | |
|
65 | 65 | #***************************************************************************** |
|
66 | 66 | # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu> |
@@ -95,9 +95,14 b' from IPython.Struct import Struct' | |||
|
95 | 95 | from IPython.excolors import ExceptionColors |
|
96 | 96 | from IPython.genutils import Term,uniq_stable,error,info |
|
97 | 97 | |
|
98 | # Globals | |
|
99 | # amount of space to put line numbers before verbose tracebacks | |
|
100 | INDENT_SIZE = 8 | |
|
101 | ||
|
98 | 102 | #--------------------------------------------------------------------------- |
|
99 | 103 | # Code begins |
|
100 | 104 | |
|
105 | # Utility functions | |
|
101 | 106 | def inspect_error(): |
|
102 | 107 | """Print a message about internal inspect errors. |
|
103 | 108 | |
@@ -106,6 +111,76 b' def inspect_error():' | |||
|
106 | 111 | error('Internal Python error in the inspect module.\n' |
|
107 | 112 | 'Below is the traceback from this internal error.\n') |
|
108 | 113 | |
|
114 | def _fixed_getinnerframes(etb, context=1,tb_offset=0): | |
|
115 | import linecache | |
|
116 | LNUM_POS, LINES_POS, INDEX_POS = 2, 4, 5 | |
|
117 | ||
|
118 | records = inspect.getinnerframes(etb, context) | |
|
119 | ||
|
120 | # If the error is at the console, don't build any context, since it would | |
|
121 | # otherwise produce 5 blank lines printed out (there is no file at the | |
|
122 | # console) | |
|
123 | rec_check = records[tb_offset:] | |
|
124 | rname = rec_check[0][1] | |
|
125 | if rname == '<ipython console>' or rname.endswith('<string>'): | |
|
126 | return rec_check | |
|
127 | ||
|
128 | aux = traceback.extract_tb(etb) | |
|
129 | assert len(records) == len(aux) | |
|
130 | for i, (file, lnum, _, _) in zip(range(len(records)), aux): | |
|
131 | maybeStart = lnum-1 - context//2 | |
|
132 | start = max(maybeStart, 0) | |
|
133 | end = start + context | |
|
134 | lines = linecache.getlines(file)[start:end] | |
|
135 | # pad with empty lines if necessary | |
|
136 | if maybeStart < 0: | |
|
137 | lines = (['\n'] * -maybeStart) + lines | |
|
138 | if len(lines) < context: | |
|
139 | lines += ['\n'] * (context - len(lines)) | |
|
140 | assert len(lines) == context | |
|
141 | buf = list(records[i]) | |
|
142 | buf[LNUM_POS] = lnum | |
|
143 | buf[INDEX_POS] = lnum - 1 - start | |
|
144 | buf[LINES_POS] = lines | |
|
145 | records[i] = tuple(buf) | |
|
146 | return records[tb_offset:] | |
|
147 | ||
|
148 | # Helper function -- largely belongs to VerboseTB, but we need the same | |
|
149 | # functionality to produce a pseudo verbose TB for SyntaxErrors, so that they | |
|
150 | # can be recognized properly by ipython.el's py-traceback-line-re | |
|
151 | # (SyntaxErrors have to be treated specially because they have no traceback) | |
|
152 | def _formatTracebackLines(lnum, index, lines, Colors, lvals=None): | |
|
153 | numbers_width = INDENT_SIZE - 1 | |
|
154 | res = [] | |
|
155 | i = lnum - index | |
|
156 | for line in lines: | |
|
157 | if i == lnum: | |
|
158 | # This is the line with the error | |
|
159 | pad = numbers_width - len(str(i)) | |
|
160 | if pad >= 3: | |
|
161 | marker = '-'*(pad-3) + '-> ' | |
|
162 | elif pad == 2: | |
|
163 | marker = '> ' | |
|
164 | elif pad == 1: | |
|
165 | marker = '>' | |
|
166 | else: | |
|
167 | marker = '' | |
|
168 | num = marker + str(i) | |
|
169 | line = '%s%s%s %s%s' %(Colors.linenoEm, num, | |
|
170 | Colors.line, line, Colors.Normal) | |
|
171 | else: | |
|
172 | num = '%*s' % (numbers_width,i) | |
|
173 | line = '%s%s%s %s' %(Colors.lineno, num, | |
|
174 | Colors.Normal, line) | |
|
175 | ||
|
176 | res.append(line) | |
|
177 | if lvals and i == lnum: | |
|
178 | res.append(lvals + '\n') | |
|
179 | i = i + 1 | |
|
180 | return res | |
|
181 | ||
|
182 | #--------------------------------------------------------------------------- | |
|
183 | # Module classes | |
|
109 | 184 | class TBTools: |
|
110 | 185 | """Basic tools used by all traceback printer classes.""" |
|
111 | 186 | |
@@ -316,9 +391,7 b' class VerboseTB(TBTools):' | |||
|
316 | 391 | # some locals |
|
317 | 392 | Colors = self.Colors # just a shorthand + quicker name lookup |
|
318 | 393 | ColorsNormal = Colors.Normal # used a lot |
|
319 | indent_size = 8 # we need some space to put line numbers before | |
|
320 | indent = ' '*indent_size | |
|
321 | numbers_width = indent_size - 1 # leave space between numbers & code | |
|
394 | indent = ' '*INDENT_SIZE | |
|
322 | 395 | text_repr = pydoc.text.repr |
|
323 | 396 | exc = '%s%s%s' % (Colors.excName, str(etype), ColorsNormal) |
|
324 | 397 | em_normal = '%s\n%s%s' % (Colors.valEm, indent,ColorsNormal) |
@@ -353,7 +426,13 b' class VerboseTB(TBTools):' | |||
|
353 | 426 | linecache.checkcache() |
|
354 | 427 | # Drop topmost frames if requested |
|
355 | 428 | try: |
|
356 | records = inspect.getinnerframes(etb, context)[self.tb_offset:] | |
|
429 | # Try the default getinnerframes and Alex's: Alex's fixes some | |
|
430 | # problems, but it generates empty tracebacks for console errors | |
|
431 | # (5 blanks lines) where none should be returned. | |
|
432 | #records = inspect.getinnerframes(etb, context)[self.tb_offset:] | |
|
433 | #print 'python records:', records # dbg | |
|
434 | records = _fixed_getinnerframes(etb, context,self.tb_offset) | |
|
435 | #print 'alex records:', records # dbg | |
|
357 | 436 | except: |
|
358 | 437 | |
|
359 | 438 | # FIXME: I've been getting many crash reports from python 2.3 |
@@ -519,32 +598,12 b' class VerboseTB(TBTools):' | |||
|
519 | 598 | lvals = '' |
|
520 | 599 | |
|
521 | 600 | level = '%s %s\n' % (link,call) |
|
522 | excerpt = [] | |
|
523 |
if index is |
|
|
524 | i = lnum - index | |
|
525 | for line in lines: | |
|
526 | if i == lnum: | |
|
527 | # This is the line with the error | |
|
528 | pad = numbers_width - len(str(i)) | |
|
529 | if pad >= 3: | |
|
530 | marker = '-'*(pad-3) + '-> ' | |
|
531 | elif pad == 2: | |
|
532 | marker = '> ' | |
|
533 | elif pad == 1: | |
|
534 | marker = '>' | |
|
535 | else: | |
|
536 | marker = '' | |
|
537 | num = '%s%s' % (marker,i) | |
|
538 | line = tpl_line_em % (num,line) | |
|
539 | else: | |
|
540 | num = '%*s' % (numbers_width,i) | |
|
541 | line = tpl_line % (num,line) | |
|
542 | ||
|
543 | excerpt.append(line) | |
|
544 | if self.include_vars and i == lnum: | |
|
545 | excerpt.append('%s\n' % lvals) | |
|
546 | i += 1 | |
|
547 | frames.append('%s%s' % (level,''.join(excerpt)) ) | |
|
601 | ||
|
602 | if index is None: | |
|
603 | frames.append(level) | |
|
604 | else: | |
|
605 | frames.append('%s%s' % (level,''.join( | |
|
606 | _formatTracebackLines(lnum,index,lines,self.Colors,lvals)))) | |
|
548 | 607 | |
|
549 | 608 | # Get (safely) a string form of the exception info |
|
550 | 609 | try: |
@@ -1,3 +1,26 b'' | |||
|
1 | 2006-01-02 Fernando Perez <Fernando.Perez@colorado.edu> | |
|
2 | ||
|
3 | * IPython/ultraTB.py (_fixed_getinnerframes): added Alex | |
|
4 | Schmolck's patch to fix inspect.getinnerframes(). | |
|
5 | ||
|
6 | * IPython/iplib.py (InteractiveShell.__init__): significant fixes | |
|
7 | for embedded instances, regarding handling of namespaces and items | |
|
8 | added to the __builtin__ one. Multiple embedded instances and | |
|
9 | recursive embeddings should work better now (though I'm not sure | |
|
10 | I've got all the corner cases fixed, that code is a bit of a brain | |
|
11 | twister). | |
|
12 | ||
|
13 | * IPython/Magic.py (magic_edit): added support to edit in-memory | |
|
14 | macros (automatically creates the necessary temp files). %edit | |
|
15 | also doesn't return the file contents anymore, it's just noise. | |
|
16 | ||
|
17 | * IPython/completer.py (Completer.attr_matches): revert change to | |
|
18 | complete only on attributes listed in __all__. I realized it | |
|
19 | cripples the tab-completion system as a tool for exploring the | |
|
20 | internals of unknown libraries (it renders any non-__all__ | |
|
21 | attribute off-limits). I got bit by this when trying to see | |
|
22 | something inside the dis module. | |
|
23 | ||
|
1 | 24 | 2005-12-31 Fernando Perez <Fernando.Perez@colorado.edu> |
|
2 | 25 | |
|
3 | 26 | * IPython/iplib.py (InteractiveShell.__init__): add .meta |
@@ -27,7 +27,8 b' else:' | |||
|
27 | 27 | print "The prompts for the nested copy have been modified" |
|
28 | 28 | nested = 1 |
|
29 | 29 | # what the embedded instance will see as sys.argv: |
|
30 |
args = ['-pi1','In <\\#>:','-pi2',' .\\D.:', |
|
|
30 | args = ['-pi1','In <\\#>: ','-pi2',' .\\D.: ', | |
|
31 | '-po','Out<\\#>: ','-nosep'] | |
|
31 | 32 | |
|
32 | 33 | # First import the embeddable shell class |
|
33 | 34 | from IPython.Shell import IPShellEmbed |
@@ -44,7 +45,8 b' ipshell = IPShellEmbed(args,' | |||
|
44 | 45 | if nested: |
|
45 | 46 | args[1] = 'In2<\\#>' |
|
46 | 47 | else: |
|
47 |
args = ['-pi1','In2<\\#>:','-pi2',' .\\D.:', |
|
|
48 | args = ['-pi1','In2<\\#>: ','-pi2',' .\\D.: ', | |
|
49 | '-po','Out<\\#>: ','-nosep'] | |
|
48 | 50 | ipshell2 = IPShellEmbed(args,banner = 'Second IPython instance.') |
|
49 | 51 | |
|
50 | 52 | print '\nHello. This is printed from the main controller program.\n' |
General Comments 0
You need to be logged in to leave comments.
Login now