##// END OF EJS Templates
Merging with upstream
Fernando Perez -
r2532:227ec978 merge
parent child Browse files
Show More

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

1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,67 +1,67 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 IPython.
5 5
6 6 IPython is a set of tools for interactive and exploratory computing in Python.
7 7 """
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (C) 2008-2009 The IPython Development Team
11 11 #
12 12 # Distributed under the terms of the BSD License. The full license is in
13 13 # the file COPYING, distributed as part of this software.
14 14 #-----------------------------------------------------------------------------
15 15
16 16 #-----------------------------------------------------------------------------
17 17 # Imports
18 18 #-----------------------------------------------------------------------------
19 19 from __future__ import absolute_import
20 20
21 21 import os
22 22 import sys
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Setup everything
26 26 #-----------------------------------------------------------------------------
27 27
28 28 if sys.version[0:3] < '2.5':
29 29 raise ImportError('Python Version 2.5 or above is required for IPython.')
30 30
31 31
32 32 # Make it easy to import extensions - they are always directly on pythonpath.
33 # Therefore, non-IPython modules can be added to extensions directory
33 # Therefore, non-IPython modules can be added to extensions directory.
34 # This should probably be in ipapp.py.
34 35 sys.path.append(os.path.join(os.path.dirname(__file__), "extensions"))
35 36
36 37 #-----------------------------------------------------------------------------
37 38 # Setup the top level names
38 39 #-----------------------------------------------------------------------------
39 40
40 # In some cases, these are causing circular imports.
41 41 from .config.loader import Config
42 42 from .core import release
43 43 from .core.application import Application
44 44 from .core.ipapp import IPythonApp
45 45 from .core.embed import embed
46 46 from .core.error import TryNext
47 47 from .core.iplib import InteractiveShell
48 48 from .testing import test
49 49
50 50 from .lib import (
51 51 enable_wx, disable_wx,
52 52 enable_gtk, disable_gtk,
53 53 enable_qt4, disable_qt4,
54 54 enable_tk, disable_tk,
55 55 set_inputhook, clear_inputhook,
56 56 current_gui, spin,
57 57 appstart_qt4, appstart_wx,
58 58 appstart_gtk, appstart_tk
59 59 )
60 60
61 61 # Release data
62 62 __author__ = ''
63 63 for author, email in release.authors.values():
64 64 __author__ += author + ' <' + email + '>\n'
65 65 __license__ = release.license
66 66 __version__ = release.version
67 67 __revision__ = release.revision
@@ -1,377 +1,370 b''
1 1 # coding: utf-8
2 2 """A simple configuration system.
3 3
4 4 Authors
5 5 -------
6 6 * Brian Granger
7 7 * Fernando Perez
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2008-2009 The IPython Development Team
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #-----------------------------------------------------------------------------
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Imports
19 19 #-----------------------------------------------------------------------------
20 20
21 21 import __builtin__
22 22 import os
23 23 import sys
24 24
25 25 from IPython.external import argparse
26 from IPython.utils.genutils import filefind
26 from IPython.utils.path import filefind
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Exceptions
30 30 #-----------------------------------------------------------------------------
31 31
32 32
33 33 class ConfigError(Exception):
34 34 pass
35 35
36 36
37 37 class ConfigLoaderError(ConfigError):
38 38 pass
39 39
40 40 #-----------------------------------------------------------------------------
41 41 # Argparse fix
42 42 #-----------------------------------------------------------------------------
43
43 44 # Unfortunately argparse by default prints help messages to stderr instead of
44 45 # stdout. This makes it annoying to capture long help screens at the command
45 46 # line, since one must know how to pipe stderr, which many users don't know how
46 47 # to do. So we override the print_help method with one that defaults to
47 48 # stdout and use our class instead.
48 49
49 50 class ArgumentParser(argparse.ArgumentParser):
50 51 """Simple argparse subclass that prints help to stdout by default."""
51 52
52 53 def print_help(self, file=None):
53 54 if file is None:
54 55 file = sys.stdout
55 56 return super(ArgumentParser, self).print_help(file)
56 57
57 58 print_help.__doc__ = argparse.ArgumentParser.print_help.__doc__
58 59
59 60 #-----------------------------------------------------------------------------
60 61 # Config class for holding config information
61 62 #-----------------------------------------------------------------------------
62 63
63 64
64 65 class Config(dict):
65 66 """An attribute based dict that can do smart merges."""
66 67
67 68 def __init__(self, *args, **kwds):
68 69 dict.__init__(self, *args, **kwds)
69 70 # This sets self.__dict__ = self, but it has to be done this way
70 71 # because we are also overriding __setattr__.
71 72 dict.__setattr__(self, '__dict__', self)
72 73
73 74 def _merge(self, other):
74 75 to_update = {}
75 76 for k, v in other.items():
76 77 if not self.has_key(k):
77 78 to_update[k] = v
78 79 else: # I have this key
79 80 if isinstance(v, Config):
80 81 # Recursively merge common sub Configs
81 82 self[k]._merge(v)
82 83 else:
83 84 # Plain updates for non-Configs
84 85 to_update[k] = v
85 86
86 87 self.update(to_update)
87 88
88 89 def _is_section_key(self, key):
89 90 if key[0].upper()==key[0] and not key.startswith('_'):
90 91 return True
91 92 else:
92 93 return False
93 94
94 95 def has_key(self, key):
95 96 if self._is_section_key(key):
96 97 return True
97 98 else:
98 99 return dict.has_key(self, key)
99 100
100 101 def _has_section(self, key):
101 102 if self._is_section_key(key):
102 103 if dict.has_key(self, key):
103 104 return True
104 105 return False
105 106
106 107 def copy(self):
107 108 return type(self)(dict.copy(self))
108 109
109 110 def __copy__(self):
110 111 return self.copy()
111 112
112 113 def __deepcopy__(self, memo):
113 114 import copy
114 115 return type(self)(copy.deepcopy(self.items()))
115 116
116 117 def __getitem__(self, key):
117 118 # Because we use this for an exec namespace, we need to delegate
118 119 # the lookup of names in __builtin__ to itself. This means
119 120 # that you can't have section or attribute names that are
120 121 # builtins.
121 122 try:
122 123 return getattr(__builtin__, key)
123 124 except AttributeError:
124 125 pass
125 126 if self._is_section_key(key):
126 127 try:
127 128 return dict.__getitem__(self, key)
128 129 except KeyError:
129 130 c = Config()
130 131 dict.__setitem__(self, key, c)
131 132 return c
132 133 else:
133 134 return dict.__getitem__(self, key)
134 135
135 136 def __setitem__(self, key, value):
136 137 # Don't allow names in __builtin__ to be modified.
137 138 if hasattr(__builtin__, key):
138 139 raise ConfigError('Config variable names cannot have the same name '
139 140 'as a Python builtin: %s' % key)
140 141 if self._is_section_key(key):
141 142 if not isinstance(value, Config):
142 143 raise ValueError('values whose keys begin with an uppercase '
143 144 'char must be Config instances: %r, %r' % (key, value))
144 145 else:
145 146 dict.__setitem__(self, key, value)
146 147
147 148 def __getattr__(self, key):
148 149 try:
149 150 return self.__getitem__(key)
150 151 except KeyError, e:
151 152 raise AttributeError(e)
152 153
153 154 def __setattr__(self, key, value):
154 155 try:
155 156 self.__setitem__(key, value)
156 157 except KeyError, e:
157 158 raise AttributeError(e)
158 159
159 160 def __delattr__(self, key):
160 161 try:
161 162 dict.__delitem__(self, key)
162 163 except KeyError, e:
163 164 raise AttributeError(e)
164 165
165 166
166 167 #-----------------------------------------------------------------------------
167 168 # Config loading classes
168 169 #-----------------------------------------------------------------------------
169 170
170 171
171 172 class ConfigLoader(object):
172 173 """A object for loading configurations from just about anywhere.
173 174
174 175 The resulting configuration is packaged as a :class:`Struct`.
175 176
176 177 Notes
177 178 -----
178 179 A :class:`ConfigLoader` does one thing: load a config from a source
179 180 (file, command line arguments) and returns the data as a :class:`Struct`.
180 181 There are lots of things that :class:`ConfigLoader` does not do. It does
181 182 not implement complex logic for finding config files. It does not handle
182 183 default values or merge multiple configs. These things need to be
183 184 handled elsewhere.
184 185 """
185 186
186 187 def __init__(self):
187 188 """A base class for config loaders.
188 189
189 190 Examples
190 191 --------
191 192
192 193 >>> cl = ConfigLoader()
193 194 >>> config = cl.load_config()
194 195 >>> config
195 196 {}
196 197 """
197 198 self.clear()
198 199
199 200 def clear(self):
200 201 self.config = Config()
201 202
202 203 def load_config(self):
203 """Load a config from somewhere, return a Struct.
204 """Load a config from somewhere, return a :class:`Config` instance.
204 205
205 206 Usually, this will cause self.config to be set and then returned.
207 However, in most cases, :meth:`ConfigLoader.clear` should be called
208 to erase any previous state.
206 209 """
210 self.clear()
207 211 return self.config
208 212
209 213
210 214 class FileConfigLoader(ConfigLoader):
211 215 """A base class for file based configurations.
212 216
213 217 As we add more file based config loaders, the common logic should go
214 218 here.
215 219 """
216 220 pass
217 221
218 222
219 223 class PyFileConfigLoader(FileConfigLoader):
220 224 """A config loader for pure python files.
221 225
222 226 This calls execfile on a plain python file and looks for attributes
223 227 that are all caps. These attribute are added to the config Struct.
224 228 """
225 229
226 230 def __init__(self, filename, path=None):
227 231 """Build a config loader for a filename and path.
228 232
229 233 Parameters
230 234 ----------
231 235 filename : str
232 236 The file name of the config file.
233 237 path : str, list, tuple
234 238 The path to search for the config file on, or a sequence of
235 239 paths to try in order.
236 240 """
237 241 super(PyFileConfigLoader, self).__init__()
238 242 self.filename = filename
239 243 self.path = path
240 244 self.full_filename = ''
241 245 self.data = None
242 246
243 247 def load_config(self):
244 248 """Load the config from a file and return it as a Struct."""
249 self.clear()
245 250 self._find_file()
246 251 self._read_file_as_dict()
247 252 self._convert_to_config()
248 253 return self.config
249 254
250 255 def _find_file(self):
251 256 """Try to find the file by searching the paths."""
252 257 self.full_filename = filefind(self.filename, self.path)
253 258
254 259 def _read_file_as_dict(self):
255 260 """Load the config file into self.config, with recursive loading."""
256 261 # This closure is made available in the namespace that is used
257 262 # to exec the config file. This allows users to call
258 263 # load_subconfig('myconfig.py') to load config files recursively.
259 264 # It needs to be a closure because it has references to self.path
260 265 # and self.config. The sub-config is loaded with the same path
261 266 # as the parent, but it uses an empty config which is then merged
262 267 # with the parents.
263 268 def load_subconfig(fname):
264 269 loader = PyFileConfigLoader(fname, self.path)
265 270 try:
266 271 sub_config = loader.load_config()
267 272 except IOError:
268 273 # Pass silently if the sub config is not there. This happens
269 274 # when a user us using a profile, but not the default config.
270 275 pass
271 276 else:
272 277 self.config._merge(sub_config)
273 278
274 279 # Again, this needs to be a closure and should be used in config
275 280 # files to get the config being loaded.
276 281 def get_config():
277 282 return self.config
278 283
279 284 namespace = dict(load_subconfig=load_subconfig, get_config=get_config)
280 285 execfile(self.full_filename, namespace)
281 286
282 287 def _convert_to_config(self):
283 288 if self.data is None:
284 289 ConfigLoaderError('self.data does not exist')
285 290
286 291
287 292 class CommandLineConfigLoader(ConfigLoader):
288 293 """A config loader for command line arguments.
289 294
290 295 As we add more command line based loaders, the common logic should go
291 296 here.
292 297 """
293 298
294 299
295 class __NoConfigDefault(object): pass
296 NoConfigDefault = __NoConfigDefault()
297
298
299 300 class ArgParseConfigLoader(CommandLineConfigLoader):
300 #: Global default for arguments (see argparse docs for details)
301 argument_default = NoConfigDefault
302
303 def __init__(self, argv=None, arguments=(), *args, **kw):
304 """Create a config loader for use with argparse.
305 301
306 With the exception of ``argv`` and ``arguments``, other args and kwargs
307 arguments here are passed onto the constructor of
308 :class:`argparse.ArgumentParser`.
302 def __init__(self, argv=None, *parser_args, **parser_kw):
303 """Create a config loader for use with argparse.
309 304
310 305 Parameters
311 306 ----------
312 307
313 308 argv : optional, list
314 309 If given, used to read command-line arguments from, otherwise
315 310 sys.argv[1:] is used.
316 311
317 arguments : optional, tuple
318 Description of valid command-line arguments, to be called in sequence
319 with parser.add_argument() to configure the parser.
312 parser_args : tuple
313 A tuple of positional arguments that will be passed to the
314 constructor of :class:`argparse.ArgumentParser`.
315
316 parser_kw : dict
317 A tuple of keyword arguments that will be passed to the
318 constructor of :class:`argparse.ArgumentParser`.
320 319 """
321 320 super(CommandLineConfigLoader, self).__init__()
322 321 if argv == None:
323 322 argv = sys.argv[1:]
324 323 self.argv = argv
325 self.arguments = arguments
326 self.args = args
327 kwargs = dict(argument_default=self.argument_default)
328 kwargs.update(kw)
329 self.kw = kwargs
324 self.parser_args = parser_args
325 kwargs = dict(argument_default=argparse.SUPPRESS)
326 kwargs.update(parser_kw)
327 self.parser_kw = kwargs
330 328
331 329 def load_config(self, args=None):
332 330 """Parse command line arguments and return as a Struct.
333 331
334 332 Parameters
335 333 ----------
336 334
337 335 args : optional, list
338 If given, a list with the structure of sys.argv[1:] to parse arguments
339 from. If not given, the instance's self.argv attribute (given at
340 construction time) is used."""
341
336 If given, a list with the structure of sys.argv[1:] to parse
337 arguments from. If not given, the instance's self.argv attribute
338 (given at construction time) is used."""
339 self.clear()
342 340 if args is None:
343 341 args = self.argv
344 342 self._create_parser()
345 343 self._parse_args(args)
346 344 self._convert_to_config()
347 345 return self.config
348 346
349 347 def get_extra_args(self):
350 348 if hasattr(self, 'extra_args'):
351 349 return self.extra_args
352 350 else:
353 351 return []
354 352
355 353 def _create_parser(self):
356 self.parser = ArgumentParser(*self.args, **self.kw)
354 self.parser = ArgumentParser(*self.parser_args, **self.parser_kw)
357 355 self._add_arguments()
358 self._add_other_arguments()
359 356
360 357 def _add_arguments(self):
361 for argument in self.arguments:
362 self.parser.add_argument(*argument[0],**argument[1])
363
364 def _add_other_arguments(self):
365 """Meant for subclasses to add their own arguments."""
366 pass
358 raise NotImplementedError("subclasses must implement _add_arguments")
367 359
368 360 def _parse_args(self, args):
369 361 """self.parser->self.parsed_data"""
370 362 self.parsed_data, self.extra_args = self.parser.parse_known_args(args)
371 363
372 364 def _convert_to_config(self):
373 365 """self.parsed_data->self.config"""
374 366 for k, v in vars(self.parsed_data).items():
375 if v is not NoConfigDefault:
376 exec_str = 'self.config.' + k + '= v'
377 exec exec_str in locals(), globals()
367 exec_str = 'self.config.' + k + '= v'
368 exec exec_str in locals(), globals()
369
370
@@ -1,162 +1,174 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Tests for IPython.config.loader
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez (design help)
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 import os
24 24 from tempfile import mkstemp
25 25 from unittest import TestCase
26 26
27 27 from IPython.config.loader import (
28 28 Config,
29 29 PyFileConfigLoader,
30 30 ArgParseConfigLoader,
31 31 ConfigError
32 32 )
33 33
34 34 #-----------------------------------------------------------------------------
35 35 # Actual tests
36 36 #-----------------------------------------------------------------------------
37 37
38 38
39 39 pyfile = """
40 40 c = get_config()
41 41 c.a = 10
42 42 c.b = 20
43 43 c.Foo.Bar.value = 10
44 44 c.Foo.Bam.value = range(10)
45 45 c.D.C.value = 'hi there'
46 46 """
47 47
48 48 class TestPyFileCL(TestCase):
49 49
50 50 def test_basic(self):
51 51 fd, fname = mkstemp('.py')
52 52 f = os.fdopen(fd, 'w')
53 53 f.write(pyfile)
54 54 f.close()
55 55 # Unlink the file
56 56 cl = PyFileConfigLoader(fname)
57 57 config = cl.load_config()
58 58 self.assertEquals(config.a, 10)
59 59 self.assertEquals(config.b, 20)
60 60 self.assertEquals(config.Foo.Bar.value, 10)
61 61 self.assertEquals(config.Foo.Bam.value, range(10))
62 62 self.assertEquals(config.D.C.value, 'hi there')
63 63
64 class MyLoader1(ArgParseConfigLoader):
65 def _add_arguments(self):
66 p = self.parser
67 p.add_argument('-f', '--foo', dest='Global.foo', type=str)
68 p.add_argument('-b', dest='MyClass.bar', type=int)
69 p.add_argument('-n', dest='n', action='store_true')
70 p.add_argument('Global.bam', type=str)
71
72 class MyLoader2(ArgParseConfigLoader):
73 def _add_arguments(self):
74 subparsers = self.parser.add_subparsers(dest='subparser_name')
75 subparser1 = subparsers.add_parser('1')
76 subparser1.add_argument('-x',dest='Global.x')
77 subparser2 = subparsers.add_parser('2')
78 subparser2.add_argument('y')
64 79
65 80 class TestArgParseCL(TestCase):
66 81
67 82 def test_basic(self):
68
69 arguments = (
70 (('-f','--foo'), dict(dest='Global.foo', type=str)),
71 (('-b',), dict(dest='MyClass.bar', type=int)),
72 (('-n',), dict(dest='n', action='store_true')),
73 (('Global.bam',), dict(type=str))
74 )
75 cl = ArgParseConfigLoader(arguments=arguments)
83 cl = MyLoader1()
76 84 config = cl.load_config('-f hi -b 10 -n wow'.split())
77 85 self.assertEquals(config.Global.foo, 'hi')
78 86 self.assertEquals(config.MyClass.bar, 10)
79 87 self.assertEquals(config.n, True)
80 88 self.assertEquals(config.Global.bam, 'wow')
89 config = cl.load_config(['wow'])
90 self.assertEquals(config.keys(), ['Global'])
91 self.assertEquals(config.Global.keys(), ['bam'])
92 self.assertEquals(config.Global.bam, 'wow')
81 93
82 94 def test_add_arguments(self):
83
84 class MyLoader(ArgParseConfigLoader):
85 def _add_arguments(self):
86 subparsers = self.parser.add_subparsers(dest='subparser_name')
87 subparser1 = subparsers.add_parser('1')
88 subparser1.add_argument('-x',dest='Global.x')
89 subparser2 = subparsers.add_parser('2')
90 subparser2.add_argument('y')
91
92 cl = MyLoader()
95 cl = MyLoader2()
93 96 config = cl.load_config('2 frobble'.split())
94 97 self.assertEquals(config.subparser_name, '2')
95 98 self.assertEquals(config.y, 'frobble')
96 99 config = cl.load_config('1 -x frobble'.split())
97 100 self.assertEquals(config.subparser_name, '1')
98 101 self.assertEquals(config.Global.x, 'frobble')
99 102
103 def test_argv(self):
104 cl = MyLoader1(argv='-f hi -b 10 -n wow'.split())
105 config = cl.load_config()
106 self.assertEquals(config.Global.foo, 'hi')
107 self.assertEquals(config.MyClass.bar, 10)
108 self.assertEquals(config.n, True)
109 self.assertEquals(config.Global.bam, 'wow')
110
111
100 112 class TestConfig(TestCase):
101 113
102 114 def test_setget(self):
103 115 c = Config()
104 116 c.a = 10
105 117 self.assertEquals(c.a, 10)
106 118 self.assertEquals(c.has_key('b'), False)
107 119
108 120 def test_auto_section(self):
109 121 c = Config()
110 122 self.assertEquals(c.has_key('A'), True)
111 123 self.assertEquals(c._has_section('A'), False)
112 124 A = c.A
113 125 A.foo = 'hi there'
114 126 self.assertEquals(c._has_section('A'), True)
115 127 self.assertEquals(c.A.foo, 'hi there')
116 128 del c.A
117 129 self.assertEquals(len(c.A.keys()),0)
118 130
119 131 def test_merge_doesnt_exist(self):
120 132 c1 = Config()
121 133 c2 = Config()
122 134 c2.bar = 10
123 135 c2.Foo.bar = 10
124 136 c1._merge(c2)
125 137 self.assertEquals(c1.Foo.bar, 10)
126 138 self.assertEquals(c1.bar, 10)
127 139 c2.Bar.bar = 10
128 140 c1._merge(c2)
129 141 self.assertEquals(c1.Bar.bar, 10)
130 142
131 143 def test_merge_exists(self):
132 144 c1 = Config()
133 145 c2 = Config()
134 146 c1.Foo.bar = 10
135 147 c1.Foo.bam = 30
136 148 c2.Foo.bar = 20
137 149 c2.Foo.wow = 40
138 150 c1._merge(c2)
139 151 self.assertEquals(c1.Foo.bam, 30)
140 152 self.assertEquals(c1.Foo.bar, 20)
141 153 self.assertEquals(c1.Foo.wow, 40)
142 154 c2.Foo.Bam.bam = 10
143 155 c1._merge(c2)
144 156 self.assertEquals(c1.Foo.Bam.bam, 10)
145 157
146 158 def test_deepcopy(self):
147 159 c1 = Config()
148 160 c1.Foo.bar = 10
149 161 c1.Foo.bam = 30
150 162 c1.a = 'asdf'
151 163 c1.b = range(10)
152 164 import copy
153 165 c2 = copy.deepcopy(c1)
154 166 self.assertEquals(c1, c2)
155 167 self.assert_(c1 is not c2)
156 168 self.assert_(c1.Foo is not c2.Foo)
157 169
158 170 def test_builtin(self):
159 171 c1 = Config()
160 172 exec 'foo = True' in c1
161 173 self.assertEquals(c1.foo, True)
162 174 self.assertRaises(ConfigError, setattr, c1, 'ValueError', 10)
@@ -1,262 +1,262 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 IPython's alias component
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (C) 2008-2009 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import __builtin__
23 23 import keyword
24 24 import os
25 25 import re
26 26 import sys
27 27
28 28 from IPython.core.component import Component
29 29 from IPython.core.splitinput import split_user_input
30 30
31 from IPython.utils.traitlets import CBool, List, Instance
32 from IPython.utils.genutils import error
31 from IPython.utils.traitlets import List
33 32 from IPython.utils.autoattr import auto_attr
33 from IPython.utils.warn import warn, error
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Utilities
37 37 #-----------------------------------------------------------------------------
38 38
39 39 # This is used as the pattern for calls to split_user_input.
40 40 shell_line_split = re.compile(r'^(\s*)(\S*\s*)(.*$)')
41 41
42 42 def default_aliases():
43 43 # Make some aliases automatically
44 44 # Prepare list of shell aliases to auto-define
45 45 if os.name == 'posix':
46 46 default_aliases = ('mkdir mkdir', 'rmdir rmdir',
47 47 'mv mv -i','rm rm -i','cp cp -i',
48 48 'cat cat','less less','clear clear',
49 49 # a better ls
50 50 'ls ls -F',
51 51 # long ls
52 52 'll ls -lF')
53 53 # Extra ls aliases with color, which need special treatment on BSD
54 54 # variants
55 55 ls_extra = ( # color ls
56 56 'lc ls -F -o --color',
57 57 # ls normal files only
58 58 'lf ls -F -o --color %l | grep ^-',
59 59 # ls symbolic links
60 60 'lk ls -F -o --color %l | grep ^l',
61 61 # directories or links to directories,
62 62 'ldir ls -F -o --color %l | grep /$',
63 63 # things which are executable
64 64 'lx ls -F -o --color %l | grep ^-..x',
65 65 )
66 66 # The BSDs don't ship GNU ls, so they don't understand the
67 67 # --color switch out of the box
68 68 if 'bsd' in sys.platform:
69 69 ls_extra = ( # ls normal files only
70 70 'lf ls -lF | grep ^-',
71 71 # ls symbolic links
72 72 'lk ls -lF | grep ^l',
73 73 # directories or links to directories,
74 74 'ldir ls -lF | grep /$',
75 75 # things which are executable
76 76 'lx ls -lF | grep ^-..x',
77 77 )
78 78 default_aliases = default_aliases + ls_extra
79 79 elif os.name in ['nt','dos']:
80 80 default_aliases = ('ls dir /on',
81 81 'ddir dir /ad /on', 'ldir dir /ad /on',
82 82 'mkdir mkdir','rmdir rmdir','echo echo',
83 83 'ren ren','cls cls','copy copy')
84 84 else:
85 85 default_aliases = ()
86 86 return [s.split(None,1) for s in default_aliases]
87 87
88 88
89 89 class AliasError(Exception):
90 90 pass
91 91
92 92
93 93 class InvalidAliasError(AliasError):
94 94 pass
95 95
96 96
97 97 #-----------------------------------------------------------------------------
98 98 # Main AliasManager class
99 99 #-----------------------------------------------------------------------------
100 100
101 101
102 102 class AliasManager(Component):
103 103
104 104 default_aliases = List(default_aliases(), config=True)
105 105 user_aliases = List(default_value=[], config=True)
106 106
107 107 def __init__(self, parent, config=None):
108 108 super(AliasManager, self).__init__(parent, config=config)
109 109 self.alias_table = {}
110 110 self.exclude_aliases()
111 111 self.init_aliases()
112 112
113 113 @auto_attr
114 114 def shell(self):
115 115 return Component.get_instances(
116 116 root=self.root,
117 117 klass='IPython.core.iplib.InteractiveShell')[0]
118 118
119 119 def __contains__(self, name):
120 120 if name in self.alias_table:
121 121 return True
122 122 else:
123 123 return False
124 124
125 125 @property
126 126 def aliases(self):
127 127 return [(item[0], item[1][1]) for item in self.alias_table.iteritems()]
128 128
129 129 def exclude_aliases(self):
130 130 # set of things NOT to alias (keywords, builtins and some magics)
131 131 no_alias = set(['cd','popd','pushd','dhist','alias','unalias'])
132 132 no_alias.update(set(keyword.kwlist))
133 133 no_alias.update(set(__builtin__.__dict__.keys()))
134 134 self.no_alias = no_alias
135 135
136 136 def init_aliases(self):
137 137 # Load default aliases
138 138 for name, cmd in self.default_aliases:
139 139 self.soft_define_alias(name, cmd)
140 140
141 141 # Load user aliases
142 142 for name, cmd in self.user_aliases:
143 143 self.soft_define_alias(name, cmd)
144 144
145 145 def clear_aliases(self):
146 146 self.alias_table.clear()
147 147
148 148 def soft_define_alias(self, name, cmd):
149 149 """Define an alias, but don't raise on an AliasError."""
150 150 try:
151 151 self.define_alias(name, cmd)
152 152 except AliasError, e:
153 153 error("Invalid alias: %s" % e)
154 154
155 155 def define_alias(self, name, cmd):
156 156 """Define a new alias after validating it.
157 157
158 158 This will raise an :exc:`AliasError` if there are validation
159 159 problems.
160 160 """
161 161 nargs = self.validate_alias(name, cmd)
162 162 self.alias_table[name] = (nargs, cmd)
163 163
164 164 def undefine_alias(self, name):
165 165 if self.alias_table.has_key(name):
166 166 del self.alias_table[name]
167 167
168 168 def validate_alias(self, name, cmd):
169 169 """Validate an alias and return the its number of arguments."""
170 170 if name in self.no_alias:
171 171 raise InvalidAliasError("The name %s can't be aliased "
172 172 "because it is a keyword or builtin." % name)
173 173 if not (isinstance(cmd, basestring)):
174 174 raise InvalidAliasError("An alias command must be a string, "
175 175 "got: %r" % name)
176 176 nargs = cmd.count('%s')
177 177 if nargs>0 and cmd.find('%l')>=0:
178 178 raise InvalidAliasError('The %s and %l specifiers are mutually '
179 179 'exclusive in alias definitions.')
180 180 return nargs
181 181
182 182 def call_alias(self, alias, rest=''):
183 183 """Call an alias given its name and the rest of the line."""
184 184 cmd = self.transform_alias(alias, rest)
185 185 try:
186 186 self.shell.system(cmd)
187 187 except:
188 188 self.shell.showtraceback()
189 189
190 190 def transform_alias(self, alias,rest=''):
191 191 """Transform alias to system command string."""
192 192 nargs, cmd = self.alias_table[alias]
193 193
194 194 if ' ' in cmd and os.path.isfile(cmd):
195 195 cmd = '"%s"' % cmd
196 196
197 197 # Expand the %l special to be the user's input line
198 198 if cmd.find('%l') >= 0:
199 199 cmd = cmd.replace('%l', rest)
200 200 rest = ''
201 201 if nargs==0:
202 202 # Simple, argument-less aliases
203 203 cmd = '%s %s' % (cmd, rest)
204 204 else:
205 205 # Handle aliases with positional arguments
206 206 args = rest.split(None, nargs)
207 207 if len(args) < nargs:
208 208 raise AliasError('Alias <%s> requires %s arguments, %s given.' %
209 209 (alias, nargs, len(args)))
210 210 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
211 211 return cmd
212 212
213 213 def expand_alias(self, line):
214 214 """ Expand an alias in the command line
215 215
216 216 Returns the provided command line, possibly with the first word
217 217 (command) translated according to alias expansion rules.
218 218
219 219 [ipython]|16> _ip.expand_aliases("np myfile.txt")
220 220 <16> 'q:/opt/np/notepad++.exe myfile.txt'
221 221 """
222 222
223 223 pre,fn,rest = split_user_input(line)
224 224 res = pre + self.expand_aliases(fn, rest)
225 225 return res
226 226
227 227 def expand_aliases(self, fn, rest):
228 228 """Expand multiple levels of aliases:
229 229
230 230 if:
231 231
232 232 alias foo bar /tmp
233 233 alias baz foo
234 234
235 235 then:
236 236
237 237 baz huhhahhei -> bar /tmp huhhahhei
238 238
239 239 """
240 240 line = fn + " " + rest
241 241
242 242 done = set()
243 243 while 1:
244 244 pre,fn,rest = split_user_input(line, shell_line_split)
245 245 if fn in self.alias_table:
246 246 if fn in done:
247 247 warn("Cyclic alias definition, repeated '%s'" % fn)
248 248 return ""
249 249 done.add(fn)
250 250
251 251 l2 = self.transform_alias(fn, rest)
252 252 if l2 == line:
253 253 break
254 254 # ls -> ls -F should not recurse forever
255 255 if l2.split(None,1)[0] == line.split(None,1)[0]:
256 256 line = l2
257 257 break
258 258 line=l2
259 259 else:
260 260 break
261 261
262 262 return line
@@ -1,489 +1,453 b''
1 1 # encoding: utf-8
2 2 """
3 3 An application for IPython.
4 4
5 5 All top-level applications should use the classes in this module for
6 6 handling configuration and creating componenets.
7 7
8 8 The job of an :class:`Application` is to create the master configuration
9 9 object and then create the components, passing the config to them.
10 10
11 11 Authors:
12 12
13 13 * Brian Granger
14 14 * Fernando Perez
15 15
16 16 Notes
17 17 -----
18 18 """
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Copyright (C) 2008-2009 The IPython Development Team
22 22 #
23 23 # Distributed under the terms of the BSD License. The full license is in
24 24 # the file COPYING, distributed as part of this software.
25 25 #-----------------------------------------------------------------------------
26 26
27 27 #-----------------------------------------------------------------------------
28 28 # Imports
29 29 #-----------------------------------------------------------------------------
30 30
31 31 import logging
32 32 import os
33 33 import sys
34 34
35 35 from IPython.core import release, crashhandler
36 from IPython.utils.genutils import get_ipython_dir, get_ipython_package_dir
36 from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
37 37 from IPython.config.loader import (
38 38 PyFileConfigLoader,
39 39 ArgParseConfigLoader,
40 40 Config,
41 41 )
42 42
43 43 #-----------------------------------------------------------------------------
44 44 # Classes and functions
45 45 #-----------------------------------------------------------------------------
46 46
47 47 class ApplicationError(Exception):
48 48 pass
49 49
50 50
51 app_cl_args = (
52 (('--ipython-dir', ), dict(
53 dest='Global.ipython_dir',type=unicode,
54 help=
55 """Set to override default location of the IPython directory
56 IPYTHON_DIR, stored as Global.ipython_dir. This can also be specified
57 through the environment variable IPYTHON_DIR.""",
58 metavar='Global.ipython_dir') ),
59 (('-p', '--profile',), dict(
60 dest='Global.profile',type=unicode,
61 help=
62 """The string name of the ipython profile to be used. Assume that your
63 config file is ipython_config-<name>.py (looks in current dir first,
64 then in IPYTHON_DIR). This is a quick way to keep and load multiple
65 config files for different tasks, especially if include your basic one
66 in your more specialized ones. You can keep a basic
67 IPYTHON_DIR/ipython_config.py file and then have other 'profiles' which
68 include this one and load extra things for particular tasks.""",
69 metavar='Global.profile') ),
70 (('--log-level',), dict(
71 dest="Global.log_level",type=int,
72 help='Set the log level (0,10,20,30,40,50). Default is 30.',
73 metavar='Global.log_level')),
74 (('--config-file',), dict(
75 dest='Global.config_file',type=unicode,
76 help=
77 """Set the config file name to override default. Normally IPython
78 loads ipython_config.py (from current directory) or
79 IPYTHON_DIR/ipython_config.py. If the loading of your config file
80 fails, IPython starts with a bare bones configuration (no modules
81 loaded at all).""",
82 metavar='Global.config_file')),
83 )
51 class BaseAppConfigLoader(ArgParseConfigLoader):
52 """Default command line options for IPython based applications."""
53
54 def _add_ipython_dir(self, parser):
55 """Add the --ipython-dir option to the parser."""
56 paa = parser.add_argument
57 paa('--ipython-dir',
58 dest='Global.ipython_dir',type=unicode,
59 help=
60 """Set to override default location of the IPython directory
61 IPYTHON_DIR, stored as Global.ipython_dir. This can also be
62 specified through the environment variable IPYTHON_DIR.""",
63 metavar='Global.ipython_dir')
64
65 def _add_log_level(self, parser):
66 """Add the --log-level option to the parser."""
67 paa = parser.add_argument
68 paa('--log-level',
69 dest="Global.log_level",type=int,
70 help='Set the log level (0,10,20,30,40,50). Default is 30.',
71 metavar='Global.log_level')
72
73 def _add_arguments(self):
74 self._add_ipython_dir(self.parser)
75 self._add_log_level(self.parser)
76
84 77
85 78 class Application(object):
86 79 """Load a config, construct components and set them running.
87 80
88 The configuration of an application can be done via four different Config
89 objects, which are loaded and ultimately merged into a single one used from
90 that point on by the app. These are:
81 The configuration of an application can be done via three different Config
82 objects, which are loaded and ultimately merged into a single one used
83 from that point on by the app. These are:
91 84
92 85 1. default_config: internal defaults, implemented in code.
93 86 2. file_config: read from the filesystem.
94 87 3. command_line_config: read from the system's command line flags.
95 4. constructor_config: passed parametrically to the constructor.
96 88
97 89 During initialization, 3 is actually read before 2, since at the
98 90 command-line one may override the location of the file to be read. But the
99 91 above is the order in which the merge is made.
100
101 There is a final config object can be created and passed to the
102 constructor: override_config. If it exists, this completely overrides the
103 configs 2-4 above (the default is still used to ensure that all needed
104 fields at least are created). This makes it easier to create
105 parametrically (e.g. in testing or sphinx plugins) objects with a known
106 configuration, that are unaffected by whatever arguments may be present in
107 sys.argv or files in the user's various directories.
108 92 """
109 93
110 94 name = u'ipython'
111 95 description = 'IPython: an enhanced interactive Python shell.'
112 #: usage message printed by argparse. If None, auto-generate
96 #: Usage message printed by argparse. If None, auto-generate
113 97 usage = None
114 config_file_name = u'ipython_config.py'
115 #: Track the default and actual separately because some messages are
116 #: only printed if we aren't using the default.
117 default_config_file_name = config_file_name
98 #: The command line config loader. Subclass of ArgParseConfigLoader.
99 command_line_loader = BaseAppConfigLoader
100 #: The name of the config file to load, determined at runtime
101 config_file_name = None
102 #: The name of the default config file. Track separately from the actual
103 #: name because some logic happens only if we aren't using the default.
104 default_config_file_name = u'ipython_config.py'
118 105 default_log_level = logging.WARN
119 106 #: Set by --profile option
120 107 profile_name = None
121 108 #: User's ipython directory, typically ~/.ipython/
122 109 ipython_dir = None
123 #: internal defaults, implemented in code.
110 #: Internal defaults, implemented in code.
124 111 default_config = None
125 #: read from the filesystem
112 #: Read from the filesystem.
126 113 file_config = None
127 #: read from the system's command line flags
114 #: Read from the system's command line flags.
128 115 command_line_config = None
129 #: passed parametrically to the constructor.
130 constructor_config = None
131 #: final override, if given supercedes file/command/constructor configs
132 override_config = None
116 #: The final config that will be passed to the component.
117 master_config = None
133 118 #: A reference to the argv to be used (typically ends up being sys.argv[1:])
134 119 argv = None
135 #: Default command line arguments. Subclasses should create a new tuple
136 #: that *includes* these.
137 cl_arguments = app_cl_args
138
139 120 #: extra arguments computed by the command-line loader
140 121 extra_args = None
122 #: The class to use as the crash handler.
123 crash_handler_class = crashhandler.CrashHandler
141 124
142 125 # Private attributes
143 126 _exiting = False
144 127 _initialized = False
145 128
146 # Class choices for things that will be instantiated at runtime.
147 _CrashHandler = crashhandler.CrashHandler
148
149 def __init__(self, argv=None, constructor_config=None, override_config=None):
129 def __init__(self, argv=None):
150 130 self.argv = sys.argv[1:] if argv is None else argv
151 self.constructor_config = constructor_config
152 self.override_config = override_config
153 131 self.init_logger()
154 132
155 133 def init_logger(self):
156 134 self.log = logging.getLogger(self.__class__.__name__)
157 135 # This is used as the default until the command line arguments are read.
158 136 self.log.setLevel(self.default_log_level)
159 137 self._log_handler = logging.StreamHandler()
160 138 self._log_formatter = logging.Formatter("[%(name)s] %(message)s")
161 139 self._log_handler.setFormatter(self._log_formatter)
162 140 self.log.addHandler(self._log_handler)
163 141
164 142 def _set_log_level(self, level):
165 143 self.log.setLevel(level)
166 144
167 145 def _get_log_level(self):
168 146 return self.log.level
169 147
170 148 log_level = property(_get_log_level, _set_log_level)
171 149
172 150 def initialize(self):
173 151 """Initialize the application.
174 152
175 153 Loads all configuration information and sets all application state, but
176 154 does not start any relevant processing (typically some kind of event
177 155 loop).
178 156
179 157 Once this method has been called, the application is flagged as
180 158 initialized and the method becomes a no-op."""
181 159
182 160 if self._initialized:
183 161 return
184 162
185 163 # The first part is protected with an 'attempt' wrapper, that will log
186 164 # failures with the basic system traceback machinery. Once our crash
187 165 # handler is in place, we can let any subsequent exception propagate,
188 166 # as our handler will log it with much better detail than the default.
189 167 self.attempt(self.create_crash_handler)
190 168
191 169 # Configuration phase
192 170 # Default config (internally hardwired in application code)
193 171 self.create_default_config()
194 172 self.log_default_config()
195 173 self.set_default_config_log_level()
196 174
197 if self.override_config is None:
198 # Command-line config
199 self.pre_load_command_line_config()
200 self.load_command_line_config()
201 self.set_command_line_config_log_level()
202 self.post_load_command_line_config()
203 self.log_command_line_config()
175 # Command-line config
176 self.pre_load_command_line_config()
177 self.load_command_line_config()
178 self.set_command_line_config_log_level()
179 self.post_load_command_line_config()
180 self.log_command_line_config()
204 181
205 182 # Find resources needed for filesystem access, using information from
206 183 # the above two
207 184 self.find_ipython_dir()
208 185 self.find_resources()
209 186 self.find_config_file_name()
210 187 self.find_config_file_paths()
211 188
212 if self.override_config is None:
213 # File-based config
214 self.pre_load_file_config()
215 self.load_file_config()
216 self.set_file_config_log_level()
217 self.post_load_file_config()
218 self.log_file_config()
189 # File-based config
190 self.pre_load_file_config()
191 self.load_file_config()
192 self.set_file_config_log_level()
193 self.post_load_file_config()
194 self.log_file_config()
219 195
220 196 # Merge all config objects into a single one the app can then use
221 197 self.merge_configs()
222 198 self.log_master_config()
223 199
224 200 # Construction phase
225 201 self.pre_construct()
226 202 self.construct()
227 203 self.post_construct()
228 204
229 205 # Done, flag as such and
230 206 self._initialized = True
231 207
232 208 def start(self):
233 209 """Start the application."""
234 210 self.initialize()
235 211 self.start_app()
236 212
237 213 #-------------------------------------------------------------------------
238 214 # Various stages of Application creation
239 215 #-------------------------------------------------------------------------
240 216
241 217 def create_crash_handler(self):
242 218 """Create a crash handler, typically setting sys.excepthook to it."""
243 self.crash_handler = self._CrashHandler(self, self.name)
219 self.crash_handler = self.crash_handler_class(self)
244 220 sys.excepthook = self.crash_handler
245 221
246 222 def create_default_config(self):
247 223 """Create defaults that can't be set elsewhere.
248 224
249 225 For the most part, we try to set default in the class attributes
250 226 of Components. But, defaults the top-level Application (which is
251 227 not a HasTraitlets or Component) are not set in this way. Instead
252 228 we set them here. The Global section is for variables like this that
253 229 don't belong to a particular component.
254 230 """
255 231 c = Config()
256 232 c.Global.ipython_dir = get_ipython_dir()
257 233 c.Global.log_level = self.log_level
258 234 self.default_config = c
259 235
260 236 def log_default_config(self):
261 237 self.log.debug('Default config loaded:')
262 238 self.log.debug(repr(self.default_config))
263 239
264 240 def set_default_config_log_level(self):
265 241 try:
266 242 self.log_level = self.default_config.Global.log_level
267 243 except AttributeError:
268 244 # Fallback to the default_log_level class attribute
269 245 pass
270 246
271 247 def create_command_line_config(self):
272 248 """Create and return a command line config loader."""
273 return ArgParseConfigLoader(self.argv, self.cl_arguments,
274 description=self.description,
275 version=release.version,
276 usage=self.usage,
277 )
249 return self.command_line_loader(
250 self.argv,
251 description=self.description,
252 version=release.version,
253 usage=self.usage
254 )
278 255
279 256 def pre_load_command_line_config(self):
280 257 """Do actions just before loading the command line config."""
281 258 pass
282 259
283 260 def load_command_line_config(self):
284 261 """Load the command line config."""
285 262 loader = self.create_command_line_config()
286 263 self.command_line_config = loader.load_config()
287 264 self.extra_args = loader.get_extra_args()
288 265
289 266 def set_command_line_config_log_level(self):
290 267 try:
291 268 self.log_level = self.command_line_config.Global.log_level
292 269 except AttributeError:
293 270 pass
294 271
295 272 def post_load_command_line_config(self):
296 273 """Do actions just after loading the command line config."""
297 274 pass
298 275
299 276 def log_command_line_config(self):
300 277 self.log.debug("Command line config loaded:")
301 278 self.log.debug(repr(self.command_line_config))
302 279
303 280 def find_ipython_dir(self):
304 281 """Set the IPython directory.
305 282
306 283 This sets ``self.ipython_dir``, but the actual value that is passed to
307 284 the application is kept in either ``self.default_config`` or
308 285 ``self.command_line_config``. This also adds ``self.ipython_dir`` to
309 286 ``sys.path`` so config files there can be referenced by other config
310 287 files.
311 288 """
312 289
313 290 try:
314 291 self.ipython_dir = self.command_line_config.Global.ipython_dir
315 292 except AttributeError:
316 293 self.ipython_dir = self.default_config.Global.ipython_dir
317 294 sys.path.append(os.path.abspath(self.ipython_dir))
318 295 if not os.path.isdir(self.ipython_dir):
319 296 os.makedirs(self.ipython_dir, mode=0777)
320 297 self.log.debug("IPYTHON_DIR set to: %s" % self.ipython_dir)
321 298
322 299 def find_resources(self):
323 300 """Find other resources that need to be in place.
324 301
325 302 Things like cluster directories need to be in place to find the
326 303 config file. These happen right after the IPython directory has
327 304 been set.
328 305 """
329 306 pass
330 307
331 308 def find_config_file_name(self):
332 309 """Find the config file name for this application.
333 310
334 311 This must set ``self.config_file_name`` to the filename of the
335 312 config file to use (just the filename). The search paths for the
336 313 config file are set in :meth:`find_config_file_paths` and then passed
337 314 to the config file loader where they are resolved to an absolute path.
338 315
339 316 If a profile has been set at the command line, this will resolve it.
340 317 """
341
342 318 try:
343 319 self.config_file_name = self.command_line_config.Global.config_file
344 320 except AttributeError:
345 321 pass
322 else:
323 return
346 324
347 325 try:
348 326 self.profile_name = self.command_line_config.Global.profile
349 327 except AttributeError:
350 pass
328 # Just use the default as there is no profile
329 self.config_file_name = self.default_config_file_name
351 330 else:
352 name_parts = self.config_file_name.split('.')
331 # Use the default config file name and profile name if set
332 # to determine the used config file name.
333 name_parts = self.default_config_file_name.split('.')
353 334 name_parts.insert(1, u'_' + self.profile_name + u'.')
354 335 self.config_file_name = ''.join(name_parts)
355 336
356 337 def find_config_file_paths(self):
357 338 """Set the search paths for resolving the config file.
358 339
359 340 This must set ``self.config_file_paths`` to a sequence of search
360 341 paths to pass to the config file loader.
361 342 """
362 343 # Include our own profiles directory last, so that users can still find
363 344 # our shipped copies of builtin profiles even if they don't have them
364 345 # in their local ipython directory.
365 346 prof_dir = os.path.join(get_ipython_package_dir(), 'config', 'profile')
366 347 self.config_file_paths = (os.getcwd(), self.ipython_dir, prof_dir)
367 348
368 349 def pre_load_file_config(self):
369 350 """Do actions before the config file is loaded."""
370 351 pass
371 352
372 353 def load_file_config(self):
373 354 """Load the config file.
374 355
375 356 This tries to load the config file from disk. If successful, the
376 357 ``CONFIG_FILE`` config variable is set to the resolved config file
377 358 location. If not successful, an empty config is used.
378 359 """
379 360 self.log.debug("Attempting to load config file: %s" %
380 361 self.config_file_name)
381 362 loader = PyFileConfigLoader(self.config_file_name,
382 363 path=self.config_file_paths)
383 364 try:
384 365 self.file_config = loader.load_config()
385 366 self.file_config.Global.config_file = loader.full_filename
386 367 except IOError:
387 368 # Only warn if the default config file was NOT being used.
388 369 if not self.config_file_name==self.default_config_file_name:
389 370 self.log.warn("Config file not found, skipping: %s" %
390 371 self.config_file_name, exc_info=True)
391 372 self.file_config = Config()
392 373 except:
393 374 self.log.warn("Error loading config file: %s" %
394 375 self.config_file_name, exc_info=True)
395 376 self.file_config = Config()
396 377
397 378 def set_file_config_log_level(self):
398 379 # We need to keeep self.log_level updated. But we only use the value
399 380 # of the file_config if a value was not specified at the command
400 381 # line, because the command line overrides everything.
401 382 if not hasattr(self.command_line_config.Global, 'log_level'):
402 383 try:
403 384 self.log_level = self.file_config.Global.log_level
404 385 except AttributeError:
405 386 pass # Use existing value
406 387
407 388 def post_load_file_config(self):
408 389 """Do actions after the config file is loaded."""
409 390 pass
410 391
411 392 def log_file_config(self):
412 393 if hasattr(self.file_config.Global, 'config_file'):
413 394 self.log.debug("Config file loaded: %s" %
414 395 self.file_config.Global.config_file)
415 396 self.log.debug(repr(self.file_config))
416 397
417 398 def merge_configs(self):
418 399 """Merge the default, command line and file config objects."""
419 400 config = Config()
420 401 config._merge(self.default_config)
421 if self.override_config is None:
422 config._merge(self.file_config)
423 config._merge(self.command_line_config)
424 if self.constructor_config is not None:
425 config._merge(self.constructor_config)
426 else:
427 config._merge(self.override_config)
402 config._merge(self.file_config)
403 config._merge(self.command_line_config)
404
428 405 # XXX fperez - propose to Brian we rename master_config to simply
429 406 # config, I think this is going to be heavily used in examples and
430 407 # application code and the name is shorter/easier to find/remember.
431 408 # For now, just alias it...
432 409 self.master_config = config
433 410 self.config = config
434 411
435 412 def log_master_config(self):
436 413 self.log.debug("Master config created:")
437 414 self.log.debug(repr(self.master_config))
438 415
439 416 def pre_construct(self):
440 417 """Do actions after the config has been built, but before construct."""
441 418 pass
442 419
443 420 def construct(self):
444 421 """Construct the main components that make up this app."""
445 422 self.log.debug("Constructing components for application")
446 423
447 424 def post_construct(self):
448 425 """Do actions after construct, but before starting the app."""
449 426 pass
450 427
451 428 def start_app(self):
452 429 """Actually start the app."""
453 430 self.log.debug("Starting application")
454 431
455 432 #-------------------------------------------------------------------------
456 433 # Utility methods
457 434 #-------------------------------------------------------------------------
458 435
459 def abort(self):
460 """Abort the starting of the application."""
461 if self._exiting:
462 pass
463 else:
464 self.log.critical("Aborting application: %s" % self.name, exc_info=True)
465 self._exiting = True
466 sys.exit(1)
467
468 436 def exit(self, exit_status=0):
469 437 if self._exiting:
470 438 pass
471 439 else:
472 440 self.log.debug("Exiting application: %s" % self.name)
473 441 self._exiting = True
474 442 sys.exit(exit_status)
475 443
476 def attempt(self, func, action='abort'):
444 def attempt(self, func):
477 445 try:
478 446 func()
479 447 except SystemExit:
480 448 raise
481 449 except:
482 if action == 'abort':
483 self.log.critical("Aborting application: %s" % self.name,
484 exc_info=True)
485 self.abort()
486 raise
487 elif action == 'exit':
488 self.exit(0)
450 self.log.critical("Aborting application: %s" % self.name,
451 exc_info=True)
452 self.exit(0)
489 453
@@ -1,658 +1,658 b''
1 1 """Word completion for IPython.
2 2
3 3 This module is a fork of the rlcompleter module in the Python standard
4 4 library. The original enhancements made to rlcompleter have been sent
5 5 upstream and were accepted as of Python 2.3, but we need a lot more
6 6 functionality specific to IPython, so this module will continue to live as an
7 7 IPython-specific utility.
8 8
9 9 Original rlcompleter documentation:
10 10
11 11 This requires the latest extension to the readline module (the
12 12 completes keywords, built-ins and globals in __main__; when completing
13 13 NAME.NAME..., it evaluates (!) the expression up to the last dot and
14 14 completes its attributes.
15 15
16 16 It's very cool to do "import string" type "string.", hit the
17 17 completion key (twice), and see the list of names defined by the
18 18 string module!
19 19
20 20 Tip: to use the tab key as the completion key, call
21 21
22 22 readline.parse_and_bind("tab: complete")
23 23
24 24 Notes:
25 25
26 26 - Exceptions raised by the completer function are *ignored* (and
27 27 generally cause the completion to fail). This is a feature -- since
28 28 readline sets the tty device in raw (or cbreak) mode, printing a
29 29 traceback wouldn't work well without some complicated hoopla to save,
30 30 reset and restore the tty state.
31 31
32 32 - The evaluation of the NAME.NAME... form may cause arbitrary
33 33 application defined code to be executed if an object with a
34 34 __getattr__ hook is found. Since it is the responsibility of the
35 35 application (or the user) to enable this feature, I consider this an
36 36 acceptable risk. More complicated expressions (e.g. function calls or
37 37 indexing operations) are *not* evaluated.
38 38
39 39 - GNU readline is also used by the built-in functions input() and
40 40 raw_input(), and thus these also benefit/suffer from the completer
41 41 features. Clearly an interactive application can benefit by
42 42 specifying its own completer function and using raw_input() for all
43 43 its input.
44 44
45 45 - When the original stdin is not a tty device, GNU readline is never
46 46 used, and this module (and the readline module) are silently inactive.
47 47 """
48 48
49 49 #*****************************************************************************
50 50 #
51 51 # Since this file is essentially a minimally modified copy of the rlcompleter
52 52 # module which is part of the standard Python distribution, I assume that the
53 53 # proper procedure is to maintain its copyright as belonging to the Python
54 54 # Software Foundation (in addition to my own, for all new code).
55 55 #
56 56 # Copyright (C) 2008-2010 IPython Development Team
57 57 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
58 58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 59 #
60 60 # Distributed under the terms of the BSD License. The full license is in
61 61 # the file COPYING, distributed as part of this software.
62 62 #
63 63 #*****************************************************************************
64 64
65 65 #-----------------------------------------------------------------------------
66 66 # Imports
67 67 #-----------------------------------------------------------------------------
68 68
69 69 import __builtin__
70 70 import __main__
71 71 import glob
72 import inspect
72 73 import itertools
73 74 import keyword
74 75 import os
75 76 import re
76 77 import shlex
77 78 import sys
78 import types
79 79
80 import IPython.utils.rlineimpl as readline
81 80 from IPython.core.error import TryNext
82 81 from IPython.core.prefilter import ESC_MAGIC
83 82 from IPython.utils import generics
84 from IPython.utils.genutils import debugx, dir2
83 from IPython.utils.frame import debugx
84 from IPython.utils.dir2 import dir2
85 import IPython.utils.rlineimpl as readline
85 86
86 87 #-----------------------------------------------------------------------------
87 88 # Globals
88 89 #-----------------------------------------------------------------------------
89 90
90 91 # Public API
91 92 __all__ = ['Completer','IPCompleter']
92 93
93 94 if sys.platform == 'win32':
94 95 PROTECTABLES = ' '
95 96 else:
96 97 PROTECTABLES = ' ()'
97 98
98 99 #-----------------------------------------------------------------------------
99 100 # Main functions and classes
100 101 #-----------------------------------------------------------------------------
101 102
102 103 def protect_filename(s):
103 104 """Escape a string to protect certain characters."""
104 105
105 106 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
106 107 for ch in s])
107 108
108 109
109 110 def single_dir_expand(matches):
110 111 "Recursively expand match lists containing a single dir."
111 112
112 113 if len(matches) == 1 and os.path.isdir(matches[0]):
113 114 # Takes care of links to directories also. Use '/'
114 115 # explicitly, even under Windows, so that name completions
115 116 # don't end up escaped.
116 117 d = matches[0]
117 118 if d[-1] in ['/','\\']:
118 119 d = d[:-1]
119 120
120 121 subdirs = os.listdir(d)
121 122 if subdirs:
122 123 matches = [ (d + '/' + p) for p in subdirs]
123 124 return single_dir_expand(matches)
124 125 else:
125 126 return matches
126 127 else:
127 128 return matches
128 129
129 130 class Bunch: pass
130 131
131 132 class Completer:
132 133 def __init__(self,namespace=None,global_namespace=None):
133 134 """Create a new completer for the command line.
134 135
135 136 Completer([namespace,global_namespace]) -> completer instance.
136 137
137 138 If unspecified, the default namespace where completions are performed
138 139 is __main__ (technically, __main__.__dict__). Namespaces should be
139 140 given as dictionaries.
140 141
141 142 An optional second namespace can be given. This allows the completer
142 143 to handle cases where both the local and global scopes need to be
143 144 distinguished.
144 145
145 146 Completer instances should be used as the completion mechanism of
146 147 readline via the set_completer() call:
147 148
148 149 readline.set_completer(Completer(my_namespace).complete)
149 150 """
150 151
151 152 # Don't bind to namespace quite yet, but flag whether the user wants a
152 153 # specific namespace or to use __main__.__dict__. This will allow us
153 154 # to bind to __main__.__dict__ at completion time, not now.
154 155 if namespace is None:
155 156 self.use_main_ns = 1
156 157 else:
157 158 self.use_main_ns = 0
158 159 self.namespace = namespace
159 160
160 161 # The global namespace, if given, can be bound directly
161 162 if global_namespace is None:
162 163 self.global_namespace = {}
163 164 else:
164 165 self.global_namespace = global_namespace
165 166
166 167 def complete(self, text, state):
167 168 """Return the next possible completion for 'text'.
168 169
169 170 This is called successively with state == 0, 1, 2, ... until it
170 171 returns None. The completion should begin with 'text'.
171 172
172 173 """
173 174 if self.use_main_ns:
174 175 self.namespace = __main__.__dict__
175 176
176 177 if state == 0:
177 178 if "." in text:
178 179 self.matches = self.attr_matches(text)
179 180 else:
180 181 self.matches = self.global_matches(text)
181 182 try:
182 183 return self.matches[state]
183 184 except IndexError:
184 185 return None
185 186
186 187 def global_matches(self, text):
187 188 """Compute matches when text is a simple name.
188 189
189 190 Return a list of all keywords, built-in functions and names currently
190 191 defined in self.namespace or self.global_namespace that match.
191 192
192 193 """
193 194 #print 'Completer->global_matches, txt=%r' % text # dbg
194 195 matches = []
195 196 match_append = matches.append
196 197 n = len(text)
197 198 for lst in [keyword.kwlist,
198 199 __builtin__.__dict__.keys(),
199 200 self.namespace.keys(),
200 201 self.global_namespace.keys()]:
201 202 for word in lst:
202 203 if word[:n] == text and word != "__builtins__":
203 204 match_append(word)
204 205 return matches
205 206
206 207 def attr_matches(self, text):
207 208 """Compute matches when text contains a dot.
208 209
209 210 Assuming the text is of the form NAME.NAME....[NAME], and is
210 211 evaluatable in self.namespace or self.global_namespace, it will be
211 212 evaluated and its attributes (as revealed by dir()) are used as
212 213 possible completions. (For class instances, class members are are
213 214 also considered.)
214 215
215 216 WARNING: this can still invoke arbitrary C code, if an object
216 217 with a __getattr__ hook is evaluated.
217 218
218 219 """
219 import re
220 220
221 221 #print 'Completer->attr_matches, txt=%r' % text # dbg
222 222 # Another option, seems to work great. Catches things like ''.<tab>
223 223 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
224 224
225 225 if not m:
226 226 return []
227 227
228 228 expr, attr = m.group(1, 3)
229 229 try:
230 230 obj = eval(expr, self.namespace)
231 231 except:
232 232 try:
233 233 obj = eval(expr, self.global_namespace)
234 234 except:
235 235 return []
236 236
237 237 words = dir2(obj)
238 238
239 239 try:
240 240 words = generics.complete_object(obj, words)
241 241 except TryNext:
242 242 pass
243 243 # Build match list to return
244 244 n = len(attr)
245 245 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
246 246 return res
247 247
248 248
249 249 class IPCompleter(Completer):
250 250 """Extension of the completer class with IPython-specific features"""
251 251
252 252 def __init__(self,shell,namespace=None,global_namespace=None,
253 253 omit__names=0,alias_table=None):
254 254 """IPCompleter() -> completer
255 255
256 256 Return a completer object suitable for use by the readline library
257 257 via readline.set_completer().
258 258
259 259 Inputs:
260 260
261 261 - shell: a pointer to the ipython shell itself. This is needed
262 262 because this completer knows about magic functions, and those can
263 263 only be accessed via the ipython instance.
264 264
265 265 - namespace: an optional dict where completions are performed.
266 266
267 267 - global_namespace: secondary optional dict for completions, to
268 268 handle cases (such as IPython embedded inside functions) where
269 269 both Python scopes are visible.
270 270
271 271 - The optional omit__names parameter sets the completer to omit the
272 272 'magic' names (__magicname__) for python objects unless the text
273 273 to be completed explicitly starts with one or more underscores.
274 274
275 275 - If alias_table is supplied, it should be a dictionary of aliases
276 276 to complete. """
277 277
278 278 Completer.__init__(self,namespace,global_namespace)
279 279
280 280 self.magic_escape = ESC_MAGIC
281 281 self.readline = readline
282 282 delims = self.readline.get_completer_delims()
283 283 delims = delims.replace(self.magic_escape,'')
284 284 self.readline.set_completer_delims(delims)
285 285 self.get_line_buffer = self.readline.get_line_buffer
286 286 self.get_endidx = self.readline.get_endidx
287 287 self.omit__names = omit__names
288 288 self.merge_completions = shell.readline_merge_completions
289 289 self.shell = shell.shell
290 290 if alias_table is None:
291 291 alias_table = {}
292 292 self.alias_table = alias_table
293 293 # Regexp to split filenames with spaces in them
294 294 self.space_name_re = re.compile(r'([^\\] )')
295 295 # Hold a local ref. to glob.glob for speed
296 296 self.glob = glob.glob
297 297
298 298 # Determine if we are running on 'dumb' terminals, like (X)Emacs
299 299 # buffers, to avoid completion problems.
300 300 term = os.environ.get('TERM','xterm')
301 301 self.dumb_terminal = term in ['dumb','emacs']
302 302
303 303 # Special handling of backslashes needed in win32 platforms
304 304 if sys.platform == "win32":
305 305 self.clean_glob = self._clean_glob_win32
306 306 else:
307 307 self.clean_glob = self._clean_glob
308 308
309 309 # All active matcher routines for completion
310 310 self.matchers = [self.python_matches,
311 311 self.file_matches,
312 312 self.magic_matches,
313 313 self.alias_matches,
314 314 self.python_func_kw_matches]
315 315
316 316 # Code contributed by Alex Schmolck, for ipython/emacs integration
317 317 def all_completions(self, text):
318 318 """Return all possible completions for the benefit of emacs."""
319 319
320 320 completions = []
321 321 comp_append = completions.append
322 322 try:
323 323 for i in xrange(sys.maxint):
324 324 res = self.complete(text, i)
325 325 if not res:
326 326 break
327 327 comp_append(res)
328 328 #XXX workaround for ``notDefined.<tab>``
329 329 except NameError:
330 330 pass
331 331 return completions
332 332 # /end Alex Schmolck code.
333 333
334 334 def _clean_glob(self,text):
335 335 return self.glob("%s*" % text)
336 336
337 337 def _clean_glob_win32(self,text):
338 338 return [f.replace("\\","/")
339 339 for f in self.glob("%s*" % text)]
340 340
341 341 def file_matches(self, text):
342 342 """Match filenames, expanding ~USER type strings.
343 343
344 344 Most of the seemingly convoluted logic in this completer is an
345 345 attempt to handle filenames with spaces in them. And yet it's not
346 346 quite perfect, because Python's readline doesn't expose all of the
347 347 GNU readline details needed for this to be done correctly.
348 348
349 349 For a filename with a space in it, the printed completions will be
350 350 only the parts after what's already been typed (instead of the
351 351 full completions, as is normally done). I don't think with the
352 352 current (as of Python 2.3) Python readline it's possible to do
353 353 better."""
354 354
355 355 #print 'Completer->file_matches: <%s>' % text # dbg
356 356
357 357 # chars that require escaping with backslash - i.e. chars
358 358 # that readline treats incorrectly as delimiters, but we
359 359 # don't want to treat as delimiters in filename matching
360 360 # when escaped with backslash
361 361
362 362 if text.startswith('!'):
363 363 text = text[1:]
364 364 text_prefix = '!'
365 365 else:
366 366 text_prefix = ''
367 367
368 368 lbuf = self.lbuf
369 369 open_quotes = 0 # track strings with open quotes
370 370 try:
371 371 lsplit = shlex.split(lbuf)[-1]
372 372 except ValueError:
373 373 # typically an unmatched ", or backslash without escaped char.
374 374 if lbuf.count('"')==1:
375 375 open_quotes = 1
376 376 lsplit = lbuf.split('"')[-1]
377 377 elif lbuf.count("'")==1:
378 378 open_quotes = 1
379 379 lsplit = lbuf.split("'")[-1]
380 380 else:
381 381 return []
382 382 except IndexError:
383 383 # tab pressed on empty line
384 384 lsplit = ""
385 385
386 386 if lsplit != protect_filename(lsplit):
387 387 # if protectables are found, do matching on the whole escaped
388 388 # name
389 389 has_protectables = 1
390 390 text0,text = text,lsplit
391 391 else:
392 392 has_protectables = 0
393 393 text = os.path.expanduser(text)
394 394
395 395 if text == "":
396 396 return [text_prefix + protect_filename(f) for f in self.glob("*")]
397 397
398 398 m0 = self.clean_glob(text.replace('\\',''))
399 399 if has_protectables:
400 400 # If we had protectables, we need to revert our changes to the
401 401 # beginning of filename so that we don't double-write the part
402 402 # of the filename we have so far
403 403 len_lsplit = len(lsplit)
404 404 matches = [text_prefix + text0 +
405 405 protect_filename(f[len_lsplit:]) for f in m0]
406 406 else:
407 407 if open_quotes:
408 408 # if we have a string with an open quote, we don't need to
409 409 # protect the names at all (and we _shouldn't_, as it
410 410 # would cause bugs when the filesystem call is made).
411 411 matches = m0
412 412 else:
413 413 matches = [text_prefix +
414 414 protect_filename(f) for f in m0]
415 415
416 416 #print 'mm',matches # dbg
417 417 return single_dir_expand(matches)
418 418
419 419 def magic_matches(self, text):
420 420 """Match magics"""
421 421 #print 'Completer->magic_matches:',text,'lb',self.lbuf # dbg
422 422 # Get all shell magics now rather than statically, so magics loaded at
423 423 # runtime show up too
424 424 magics = self.shell.lsmagic()
425 425 pre = self.magic_escape
426 426 baretext = text.lstrip(pre)
427 427 return [ pre+m for m in magics if m.startswith(baretext)]
428 428
429 429 def alias_matches(self, text):
430 430 """Match internal system aliases"""
431 431 #print 'Completer->alias_matches:',text,'lb',self.lbuf # dbg
432 432
433 433 # if we are not in the first 'item', alias matching
434 434 # doesn't make sense - unless we are starting with 'sudo' command.
435 435 if ' ' in self.lbuf.lstrip() and \
436 436 not self.lbuf.lstrip().startswith('sudo'):
437 437 return []
438 438 text = os.path.expanduser(text)
439 439 aliases = self.alias_table.keys()
440 440 if text == "":
441 441 return aliases
442 442 else:
443 443 return [alias for alias in aliases if alias.startswith(text)]
444 444
445 445 def python_matches(self,text):
446 446 """Match attributes or global python names"""
447 447
448 448 #print 'Completer->python_matches, txt=%r' % text # dbg
449 449 if "." in text:
450 450 try:
451 451 matches = self.attr_matches(text)
452 452 if text.endswith('.') and self.omit__names:
453 453 if self.omit__names == 1:
454 454 # true if txt is _not_ a __ name, false otherwise:
455 455 no__name = (lambda txt:
456 456 re.match(r'.*\.__.*?__',txt) is None)
457 457 else:
458 458 # true if txt is _not_ a _ name, false otherwise:
459 459 no__name = (lambda txt:
460 460 re.match(r'.*\._.*?',txt) is None)
461 461 matches = filter(no__name, matches)
462 462 except NameError:
463 463 # catches <undefined attributes>.<tab>
464 464 matches = []
465 465 else:
466 466 matches = self.global_matches(text)
467 467
468 468 return matches
469 469
470 470 def _default_arguments(self, obj):
471 471 """Return the list of default arguments of obj if it is callable,
472 472 or empty list otherwise."""
473 473
474 474 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
475 475 # for classes, check for __init__,__new__
476 476 if inspect.isclass(obj):
477 477 obj = (getattr(obj,'__init__',None) or
478 478 getattr(obj,'__new__',None))
479 479 # for all others, check if they are __call__able
480 480 elif hasattr(obj, '__call__'):
481 481 obj = obj.__call__
482 482 # XXX: is there a way to handle the builtins ?
483 483 try:
484 484 args,_,_1,defaults = inspect.getargspec(obj)
485 485 if defaults:
486 486 return args[-len(defaults):]
487 487 except TypeError: pass
488 488 return []
489 489
490 490 def python_func_kw_matches(self,text):
491 491 """Match named parameters (kwargs) of the last open function"""
492 492
493 493 if "." in text: # a parameter cannot be dotted
494 494 return []
495 495 try: regexp = self.__funcParamsRegex
496 496 except AttributeError:
497 497 regexp = self.__funcParamsRegex = re.compile(r'''
498 498 '.*?' | # single quoted strings or
499 499 ".*?" | # double quoted strings or
500 500 \w+ | # identifier
501 501 \S # other characters
502 502 ''', re.VERBOSE | re.DOTALL)
503 503 # 1. find the nearest identifier that comes before an unclosed
504 504 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
505 505 tokens = regexp.findall(self.get_line_buffer())
506 506 tokens.reverse()
507 507 iterTokens = iter(tokens); openPar = 0
508 508 for token in iterTokens:
509 509 if token == ')':
510 510 openPar -= 1
511 511 elif token == '(':
512 512 openPar += 1
513 513 if openPar > 0:
514 514 # found the last unclosed parenthesis
515 515 break
516 516 else:
517 517 return []
518 518 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
519 519 ids = []
520 520 isId = re.compile(r'\w+$').match
521 521 while True:
522 522 try:
523 523 ids.append(iterTokens.next())
524 524 if not isId(ids[-1]):
525 525 ids.pop(); break
526 526 if not iterTokens.next() == '.':
527 527 break
528 528 except StopIteration:
529 529 break
530 530 # lookup the candidate callable matches either using global_matches
531 531 # or attr_matches for dotted names
532 532 if len(ids) == 1:
533 533 callableMatches = self.global_matches(ids[0])
534 534 else:
535 535 callableMatches = self.attr_matches('.'.join(ids[::-1]))
536 536 argMatches = []
537 537 for callableMatch in callableMatches:
538 538 try:
539 539 namedArgs = self._default_arguments(eval(callableMatch,
540 540 self.namespace))
541 541 except:
542 542 continue
543 543 for namedArg in namedArgs:
544 544 if namedArg.startswith(text):
545 545 argMatches.append("%s=" %namedArg)
546 546 return argMatches
547 547
548 548 def dispatch_custom_completer(self,text):
549 549 #print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
550 550 line = self.full_lbuf
551 551 if not line.strip():
552 552 return None
553 553
554 554 event = Bunch()
555 555 event.line = line
556 556 event.symbol = text
557 557 cmd = line.split(None,1)[0]
558 558 event.command = cmd
559 559 #print "\ncustom:{%s]\n" % event # dbg
560 560
561 561 # for foo etc, try also to find completer for %foo
562 562 if not cmd.startswith(self.magic_escape):
563 563 try_magic = self.custom_completers.s_matches(
564 564 self.magic_escape + cmd)
565 565 else:
566 566 try_magic = []
567 567
568 568 for c in itertools.chain(self.custom_completers.s_matches(cmd),
569 569 try_magic,
570 570 self.custom_completers.flat_matches(self.lbuf)):
571 571 #print "try",c # dbg
572 572 try:
573 573 res = c(event)
574 574 # first, try case sensitive match
575 575 withcase = [r for r in res if r.startswith(text)]
576 576 if withcase:
577 577 return withcase
578 578 # if none, then case insensitive ones are ok too
579 579 text_low = text.lower()
580 580 return [r for r in res if r.lower().startswith(text_low)]
581 581 except TryNext:
582 582 pass
583 583
584 584 return None
585 585
586 586 def complete(self, text, state,line_buffer=None):
587 587 """Return the next possible completion for 'text'.
588 588
589 589 This is called successively with state == 0, 1, 2, ... until it
590 590 returns None. The completion should begin with 'text'.
591 591
592 592 :Keywords:
593 593 - line_buffer: string
594 594 If not given, the completer attempts to obtain the current line buffer
595 595 via readline. This keyword allows clients which are requesting for
596 596 text completions in non-readline contexts to inform the completer of
597 597 the entire text.
598 598 """
599 599
600 600 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
601 601
602 602 # if there is only a tab on a line with only whitespace, instead
603 603 # of the mostly useless 'do you want to see all million
604 604 # completions' message, just do the right thing and give the user
605 605 # his tab! Incidentally, this enables pasting of tabbed text from
606 606 # an editor (as long as autoindent is off).
607 607
608 608 # It should be noted that at least pyreadline still shows
609 609 # file completions - is there a way around it?
610 610
611 611 # don't apply this on 'dumb' terminals, such as emacs buffers, so we
612 612 # don't interfere with their own tab-completion mechanism.
613 613 if line_buffer is None:
614 614 self.full_lbuf = self.get_line_buffer()
615 615 else:
616 616 self.full_lbuf = line_buffer
617 617
618 618 if not (self.dumb_terminal or self.full_lbuf.strip()):
619 619 self.readline.insert_text('\t')
620 620 return None
621 621
622 622 magic_escape = self.magic_escape
623 623
624 624 self.lbuf = self.full_lbuf[:self.get_endidx()]
625 625
626 626 try:
627 627 if text.startswith('~'):
628 628 text = os.path.expanduser(text)
629 629 if state == 0:
630 630 custom_res = self.dispatch_custom_completer(text)
631 631 if custom_res is not None:
632 632 # did custom completers produce something?
633 633 self.matches = custom_res
634 634 else:
635 635 # Extend the list of completions with the results of each
636 636 # matcher, so we return results to the user from all
637 637 # namespaces.
638 638 if self.merge_completions:
639 639 self.matches = []
640 640 for matcher in self.matchers:
641 641 self.matches.extend(matcher(text))
642 642 else:
643 643 for matcher in self.matchers:
644 644 self.matches = matcher(text)
645 645 if self.matches:
646 646 break
647 647 self.matches = list(set(self.matches))
648 648 try:
649 649 #print "MATCH: %r" % self.matches[state] # dbg
650 650 return self.matches[state]
651 651 except IndexError:
652 652 return None
653 653 except:
654 654 #from IPython.core.ultratb import AutoFormattedTB; # dbg
655 655 #tb=AutoFormattedTB('Verbose');tb() #dbg
656 656
657 657 # If completion fails, don't annoy the user.
658 658 return None
@@ -1,346 +1,346 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 A lightweight component system for IPython.
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 from copy import deepcopy
24 24 import datetime
25 25 from weakref import WeakValueDictionary
26 26
27 27 from IPython.utils.importstring import import_item
28 28 from IPython.config.loader import Config
29 29 from IPython.utils.traitlets import (
30 HasTraitlets, TraitletError, MetaHasTraitlets, Instance, This
30 HasTraitlets, MetaHasTraitlets, Instance, This
31 31 )
32 32
33 33
34 34 #-----------------------------------------------------------------------------
35 35 # Helper classes for Components
36 36 #-----------------------------------------------------------------------------
37 37
38 38
39 39 class ComponentError(Exception):
40 40 pass
41 41
42 42 class MetaComponentTracker(type):
43 43 """A metaclass that tracks instances of Components and its subclasses."""
44 44
45 45 def __init__(cls, name, bases, d):
46 46 super(MetaComponentTracker, cls).__init__(name, bases, d)
47 47 cls.__instance_refs = WeakValueDictionary()
48 48 cls.__numcreated = 0
49 49
50 50 def __call__(cls, *args, **kw):
51 51 """Called when a class is called (instantiated)!!!
52 52
53 53 When a Component or subclass is instantiated, this is called and
54 54 the instance is saved in a WeakValueDictionary for tracking.
55 55 """
56 56 instance = cls.__new__(cls, *args, **kw)
57 57
58 58 # Register the instance before __init__ is called so get_instances
59 59 # works inside __init__ methods!
60 60 indices = cls.register_instance(instance)
61 61
62 62 # This is in a try/except because of the __init__ method fails, the
63 63 # instance is discarded and shouldn't be tracked.
64 64 try:
65 65 if isinstance(instance, cls):
66 66 cls.__init__(instance, *args, **kw)
67 67 except:
68 68 # Unregister the instance because __init__ failed!
69 69 cls.unregister_instances(indices)
70 70 raise
71 71 else:
72 72 return instance
73 73
74 74 def register_instance(cls, instance):
75 75 """Register instance with cls and its subclasses."""
76 76 # indices is a list of the keys used to register the instance
77 77 # with. This list is needed if the instance needs to be unregistered.
78 78 indices = []
79 79 for c in cls.__mro__:
80 80 if issubclass(cls, c) and issubclass(c, Component):
81 81 c.__numcreated += 1
82 82 indices.append(c.__numcreated)
83 83 c.__instance_refs[c.__numcreated] = instance
84 84 else:
85 85 break
86 86 return indices
87 87
88 88 def unregister_instances(cls, indices):
89 89 """Unregister instance with cls and its subclasses."""
90 90 for c, index in zip(cls.__mro__, indices):
91 91 try:
92 92 del c.__instance_refs[index]
93 93 except KeyError:
94 94 pass
95 95
96 96 def clear_instances(cls):
97 97 """Clear all instances tracked by cls."""
98 98 cls.__instance_refs.clear()
99 99 cls.__numcreated = 0
100 100
101 101 def get_instances(cls, name=None, root=None, klass=None):
102 102 """Get all instances of cls and its subclasses.
103 103
104 104 Parameters
105 105 ----------
106 106 name : str
107 107 Limit to components with this name.
108 108 root : Component or subclass
109 109 Limit to components having this root.
110 110 klass : class or str
111 111 Limits to instances of the class or its subclasses. If a str
112 112 is given ut must be in the form 'foo.bar.MyClass'. The str
113 113 form of this argument is useful for forward declarations.
114 114 """
115 115 if klass is not None:
116 116 if isinstance(klass, basestring):
117 117 klass = import_item(klass)
118 118 # Limit search to instances of klass for performance
119 119 if issubclass(klass, Component):
120 120 return klass.get_instances(name=name, root=root)
121 121 instances = cls.__instance_refs.values()
122 122 if name is not None:
123 123 instances = [i for i in instances if i.name == name]
124 124 if klass is not None:
125 125 instances = [i for i in instances if isinstance(i, klass)]
126 126 if root is not None:
127 127 instances = [i for i in instances if i.root == root]
128 128 return instances
129 129
130 130 def get_instances_by_condition(cls, call, name=None, root=None,
131 131 klass=None):
132 132 """Get all instances of cls, i such that call(i)==True.
133 133
134 134 This also takes the ``name`` and ``root`` and ``classname``
135 135 arguments of :meth:`get_instance`
136 136 """
137 137 return [i for i in cls.get_instances(name, root, klass) if call(i)]
138 138
139 139
140 140 def masquerade_as(instance, cls):
141 141 """Let instance masquerade as an instance of cls.
142 142
143 143 Sometimes, such as in testing code, it is useful to let a class
144 144 masquerade as another. Python, being duck typed, allows this by
145 145 default. But, instances of components are tracked by their class type.
146 146
147 147 After calling this, ``cls.get_instances()`` will return ``instance``. This
148 148 does not, however, cause ``isinstance(instance, cls)`` to return ``True``.
149 149
150 150 Parameters
151 151 ----------
152 152 instance : an instance of a Component or Component subclass
153 153 The instance that will pretend to be a cls.
154 154 cls : subclass of Component
155 155 The Component subclass that instance will pretend to be.
156 156 """
157 157 cls.register_instance(instance)
158 158
159 159
160 160 class __ComponentNameGenerator(object):
161 161 """A Singleton to generate unique component names."""
162 162
163 163 def __init__(self, prefix):
164 164 self.prefix = prefix
165 165 self.i = 0
166 166
167 167 def __call__(self):
168 168 count = self.i
169 169 self.i += 1
170 170 return "%s%s" % (self.prefix, count)
171 171
172 172
173 173 ComponentNameGenerator = __ComponentNameGenerator('ipython.component')
174 174
175 175
176 176 class MetaComponent(MetaHasTraitlets, MetaComponentTracker):
177 177 pass
178 178
179 179
180 180 #-----------------------------------------------------------------------------
181 181 # Component implementation
182 182 #-----------------------------------------------------------------------------
183 183
184 184
185 185 class Component(HasTraitlets):
186 186
187 187 __metaclass__ = MetaComponent
188 188
189 189 # Traitlets are fun!
190 190 config = Instance(Config,(),{})
191 191 parent = This()
192 192 root = This()
193 193 created = None
194 194
195 195 def __init__(self, parent, name=None, config=None):
196 196 """Create a component given a parent and possibly and name and config.
197 197
198 198 Parameters
199 199 ----------
200 200 parent : Component subclass
201 201 The parent in the component graph. The parent is used
202 202 to get the root of the component graph.
203 203 name : str
204 204 The unique name of the component. If empty, then a unique
205 205 one will be autogenerated.
206 206 config : Config
207 207 If this is empty, self.config = parent.config, otherwise
208 208 self.config = config and root.config is ignored. This argument
209 209 should only be used to *override* the automatic inheritance of
210 210 parent.config. If a caller wants to modify parent.config
211 211 (not override), the caller should make a copy and change
212 212 attributes and then pass the copy to this argument.
213 213
214 214 Notes
215 215 -----
216 216 Subclasses of Component must call the :meth:`__init__` method of
217 217 :class:`Component` *before* doing anything else and using
218 218 :func:`super`::
219 219
220 220 class MyComponent(Component):
221 221 def __init__(self, parent, name=None, config=None):
222 222 super(MyComponent, self).__init__(parent, name, config)
223 223 # Then any other code you need to finish initialization.
224 224
225 225 This ensures that the :attr:`parent`, :attr:`name` and :attr:`config`
226 226 attributes are handled properly.
227 227 """
228 228 super(Component, self).__init__()
229 229 self._children = []
230 230 if name is None:
231 231 self.name = ComponentNameGenerator()
232 232 else:
233 233 self.name = name
234 234 self.root = self # This is the default, it is set when parent is set
235 235 self.parent = parent
236 236 if config is not None:
237 237 self.config = config
238 238 # We used to deepcopy, but for now we are trying to just save
239 239 # by reference. This *could* have side effects as all components
240 240 # will share config. In fact, I did find such a side effect in
241 241 # _config_changed below. If a config attribute value was a mutable type
242 242 # all instances of a component were getting the same copy, effectively
243 243 # making that a class attribute.
244 244 # self.config = deepcopy(config)
245 245 else:
246 246 if self.parent is not None:
247 247 self.config = self.parent.config
248 248 # We used to deepcopy, but for now we are trying to just save
249 249 # by reference. This *could* have side effects as all components
250 250 # will share config. In fact, I did find such a side effect in
251 251 # _config_changed below. If a config attribute value was a mutable type
252 252 # all instances of a component were getting the same copy, effectively
253 253 # making that a class attribute.
254 254 # self.config = deepcopy(self.parent.config)
255 255
256 256 self.created = datetime.datetime.now()
257 257
258 258 #-------------------------------------------------------------------------
259 259 # Static traitlet notifiations
260 260 #-------------------------------------------------------------------------
261 261
262 262 def _parent_changed(self, name, old, new):
263 263 if old is not None:
264 264 old._remove_child(self)
265 265 if new is not None:
266 266 new._add_child(self)
267 267
268 268 if new is None:
269 269 self.root = self
270 270 else:
271 271 self.root = new.root
272 272
273 273 def _root_changed(self, name, old, new):
274 274 if self.parent is None:
275 275 if not (new is self):
276 276 raise ComponentError("Root not self, but parent is None.")
277 277 else:
278 278 if not self.parent.root is new:
279 279 raise ComponentError("Error in setting the root attribute: "
280 280 "root != parent.root")
281 281
282 282 def _config_changed(self, name, old, new):
283 283 """Update all the class traits having ``config=True`` as metadata.
284 284
285 285 For any class traitlet with a ``config`` metadata attribute that is
286 286 ``True``, we update the traitlet with the value of the corresponding
287 287 config entry.
288 288 """
289 289 # Get all traitlets with a config metadata entry that is True
290 290 traitlets = self.traitlets(config=True)
291 291
292 292 # We auto-load config section for this class as well as any parent
293 293 # classes that are Component subclasses. This starts with Component
294 294 # and works down the mro loading the config for each section.
295 295 section_names = [cls.__name__ for cls in \
296 296 reversed(self.__class__.__mro__) if
297 297 issubclass(cls, Component) and issubclass(self.__class__, cls)]
298 298
299 299 for sname in section_names:
300 300 # Don't do a blind getattr as that would cause the config to
301 301 # dynamically create the section with name self.__class__.__name__.
302 302 if new._has_section(sname):
303 303 my_config = new[sname]
304 304 for k, v in traitlets.items():
305 305 # Don't allow traitlets with config=True to start with
306 306 # uppercase. Otherwise, they are confused with Config
307 307 # subsections. But, developers shouldn't have uppercase
308 308 # attributes anyways! (PEP 6)
309 309 if k[0].upper()==k[0] and not k.startswith('_'):
310 310 raise ComponentError('Component traitlets with '
311 311 'config=True must start with a lowercase so they are '
312 312 'not confused with Config subsections: %s.%s' % \
313 313 (self.__class__.__name__, k))
314 314 try:
315 315 # Here we grab the value from the config
316 316 # If k has the naming convention of a config
317 317 # section, it will be auto created.
318 318 config_value = my_config[k]
319 319 except KeyError:
320 320 pass
321 321 else:
322 322 # print "Setting %s.%s from %s.%s=%r" % \
323 323 # (self.__class__.__name__,k,sname,k,config_value)
324 324 # We have to do a deepcopy here if we don't deepcopy the entire
325 325 # config object. If we don't, a mutable config_value will be
326 326 # shared by all instances, effectively making it a class attribute.
327 327 setattr(self, k, deepcopy(config_value))
328 328
329 329 @property
330 330 def children(self):
331 331 """A list of all my child components."""
332 332 return self._children
333 333
334 334 def _remove_child(self, child):
335 335 """A private method for removing children components."""
336 336 if child in self._children:
337 337 index = self._children.index(child)
338 338 del self._children[index]
339 339
340 340 def _add_child(self, child):
341 341 """A private method for adding children components."""
342 342 if child not in self._children:
343 343 self._children.append(child)
344 344
345 345 def __repr__(self):
346 346 return "<%s('%s')>" % (self.__class__.__name__, self.name)
@@ -1,223 +1,180 b''
1 # -*- coding: utf-8 -*-
1 # encoding: utf-8
2 2 """sys.excepthook for IPython itself, leaves a detailed report on disk.
3 3
4 Authors:
4 5
5 Authors
6 -------
7 - Fernando Perez <Fernando.Perez@berkeley.edu>
6 * Fernando Perez
7 * Brian E. Granger
8 8 """
9 9
10 #*****************************************************************************
11 # Copyright (C) 2008-2009 The IPython Development Team
12 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
10 #-----------------------------------------------------------------------------
11 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
12 # Copyright (C) 2008-2010 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 #*****************************************************************************
16 #-----------------------------------------------------------------------------
17 17
18 #****************************************************************************
19 # Required modules
18 #-----------------------------------------------------------------------------
19 # Imports
20 #-----------------------------------------------------------------------------
20 21
21 # From the standard library
22 22 import os
23 23 import sys
24 24 from pprint import pformat
25 25
26 # Our own
27 from IPython.core import release
28 26 from IPython.core import ultratb
29 from IPython.utils.genutils import sys_info
30
31 27 from IPython.external.Itpl import itpl
28 from IPython.utils.sysinfo import sys_info
32 29
33 #****************************************************************************
30 #-----------------------------------------------------------------------------
31 # Code
32 #-----------------------------------------------------------------------------
34 33
35 class CrashHandler(object):
36 """Customizable crash handlers for IPython-based systems.
34 # Template for the user message.
35 _default_message_template = """\
36 Oops, $self.app_name crashed. We do our best to make it stable, but...
37
38 A crash report was automatically generated with the following information:
39 - A verbatim copy of the crash traceback.
40 - A copy of your input history during this session.
41 - Data on your current $self.app_name configuration.
37 42
38 Instances of this class provide a __call__ method which can be used as a
39 sys.excepthook, i.e., the __call__ signature is:
43 It was left in the file named:
44 \t'$self.crash_report_fname'
45 If you can email this file to the developers, the information in it will help
46 them in understanding and correcting the problem.
40 47
41 def __call__(self,etype, evalue, etb)
48 You can mail it to: $self.contact_name at $self.contact_email
49 with the subject '$self.app_name Crash Report'.
42 50
43 """
51 If you want to do it now, the following command will work (under Unix):
52 mail -s '$self.app_name Crash Report' $self.contact_email < $self.crash_report_fname
53
54 To ensure accurate tracking of this issue, please file a report about it at:
55 $self.bug_tracker
56 """
44 57
45 def __init__(self,app, app_name, contact_name=None, contact_email=None,
46 bug_tracker=None, crash_report_fname='CrashReport.txt',
47 show_crash_traceback=True, call_pdb=False):
48 """New crash handler.
49 58
50 Inputs:
59 class CrashHandler(object):
60 """Customizable crash handlers for IPython applications.
51 61
52 - app: a running application instance, which will be queried at crash
53 time for internal information.
62 Instances of this class provide a :meth:`__call__` method which can be
63 used as a ``sys.excepthook``. The :meth:`__call__` signature is::
54 64
55 - app_name: a string containing the name of your application.
65 def __call__(self, etype, evalue, etb)
66 """
56 67
57 - contact_name: a string with the name of the person to contact.
68 message_template = _default_message_template
58 69
59 - contact_email: a string with the email address of the contact.
70 def __init__(self, app, contact_name=None, contact_email=None,
71 bug_tracker=None, show_crash_traceback=True, call_pdb=False):
72 """Create a new crash handler
60 73
61 - bug_tracker: a string with the URL for your project's bug tracker.
74 Parameters
75 ----------
76 app : Application
77 A running :class:`Application` instance, which will be queried at
78 crash time for internal information.
62 79
63 - crash_report_fname: a string with the filename for the crash report
64 to be saved in. These reports are left in the ipython user directory
65 as determined by the running IPython instance.
80 contact_name : str
81 A string with the name of the person to contact.
66 82
67 Optional inputs:
68
69 - show_crash_traceback(True): if false, don't print the crash
70 traceback on stderr, only generate the on-disk report
83 contact_email : str
84 A string with the email address of the contact.
71 85
86 bug_tracker : str
87 A string with the URL for your project's bug tracker.
88
89 show_crash_traceback : bool
90 If false, don't print the crash traceback on stderr, only generate
91 the on-disk report
72 92
73 93 Non-argument instance attributes:
74 94
75 These instances contain some non-argument attributes which allow for
76 further customization of the crash handler's behavior. Please see the
95 These instances contain some non-argument attributes which allow for
96 further customization of the crash handler's behavior. Please see the
77 97 source for further details.
78 98 """
79
80 # apply args into instance
81 99 self.app = app
82 self.app_name = app_name
100 self.app_name = self.app.name
83 101 self.contact_name = contact_name
84 102 self.contact_email = contact_email
85 103 self.bug_tracker = bug_tracker
86 self.crash_report_fname = crash_report_fname
104 self.crash_report_fname = "Crash_report_%s.txt" % self.app_name
87 105 self.show_crash_traceback = show_crash_traceback
88 106 self.section_sep = '\n\n'+'*'*75+'\n\n'
89 107 self.call_pdb = call_pdb
90 108 #self.call_pdb = True # dbg
91
92 # Hardcoded defaults, which can be overridden either by subclasses or
93 # at runtime for the instance.
94
95 # Template for the user message. Subclasses which completely override
96 # this, or user apps, can modify it to suit their tastes. It gets
97 # expanded using itpl, so calls of the kind $self.foo are valid.
98 self.user_message_template = """
99 Oops, $self.app_name crashed. We do our best to make it stable, but...
100 109
101 A crash report was automatically generated with the following information:
102 - A verbatim copy of the crash traceback.
103 - A copy of your input history during this session.
104 - Data on your current $self.app_name configuration.
105
106 It was left in the file named:
107 \t'$self.crash_report_fname'
108 If you can email this file to the developers, the information in it will help
109 them in understanding and correcting the problem.
110
111 You can mail it to: $self.contact_name at $self.contact_email
112 with the subject '$self.app_name Crash Report'.
113
114 If you want to do it now, the following command will work (under Unix):
115 mail -s '$self.app_name Crash Report' $self.contact_email < $self.crash_report_fname
116
117 To ensure accurate tracking of this issue, please file a report about it at:
118 $self.bug_tracker
119 """
120
121 def __call__(self,etype, evalue, etb):
110 def __call__(self, etype, evalue, etb):
122 111 """Handle an exception, call for compatible with sys.excepthook"""
123 112
124 113 # Report tracebacks shouldn't use color in general (safer for users)
125 114 color_scheme = 'NoColor'
126 115
127 116 # Use this ONLY for developer debugging (keep commented out for release)
128 117 #color_scheme = 'Linux' # dbg
129 118
130 119 try:
131 120 rptdir = self.app.ipython_dir
132 121 except:
133 122 rptdir = os.getcwd()
134 123 if not os.path.isdir(rptdir):
135 124 rptdir = os.getcwd()
136 125 report_name = os.path.join(rptdir,self.crash_report_fname)
137 126 # write the report filename into the instance dict so it can get
138 127 # properly expanded out in the user message template
139 128 self.crash_report_fname = report_name
140 TBhandler = ultratb.VerboseTB(color_scheme=color_scheme,
141 long_header=1,
142 call_pdb=self.call_pdb,
143 )
129 TBhandler = ultratb.VerboseTB(
130 color_scheme=color_scheme,
131 long_header=1,
132 call_pdb=self.call_pdb,
133 )
144 134 if self.call_pdb:
145 135 TBhandler(etype,evalue,etb)
146 136 return
147 137 else:
148 138 traceback = TBhandler.text(etype,evalue,etb,context=31)
149 139
150 140 # print traceback to screen
151 141 if self.show_crash_traceback:
152 142 print >> sys.stderr, traceback
153 143
154 144 # and generate a complete report on disk
155 145 try:
156 146 report = open(report_name,'w')
157 147 except:
158 148 print >> sys.stderr, 'Could not create crash report on disk.'
159 149 return
160 150
161 151 # Inform user on stderr of what happened
162 msg = itpl('\n'+'*'*70+'\n'+self.user_message_template)
152 msg = itpl('\n'+'*'*70+'\n'+self.message_template)
163 153 print >> sys.stderr, msg
164 154
165 155 # Construct report on disk
166 156 report.write(self.make_report(traceback))
167 157 report.close()
168 158 raw_input("Hit <Enter> to quit this message (your terminal may close):")
169 159
170 160 def make_report(self,traceback):
171 161 """Return a string containing a crash report."""
172 162
173 163 sec_sep = self.section_sep
174 164
175 165 report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n']
176 166 rpt_add = report.append
177 167 rpt_add(sys_info())
178 168
179 169 try:
180 170 config = pformat(self.app.config)
181 rpt_add(sec_sep+'Current user configuration structure:\n\n')
171 rpt_add(sec_sep)
172 rpt_add('Application name: %s\n\n' % self.app_name)
173 rpt_add('Current user configuration structure:\n\n')
182 174 rpt_add(config)
183 175 except:
184 176 pass
185 177 rpt_add(sec_sep+'Crash traceback:\n\n' + traceback)
186 178
187 179 return ''.join(report)
188 180
189
190 class IPythonCrashHandler(CrashHandler):
191 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
192
193 def __init__(self, app, app_name='IPython'):
194
195 # Set here which of the IPython authors should be listed as contact
196 AUTHOR_CONTACT = 'Fernando'
197
198 # Set argument defaults
199 bug_tracker = 'https://bugs.launchpad.net/ipython/+filebug'
200 contact_name,contact_email = release.authors[AUTHOR_CONTACT][:2]
201 crash_report_fname = 'IPython_crash_report.txt'
202 # Call parent constructor
203 CrashHandler.__init__(self,app,app_name,contact_name,contact_email,
204 bug_tracker,crash_report_fname)
205
206 def make_report(self,traceback):
207 """Return a string containing a crash report."""
208
209 sec_sep = self.section_sep
210 # Start with parent report
211 report = [super(IPythonCrashHandler, self).make_report(traceback)]
212 # Add interactive-specific info we may have
213 rpt_add = report.append
214 try:
215 rpt_add(sec_sep+"History of session input:")
216 for line in self.app.shell.user_ns['_ih']:
217 rpt_add(line)
218 rpt_add('\n*** Last line of input (may not be in above history):\n')
219 rpt_add(self.app.shell._last_input_line+'\n')
220 except:
221 pass
222
223 return ''.join(report)
@@ -1,512 +1,510 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Pdb debugger class.
4 4
5 5 Modified from the standard pdb.Pdb class to avoid including readline, so that
6 6 the command line completion of other programs which include this isn't
7 7 damaged.
8 8
9 9 In the future, this class will be expanded with improvements over the standard
10 10 pdb.
11 11
12 12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
13 13 changes. Licensing should therefore be under the standard Python terms. For
14 14 details on the PSF (Python Software Foundation) standard license, see:
15 15
16 16 http://www.python.org/2.2.3/license.html"""
17 17
18 18 #*****************************************************************************
19 19 #
20 20 # This file is licensed under the PSF license.
21 21 #
22 22 # Copyright (C) 2001 Python Software Foundation, www.python.org
23 23 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
24 24 #
25 25 #
26 26 #*****************************************************************************
27 27
28 28 import bdb
29 import cmd
30 29 import linecache
31 import os
32 30 import sys
33 31
34 32 from IPython.utils import PyColorize
35 33 from IPython.core import ipapi
36 34 from IPython.utils import coloransi
37 from IPython.utils.genutils import Term
35 from IPython.utils.io import Term
38 36 from IPython.core.excolors import exception_colors
39 37
40 38 # See if we can use pydb.
41 39 has_pydb = False
42 40 prompt = 'ipdb> '
43 41 #We have to check this directly from sys.argv, config struct not yet available
44 42 if '-pydb' in sys.argv:
45 43 try:
46 44 import pydb
47 45 if hasattr(pydb.pydb, "runl") and pydb.version>'1.17':
48 46 # Version 1.17 is broken, and that's what ships with Ubuntu Edgy, so we
49 47 # better protect against it.
50 48 has_pydb = True
51 49 except ImportError:
52 50 print "Pydb (http://bashdb.sourceforge.net/pydb/) does not seem to be available"
53 51
54 52 if has_pydb:
55 53 from pydb import Pdb as OldPdb
56 54 #print "Using pydb for %run -d and post-mortem" #dbg
57 55 prompt = 'ipydb> '
58 56 else:
59 57 from pdb import Pdb as OldPdb
60 58
61 59 # Allow the set_trace code to operate outside of an ipython instance, even if
62 60 # it does so with some limitations. The rest of this support is implemented in
63 61 # the Tracer constructor.
64 62 def BdbQuit_excepthook(et,ev,tb):
65 63 if et==bdb.BdbQuit:
66 64 print 'Exiting Debugger.'
67 65 else:
68 66 BdbQuit_excepthook.excepthook_ori(et,ev,tb)
69 67
70 68 def BdbQuit_IPython_excepthook(self,et,ev,tb):
71 69 print 'Exiting Debugger.'
72 70
73 71
74 72 class Tracer(object):
75 73 """Class for local debugging, similar to pdb.set_trace.
76 74
77 75 Instances of this class, when called, behave like pdb.set_trace, but
78 76 providing IPython's enhanced capabilities.
79 77
80 78 This is implemented as a class which must be initialized in your own code
81 79 and not as a standalone function because we need to detect at runtime
82 80 whether IPython is already active or not. That detection is done in the
83 81 constructor, ensuring that this code plays nicely with a running IPython,
84 82 while functioning acceptably (though with limitations) if outside of it.
85 83 """
86 84
87 85 def __init__(self,colors=None):
88 86 """Create a local debugger instance.
89 87
90 88 :Parameters:
91 89
92 90 - `colors` (None): a string containing the name of the color scheme to
93 91 use, it must be one of IPython's valid color schemes. If not given, the
94 92 function will default to the current IPython scheme when running inside
95 93 IPython, and to 'NoColor' otherwise.
96 94
97 95 Usage example:
98 96
99 97 from IPython.core.debugger import Tracer; debug_here = Tracer()
100 98
101 99 ... later in your code
102 100 debug_here() # -> will open up the debugger at that point.
103 101
104 102 Once the debugger activates, you can use all of its regular commands to
105 103 step through code, set breakpoints, etc. See the pdb documentation
106 104 from the Python standard library for usage details.
107 105 """
108 106
109 107 try:
110 108 ip = ipapi.get()
111 109 except:
112 110 # Outside of ipython, we set our own exception hook manually
113 111 BdbQuit_excepthook.excepthook_ori = sys.excepthook
114 112 sys.excepthook = BdbQuit_excepthook
115 113 def_colors = 'NoColor'
116 114 try:
117 115 # Limited tab completion support
118 116 import readline
119 117 readline.parse_and_bind('tab: complete')
120 118 except ImportError:
121 119 pass
122 120 else:
123 121 # In ipython, we use its custom exception handler mechanism
124 122 def_colors = ip.colors
125 123 ip.set_custom_exc((bdb.BdbQuit,), BdbQuit_IPython_excepthook)
126 124
127 125 if colors is None:
128 126 colors = def_colors
129 127 self.debugger = Pdb(colors)
130 128
131 129 def __call__(self):
132 130 """Starts an interactive debugger at the point where called.
133 131
134 132 This is similar to the pdb.set_trace() function from the std lib, but
135 133 using IPython's enhanced debugger."""
136 134
137 135 self.debugger.set_trace(sys._getframe().f_back)
138 136
139 137
140 138 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
141 139 """Make new_fn have old_fn's doc string. This is particularly useful
142 140 for the do_... commands that hook into the help system.
143 141 Adapted from from a comp.lang.python posting
144 142 by Duncan Booth."""
145 143 def wrapper(*args, **kw):
146 144 return new_fn(*args, **kw)
147 145 if old_fn.__doc__:
148 146 wrapper.__doc__ = old_fn.__doc__ + additional_text
149 147 return wrapper
150 148
151 149
152 150 def _file_lines(fname):
153 151 """Return the contents of a named file as a list of lines.
154 152
155 153 This function never raises an IOError exception: if the file can't be
156 154 read, it simply returns an empty list."""
157 155
158 156 try:
159 157 outfile = open(fname)
160 158 except IOError:
161 159 return []
162 160 else:
163 161 out = outfile.readlines()
164 162 outfile.close()
165 163 return out
166 164
167 165
168 166 class Pdb(OldPdb):
169 167 """Modified Pdb class, does not load readline."""
170 168
171 169 def __init__(self,color_scheme='NoColor',completekey=None,
172 170 stdin=None, stdout=None):
173 171
174 172 # Parent constructor:
175 173 if has_pydb and completekey is None:
176 174 OldPdb.__init__(self,stdin=stdin,stdout=Term.cout)
177 175 else:
178 176 OldPdb.__init__(self,completekey,stdin,stdout)
179 177
180 178 self.prompt = prompt # The default prompt is '(Pdb)'
181 179
182 180 # IPython changes...
183 181 self.is_pydb = has_pydb
184 182
185 183 self.shell = ipapi.get()
186 184
187 185 if self.is_pydb:
188 186
189 187 # iplib.py's ipalias seems to want pdb's checkline
190 188 # which located in pydb.fn
191 189 import pydb.fns
192 190 self.checkline = lambda filename, lineno: \
193 191 pydb.fns.checkline(self, filename, lineno)
194 192
195 193 self.curframe = None
196 194 self.do_restart = self.new_do_restart
197 195
198 196 self.old_all_completions = self.shell.Completer.all_completions
199 197 self.shell.Completer.all_completions=self.all_completions
200 198
201 199 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
202 200 OldPdb.do_list)
203 201 self.do_l = self.do_list
204 202 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
205 203 OldPdb.do_frame)
206 204
207 205 self.aliases = {}
208 206
209 207 # Create color table: we copy the default one from the traceback
210 208 # module and add a few attributes needed for debugging
211 209 self.color_scheme_table = exception_colors()
212 210
213 211 # shorthands
214 212 C = coloransi.TermColors
215 213 cst = self.color_scheme_table
216 214
217 215 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
218 216 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
219 217
220 218 cst['Linux'].colors.breakpoint_enabled = C.LightRed
221 219 cst['Linux'].colors.breakpoint_disabled = C.Red
222 220
223 221 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
224 222 cst['LightBG'].colors.breakpoint_disabled = C.Red
225 223
226 224 self.set_colors(color_scheme)
227 225
228 226 # Add a python parser so we can syntax highlight source while
229 227 # debugging.
230 228 self.parser = PyColorize.Parser()
231 229
232 230 def set_colors(self, scheme):
233 231 """Shorthand access to the color table scheme selector method."""
234 232 self.color_scheme_table.set_active_scheme(scheme)
235 233
236 234 def interaction(self, frame, traceback):
237 235 self.shell.set_completer_frame(frame)
238 236 OldPdb.interaction(self, frame, traceback)
239 237
240 238 def new_do_up(self, arg):
241 239 OldPdb.do_up(self, arg)
242 240 self.shell.set_completer_frame(self.curframe)
243 241 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
244 242
245 243 def new_do_down(self, arg):
246 244 OldPdb.do_down(self, arg)
247 245 self.shell.set_completer_frame(self.curframe)
248 246
249 247 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
250 248
251 249 def new_do_frame(self, arg):
252 250 OldPdb.do_frame(self, arg)
253 251 self.shell.set_completer_frame(self.curframe)
254 252
255 253 def new_do_quit(self, arg):
256 254
257 255 if hasattr(self, 'old_all_completions'):
258 256 self.shell.Completer.all_completions=self.old_all_completions
259 257
260 258
261 259 return OldPdb.do_quit(self, arg)
262 260
263 261 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
264 262
265 263 def new_do_restart(self, arg):
266 264 """Restart command. In the context of ipython this is exactly the same
267 265 thing as 'quit'."""
268 266 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
269 267 return self.do_quit(arg)
270 268
271 269 def postloop(self):
272 270 self.shell.set_completer_frame(None)
273 271
274 272 def print_stack_trace(self):
275 273 try:
276 274 for frame_lineno in self.stack:
277 275 self.print_stack_entry(frame_lineno, context = 5)
278 276 except KeyboardInterrupt:
279 277 pass
280 278
281 279 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
282 280 context = 3):
283 281 #frame, lineno = frame_lineno
284 282 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
285 283
286 284 # vds: >>
287 285 frame, lineno = frame_lineno
288 286 filename = frame.f_code.co_filename
289 287 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
290 288 # vds: <<
291 289
292 290 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
293 291 import linecache, repr
294 292
295 293 ret = []
296 294
297 295 Colors = self.color_scheme_table.active_colors
298 296 ColorsNormal = Colors.Normal
299 297 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
300 298 tpl_call = '%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
301 299 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
302 300 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
303 301 ColorsNormal)
304 302
305 303 frame, lineno = frame_lineno
306 304
307 305 return_value = ''
308 306 if '__return__' in frame.f_locals:
309 307 rv = frame.f_locals['__return__']
310 308 #return_value += '->'
311 309 return_value += repr.repr(rv) + '\n'
312 310 ret.append(return_value)
313 311
314 312 #s = filename + '(' + `lineno` + ')'
315 313 filename = self.canonic(frame.f_code.co_filename)
316 314 link = tpl_link % filename
317 315
318 316 if frame.f_code.co_name:
319 317 func = frame.f_code.co_name
320 318 else:
321 319 func = "<lambda>"
322 320
323 321 call = ''
324 322 if func != '?':
325 323 if '__args__' in frame.f_locals:
326 324 args = repr.repr(frame.f_locals['__args__'])
327 325 else:
328 326 args = '()'
329 327 call = tpl_call % (func, args)
330 328
331 329 # The level info should be generated in the same format pdb uses, to
332 330 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
333 331 if frame is self.curframe:
334 332 ret.append('> ')
335 333 else:
336 334 ret.append(' ')
337 335 ret.append('%s(%s)%s\n' % (link,lineno,call))
338 336
339 337 start = lineno - 1 - context//2
340 338 lines = linecache.getlines(filename)
341 339 start = max(start, 0)
342 340 start = min(start, len(lines) - context)
343 341 lines = lines[start : start + context]
344 342
345 343 for i,line in enumerate(lines):
346 344 show_arrow = (start + 1 + i == lineno)
347 345 linetpl = (frame is self.curframe or show_arrow) \
348 346 and tpl_line_em \
349 347 or tpl_line
350 348 ret.append(self.__format_line(linetpl, filename,
351 349 start + 1 + i, line,
352 350 arrow = show_arrow) )
353 351
354 352 return ''.join(ret)
355 353
356 354 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
357 355 bp_mark = ""
358 356 bp_mark_color = ""
359 357
360 358 scheme = self.color_scheme_table.active_scheme_name
361 359 new_line, err = self.parser.format2(line, 'str', scheme)
362 360 if not err: line = new_line
363 361
364 362 bp = None
365 363 if lineno in self.get_file_breaks(filename):
366 364 bps = self.get_breaks(filename, lineno)
367 365 bp = bps[-1]
368 366
369 367 if bp:
370 368 Colors = self.color_scheme_table.active_colors
371 369 bp_mark = str(bp.number)
372 370 bp_mark_color = Colors.breakpoint_enabled
373 371 if not bp.enabled:
374 372 bp_mark_color = Colors.breakpoint_disabled
375 373
376 374 numbers_width = 7
377 375 if arrow:
378 376 # This is the line with the error
379 377 pad = numbers_width - len(str(lineno)) - len(bp_mark)
380 378 if pad >= 3:
381 379 marker = '-'*(pad-3) + '-> '
382 380 elif pad == 2:
383 381 marker = '> '
384 382 elif pad == 1:
385 383 marker = '>'
386 384 else:
387 385 marker = ''
388 386 num = '%s%s' % (marker, str(lineno))
389 387 line = tpl_line % (bp_mark_color + bp_mark, num, line)
390 388 else:
391 389 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
392 390 line = tpl_line % (bp_mark_color + bp_mark, num, line)
393 391
394 392 return line
395 393
396 394 def list_command_pydb(self, arg):
397 395 """List command to use if we have a newer pydb installed"""
398 396 filename, first, last = OldPdb.parse_list_cmd(self, arg)
399 397 if filename is not None:
400 398 self.print_list_lines(filename, first, last)
401 399
402 400 def print_list_lines(self, filename, first, last):
403 401 """The printing (as opposed to the parsing part of a 'list'
404 402 command."""
405 403 try:
406 404 Colors = self.color_scheme_table.active_colors
407 405 ColorsNormal = Colors.Normal
408 406 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
409 407 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
410 408 src = []
411 409 for lineno in range(first, last+1):
412 410 line = linecache.getline(filename, lineno)
413 411 if not line:
414 412 break
415 413
416 414 if lineno == self.curframe.f_lineno:
417 415 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
418 416 else:
419 417 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
420 418
421 419 src.append(line)
422 420 self.lineno = lineno
423 421
424 422 print >>Term.cout, ''.join(src)
425 423
426 424 except KeyboardInterrupt:
427 425 pass
428 426
429 427 def do_list(self, arg):
430 428 self.lastcmd = 'list'
431 429 last = None
432 430 if arg:
433 431 try:
434 432 x = eval(arg, {}, {})
435 433 if type(x) == type(()):
436 434 first, last = x
437 435 first = int(first)
438 436 last = int(last)
439 437 if last < first:
440 438 # Assume it's a count
441 439 last = first + last
442 440 else:
443 441 first = max(1, int(x) - 5)
444 442 except:
445 443 print '*** Error in argument:', `arg`
446 444 return
447 445 elif self.lineno is None:
448 446 first = max(1, self.curframe.f_lineno - 5)
449 447 else:
450 448 first = self.lineno + 1
451 449 if last is None:
452 450 last = first + 10
453 451 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
454 452
455 453 # vds: >>
456 454 lineno = first
457 455 filename = self.curframe.f_code.co_filename
458 456 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
459 457 # vds: <<
460 458
461 459 do_l = do_list
462 460
463 461 def do_pdef(self, arg):
464 462 """The debugger interface to magic_pdef"""
465 463 namespaces = [('Locals', self.curframe.f_locals),
466 464 ('Globals', self.curframe.f_globals)]
467 465 self.shell.magic_pdef(arg, namespaces=namespaces)
468 466
469 467 def do_pdoc(self, arg):
470 468 """The debugger interface to magic_pdoc"""
471 469 namespaces = [('Locals', self.curframe.f_locals),
472 470 ('Globals', self.curframe.f_globals)]
473 471 self.shell.magic_pdoc(arg, namespaces=namespaces)
474 472
475 473 def do_pinfo(self, arg):
476 474 """The debugger equivalant of ?obj"""
477 475 namespaces = [('Locals', self.curframe.f_locals),
478 476 ('Globals', self.curframe.f_globals)]
479 477 self.shell.magic_pinfo("pinfo %s" % arg, namespaces=namespaces)
480 478
481 479 def checkline(self, filename, lineno):
482 480 """Check whether specified line seems to be executable.
483 481
484 482 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
485 483 line or EOF). Warning: testing is not comprehensive.
486 484 """
487 485 #######################################################################
488 486 # XXX Hack! Use python-2.5 compatible code for this call, because with
489 487 # all of our changes, we've drifted from the pdb api in 2.6. For now,
490 488 # changing:
491 489 #
492 490 #line = linecache.getline(filename, lineno, self.curframe.f_globals)
493 491 # to:
494 492 #
495 493 line = linecache.getline(filename, lineno)
496 494 #
497 495 # does the trick. But in reality, we need to fix this by reconciling
498 496 # our updates with the new Pdb APIs in Python 2.6.
499 497 #
500 498 # End hack. The rest of this method is copied verbatim from 2.6 pdb.py
501 499 #######################################################################
502 500
503 501 if not line:
504 502 print >>self.stdout, 'End of file'
505 503 return 0
506 504 line = line.strip()
507 505 # Don't allow setting breakpoint at a blank line
508 506 if (not line or (line[0] == '#') or
509 507 (line[:3] == '"""') or line[:3] == "'''"):
510 508 print >>self.stdout, '*** Blank or comment'
511 509 return 0
512 510 return lineno
@@ -1,77 +1,75 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 A context manager for handling sys.displayhook.
5 5
6 6 Authors:
7 7
8 8 * Robert Kern
9 9 * Brian Granger
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 import sys
24 24
25 25 from IPython.core.component import Component
26 26
27 from IPython.utils.autoattr import auto_attr
28
29 27 #-----------------------------------------------------------------------------
30 28 # Classes and functions
31 29 #-----------------------------------------------------------------------------
32 30
33 31
34 32 class DisplayTrap(Component):
35 33 """Object to manage sys.displayhook.
36 34
37 35 This came from IPython.core.kernel.display_hook, but is simplified
38 36 (no callbacks or formatters) until more of the core is refactored.
39 37 """
40 38
41 39 def __init__(self, parent, hook):
42 40 super(DisplayTrap, self).__init__(parent, None, None)
43 41 self.hook = hook
44 42 self.old_hook = None
45 43 # We define this to track if a single BuiltinTrap is nested.
46 44 # Only turn off the trap when the outermost call to __exit__ is made.
47 45 self._nested_level = 0
48 46
49 47 # @auto_attr
50 48 # def shell(self):
51 49 # return Component.get_instances(
52 50 # root=self.root,
53 51 # klass='IPython.core.iplib.InteractiveShell')[0]
54 52
55 53 def __enter__(self):
56 54 if self._nested_level == 0:
57 55 self.set()
58 56 self._nested_level += 1
59 57 return self
60 58
61 59 def __exit__(self, type, value, traceback):
62 60 if self._nested_level == 1:
63 61 self.unset()
64 62 self._nested_level -= 1
65 63 # Returning False will cause exceptions to propagate
66 64 return False
67 65
68 66 def set(self):
69 67 """Set the hook."""
70 68 if sys.displayhook is not self.hook:
71 69 self.old_hook = sys.displayhook
72 70 sys.displayhook = self.hook
73 71
74 72 def unset(self):
75 73 """Unset the hook."""
76 74 sys.displayhook = self.old_hook
77 75
@@ -1,272 +1,273 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 An embedded IPython shell.
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10
11 11 Notes
12 12 -----
13 13 """
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Copyright (C) 2008-2009 The IPython Development Team
17 17 #
18 18 # Distributed under the terms of the BSD License. The full license is in
19 19 # the file COPYING, distributed as part of this software.
20 20 #-----------------------------------------------------------------------------
21 21
22 22 #-----------------------------------------------------------------------------
23 23 # Imports
24 24 #-----------------------------------------------------------------------------
25 25
26 26 from __future__ import with_statement
27 import __main__
27 28
28 29 import sys
29 30 from contextlib import nested
30 31
31 32 from IPython.core import ultratb
32 33 from IPython.core.iplib import InteractiveShell
33 34 from IPython.core.ipapp import load_default_config
34 35
35 36 from IPython.utils.traitlets import Bool, Str, CBool
36 from IPython.utils.genutils import ask_yes_no
37 from IPython.utils.io import ask_yes_no
37 38
38 39
39 40 #-----------------------------------------------------------------------------
40 41 # Classes and functions
41 42 #-----------------------------------------------------------------------------
42 43
43 44 # This is an additional magic that is exposed in embedded shells.
44 45 def kill_embedded(self,parameter_s=''):
45 46 """%kill_embedded : deactivate for good the current embedded IPython.
46 47
47 48 This function (after asking for confirmation) sets an internal flag so that
48 49 an embedded IPython will never activate again. This is useful to
49 50 permanently disable a shell that is being called inside a loop: once you've
50 51 figured out what you needed from it, you may then kill it and the program
51 52 will then continue to run without the interactive shell interfering again.
52 53 """
53 54
54 55 kill = ask_yes_no("Are you sure you want to kill this embedded instance "
55 56 "(y/n)? [y/N] ",'n')
56 57 if kill:
57 58 self.embedded_active = False
58 59 print "This embedded IPython will not reactivate anymore once you exit."
59 60
60 61
61 62 class InteractiveShellEmbed(InteractiveShell):
62 63
63 64 dummy_mode = Bool(False)
64 65 exit_msg = Str('')
65 66 embedded = CBool(True)
66 67 embedded_active = CBool(True)
67 68 # Like the base class display_banner is not configurable, but here it
68 69 # is True by default.
69 70 display_banner = CBool(True)
70 71
71 72 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
72 73 user_ns=None, user_global_ns=None,
73 74 banner1=None, banner2=None, display_banner=None,
74 75 custom_exceptions=((),None), exit_msg=''):
75 76
76 77 self.save_sys_ipcompleter()
77 78
78 79 super(InteractiveShellEmbed,self).__init__(
79 80 parent=parent, config=config, ipython_dir=ipython_dir, usage=usage,
80 81 user_ns=user_ns, user_global_ns=user_global_ns,
81 82 banner1=banner1, banner2=banner2, display_banner=display_banner,
82 83 custom_exceptions=custom_exceptions)
83 84
84 85 self.exit_msg = exit_msg
85 86 self.define_magic("kill_embedded", kill_embedded)
86 87
87 88 # don't use the ipython crash handler so that user exceptions aren't
88 89 # trapped
89 90 sys.excepthook = ultratb.FormattedTB(color_scheme=self.colors,
90 91 mode=self.xmode,
91 92 call_pdb=self.pdb)
92 93
93 94 self.restore_sys_ipcompleter()
94 95
95 96 def init_sys_modules(self):
96 97 pass
97 98
98 99 def save_sys_ipcompleter(self):
99 100 """Save readline completer status."""
100 101 try:
101 102 #print 'Save completer',sys.ipcompleter # dbg
102 103 self.sys_ipcompleter_orig = sys.ipcompleter
103 104 except:
104 105 pass # not nested with IPython
105 106
106 107 def restore_sys_ipcompleter(self):
107 108 """Restores the readline completer which was in place.
108 109
109 110 This allows embedded IPython within IPython not to disrupt the
110 111 parent's completion.
111 112 """
112 113 try:
113 114 self.readline.set_completer(self.sys_ipcompleter_orig)
114 115 sys.ipcompleter = self.sys_ipcompleter_orig
115 116 except:
116 117 pass
117 118
118 119 def __call__(self, header='', local_ns=None, global_ns=None, dummy=None,
119 120 stack_depth=1):
120 121 """Activate the interactive interpreter.
121 122
122 123 __call__(self,header='',local_ns=None,global_ns,dummy=None) -> Start
123 124 the interpreter shell with the given local and global namespaces, and
124 125 optionally print a header string at startup.
125 126
126 127 The shell can be globally activated/deactivated using the
127 128 set/get_dummy_mode methods. This allows you to turn off a shell used
128 129 for debugging globally.
129 130
130 131 However, *each* time you call the shell you can override the current
131 132 state of dummy_mode with the optional keyword parameter 'dummy'. For
132 133 example, if you set dummy mode on with IPShell.set_dummy_mode(1), you
133 134 can still have a specific call work by making it as IPShell(dummy=0).
134 135
135 136 The optional keyword parameter dummy controls whether the call
136 137 actually does anything.
137 138 """
138 139
139 140 # If the user has turned it off, go away
140 141 if not self.embedded_active:
141 142 return
142 143
143 144 # Normal exits from interactive mode set this flag, so the shell can't
144 145 # re-enter (it checks this variable at the start of interactive mode).
145 146 self.exit_now = False
146 147
147 148 # Allow the dummy parameter to override the global __dummy_mode
148 149 if dummy or (dummy != 0 and self.dummy_mode):
149 150 return
150 151
151 152 if self.has_readline:
152 153 self.set_completer()
153 154
154 155 # self.banner is auto computed
155 156 if header:
156 157 self.old_banner2 = self.banner2
157 158 self.banner2 = self.banner2 + '\n' + header + '\n'
158 159
159 160 # Call the embedding code with a stack depth of 1 so it can skip over
160 161 # our call and get the original caller's namespaces.
161 162 self.mainloop(local_ns, global_ns, stack_depth=stack_depth)
162 163
163 164 self.banner2 = self.old_banner2
164 165
165 166 if self.exit_msg is not None:
166 167 print self.exit_msg
167 168
168 169 self.restore_sys_ipcompleter()
169 170
170 171 def mainloop(self, local_ns=None, global_ns=None, stack_depth=0,
171 172 display_banner=None):
172 173 """Embeds IPython into a running python program.
173 174
174 175 Input:
175 176
176 177 - header: An optional header message can be specified.
177 178
178 179 - local_ns, global_ns: working namespaces. If given as None, the
179 180 IPython-initialized one is updated with __main__.__dict__, so that
180 181 program variables become visible but user-specific configuration
181 182 remains possible.
182 183
183 184 - stack_depth: specifies how many levels in the stack to go to
184 185 looking for namespaces (when local_ns and global_ns are None). This
185 186 allows an intermediate caller to make sure that this function gets
186 187 the namespace from the intended level in the stack. By default (0)
187 188 it will get its locals and globals from the immediate caller.
188 189
189 190 Warning: it's possible to use this in a program which is being run by
190 191 IPython itself (via %run), but some funny things will happen (a few
191 192 globals get overwritten). In the future this will be cleaned up, as
192 193 there is no fundamental reason why it can't work perfectly."""
193 194
194 195 # Get locals and globals from caller
195 196 if local_ns is None or global_ns is None:
196 197 call_frame = sys._getframe(stack_depth).f_back
197 198
198 199 if local_ns is None:
199 200 local_ns = call_frame.f_locals
200 201 if global_ns is None:
201 202 global_ns = call_frame.f_globals
202 203
203 204 # Update namespaces and fire up interpreter
204 205
205 206 # The global one is easy, we can just throw it in
206 207 self.user_global_ns = global_ns
207 208
208 209 # but the user/local one is tricky: ipython needs it to store internal
209 210 # data, but we also need the locals. We'll copy locals in the user
210 211 # one, but will track what got copied so we can delete them at exit.
211 212 # This is so that a later embedded call doesn't see locals from a
212 213 # previous call (which most likely existed in a separate scope).
213 214 local_varnames = local_ns.keys()
214 215 self.user_ns.update(local_ns)
215 216 #self.user_ns['local_ns'] = local_ns # dbg
216 217
217 218 # Patch for global embedding to make sure that things don't overwrite
218 219 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
219 220 # FIXME. Test this a bit more carefully (the if.. is new)
220 221 if local_ns is None and global_ns is None:
221 222 self.user_global_ns.update(__main__.__dict__)
222 223
223 224 # make sure the tab-completer has the correct frame information, so it
224 225 # actually completes using the frame's locals/globals
225 226 self.set_completer_frame()
226 227
227 228 with nested(self.builtin_trap, self.display_trap):
228 229 self.interact(display_banner=display_banner)
229 230
230 231 # now, purge out the user namespace from anything we might have added
231 232 # from the caller's local namespace
232 233 delvar = self.user_ns.pop
233 234 for var in local_varnames:
234 235 delvar(var,None)
235 236
236 237
237 238 _embedded_shell = None
238 239
239 240
240 241 def embed(header='', config=None, usage=None, banner1=None, banner2=None,
241 242 display_banner=True, exit_msg=''):
242 243 """Call this to embed IPython at the current point in your program.
243 244
244 245 The first invocation of this will create an :class:`InteractiveShellEmbed`
245 246 instance and then call it. Consecutive calls just call the already
246 247 created instance.
247 248
248 249 Here is a simple example::
249 250
250 251 from IPython import embed
251 252 a = 10
252 253 b = 20
253 254 embed('First time')
254 255 c = 30
255 256 d = 40
256 257 embed
257 258
258 259 Full customization can be done by passing a :class:`Struct` in as the
259 260 config argument.
260 261 """
261 262 if config is None:
262 263 config = load_default_config()
263 264 config.InteractiveShellEmbed = config.InteractiveShell
264 265 global _embedded_shell
265 266 if _embedded_shell is None:
266 267 _embedded_shell = InteractiveShellEmbed(
267 268 config=config, usage=usage,
268 269 banner1=banner1, banner2=banner2,
269 270 display_banner=display_banner, exit_msg=exit_msg
270 271 )
271 272 _embedded_shell(header=header, stack_depth=2)
272 273
@@ -1,137 +1,135 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Color schemes for exception handling code in IPython.
4 4 """
5 5
6 6 #*****************************************************************************
7 7 # Copyright (C) 2005-2006 Fernando Perez <fperez@colorado.edu>
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #*****************************************************************************
12 12
13 #****************************************************************************
14 # Required modules
15 13 from IPython.utils.coloransi import ColorSchemeTable, TermColors, ColorScheme
16 14
17 15 def exception_colors():
18 16 """Return a color table with fields for exception reporting.
19 17
20 18 The table is an instance of ColorSchemeTable with schemes added for
21 19 'Linux', 'LightBG' and 'NoColor' and fields for exception handling filled
22 20 in.
23 21
24 22 Examples:
25 23
26 24 >>> ec = exception_colors()
27 25 >>> ec.active_scheme_name
28 26 ''
29 27 >>> print ec.active_colors
30 28 None
31 29
32 30 Now we activate a color scheme:
33 31 >>> ec.set_active_scheme('NoColor')
34 32 >>> ec.active_scheme_name
35 33 'NoColor'
36 34 >>> ec.active_colors.keys()
37 35 ['em', 'filenameEm', 'excName', 'valEm', 'nameEm', 'line', 'topline',
38 36 'name', 'caret', 'val', 'vName', 'Normal', 'filename', 'linenoEm',
39 37 'lineno', 'normalEm']
40 38 """
41 39
42 40 ex_colors = ColorSchemeTable()
43 41
44 42 # Populate it with color schemes
45 43 C = TermColors # shorthand and local lookup
46 44 ex_colors.add_scheme(ColorScheme(
47 45 'NoColor',
48 46 # The color to be used for the top line
49 47 topline = C.NoColor,
50 48
51 49 # The colors to be used in the traceback
52 50 filename = C.NoColor,
53 51 lineno = C.NoColor,
54 52 name = C.NoColor,
55 53 vName = C.NoColor,
56 54 val = C.NoColor,
57 55 em = C.NoColor,
58 56
59 57 # Emphasized colors for the last frame of the traceback
60 58 normalEm = C.NoColor,
61 59 filenameEm = C.NoColor,
62 60 linenoEm = C.NoColor,
63 61 nameEm = C.NoColor,
64 62 valEm = C.NoColor,
65 63
66 64 # Colors for printing the exception
67 65 excName = C.NoColor,
68 66 line = C.NoColor,
69 67 caret = C.NoColor,
70 68 Normal = C.NoColor
71 69 ))
72 70
73 71 # make some schemes as instances so we can copy them for modification easily
74 72 ex_colors.add_scheme(ColorScheme(
75 73 'Linux',
76 74 # The color to be used for the top line
77 75 topline = C.LightRed,
78 76
79 77 # The colors to be used in the traceback
80 78 filename = C.Green,
81 79 lineno = C.Green,
82 80 name = C.Purple,
83 81 vName = C.Cyan,
84 82 val = C.Green,
85 83 em = C.LightCyan,
86 84
87 85 # Emphasized colors for the last frame of the traceback
88 86 normalEm = C.LightCyan,
89 87 filenameEm = C.LightGreen,
90 88 linenoEm = C.LightGreen,
91 89 nameEm = C.LightPurple,
92 90 valEm = C.LightBlue,
93 91
94 92 # Colors for printing the exception
95 93 excName = C.LightRed,
96 94 line = C.Yellow,
97 95 caret = C.White,
98 96 Normal = C.Normal
99 97 ))
100 98
101 99 # For light backgrounds, swap dark/light colors
102 100 ex_colors.add_scheme(ColorScheme(
103 101 'LightBG',
104 102 # The color to be used for the top line
105 103 topline = C.Red,
106 104
107 105 # The colors to be used in the traceback
108 106 filename = C.LightGreen,
109 107 lineno = C.LightGreen,
110 108 name = C.LightPurple,
111 109 vName = C.Cyan,
112 110 val = C.LightGreen,
113 111 em = C.Cyan,
114 112
115 113 # Emphasized colors for the last frame of the traceback
116 114 normalEm = C.Cyan,
117 115 filenameEm = C.Green,
118 116 linenoEm = C.Green,
119 117 nameEm = C.Purple,
120 118 valEm = C.Blue,
121 119
122 120 # Colors for printing the exception
123 121 excName = C.Red,
124 122 #line = C.Brown, # brown often is displayed as yellow
125 123 line = C.Red,
126 124 caret = C.Normal,
127 125 Normal = C.Normal,
128 126 ))
129 127
130 128 return ex_colors
131 129
132 130
133 131 # For backwards compatibility, keep around a single global object. Note that
134 132 # this should NOT be used, the factory function should be used instead, since
135 133 # these objects are stateful and it's very easy to get strange bugs if any code
136 134 # modifies the module-level object's state.
137 135 ExceptionColors = exception_colors()
@@ -1,276 +1,277 b''
1 1 # -*- coding: utf-8 -*-
2 2 """ History related magics and functionality """
3 3
4 4 # Stdlib imports
5 5 import fnmatch
6 6 import os
7 7
8 from IPython.utils.genutils import Term, ask_yes_no, warn
8 from IPython.utils.io import Term, ask_yes_no
9 from IPython.utils.warn import warn
9 10 from IPython.core import ipapi
10 11
11 12 def magic_history(self, parameter_s = ''):
12 13 """Print input history (_i<n> variables), with most recent last.
13 14
14 15 %history -> print at most 40 inputs (some may be multi-line)\\
15 16 %history n -> print at most n inputs\\
16 17 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
17 18
18 19 By default, input history is printed without line numbers so it can be
19 20 directly pasted into an editor.
20 21
21 22 With -n, each input's number <n> is shown, and is accessible as the
22 23 automatically generated variable _i<n> as well as In[<n>]. Multi-line
23 24 statements are printed starting at a new line for easy copy/paste.
24 25
25 26 Options:
26 27
27 28 -n: print line numbers for each input.
28 29 This feature is only available if numbered prompts are in use.
29 30
30 31 -o: also print outputs for each input.
31 32
32 33 -p: print classic '>>>' python prompts before each input. This is useful
33 34 for making documentation, and in conjunction with -o, for producing
34 35 doctest-ready output.
35 36
36 37 -t: (default) print the 'translated' history, as IPython understands it.
37 38 IPython filters your input and converts it all into valid Python source
38 39 before executing it (things like magics or aliases are turned into
39 40 function calls, for example). With this option, you'll see the native
40 41 history instead of the user-entered version: '%cd /' will be seen as
41 42 '_ip.magic("%cd /")' instead of '%cd /'.
42 43
43 44 -r: print the 'raw' history, i.e. the actual commands you typed.
44 45
45 46 -g: treat the arg as a pattern to grep for in (full) history.
46 47 This includes the "shadow history" (almost all commands ever written).
47 48 Use '%hist -g' to show full shadow history (may be very long).
48 49 In shadow history, every index nuwber starts with 0.
49 50
50 51 -f FILENAME: instead of printing the output to the screen, redirect it to
51 52 the given file. The file is always overwritten, though IPython asks for
52 53 confirmation first if it already exists.
53 54 """
54 55
55 56 if not self.outputcache.do_full_cache:
56 57 print 'This feature is only available if numbered prompts are in use.'
57 58 return
58 59 opts,args = self.parse_options(parameter_s,'gnoptsrf:',mode='list')
59 60
60 61 # Check if output to specific file was requested.
61 62 try:
62 63 outfname = opts['f']
63 64 except KeyError:
64 65 outfile = Term.cout # default
65 66 # We don't want to close stdout at the end!
66 67 close_at_end = False
67 68 else:
68 69 if os.path.exists(outfname):
69 70 if not ask_yes_no("File %r exists. Overwrite?" % outfname):
70 71 print 'Aborting.'
71 72 return
72 73
73 74 outfile = open(outfname,'w')
74 75 close_at_end = True
75 76
76 77 if 't' in opts:
77 78 input_hist = self.input_hist
78 79 elif 'r' in opts:
79 80 input_hist = self.input_hist_raw
80 81 else:
81 82 input_hist = self.input_hist
82 83
83 84 default_length = 40
84 85 pattern = None
85 86 if 'g' in opts:
86 87 init = 1
87 88 final = len(input_hist)
88 89 parts = parameter_s.split(None, 1)
89 90 if len(parts) == 1:
90 91 parts += '*'
91 92 head, pattern = parts
92 93 pattern = "*" + pattern + "*"
93 94 elif len(args) == 0:
94 95 final = len(input_hist)-1
95 96 init = max(1,final-default_length)
96 97 elif len(args) == 1:
97 98 final = len(input_hist)
98 99 init = max(1, final-int(args[0]))
99 100 elif len(args) == 2:
100 101 init, final = map(int, args)
101 102 else:
102 103 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
103 104 print >> Term.cout, self.magic_hist.__doc__
104 105 return
105 106
106 107 width = len(str(final))
107 108 line_sep = ['','\n']
108 109 print_nums = 'n' in opts
109 110 print_outputs = 'o' in opts
110 111 pyprompts = 'p' in opts
111 112
112 113 found = False
113 114 if pattern is not None:
114 115 sh = self.shadowhist.all()
115 116 for idx, s in sh:
116 117 if fnmatch.fnmatch(s, pattern):
117 118 print >> outfile, "0%d: %s" %(idx, s)
118 119 found = True
119 120
120 121 if found:
121 122 print >> outfile, "==="
122 123 print >> outfile, \
123 124 "shadow history ends, fetch by %rep <number> (must start with 0)"
124 125 print >> outfile, "=== start of normal history ==="
125 126
126 127 for in_num in range(init,final):
127 128 inline = input_hist[in_num]
128 129 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
129 130 continue
130 131
131 132 multiline = int(inline.count('\n') > 1)
132 133 if print_nums:
133 134 print >> outfile, \
134 135 '%s:%s' % (str(in_num).ljust(width), line_sep[multiline]),
135 136 if pyprompts:
136 137 print >> outfile, '>>>',
137 138 if multiline:
138 139 lines = inline.splitlines()
139 140 print >> outfile, '\n... '.join(lines)
140 141 print >> outfile, '... '
141 142 else:
142 143 print >> outfile, inline,
143 144 else:
144 145 print >> outfile, inline,
145 146 if print_outputs:
146 147 output = self.shell.user_ns['Out'].get(in_num)
147 148 if output is not None:
148 149 print >> outfile, repr(output)
149 150
150 151 if close_at_end:
151 152 outfile.close()
152 153
153 154
154 155 def magic_hist(self, parameter_s=''):
155 156 """Alternate name for %history."""
156 157 return self.magic_history(parameter_s)
157 158
158 159
159 160 def rep_f(self, arg):
160 161 r""" Repeat a command, or get command to input line for editing
161 162
162 163 - %rep (no arguments):
163 164
164 165 Place a string version of last computation result (stored in the special '_'
165 166 variable) to the next input prompt. Allows you to create elaborate command
166 167 lines without using copy-paste::
167 168
168 169 $ l = ["hei", "vaan"]
169 170 $ "".join(l)
170 171 ==> heivaan
171 172 $ %rep
172 173 $ heivaan_ <== cursor blinking
173 174
174 175 %rep 45
175 176
176 177 Place history line 45 to next input prompt. Use %hist to find out the
177 178 number.
178 179
179 180 %rep 1-4 6-7 3
180 181
181 182 Repeat the specified lines immediately. Input slice syntax is the same as
182 183 in %macro and %save.
183 184
184 185 %rep foo
185 186
186 187 Place the most recent line that has the substring "foo" to next input.
187 188 (e.g. 'svn ci -m foobar').
188 189 """
189 190
190 191 opts,args = self.parse_options(arg,'',mode='list')
191 192 if not args:
192 193 self.set_next_input(str(self.user_ns["_"]))
193 194 return
194 195
195 196 if len(args) == 1 and not '-' in args[0]:
196 197 arg = args[0]
197 198 if len(arg) > 1 and arg.startswith('0'):
198 199 # get from shadow hist
199 200 num = int(arg[1:])
200 201 line = self.shadowhist.get(num)
201 202 self.set_next_input(str(line))
202 203 return
203 204 try:
204 205 num = int(args[0])
205 206 self.set_next_input(str(self.input_hist_raw[num]).rstrip())
206 207 return
207 208 except ValueError:
208 209 pass
209 210
210 211 for h in reversed(self.input_hist_raw):
211 212 if 'rep' in h:
212 213 continue
213 214 if fnmatch.fnmatch(h,'*' + arg + '*'):
214 215 self.set_next_input(str(h).rstrip())
215 216 return
216 217
217 218 try:
218 219 lines = self.extract_input_slices(args, True)
219 220 print "lines",lines
220 221 self.runlines(lines)
221 222 except ValueError:
222 223 print "Not found in recent history:", args
223 224
224 225
225 226 _sentinel = object()
226 227
227 228 class ShadowHist(object):
228 229 def __init__(self,db):
229 230 # cmd => idx mapping
230 231 self.curidx = 0
231 232 self.db = db
232 233 self.disabled = False
233 234
234 235 def inc_idx(self):
235 236 idx = self.db.get('shadowhist_idx', 1)
236 237 self.db['shadowhist_idx'] = idx + 1
237 238 return idx
238 239
239 240 def add(self, ent):
240 241 if self.disabled:
241 242 return
242 243 try:
243 244 old = self.db.hget('shadowhist', ent, _sentinel)
244 245 if old is not _sentinel:
245 246 return
246 247 newidx = self.inc_idx()
247 248 #print "new",newidx # dbg
248 249 self.db.hset('shadowhist',ent, newidx)
249 250 except:
250 251 ipapi.get().showtraceback()
251 252 print "WARNING: disabling shadow history"
252 253 self.disabled = True
253 254
254 255 def all(self):
255 256 d = self.db.hdict('shadowhist')
256 257 items = [(i,s) for (s,i) in d.items()]
257 258 items.sort()
258 259 return items
259 260
260 261 def get(self, idx):
261 262 all = self.all()
262 263
263 264 for k, v in all:
264 265 #print k,v
265 266 if k == idx:
266 267 return v
267 268
268 269
269 270 def init_ipython(ip):
270 271 ip.define_magic("rep",rep_f)
271 272 ip.define_magic("hist",magic_hist)
272 273 ip.define_magic("history",magic_history)
273 274
274 275 # XXX - ipy_completers are in quarantine, need to be updated to new apis
275 276 #import ipy_completers
276 277 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,273 +1,276 b''
1 1 """hooks for IPython.
2 2
3 3 In Python, it is possible to overwrite any method of any object if you really
4 4 want to. But IPython exposes a few 'hooks', methods which are _designed_ to
5 5 be overwritten by users for customization purposes. This module defines the
6 6 default versions of all such hooks, which get used by IPython if not
7 7 overridden by the user.
8 8
9 9 hooks are simple functions, but they should be declared with 'self' as their
10 10 first argument, because when activated they are registered into IPython as
11 11 instance methods. The self argument will be the IPython running instance
12 12 itself, so hooks have full access to the entire IPython object.
13 13
14 14 If you wish to define a new hook and activate it, you need to put the
15 15 necessary code into a python file which can be either imported or execfile()'d
16 16 from within your ipythonrc configuration.
17 17
18 18 For example, suppose that you have a module called 'myiphooks' in your
19 19 PYTHONPATH, which contains the following definition:
20 20
21 21 import os
22 22 from IPython.core import ipapi
23 23 ip = ipapi.get()
24 24
25 25 def calljed(self,filename, linenum):
26 26 "My editor hook calls the jed editor directly."
27 27 print "Calling my own editor, jed ..."
28 28 if os.system('jed +%d %s' % (linenum,filename)) != 0:
29 29 raise TryNext()
30 30
31 31 ip.set_hook('editor', calljed)
32 32
33 33 You can then enable the functionality by doing 'import myiphooks'
34 34 somewhere in your configuration files or ipython command line.
35 35 """
36 36
37 37 #*****************************************************************************
38 38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
39 39 #
40 40 # Distributed under the terms of the BSD License. The full license is in
41 41 # the file COPYING, distributed as part of this software.
42 42 #*****************************************************************************
43 43
44 44 import os, bisect
45 45 import sys
46 from IPython.utils.genutils import Term, shell
46
47 47 from pprint import PrettyPrinter
48 48
49 from IPython.utils.io import Term
50 from IPython.utils.process import shell
51
49 52 from IPython.core.error import TryNext
50 53
51 54 # List here all the default hooks. For now it's just the editor functions
52 55 # but over time we'll move here all the public API for user-accessible things.
53 56
54 57 __all__ = ['editor', 'fix_error_editor', 'synchronize_with_editor', 'result_display',
55 58 'input_prefilter', 'shutdown_hook', 'late_startup_hook',
56 59 'generate_prompt', 'generate_output_prompt','shell_hook',
57 60 'show_in_pager','pre_prompt_hook', 'pre_runcode_hook',
58 61 'clipboard_get']
59 62
60 63 pformat = PrettyPrinter().pformat
61 64
62 65 def editor(self,filename, linenum=None):
63 66 """Open the default editor at the given filename and linenumber.
64 67
65 68 This is IPython's default editor hook, you can use it as an example to
66 69 write your own modified one. To set your own editor function as the
67 70 new editor hook, call ip.set_hook('editor',yourfunc)."""
68 71
69 72 # IPython configures a default editor at startup by reading $EDITOR from
70 73 # the environment, and falling back on vi (unix) or notepad (win32).
71 74 editor = self.editor
72 75
73 76 # marker for at which line to open the file (for existing objects)
74 77 if linenum is None or editor=='notepad':
75 78 linemark = ''
76 79 else:
77 80 linemark = '+%d' % int(linenum)
78 81
79 82 # Enclose in quotes if necessary and legal
80 83 if ' ' in editor and os.path.isfile(editor) and editor[0] != '"':
81 84 editor = '"%s"' % editor
82 85
83 86 # Call the actual editor
84 87 if os.system('%s %s %s' % (editor,linemark,filename)) != 0:
85 88 raise TryNext()
86 89
87 90 import tempfile
88 91 def fix_error_editor(self,filename,linenum,column,msg):
89 92 """Open the editor at the given filename, linenumber, column and
90 93 show an error message. This is used for correcting syntax errors.
91 94 The current implementation only has special support for the VIM editor,
92 95 and falls back on the 'editor' hook if VIM is not used.
93 96
94 97 Call ip.set_hook('fix_error_editor',youfunc) to use your own function,
95 98 """
96 99 def vim_quickfix_file():
97 100 t = tempfile.NamedTemporaryFile()
98 101 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
99 102 t.flush()
100 103 return t
101 104 if os.path.basename(self.editor) != 'vim':
102 105 self.hooks.editor(filename,linenum)
103 106 return
104 107 t = vim_quickfix_file()
105 108 try:
106 109 if os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name):
107 110 raise TryNext()
108 111 finally:
109 112 t.close()
110 113
111 114
112 115 def synchronize_with_editor(self, filename, linenum, column):
113 116 pass
114 117
115 118
116 119 class CommandChainDispatcher:
117 120 """ Dispatch calls to a chain of commands until some func can handle it
118 121
119 122 Usage: instantiate, execute "add" to add commands (with optional
120 123 priority), execute normally via f() calling mechanism.
121 124
122 125 """
123 126 def __init__(self,commands=None):
124 127 if commands is None:
125 128 self.chain = []
126 129 else:
127 130 self.chain = commands
128 131
129 132
130 133 def __call__(self,*args, **kw):
131 134 """ Command chain is called just like normal func.
132 135
133 136 This will call all funcs in chain with the same args as were given to this
134 137 function, and return the result of first func that didn't raise
135 138 TryNext """
136 139
137 140 for prio,cmd in self.chain:
138 141 #print "prio",prio,"cmd",cmd #dbg
139 142 try:
140 143 return cmd(*args, **kw)
141 144 except TryNext, exc:
142 145 if exc.args or exc.kwargs:
143 146 args = exc.args
144 147 kw = exc.kwargs
145 148 # if no function will accept it, raise TryNext up to the caller
146 149 raise TryNext
147 150
148 151 def __str__(self):
149 152 return str(self.chain)
150 153
151 154 def add(self, func, priority=0):
152 155 """ Add a func to the cmd chain with given priority """
153 156 bisect.insort(self.chain,(priority,func))
154 157
155 158 def __iter__(self):
156 159 """ Return all objects in chain.
157 160
158 161 Handy if the objects are not callable.
159 162 """
160 163 return iter(self.chain)
161 164
162 165
163 166 def result_display(self,arg):
164 167 """ Default display hook.
165 168
166 169 Called for displaying the result to the user.
167 170 """
168 171
169 172 if self.pprint:
170 173 out = pformat(arg)
171 174 if '\n' in out:
172 175 # So that multi-line strings line up with the left column of
173 176 # the screen, instead of having the output prompt mess up
174 177 # their first line.
175 178 Term.cout.write('\n')
176 179 print >>Term.cout, out
177 180 else:
178 181 # By default, the interactive prompt uses repr() to display results,
179 182 # so we should honor this. Users who'd rather use a different
180 183 # mechanism can easily override this hook.
181 184 print >>Term.cout, repr(arg)
182 185 # the default display hook doesn't manipulate the value to put in history
183 186 return None
184 187
185 188
186 189 def input_prefilter(self,line):
187 190 """ Default input prefilter
188 191
189 192 This returns the line as unchanged, so that the interpreter
190 193 knows that nothing was done and proceeds with "classic" prefiltering
191 194 (%magics, !shell commands etc.).
192 195
193 196 Note that leading whitespace is not passed to this hook. Prefilter
194 197 can't alter indentation.
195 198
196 199 """
197 200 #print "attempt to rewrite",line #dbg
198 201 return line
199 202
200 203
201 204 def shutdown_hook(self):
202 205 """ default shutdown hook
203 206
204 207 Typically, shotdown hooks should raise TryNext so all shutdown ops are done
205 208 """
206 209
207 210 #print "default shutdown hook ok" # dbg
208 211 return
209 212
210 213
211 214 def late_startup_hook(self):
212 215 """ Executed after ipython has been constructed and configured
213 216
214 217 """
215 218 #print "default startup hook ok" # dbg
216 219
217 220
218 221 def generate_prompt(self, is_continuation):
219 222 """ calculate and return a string with the prompt to display """
220 223 if is_continuation:
221 224 return str(self.outputcache.prompt2)
222 225 return str(self.outputcache.prompt1)
223 226
224 227
225 228 def generate_output_prompt(self):
226 229 return str(self.outputcache.prompt_out)
227 230
228 231
229 232 def shell_hook(self,cmd):
230 233 """ Run system/shell command a'la os.system() """
231 234
232 235 shell(cmd, header=self.system_header, verbose=self.system_verbose)
233 236
234 237
235 238 def show_in_pager(self,s):
236 239 """ Run a string through pager """
237 240 # raising TryNext here will use the default paging functionality
238 241 raise TryNext
239 242
240 243
241 244 def pre_prompt_hook(self):
242 245 """ Run before displaying the next prompt
243 246
244 247 Use this e.g. to display output from asynchronous operations (in order
245 248 to not mess up text entry)
246 249 """
247 250
248 251 return None
249 252
250 253
251 254 def pre_runcode_hook(self):
252 255 """ Executed before running the (prefiltered) code in IPython """
253 256 return None
254 257
255 258
256 259 def clipboard_get(self):
257 260 """ Get text from the clipboard.
258 261 """
259 262 from IPython.lib.clipboard import (
260 263 osx_clipboard_get, tkinter_clipboard_get,
261 264 win32_clipboard_get
262 265 )
263 266 if sys.platform == 'win32':
264 267 chain = [win32_clipboard_get, tkinter_clipboard_get]
265 268 elif sys.platform == 'darwin':
266 269 chain = [osx_clipboard_get, tkinter_clipboard_get]
267 270 else:
268 271 chain = [tkinter_clipboard_get]
269 272 dispatcher = CommandChainDispatcher()
270 273 for func in chain:
271 274 dispatcher.add(func)
272 275 text = dispatcher()
273 276 return text
@@ -1,38 +1,36 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 This module is *completely* deprecated and should no longer be used for
5 5 any purpose. Currently, we have a few parts of the core that have
6 6 not been componentized and thus, still rely on this module. When everything
7 7 has been made into a component, this module will be sent to deathrow.
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2008-2009 The IPython Development Team
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #-----------------------------------------------------------------------------
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Imports
19 19 #-----------------------------------------------------------------------------
20 20
21 from IPython.core.error import TryNext, UsageError, IPythonCoreError
22
23 21 #-----------------------------------------------------------------------------
24 22 # Classes and functions
25 23 #-----------------------------------------------------------------------------
26 24
27 25
28 26 def get():
29 27 """Get the most recently created InteractiveShell instance."""
30 28 from IPython.core.iplib import InteractiveShell
31 29 insts = InteractiveShell.get_instances()
32 30 if len(insts)==0:
33 31 return None
34 32 most_recent = insts[0]
35 33 for inst in insts[1:]:
36 34 if inst.created > most_recent.created:
37 35 most_recent = inst
38 36 return most_recent
This diff has been collapsed as it changes many lines, (690 lines changed) Show them Hide them
@@ -1,655 +1,653 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 The :class:`~IPython.core.application.Application` object for the command
5 5 line :command:`ipython` program.
6 6
7 7 Authors
8 8 -------
9 9
10 10 * Brian Granger
11 11 * Fernando Perez
12 12 """
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Copyright (C) 2008-2010 The IPython Development Team
16 16 #
17 17 # Distributed under the terms of the BSD License. The full license is in
18 18 # the file COPYING, distributed as part of this software.
19 19 #-----------------------------------------------------------------------------
20 20
21 21 #-----------------------------------------------------------------------------
22 22 # Imports
23 23 #-----------------------------------------------------------------------------
24
24 25 from __future__ import absolute_import
25 26
26 27 import logging
27 28 import os
28 29 import sys
29 30
30 from IPython.core import crashhandler
31 from IPython.core.application import Application
31 from IPython.core import release
32 from IPython.core.crashhandler import CrashHandler
33 from IPython.core.application import Application, BaseAppConfigLoader
32 34 from IPython.core.iplib import InteractiveShell
33 35 from IPython.config.loader import (
34 36 Config,
35 PyFileConfigLoader,
36 # NoConfigDefault,
37 PyFileConfigLoader
37 38 )
38 39 from IPython.lib import inputhook
39 from IPython.utils.genutils import filefind, get_ipython_dir
40 from IPython.utils.path import filefind, get_ipython_dir
40 41 from . import usage
41 42
42 43 #-----------------------------------------------------------------------------
43 44 # Globals, utilities and helpers
44 45 #-----------------------------------------------------------------------------
45 46
47 #: The default config file name for this application.
46 48 default_config_file_name = u'ipython_config.py'
47 49
48 cl_args = (
49 (('--autocall',), dict(
50 type=int, dest='InteractiveShell.autocall',
51 help=
52 """Make IPython automatically call any callable object even if you
53 didn't type explicit parentheses. For example, 'str 43' becomes
54 'str(43)' automatically. The value can be '0' to disable the feature,
55 '1' for 'smart' autocall, where it is not applied if there are no more
56 arguments on the line, and '2' for 'full' autocall, where all callable
57 objects are automatically called (even if no arguments are present).
58 The default is '1'.""",
59 metavar='InteractiveShell.autocall')
60 ),
61 (('--autoindent',), dict(
62 action='store_true', dest='InteractiveShell.autoindent',
63 help='Turn on autoindenting.')
64 ),
65 (('--no-autoindent',), dict(
66 action='store_false', dest='InteractiveShell.autoindent',
67 help='Turn off autoindenting.')
68 ),
69 (('--automagic',), dict(
70 action='store_true', dest='InteractiveShell.automagic',
71 help='Turn on the auto calling of magic commands.'
72 'Type %%magic at the IPython prompt for more information.')
73 ),
74 (('--no-automagic',), dict(
75 action='store_false', dest='InteractiveShell.automagic',
76 help='Turn off the auto calling of magic commands.')
77 ),
78 (('--autoedit-syntax',), dict(
79 action='store_true', dest='InteractiveShell.autoedit_syntax',
80 help='Turn on auto editing of files with syntax errors.')
81 ),
82 (('--no-autoedit-syntax',), dict(
83 action='store_false', dest='InteractiveShell.autoedit_syntax',
84 help='Turn off auto editing of files with syntax errors.')
85 ),
86 (('--banner',), dict(
87 action='store_true', dest='Global.display_banner',
88 help='Display a banner upon starting IPython.')
89 ),
90 (('--no-banner',), dict(
91 action='store_false', dest='Global.display_banner',
92 help="Don't display a banner upon starting IPython.")
93 ),
94 (('--cache-size',), dict(
95 type=int, dest='InteractiveShell.cache_size',
96 help=
97 """Set the size of the output cache. The default is 1000, you can
98 change it permanently in your config file. Setting it to 0 completely
99 disables the caching system, and the minimum value accepted is 20 (if
100 you provide a value less than 20, it is reset to 0 and a warning is
101 issued). This limit is defined because otherwise you'll spend more
102 time re-flushing a too small cache than working.
103 """,
104 metavar='InteractiveShell.cache_size')
105 ),
106 (('--classic',), dict(
107 action='store_true', dest='Global.classic',
108 help="Gives IPython a similar feel to the classic Python prompt.")
109 ),
110 (('--colors',), dict(
111 type=str, dest='InteractiveShell.colors',
112 help="Set the color scheme (NoColor, Linux, and LightBG).",
113 metavar='InteractiveShell.colors')
114 ),
115 (('--color-info',), dict(
116 action='store_true', dest='InteractiveShell.color_info',
117 help=
118 """IPython can display information about objects via a set of func-
119 tions, and optionally can use colors for this, syntax highlighting
120 source code and various other elements. However, because this
121 information is passed through a pager (like 'less') and many pagers get
122 confused with color codes, this option is off by default. You can test
123 it and turn it on permanently in your ipython_config.py file if it
124 works for you. Test it and turn it on permanently if it works with
125 your system. The magic function %%color_info allows you to toggle this
126 inter- actively for testing."""
127 )
128 ),
129 (('--no-color-info',), dict(
130 action='store_false', dest='InteractiveShell.color_info',
131 help="Disable using colors for info related things.")
132 ),
133 (('--confirm-exit',), dict(
134 action='store_true', dest='InteractiveShell.confirm_exit',
135 help=
136 """Set to confirm when you try to exit IPython with an EOF (Control-D
137 in Unix, Control-Z/Enter in Windows). By typing 'exit', 'quit' or
138 '%%Exit', you can force a direct exit without any confirmation.
139 """
140 )
141 ),
142 (('--no-confirm-exit',), dict(
143 action='store_false', dest='InteractiveShell.confirm_exit',
144 help="Don't prompt the user when exiting.")
145 ),
146 (('--deep-reload',), dict(
147 action='store_true', dest='InteractiveShell.deep_reload',
148 help=
149 """Enable deep (recursive) reloading by default. IPython can use the
150 deep_reload module which reloads changes in modules recursively (it
151 replaces the reload() function, so you don't need to change anything to
152 use it). deep_reload() forces a full reload of modules whose code may
153 have changed, which the default reload() function does not. When
154 deep_reload is off, IPython will use the normal reload(), but
155 deep_reload will still be available as dreload(). This fea- ture is off
156 by default [which means that you have both normal reload() and
157 dreload()].""")
158 ),
159 (('--no-deep-reload',), dict(
160 action='store_false', dest='InteractiveShell.deep_reload',
161 help="Disable deep (recursive) reloading by default.")
162 ),
163 (('--editor',), dict(
164 type=str, dest='InteractiveShell.editor',
165 help="Set the editor used by IPython (default to $EDITOR/vi/notepad).",
166 metavar='InteractiveShell.editor')
167 ),
168 (('--log','-l'), dict(
169 action='store_true', dest='InteractiveShell.logstart',
170 help="Start logging to the default log file (./ipython_log.py).")
171 ),
172 (('--logfile','-lf'), dict(
173 type=unicode, dest='InteractiveShell.logfile',
174 help="Start logging to logfile with this name.",
175 metavar='InteractiveShell.logfile')
176 ),
177 (('--log-append','-la'), dict(
178 type=unicode, dest='InteractiveShell.logappend',
179 help="Start logging to the given file in append mode.",
180 metavar='InteractiveShell.logfile')
181 ),
182 (('--pdb',), dict(
183 action='store_true', dest='InteractiveShell.pdb',
184 help="Enable auto calling the pdb debugger after every exception.")
185 ),
186 (('--no-pdb',), dict(
187 action='store_false', dest='InteractiveShell.pdb',
188 help="Disable auto calling the pdb debugger after every exception.")
189 ),
190 (('--pprint',), dict(
191 action='store_true', dest='InteractiveShell.pprint',
192 help="Enable auto pretty printing of results.")
193 ),
194 (('--no-pprint',), dict(
195 action='store_false', dest='InteractiveShell.pprint',
196 help="Disable auto auto pretty printing of results.")
197 ),
198 (('--prompt-in1','-pi1'), dict(
199 type=str, dest='InteractiveShell.prompt_in1',
200 help=
201 """Set the main input prompt ('In [\#]: '). Note that if you are using
202 numbered prompts, the number is represented with a '\#' in the string.
203 Don't forget to quote strings with spaces embedded in them. Most
204 bash-like escapes can be used to customize IPython's prompts, as well
205 as a few additional ones which are IPython-spe- cific. All valid
206 prompt escapes are described in detail in the Customization section of
207 the IPython manual.""",
208 metavar='InteractiveShell.prompt_in1')
209 ),
210 (('--prompt-in2','-pi2'), dict(
211 type=str, dest='InteractiveShell.prompt_in2',
212 help=
213 """Set the secondary input prompt (' .\D.: '). Similar to the previous
214 option, but used for the continuation prompts. The special sequence
215 '\D' is similar to '\#', but with all digits replaced by dots (so you
216 can have your continuation prompt aligned with your input prompt).
217 Default: ' .\D.: ' (note three spaces at the start for alignment with
218 'In [\#]')""",
219 metavar='InteractiveShell.prompt_in2')
220 ),
221 (('--prompt-out','-po'), dict(
222 type=str, dest='InteractiveShell.prompt_out',
223 help="Set the output prompt ('Out[\#]:')",
224 metavar='InteractiveShell.prompt_out')
225 ),
226 (('--quick',), dict(
227 action='store_true', dest='Global.quick',
228 help="Enable quick startup with no config files.")
229 ),
230 (('--readline',), dict(
231 action='store_true', dest='InteractiveShell.readline_use',
232 help="Enable readline for command line usage.")
233 ),
234 (('--no-readline',), dict(
235 action='store_false', dest='InteractiveShell.readline_use',
236 help="Disable readline for command line usage.")
237 ),
238 (('--screen-length','-sl'), dict(
239 type=int, dest='InteractiveShell.screen_length',
240 help=
241 """Number of lines of your screen, used to control printing of very
242 long strings. Strings longer than this number of lines will be sent
243 through a pager instead of directly printed. The default value for
244 this is 0, which means IPython will auto-detect your screen size every
245 time it needs to print certain potentially long strings (this doesn't
246 change the behavior of the 'print' keyword, it's only triggered
247 internally). If for some reason this isn't working well (it needs
248 curses support), specify it yourself. Otherwise don't change the
249 default.""",
250 metavar='InteractiveShell.screen_length')
251 ),
252 (('--separate-in','-si'), dict(
253 type=str, dest='InteractiveShell.separate_in',
254 help="Separator before input prompts. Default '\\n'.",
255 metavar='InteractiveShell.separate_in')
256 ),
257 (('--separate-out','-so'), dict(
258 type=str, dest='InteractiveShell.separate_out',
259 help="Separator before output prompts. Default 0 (nothing).",
260 metavar='InteractiveShell.separate_out')
261 ),
262 (('--separate-out2','-so2'), dict(
263 type=str, dest='InteractiveShell.separate_out2',
264 help="Separator after output prompts. Default 0 (nonight).",
265 metavar='InteractiveShell.separate_out2')
266 ),
267 (('-no-sep',), dict(
268 action='store_true', dest='Global.nosep',
269 help="Eliminate all spacing between prompts.")
270 ),
271 (('--term-title',), dict(
272 action='store_true', dest='InteractiveShell.term_title',
273 help="Enable auto setting the terminal title.")
274 ),
275 (('--no-term-title',), dict(
276 action='store_false', dest='InteractiveShell.term_title',
277 help="Disable auto setting the terminal title.")
278 ),
279 (('--xmode',), dict(
280 type=str, dest='InteractiveShell.xmode',
281 help=
282 """Exception reporting mode ('Plain','Context','Verbose'). Plain:
283 similar to python's normal traceback printing. Context: prints 5 lines
284 of context source code around each line in the traceback. Verbose:
285 similar to Context, but additionally prints the variables currently
286 visible where the exception happened (shortening their strings if too
287 long). This can potentially be very slow, if you happen to have a huge
288 data structure whose string representation is complex to compute.
289 Your computer may appear to freeze for a while with cpu usage at 100%%.
290 If this occurs, you can cancel the traceback with Ctrl-C (maybe hitting
291 it more than once).
292 """,
293 metavar='InteractiveShell.xmode')
294 ),
295 (('--ext',), dict(
296 type=str, dest='Global.extra_extension',
297 help="The dotted module name of an IPython extension to load.",
298 metavar='Global.extra_extension')
299 ),
300 (('-c',), dict(
301 type=str, dest='Global.code_to_run',
302 help="Execute the given command string.",
303 metavar='Global.code_to_run')
304 ),
305 (('-i',), dict(
306 action='store_true', dest='Global.force_interact',
307 help=
308 "If running code from the command line, become interactive afterwards."
309 )
310 ),
311
312 # Options to start with GUI control enabled from the beginning
313 (('--gui',), dict(
314 type=str, dest='Global.gui',
315 help="Enable GUI event loop integration ('qt', 'wx', 'gtk').",
316 metavar='gui-mode')
317 ),
318
319 (('--pylab','-pylab'), dict(
320 type=str, dest='Global.pylab',
321 nargs='?', const='auto', metavar='gui-mode',
322 help="Pre-load matplotlib and numpy for interactive use. "+
323 "If no value is given, the gui backend is matplotlib's, else use "+
324 "one of: ['tk', 'qt', 'wx', 'gtk'].")
325 ),
326
327 # Legacy GUI options. Leave them in for backwards compatibility, but the
328 # 'thread' names are really a misnomer now.
329 (('--wthread','-wthread'), dict(
330 action='store_true', dest='Global.wthread',
331 help="Enable wxPython event loop integration "+
332 "(DEPRECATED, use --gui wx)")
333 ),
334 (('--q4thread','--qthread','-q4thread','-qthread'), dict(
335 action='store_true', dest='Global.q4thread',
336 help="Enable Qt4 event loop integration. Qt3 is no longer supported. "+
337 "(DEPRECATED, use --gui qt)")
338 ),
339 (('--gthread','-gthread'), dict(
340 action='store_true', dest='Global.gthread',
341 help="Enable GTK event loop integration. "+
342 "(DEPRECATED, use --gui gtk)")
343 ),
344 )
50
51 class IPAppConfigLoader(BaseAppConfigLoader):
52
53 def _add_arguments(self):
54 super(IPAppConfigLoader, self)._add_arguments()
55 paa = self.parser.add_argument
56 paa('-p',
57 '--profile', dest='Global.profile', type=unicode,
58 help=
59 """The string name of the ipython profile to be used. Assume that your
60 config file is ipython_config-<name>.py (looks in current dir first,
61 then in IPYTHON_DIR). This is a quick way to keep and load multiple
62 config files for different tasks, especially if include your basic one
63 in your more specialized ones. You can keep a basic
64 IPYTHON_DIR/ipython_config.py file and then have other 'profiles' which
65 include this one and load extra things for particular tasks.""",
66 metavar='Global.profile')
67 paa('--config-file',
68 dest='Global.config_file', type=unicode,
69 help=
70 """Set the config file name to override default. Normally IPython
71 loads ipython_config.py (from current directory) or
72 IPYTHON_DIR/ipython_config.py. If the loading of your config file
73 fails, IPython starts with a bare bones configuration (no modules
74 loaded at all).""",
75 metavar='Global.config_file')
76 paa('--autocall',
77 dest='InteractiveShell.autocall', type=int,
78 help=
79 """Make IPython automatically call any callable object even if you
80 didn't type explicit parentheses. For example, 'str 43' becomes
81 'str(43)' automatically. The value can be '0' to disable the feature,
82 '1' for 'smart' autocall, where it is not applied if there are no more
83 arguments on the line, and '2' for 'full' autocall, where all callable
84 objects are automatically called (even if no arguments are present).
85 The default is '1'.""",
86 metavar='InteractiveShell.autocall')
87 paa('--autoindent',
88 action='store_true', dest='InteractiveShell.autoindent',
89 help='Turn on autoindenting.')
90 paa('--no-autoindent',
91 action='store_false', dest='InteractiveShell.autoindent',
92 help='Turn off autoindenting.')
93 paa('--automagic',
94 action='store_true', dest='InteractiveShell.automagic',
95 help=
96 """Turn on the auto calling of magic commands. Type %%magic at the
97 IPython prompt for more information.""")
98 paa('--no-automagic',
99 action='store_false', dest='InteractiveShell.automagic',
100 help='Turn off the auto calling of magic commands.')
101 paa('--autoedit-syntax',
102 action='store_true', dest='InteractiveShell.autoedit_syntax',
103 help='Turn on auto editing of files with syntax errors.')
104 paa('--no-autoedit-syntax',
105 action='store_false', dest='InteractiveShell.autoedit_syntax',
106 help='Turn off auto editing of files with syntax errors.')
107 paa('--banner',
108 action='store_true', dest='Global.display_banner',
109 help='Display a banner upon starting IPython.')
110 paa('--no-banner',
111 action='store_false', dest='Global.display_banner',
112 help="Don't display a banner upon starting IPython.")
113 paa('--cache-size',
114 type=int, dest='InteractiveShell.cache_size',
115 help=
116 """Set the size of the output cache. The default is 1000, you can
117 change it permanently in your config file. Setting it to 0 completely
118 disables the caching system, and the minimum value accepted is 20 (if
119 you provide a value less than 20, it is reset to 0 and a warning is
120 issued). This limit is defined because otherwise you'll spend more
121 time re-flushing a too small cache than working""",
122 metavar='InteractiveShell.cache_size')
123 paa('--classic',
124 action='store_true', dest='Global.classic',
125 help="Gives IPython a similar feel to the classic Python prompt.")
126 paa('--colors',
127 type=str, dest='InteractiveShell.colors',
128 help="Set the color scheme (NoColor, Linux, and LightBG).",
129 metavar='InteractiveShell.colors')
130 paa('--color-info',
131 action='store_true', dest='InteractiveShell.color_info',
132 help=
133 """IPython can display information about objects via a set of func-
134 tions, and optionally can use colors for this, syntax highlighting
135 source code and various other elements. However, because this
136 information is passed through a pager (like 'less') and many pagers get
137 confused with color codes, this option is off by default. You can test
138 it and turn it on permanently in your ipython_config.py file if it
139 works for you. Test it and turn it on permanently if it works with
140 your system. The magic function %%color_info allows you to toggle this
141 inter- actively for testing.""")
142 paa('--no-color-info',
143 action='store_false', dest='InteractiveShell.color_info',
144 help="Disable using colors for info related things.")
145 paa('--confirm-exit',
146 action='store_true', dest='InteractiveShell.confirm_exit',
147 help=
148 """Set to confirm when you try to exit IPython with an EOF (Control-D
149 in Unix, Control-Z/Enter in Windows). By typing 'exit', 'quit' or
150 '%%Exit', you can force a direct exit without any confirmation.""")
151 paa('--no-confirm-exit',
152 action='store_false', dest='InteractiveShell.confirm_exit',
153 help="Don't prompt the user when exiting.")
154 paa('--deep-reload',
155 action='store_true', dest='InteractiveShell.deep_reload',
156 help=
157 """Enable deep (recursive) reloading by default. IPython can use the
158 deep_reload module which reloads changes in modules recursively (it
159 replaces the reload() function, so you don't need to change anything to
160 use it). deep_reload() forces a full reload of modules whose code may
161 have changed, which the default reload() function does not. When
162 deep_reload is off, IPython will use the normal reload(), but
163 deep_reload will still be available as dreload(). This fea- ture is off
164 by default [which means that you have both normal reload() and
165 dreload()].""")
166 paa('--no-deep-reload',
167 action='store_false', dest='InteractiveShell.deep_reload',
168 help="Disable deep (recursive) reloading by default.")
169 paa('--editor',
170 type=str, dest='InteractiveShell.editor',
171 help="Set the editor used by IPython (default to $EDITOR/vi/notepad).",
172 metavar='InteractiveShell.editor')
173 paa('--log','-l',
174 action='store_true', dest='InteractiveShell.logstart',
175 help="Start logging to the default log file (./ipython_log.py).")
176 paa('--logfile','-lf',
177 type=unicode, dest='InteractiveShell.logfile',
178 help="Start logging to logfile with this name.",
179 metavar='InteractiveShell.logfile')
180 paa('--log-append','-la',
181 type=unicode, dest='InteractiveShell.logappend',
182 help="Start logging to the given file in append mode.",
183 metavar='InteractiveShell.logfile')
184 paa('--pdb',
185 action='store_true', dest='InteractiveShell.pdb',
186 help="Enable auto calling the pdb debugger after every exception.")
187 paa('--no-pdb',
188 action='store_false', dest='InteractiveShell.pdb',
189 help="Disable auto calling the pdb debugger after every exception.")
190 paa('--pprint',
191 action='store_true', dest='InteractiveShell.pprint',
192 help="Enable auto pretty printing of results.")
193 paa('--no-pprint',
194 action='store_false', dest='InteractiveShell.pprint',
195 help="Disable auto auto pretty printing of results.")
196 paa('--prompt-in1','-pi1',
197 type=str, dest='InteractiveShell.prompt_in1',
198 help=
199 """Set the main input prompt ('In [\#]: '). Note that if you are using
200 numbered prompts, the number is represented with a '\#' in the string.
201 Don't forget to quote strings with spaces embedded in them. Most
202 bash-like escapes can be used to customize IPython's prompts, as well
203 as a few additional ones which are IPython-spe- cific. All valid
204 prompt escapes are described in detail in the Customization section of
205 the IPython manual.""",
206 metavar='InteractiveShell.prompt_in1')
207 paa('--prompt-in2','-pi2',
208 type=str, dest='InteractiveShell.prompt_in2',
209 help=
210 """Set the secondary input prompt (' .\D.: '). Similar to the previous
211 option, but used for the continuation prompts. The special sequence
212 '\D' is similar to '\#', but with all digits replaced by dots (so you
213 can have your continuation prompt aligned with your input prompt).
214 Default: ' .\D.: ' (note three spaces at the start for alignment with
215 'In [\#]')""",
216 metavar='InteractiveShell.prompt_in2')
217 paa('--prompt-out','-po',
218 type=str, dest='InteractiveShell.prompt_out',
219 help="Set the output prompt ('Out[\#]:')",
220 metavar='InteractiveShell.prompt_out')
221 paa('--quick',
222 action='store_true', dest='Global.quick',
223 help="Enable quick startup with no config files.")
224 paa('--readline',
225 action='store_true', dest='InteractiveShell.readline_use',
226 help="Enable readline for command line usage.")
227 paa('--no-readline',
228 action='store_false', dest='InteractiveShell.readline_use',
229 help="Disable readline for command line usage.")
230 paa('--screen-length','-sl',
231 type=int, dest='InteractiveShell.screen_length',
232 help=
233 """Number of lines of your screen, used to control printing of very
234 long strings. Strings longer than this number of lines will be sent
235 through a pager instead of directly printed. The default value for
236 this is 0, which means IPython will auto-detect your screen size every
237 time it needs to print certain potentially long strings (this doesn't
238 change the behavior of the 'print' keyword, it's only triggered
239 internally). If for some reason this isn't working well (it needs
240 curses support), specify it yourself. Otherwise don't change the
241 default.""",
242 metavar='InteractiveShell.screen_length')
243 paa('--separate-in','-si',
244 type=str, dest='InteractiveShell.separate_in',
245 help="Separator before input prompts. Default '\\n'.",
246 metavar='InteractiveShell.separate_in')
247 paa('--separate-out','-so',
248 type=str, dest='InteractiveShell.separate_out',
249 help="Separator before output prompts. Default 0 (nothing).",
250 metavar='InteractiveShell.separate_out')
251 paa('--separate-out2','-so2',
252 type=str, dest='InteractiveShell.separate_out2',
253 help="Separator after output prompts. Default 0 (nonight).",
254 metavar='InteractiveShell.separate_out2')
255 paa('--no-sep',
256 action='store_true', dest='Global.nosep',
257 help="Eliminate all spacing between prompts.")
258 paa('--term-title',
259 action='store_true', dest='InteractiveShell.term_title',
260 help="Enable auto setting the terminal title.")
261 paa('--no-term-title',
262 action='store_false', dest='InteractiveShell.term_title',
263 help="Disable auto setting the terminal title.")
264 paa('--xmode',
265 type=str, dest='InteractiveShell.xmode',
266 help=
267 """Exception reporting mode ('Plain','Context','Verbose'). Plain:
268 similar to python's normal traceback printing. Context: prints 5 lines
269 of context source code around each line in the traceback. Verbose:
270 similar to Context, but additionally prints the variables currently
271 visible where the exception happened (shortening their strings if too
272 long). This can potentially be very slow, if you happen to have a huge
273 data structure whose string representation is complex to compute.
274 Your computer may appear to freeze for a while with cpu usage at 100%%.
275 If this occurs, you can cancel the traceback with Ctrl-C (maybe hitting
276 it more than once).
277 """,
278 metavar='InteractiveShell.xmode')
279 paa('--ext',
280 type=str, dest='Global.extra_extension',
281 help="The dotted module name of an IPython extension to load.",
282 metavar='Global.extra_extension')
283 paa('-c',
284 type=str, dest='Global.code_to_run',
285 help="Execute the given command string.",
286 metavar='Global.code_to_run')
287 paa('-i',
288 action='store_true', dest='Global.force_interact',
289 help=
290 "If running code from the command line, become interactive afterwards.")
291
292 # Options to start with GUI control enabled from the beginning
293 paa('--gui',
294 type=str, dest='Global.gui',
295 help="Enable GUI event loop integration ('qt', 'wx', 'gtk').",
296 metavar='gui-mode')
297 paa('--pylab','-pylab',
298 type=str, dest='Global.pylab',
299 nargs='?', const='auto', metavar='gui-mode',
300 help="Pre-load matplotlib and numpy for interactive use. "+
301 "If no value is given, the gui backend is matplotlib's, else use "+
302 "one of: ['tk', 'qt', 'wx', 'gtk'].")
303
304 # Legacy GUI options. Leave them in for backwards compatibility, but the
305 # 'thread' names are really a misnomer now.
306 paa('--wthread', '-wthread',
307 action='store_true', dest='Global.wthread',
308 help=
309 """Enable wxPython event loop integration. (DEPRECATED, use --gui wx)""")
310 paa('--q4thread', '--qthread', '-q4thread', '-qthread',
311 action='store_true', dest='Global.q4thread',
312 help=
313 """Enable Qt4 event loop integration. Qt3 is no longer supported.
314 (DEPRECATED, use --gui qt)""")
315 paa('--gthread', '-gthread',
316 action='store_true', dest='Global.gthread',
317 help=
318 """Enable GTK event loop integration. (DEPRECATED, use --gui gtk)""")
319
345 320
346 321 #-----------------------------------------------------------------------------
347 # Main classes and functions
322 # Crash handler for this application
348 323 #-----------------------------------------------------------------------------
349 324
350 class IPythonApp(Application):
351 name = u'ipython'
352 #: argparse formats better the 'usage' than the 'description' field
353 description = None
354 #: usage message printed by argparse. If None, auto-generate
355 usage = usage.cl_usage
356 325
357 config_file_name = default_config_file_name
326 _message_template = """\
327 Oops, $self.app_name crashed. We do our best to make it stable, but...
328
329 A crash report was automatically generated with the following information:
330 - A verbatim copy of the crash traceback.
331 - A copy of your input history during this session.
332 - Data on your current $self.app_name configuration.
358 333
359 cl_arguments = Application.cl_arguments + cl_args
334 It was left in the file named:
335 \t'$self.crash_report_fname'
336 If you can email this file to the developers, the information in it will help
337 them in understanding and correcting the problem.
360 338
361 # Private and configuration attributes
362 _CrashHandler = crashhandler.IPythonCrashHandler
363
364 def __init__(self, argv=None,
365 constructor_config=None, override_config=None,
366 **shell_params):
367 """Create a new IPythonApp.
339 You can mail it to: $self.contact_name at $self.contact_email
340 with the subject '$self.app_name Crash Report'.
368 341
369 See the parent class for details on how configuration is handled.
342 If you want to do it now, the following command will work (under Unix):
343 mail -s '$self.app_name Crash Report' $self.contact_email < $self.crash_report_fname
370 344
371 Parameters
372 ----------
373 argv : optional, list
374 If given, used as the command-line argv environment to read arguments
375 from.
345 To ensure accurate tracking of this issue, please file a report about it at:
346 $self.bug_tracker
347 """
376 348
377 constructor_config : optional, Config
378 If given, additional config that is merged last, after internal
379 defaults, command-line and file-based configs.
349 class IPAppCrashHandler(CrashHandler):
350 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
380 351
381 override_config : optional, Config
382 If given, config that overrides all others unconditionally (except
383 for internal defaults, which ensure that all parameters exist).
352 message_template = _message_template
384 353
385 shell_params : optional, dict
386 All other keywords are passed to the :class:`iplib.InteractiveShell`
387 constructor.
388 """
389 super(IPythonApp, self).__init__(argv, constructor_config,
390 override_config)
391 self.shell_params = shell_params
354 def __init__(self, app):
355 contact_name = release.authors['Fernando'][0]
356 contact_email = release.authors['Fernando'][1]
357 bug_tracker = 'https://bugs.launchpad.net/ipython/+filebug'
358 super(IPAppCrashHandler,self).__init__(
359 app, contact_name, contact_email, bug_tracker
360 )
361
362 def make_report(self,traceback):
363 """Return a string containing a crash report."""
364
365 sec_sep = self.section_sep
366 # Start with parent report
367 report = [super(IPAppCrashHandler, self).make_report(traceback)]
368 # Add interactive-specific info we may have
369 rpt_add = report.append
370 try:
371 rpt_add(sec_sep+"History of session input:")
372 for line in self.app.shell.user_ns['_ih']:
373 rpt_add(line)
374 rpt_add('\n*** Last line of input (may not be in above history):\n')
375 rpt_add(self.app.shell._last_input_line+'\n')
376 except:
377 pass
378
379 return ''.join(report)
380
381
382 #-----------------------------------------------------------------------------
383 # Main classes and functions
384 #-----------------------------------------------------------------------------
385
386 class IPythonApp(Application):
387 name = u'ipython'
388 #: argparse formats better the 'usage' than the 'description' field
389 description = None
390 usage = usage.cl_usage
391 command_line_loader = IPAppConfigLoader
392 default_config_file_name = default_config_file_name
393 crash_handler_class = IPAppCrashHandler
392 394
393 395 def create_default_config(self):
394 396 super(IPythonApp, self).create_default_config()
395 397 # Eliminate multiple lookups
396 398 Global = self.default_config.Global
397 399
398 400 # Set all default values
399 401 Global.display_banner = True
400 402
401 403 # If the -c flag is given or a file is given to run at the cmd line
402 404 # like "ipython foo.py", normally we exit without starting the main
403 405 # loop. The force_interact config variable allows a user to override
404 406 # this and interact. It is also set by the -i cmd line flag, just
405 407 # like Python.
406 408 Global.force_interact = False
407 409
408 410 # By default always interact by starting the IPython mainloop.
409 411 Global.interact = True
410 412
411 413 # No GUI integration by default
412 414 Global.gui = False
413 415 # Pylab off by default
414 416 Global.pylab = False
415 417
416 418 # Deprecated versions of gui support that used threading, we support
417 419 # them just for bacwards compatibility as an alternate spelling for
418 420 # '--gui X'
419 421 Global.qthread = False
420 422 Global.q4thread = False
421 423 Global.wthread = False
422 424 Global.gthread = False
423 425
424 426 def load_file_config(self):
425 427 if hasattr(self.command_line_config.Global, 'quick'):
426 428 if self.command_line_config.Global.quick:
427 429 self.file_config = Config()
428 430 return
429 431 super(IPythonApp, self).load_file_config()
430 432
431 433 def post_load_file_config(self):
432 434 if hasattr(self.command_line_config.Global, 'extra_extension'):
433 435 if not hasattr(self.file_config.Global, 'extensions'):
434 436 self.file_config.Global.extensions = []
435 437 self.file_config.Global.extensions.append(
436 438 self.command_line_config.Global.extra_extension)
437 439 del self.command_line_config.Global.extra_extension
438 440
439 441 def pre_construct(self):
440 442 config = self.master_config
441 443
442 444 if hasattr(config.Global, 'classic'):
443 445 if config.Global.classic:
444 446 config.InteractiveShell.cache_size = 0
445 447 config.InteractiveShell.pprint = 0
446 448 config.InteractiveShell.prompt_in1 = '>>> '
447 449 config.InteractiveShell.prompt_in2 = '... '
448 450 config.InteractiveShell.prompt_out = ''
449 451 config.InteractiveShell.separate_in = \
450 452 config.InteractiveShell.separate_out = \
451 453 config.InteractiveShell.separate_out2 = ''
452 454 config.InteractiveShell.colors = 'NoColor'
453 455 config.InteractiveShell.xmode = 'Plain'
454 456
455 457 if hasattr(config.Global, 'nosep'):
456 458 if config.Global.nosep:
457 459 config.InteractiveShell.separate_in = \
458 460 config.InteractiveShell.separate_out = \
459 461 config.InteractiveShell.separate_out2 = ''
460 462
461 463 # if there is code of files to run from the cmd line, don't interact
462 464 # unless the -i flag (Global.force_interact) is true.
463 465 code_to_run = config.Global.get('code_to_run','')
464 466 file_to_run = False
465 467 if self.extra_args and self.extra_args[0]:
466 468 file_to_run = True
467 469 if file_to_run or code_to_run:
468 470 if not config.Global.force_interact:
469 471 config.Global.interact = False
470 472
471 473 def construct(self):
472 474 # I am a little hesitant to put these into InteractiveShell itself.
473 475 # But that might be the place for them
474 476 sys.path.insert(0, '')
475 477
476 478 # Create an InteractiveShell instance
477 self.shell = InteractiveShell(None, self.master_config,
478 **self.shell_params )
479 self.shell = InteractiveShell(None, self.master_config)
479 480
480 481 def post_construct(self):
481 482 """Do actions after construct, but before starting the app."""
482 483 config = self.master_config
483 484
484 485 # shell.display_banner should always be False for the terminal
485 486 # based app, because we call shell.show_banner() by hand below
486 487 # so the banner shows *before* all extension loading stuff.
487 488 self.shell.display_banner = False
488
489 489 if config.Global.display_banner and \
490 490 config.Global.interact:
491 491 self.shell.show_banner()
492 492
493 493 # Make sure there is a space below the banner.
494 494 if self.log_level <= logging.INFO: print
495 495
496 496 # Now a variety of things that happen after the banner is printed.
497 497 self._enable_gui_pylab()
498 498 self._load_extensions()
499 499 self._run_exec_lines()
500 500 self._run_exec_files()
501 501 self._run_cmd_line_code()
502 self._configure_xmode()
503 502
504 503 def _enable_gui_pylab(self):
505 504 """Enable GUI event loop integration, taking pylab into account."""
506 505 Global = self.master_config.Global
507 506
508 507 # Select which gui to use
509 508 if Global.gui:
510 509 gui = Global.gui
511 510 # The following are deprecated, but there's likely to be a lot of use
512 511 # of this form out there, so we might as well support it for now. But
513 512 # the --gui option above takes precedence.
514 513 elif Global.wthread:
515 514 gui = inputhook.GUI_WX
516 515 elif Global.qthread:
517 516 gui = inputhook.GUI_QT
518 517 elif Global.gthread:
519 518 gui = inputhook.GUI_GTK
520 519 else:
521 520 gui = None
522 521
523 522 # Using --pylab will also require gui activation, though which toolkit
524 523 # to use may be chosen automatically based on mpl configuration.
525 524 if Global.pylab:
526 525 activate = self.shell.enable_pylab
527 526 if Global.pylab == 'auto':
528 527 gui = None
529 528 else:
530 529 gui = Global.pylab
531 530 else:
532 531 # Enable only GUI integration, no pylab
533 532 activate = inputhook.enable_gui
534 533
535 534 if gui or Global.pylab:
536 535 try:
537 536 self.log.info("Enabling GUI event loop integration, "
538 537 "toolkit=%s, pylab=%s" % (gui, Global.pylab) )
539 538 activate(gui)
540 539 except:
541 540 self.log.warn("Error in enabling GUI event loop integration:")
542 541 self.shell.showtraceback()
543 542
544 543 def _load_extensions(self):
545 544 """Load all IPython extensions in Global.extensions.
546 545
547 546 This uses the :meth:`InteractiveShell.load_extensions` to load all
548 547 the extensions listed in ``self.master_config.Global.extensions``.
549 548 """
550 549 try:
551 550 if hasattr(self.master_config.Global, 'extensions'):
552 551 self.log.debug("Loading IPython extensions...")
553 552 extensions = self.master_config.Global.extensions
554 553 for ext in extensions:
555 554 try:
556 555 self.log.info("Loading IPython extension: %s" % ext)
557 556 self.shell.load_extension(ext)
558 557 except:
559 558 self.log.warn("Error in loading extension: %s" % ext)
560 559 self.shell.showtraceback()
561 560 except:
562 561 self.log.warn("Unknown error in loading extensions:")
563 562 self.shell.showtraceback()
564 563
565 564 def _run_exec_lines(self):
566 565 """Run lines of code in Global.exec_lines in the user's namespace."""
567 566 try:
568 567 if hasattr(self.master_config.Global, 'exec_lines'):
569 568 self.log.debug("Running code from Global.exec_lines...")
570 569 exec_lines = self.master_config.Global.exec_lines
571 570 for line in exec_lines:
572 571 try:
573 572 self.log.info("Running code in user namespace: %s" % line)
574 573 self.shell.runlines(line)
575 574 except:
576 575 self.log.warn("Error in executing line in user namespace: %s" % line)
577 576 self.shell.showtraceback()
578 577 except:
579 578 self.log.warn("Unknown error in handling Global.exec_lines:")
580 579 self.shell.showtraceback()
581 580
582 581 def _exec_file(self, fname):
583 582 full_filename = filefind(fname, [u'.', self.ipython_dir])
584 583 if os.path.isfile(full_filename):
585 584 if full_filename.endswith(u'.py'):
586 585 self.log.info("Running file in user namespace: %s" % full_filename)
587 586 self.shell.safe_execfile(full_filename, self.shell.user_ns)
588 587 elif full_filename.endswith('.ipy'):
589 588 self.log.info("Running file in user namespace: %s" % full_filename)
590 589 self.shell.safe_execfile_ipy(full_filename)
591 590 else:
592 591 self.log.warn("File does not have a .py or .ipy extension: <%s>" % full_filename)
593 592
594 593 def _run_exec_files(self):
595 594 try:
596 595 if hasattr(self.master_config.Global, 'exec_files'):
597 596 self.log.debug("Running files in Global.exec_files...")
598 597 exec_files = self.master_config.Global.exec_files
599 598 for fname in exec_files:
600 599 self._exec_file(fname)
601 600 except:
602 601 self.log.warn("Unknown error in handling Global.exec_files:")
603 602 self.shell.showtraceback()
604 603
605 604 def _run_cmd_line_code(self):
606 605 if hasattr(self.master_config.Global, 'code_to_run'):
607 606 line = self.master_config.Global.code_to_run
608 607 try:
609 608 self.log.info("Running code given at command line (-c): %s" % line)
610 609 self.shell.runlines(line)
611 610 except:
612 611 self.log.warn("Error in executing line in user namespace: %s" % line)
613 612 self.shell.showtraceback()
614 613 return
615 614 # Like Python itself, ignore the second if the first of these is present
616 615 try:
617 616 fname = self.extra_args[0]
618 617 except:
619 618 pass
620 619 else:
621 620 try:
622 621 self._exec_file(fname)
623 622 except:
624 623 self.log.warn("Error in executing file in user namespace: %s" % fname)
625 624 self.shell.showtraceback()
626 625
627 def _configure_xmode(self):
628 # XXX - shouldn't this be read from the config? I'm still a little
629 # lost with all the details of handling the new config guys...
630 self.shell.InteractiveTB.set_mode(mode=self.shell.xmode)
631
632 626 def start_app(self):
633 627 if self.master_config.Global.interact:
634 628 self.log.debug("Starting IPython's mainloop...")
635 629 self.shell.mainloop()
636 630 else:
637 631 self.log.debug("IPython not interactive, start_app is no-op...")
638 632
639 633
640 634 def load_default_config(ipython_dir=None):
641 635 """Load the default config file from the default ipython_dir.
642 636
643 637 This is useful for embedded shells.
644 638 """
645 639 if ipython_dir is None:
646 640 ipython_dir = get_ipython_dir()
647 641 cl = PyFileConfigLoader(default_config_file_name, ipython_dir)
648 642 config = cl.load_config()
649 643 return config
650 644
651 645
652 646 def launch_new_instance():
653 647 """Create and run a full blown IPython instance"""
654 648 app = IPythonApp()
655 649 app.start()
650
651
652 if __name__ == '__main__':
653 launch_new_instance()
@@ -1,2549 +1,2561 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Main IPython Component
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
8 8 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
9 9 # Copyright (C) 2008-2009 The IPython Development Team
10 10 #
11 11 # Distributed under the terms of the BSD License. The full license is in
12 12 # the file COPYING, distributed as part of this software.
13 13 #-----------------------------------------------------------------------------
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Imports
17 17 #-----------------------------------------------------------------------------
18 18
19 19 from __future__ import with_statement
20 20 from __future__ import absolute_import
21 21
22 22 import __builtin__
23 import StringIO
24 23 import bdb
25 24 import codeop
26 25 import exceptions
27 26 import new
28 27 import os
29 28 import re
30 29 import string
31 30 import sys
32 31 import tempfile
33 32 from contextlib import nested
34 33
35 34 from IPython.core import debugger, oinspect
36 35 from IPython.core import history as ipcorehist
37 36 from IPython.core import prefilter
38 37 from IPython.core import shadowns
39 38 from IPython.core import ultratb
40 39 from IPython.core.alias import AliasManager
41 40 from IPython.core.builtin_trap import BuiltinTrap
42 41 from IPython.core.component import Component
43 42 from IPython.core.display_trap import DisplayTrap
44 43 from IPython.core.error import TryNext, UsageError
45 44 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
46 45 from IPython.core.logger import Logger
47 46 from IPython.core.magic import Magic
48 47 from IPython.core.prefilter import PrefilterManager
49 48 from IPython.core.prompts import CachedOutput
50 from IPython.core.pylabtools import pylab_activate
51 49 from IPython.core.usage import interactive_usage, default_banner
50 import IPython.core.hooks
52 51 from IPython.external.Itpl import ItplNS
53 52 from IPython.lib.inputhook import enable_gui
54 53 from IPython.lib.backgroundjobs import BackgroundJobManager
54 from IPython.lib.pylabtools import pylab_activate
55 55 from IPython.utils import PyColorize
56 56 from IPython.utils import pickleshare
57 from IPython.utils.genutils import get_ipython_dir
57 from IPython.utils.doctestreload import doctest_reload
58 58 from IPython.utils.ipstruct import Struct
59 from IPython.utils.platutils import toggle_set_term_title, set_term_title
59 from IPython.utils.io import Term, ask_yes_no
60 from IPython.utils.path import get_home_dir, get_ipython_dir, HomeDirError
61 from IPython.utils.process import (
62 abbrev_cwd,
63 getoutput,
64 getoutputerror
65 )
66 # import IPython.utils.rlineimpl as readline
60 67 from IPython.utils.strdispatch import StrDispatch
61 68 from IPython.utils.syspathcontext import prepended_to_syspath
62
63 # XXX - need to clean up this import * line
64 from IPython.utils.genutils import *
65
66 # from IPython.utils import growl
67 # growl.start("IPython")
68
69 from IPython.utils.terminal import toggle_set_term_title, set_term_title
70 from IPython.utils.warn import warn, error, fatal
69 71 from IPython.utils.traitlets import (
70 72 Int, Str, CBool, CaselessStrEnum, Enum, List, Unicode
71 73 )
72 74
75 # from IPython.utils import growl
76 # growl.start("IPython")
77
73 78 #-----------------------------------------------------------------------------
74 79 # Globals
75 80 #-----------------------------------------------------------------------------
76 81
77 82 # store the builtin raw_input globally, and use this always, in case user code
78 83 # overwrites it (like wx.py.PyShell does)
79 84 raw_input_original = raw_input
80 85
81 86 # compiled regexps for autoindent management
82 87 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
83 88
84 89 #-----------------------------------------------------------------------------
85 90 # Utilities
86 91 #-----------------------------------------------------------------------------
87 92
88 93 ini_spaces_re = re.compile(r'^(\s+)')
89 94
90 95
91 96 def num_ini_spaces(strng):
92 97 """Return the number of initial spaces in a string"""
93 98
94 99 ini_spaces = ini_spaces_re.match(strng)
95 100 if ini_spaces:
96 101 return ini_spaces.end()
97 102 else:
98 103 return 0
99 104
100 105
101 106 def softspace(file, newvalue):
102 107 """Copied from code.py, to remove the dependency"""
103 108
104 109 oldvalue = 0
105 110 try:
106 111 oldvalue = file.softspace
107 112 except AttributeError:
108 113 pass
109 114 try:
110 115 file.softspace = newvalue
111 116 except (AttributeError, TypeError):
112 117 # "attribute-less object" or "read-only attributes"
113 118 pass
114 119 return oldvalue
115 120
116 121
117 122 def no_op(*a, **kw): pass
118 123
119 124 class SpaceInInput(exceptions.Exception): pass
120 125
121 126 class Bunch: pass
122 127
123 128 class InputList(list):
124 129 """Class to store user input.
125 130
126 131 It's basically a list, but slices return a string instead of a list, thus
127 132 allowing things like (assuming 'In' is an instance):
128 133
129 134 exec In[4:7]
130 135
131 136 or
132 137
133 138 exec In[5:9] + In[14] + In[21:25]"""
134 139
135 140 def __getslice__(self,i,j):
136 141 return ''.join(list.__getslice__(self,i,j))
137 142
138 143
139 144 class SyntaxTB(ultratb.ListTB):
140 145 """Extension which holds some state: the last exception value"""
141 146
142 147 def __init__(self,color_scheme = 'NoColor'):
143 148 ultratb.ListTB.__init__(self,color_scheme)
144 149 self.last_syntax_error = None
145 150
146 151 def __call__(self, etype, value, elist):
147 152 self.last_syntax_error = value
148 153 ultratb.ListTB.__call__(self,etype,value,elist)
149 154
150 155 def clear_err_state(self):
151 156 """Return the current error state and clear it"""
152 157 e = self.last_syntax_error
153 158 self.last_syntax_error = None
154 159 return e
155 160
156 161
157 162 def get_default_editor():
158 163 try:
159 164 ed = os.environ['EDITOR']
160 165 except KeyError:
161 166 if os.name == 'posix':
162 167 ed = 'vi' # the only one guaranteed to be there!
163 168 else:
164 169 ed = 'notepad' # same in Windows!
165 170 return ed
166 171
167 172
168 173 def get_default_colors():
169 174 if sys.platform=='darwin':
170 175 return "LightBG"
171 176 elif os.name=='nt':
172 177 return 'Linux'
173 178 else:
174 179 return 'Linux'
175 180
176 181
177 182 class SeparateStr(Str):
178 183 """A Str subclass to validate separate_in, separate_out, etc.
179 184
180 185 This is a Str based traitlet that converts '0'->'' and '\\n'->'\n'.
181 186 """
182 187
183 188 def validate(self, obj, value):
184 189 if value == '0': value = ''
185 190 value = value.replace('\\n','\n')
186 191 return super(SeparateStr, self).validate(obj, value)
187 192
188 193
189 def make_user_namespaces(user_ns=None, user_global_ns=None):
190 """Return a valid local and global user interactive namespaces.
191
192 This builds a dict with the minimal information needed to operate as a
193 valid IPython user namespace, which you can pass to the various
194 embedding classes in ipython. The default implementation returns the
195 same dict for both the locals and the globals to allow functions to
196 refer to variables in the namespace. Customized implementations can
197 return different dicts. The locals dictionary can actually be anything
198 following the basic mapping protocol of a dict, but the globals dict
199 must be a true dict, not even a subclass. It is recommended that any
200 custom object for the locals namespace synchronize with the globals
201 dict somehow.
202
203 Raises TypeError if the provided globals namespace is not a true dict.
204
205 Parameters
206 ----------
207 user_ns : dict-like, optional
208 The current user namespace. The items in this namespace should
209 be included in the output. If None, an appropriate blank
210 namespace should be created.
211 user_global_ns : dict, optional
212 The current user global namespace. The items in this namespace
213 should be included in the output. If None, an appropriate
214 blank namespace should be created.
215
216 Returns
217 -------
218 A pair of dictionary-like object to be used as the local namespace
219 of the interpreter and a dict to be used as the global namespace.
220 """
221
222
223 # We must ensure that __builtin__ (without the final 's') is always
224 # available and pointing to the __builtin__ *module*. For more details:
225 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
226
227 if user_ns is None:
228 # Set __name__ to __main__ to better match the behavior of the
229 # normal interpreter.
230 user_ns = {'__name__' :'__main__',
231 '__builtin__' : __builtin__,
232 '__builtins__' : __builtin__,
233 }
234 else:
235 user_ns.setdefault('__name__','__main__')
236 user_ns.setdefault('__builtin__',__builtin__)
237 user_ns.setdefault('__builtins__',__builtin__)
238
239 if user_global_ns is None:
240 user_global_ns = user_ns
241 if type(user_global_ns) is not dict:
242 raise TypeError("user_global_ns must be a true dict; got %r"
243 % type(user_global_ns))
244
245 return user_ns, user_global_ns
246
247 194 #-----------------------------------------------------------------------------
248 195 # Main IPython class
249 196 #-----------------------------------------------------------------------------
250 197
251 198
252 199 class InteractiveShell(Component, Magic):
253 200 """An enhanced, interactive shell for Python."""
254 201
255 202 autocall = Enum((0,1,2), default_value=1, config=True)
256 203 autoedit_syntax = CBool(False, config=True)
257 204 autoindent = CBool(True, config=True)
258 205 automagic = CBool(True, config=True)
259 206 banner = Str('')
260 207 banner1 = Str(default_banner, config=True)
261 208 banner2 = Str('', config=True)
262 209 cache_size = Int(1000, config=True)
263 210 color_info = CBool(True, config=True)
264 211 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
265 212 default_value=get_default_colors(), config=True)
266 213 confirm_exit = CBool(True, config=True)
267 214 debug = CBool(False, config=True)
268 215 deep_reload = CBool(False, config=True)
269 216 # This display_banner only controls whether or not self.show_banner()
270 217 # is called when mainloop/interact are called. The default is False
271 218 # because for the terminal based application, the banner behavior
272 219 # is controlled by Global.display_banner, which IPythonApp looks at
273 220 # to determine if *it* should call show_banner() by hand or not.
274 221 display_banner = CBool(False) # This isn't configurable!
275 222 embedded = CBool(False)
276 223 embedded_active = CBool(False)
277 224 editor = Str(get_default_editor(), config=True)
278 225 filename = Str("<ipython console>")
279 226 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
280 227 logstart = CBool(False, config=True)
281 228 logfile = Str('', config=True)
282 229 logappend = Str('', config=True)
283 230 object_info_string_level = Enum((0,1,2), default_value=0,
284 231 config=True)
285 232 pager = Str('less', config=True)
286 233 pdb = CBool(False, config=True)
287 234 pprint = CBool(True, config=True)
288 235 profile = Str('', config=True)
289 236 prompt_in1 = Str('In [\\#]: ', config=True)
290 237 prompt_in2 = Str(' .\\D.: ', config=True)
291 238 prompt_out = Str('Out[\\#]: ', config=True)
292 239 prompts_pad_left = CBool(True, config=True)
293 240 quiet = CBool(False, config=True)
294 241
295 242 readline_use = CBool(True, config=True)
296 243 readline_merge_completions = CBool(True, config=True)
297 244 readline_omit__names = Enum((0,1,2), default_value=0, config=True)
298 245 readline_remove_delims = Str('-/~', config=True)
299 246 readline_parse_and_bind = List([
300 247 'tab: complete',
301 248 '"\C-l": possible-completions',
302 249 'set show-all-if-ambiguous on',
303 250 '"\C-o": tab-insert',
304 251 '"\M-i": " "',
305 252 '"\M-o": "\d\d\d\d"',
306 253 '"\M-I": "\d\d\d\d"',
307 254 '"\C-r": reverse-search-history',
308 255 '"\C-s": forward-search-history',
309 256 '"\C-p": history-search-backward',
310 257 '"\C-n": history-search-forward',
311 258 '"\e[A": history-search-backward',
312 259 '"\e[B": history-search-forward',
313 260 '"\C-k": kill-line',
314 261 '"\C-u": unix-line-discard',
315 262 ], allow_none=False, config=True)
316 263
317 264 screen_length = Int(0, config=True)
318 265
319 266 # Use custom TraitletTypes that convert '0'->'' and '\\n'->'\n'
320 267 separate_in = SeparateStr('\n', config=True)
321 268 separate_out = SeparateStr('', config=True)
322 269 separate_out2 = SeparateStr('', config=True)
323 270
324 271 system_header = Str('IPython system call: ', config=True)
325 272 system_verbose = CBool(False, config=True)
326 273 term_title = CBool(False, config=True)
327 274 wildcards_case_sensitive = CBool(True, config=True)
328 275 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
329 276 default_value='Context', config=True)
330 277
331 278 autoexec = List(allow_none=False)
332 279
333 280 # class attribute to indicate whether the class supports threads or not.
334 281 # Subclasses with thread support should override this as needed.
335 282 isthreaded = False
336 283
337 284 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
338 285 user_ns=None, user_global_ns=None,
339 286 banner1=None, banner2=None, display_banner=None,
340 287 custom_exceptions=((),None)):
341 288
342 289 # This is where traitlets with a config_key argument are updated
343 290 # from the values on config.
344 291 super(InteractiveShell, self).__init__(parent, config=config)
345 292
346 293 # These are relatively independent and stateless
347 294 self.init_ipython_dir(ipython_dir)
348 295 self.init_instance_attrs()
349 296 self.init_term_title()
350 297 self.init_usage(usage)
351 298 self.init_banner(banner1, banner2, display_banner)
352 299
353 300 # Create namespaces (user_ns, user_global_ns, etc.)
354 301 self.init_create_namespaces(user_ns, user_global_ns)
355 302 # This has to be done after init_create_namespaces because it uses
356 303 # something in self.user_ns, but before init_sys_modules, which
357 304 # is the first thing to modify sys.
358 305 self.save_sys_module_state()
359 306 self.init_sys_modules()
360 307
361 308 self.init_history()
362 309 self.init_encoding()
363 310 self.init_prefilter()
364 311
365 312 Magic.__init__(self, self)
366 313
367 314 self.init_syntax_highlighting()
368 315 self.init_hooks()
369 316 self.init_pushd_popd_magic()
370 317 self.init_traceback_handlers(custom_exceptions)
371 318 self.init_user_ns()
372 319 self.init_logger()
373 320 self.init_alias()
374 321 self.init_builtins()
375 322
376 323 # pre_config_initialization
377 324 self.init_shadow_hist()
378 325
379 326 # The next section should contain averything that was in ipmaker.
380 327 self.init_logstart()
381 328
382 329 # The following was in post_config_initialization
383 330 self.init_inspector()
384 331 self.init_readline()
385 332 self.init_prompts()
386 333 self.init_displayhook()
387 334 self.init_reload_doctest()
388 335 self.init_magics()
389 336 self.init_pdb()
390 337 self.hooks.late_startup_hook()
391 338
392 339 def get_ipython(self):
393 340 """Return the currently running IPython instance."""
394 341 return self
395 342
396 343 #-------------------------------------------------------------------------
397 344 # Traitlet changed handlers
398 345 #-------------------------------------------------------------------------
399 346
400 347 def _banner1_changed(self):
401 348 self.compute_banner()
402 349
403 350 def _banner2_changed(self):
404 351 self.compute_banner()
405 352
406 353 def _ipython_dir_changed(self, name, new):
407 354 if not os.path.isdir(new):
408 355 os.makedirs(new, mode = 0777)
409 356 if not os.path.isdir(self.ipython_extension_dir):
410 357 os.makedirs(self.ipython_extension_dir, mode = 0777)
411 358
412 359 @property
413 360 def ipython_extension_dir(self):
414 361 return os.path.join(self.ipython_dir, 'extensions')
415 362
416 363 @property
417 364 def usable_screen_length(self):
418 365 if self.screen_length == 0:
419 366 return 0
420 367 else:
421 368 num_lines_bot = self.separate_in.count('\n')+1
422 369 return self.screen_length - num_lines_bot
423 370
424 371 def _term_title_changed(self, name, new_value):
425 372 self.init_term_title()
426 373
427 374 def set_autoindent(self,value=None):
428 375 """Set the autoindent flag, checking for readline support.
429 376
430 377 If called with no arguments, it acts as a toggle."""
431 378
432 379 if not self.has_readline:
433 380 if os.name == 'posix':
434 381 warn("The auto-indent feature requires the readline library")
435 382 self.autoindent = 0
436 383 return
437 384 if value is None:
438 385 self.autoindent = not self.autoindent
439 386 else:
440 387 self.autoindent = value
441 388
442 389 #-------------------------------------------------------------------------
443 390 # init_* methods called by __init__
444 391 #-------------------------------------------------------------------------
445 392
446 393 def init_ipython_dir(self, ipython_dir):
447 394 if ipython_dir is not None:
448 395 self.ipython_dir = ipython_dir
449 396 self.config.Global.ipython_dir = self.ipython_dir
450 397 return
451 398
452 399 if hasattr(self.config.Global, 'ipython_dir'):
453 400 self.ipython_dir = self.config.Global.ipython_dir
454 401 else:
455 402 self.ipython_dir = get_ipython_dir()
456 403
457 404 # All children can just read this
458 405 self.config.Global.ipython_dir = self.ipython_dir
459 406
460 407 def init_instance_attrs(self):
461 408 self.jobs = BackgroundJobManager()
462 409 self.more = False
463 410
464 411 # command compiler
465 412 self.compile = codeop.CommandCompiler()
466 413
467 414 # User input buffer
468 415 self.buffer = []
469 416
470 417 # Make an empty namespace, which extension writers can rely on both
471 418 # existing and NEVER being used by ipython itself. This gives them a
472 419 # convenient location for storing additional information and state
473 420 # their extensions may require, without fear of collisions with other
474 421 # ipython names that may develop later.
475 422 self.meta = Struct()
476 423
477 424 # Object variable to store code object waiting execution. This is
478 425 # used mainly by the multithreaded shells, but it can come in handy in
479 426 # other situations. No need to use a Queue here, since it's a single
480 427 # item which gets cleared once run.
481 428 self.code_to_run = None
482 429
483 430 # Flag to mark unconditional exit
484 431 self.exit_now = False
485 432
486 433 # Temporary files used for various purposes. Deleted at exit.
487 434 self.tempfiles = []
488 435
489 436 # Keep track of readline usage (later set by init_readline)
490 437 self.has_readline = False
491 438
492 439 # keep track of where we started running (mainly for crash post-mortem)
493 440 # This is not being used anywhere currently.
494 441 self.starting_dir = os.getcwd()
495 442
496 443 # Indentation management
497 444 self.indent_current_nsp = 0
498 445
499 446 def init_term_title(self):
500 447 # Enable or disable the terminal title.
501 448 if self.term_title:
502 449 toggle_set_term_title(True)
503 450 set_term_title('IPython: ' + abbrev_cwd())
504 451 else:
505 452 toggle_set_term_title(False)
506 453
507 454 def init_usage(self, usage=None):
508 455 if usage is None:
509 456 self.usage = interactive_usage
510 457 else:
511 458 self.usage = usage
512 459
513 460 def init_encoding(self):
514 461 # Get system encoding at startup time. Certain terminals (like Emacs
515 462 # under Win32 have it set to None, and we need to have a known valid
516 463 # encoding to use in the raw_input() method
517 464 try:
518 465 self.stdin_encoding = sys.stdin.encoding or 'ascii'
519 466 except AttributeError:
520 467 self.stdin_encoding = 'ascii'
521 468
522 469 def init_syntax_highlighting(self):
523 470 # Python source parser/formatter for syntax highlighting
524 471 pyformat = PyColorize.Parser().format
525 472 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
526 473
527 474 def init_pushd_popd_magic(self):
528 475 # for pushd/popd management
529 476 try:
530 477 self.home_dir = get_home_dir()
531 478 except HomeDirError, msg:
532 479 fatal(msg)
533 480
534 481 self.dir_stack = []
535 482
536 483 def init_logger(self):
537 484 self.logger = Logger(self, logfname='ipython_log.py', logmode='rotate')
538 485 # local shortcut, this is used a LOT
539 486 self.log = self.logger.log
540 487
541 488 def init_logstart(self):
542 489 if self.logappend:
543 490 self.magic_logstart(self.logappend + ' append')
544 491 elif self.logfile:
545 492 self.magic_logstart(self.logfile)
546 493 elif self.logstart:
547 494 self.magic_logstart()
548 495
549 496 def init_builtins(self):
550 497 self.builtin_trap = BuiltinTrap(self)
551 498
552 499 def init_inspector(self):
553 500 # Object inspector
554 501 self.inspector = oinspect.Inspector(oinspect.InspectColors,
555 502 PyColorize.ANSICodeColors,
556 503 'NoColor',
557 504 self.object_info_string_level)
558 505
559 506 def init_prompts(self):
560 507 # Initialize cache, set in/out prompts and printing system
561 508 self.outputcache = CachedOutput(self,
562 509 self.cache_size,
563 510 self.pprint,
564 511 input_sep = self.separate_in,
565 512 output_sep = self.separate_out,
566 513 output_sep2 = self.separate_out2,
567 514 ps1 = self.prompt_in1,
568 515 ps2 = self.prompt_in2,
569 516 ps_out = self.prompt_out,
570 517 pad_left = self.prompts_pad_left)
571 518
572 519 # user may have over-ridden the default print hook:
573 520 try:
574 521 self.outputcache.__class__.display = self.hooks.display
575 522 except AttributeError:
576 523 pass
577 524
578 525 def init_displayhook(self):
579 526 self.display_trap = DisplayTrap(self, self.outputcache)
580 527
581 528 def init_reload_doctest(self):
582 529 # Do a proper resetting of doctest, including the necessary displayhook
583 530 # monkeypatching
584 531 try:
585 532 doctest_reload()
586 533 except ImportError:
587 534 warn("doctest module does not exist.")
588 535
589 536 #-------------------------------------------------------------------------
590 537 # Things related to the banner
591 538 #-------------------------------------------------------------------------
592 539
593 540 def init_banner(self, banner1, banner2, display_banner):
594 541 if banner1 is not None:
595 542 self.banner1 = banner1
596 543 if banner2 is not None:
597 544 self.banner2 = banner2
598 545 if display_banner is not None:
599 546 self.display_banner = display_banner
600 547 self.compute_banner()
601 548
602 549 def show_banner(self, banner=None):
603 550 if banner is None:
604 551 banner = self.banner
605 552 self.write(banner)
606 553
607 554 def compute_banner(self):
608 555 self.banner = self.banner1 + '\n'
609 556 if self.profile:
610 557 self.banner += '\nIPython profile: %s\n' % self.profile
611 558 if self.banner2:
612 559 self.banner += '\n' + self.banner2 + '\n'
613 560
614 561 #-------------------------------------------------------------------------
615 562 # Things related to injections into the sys module
616 563 #-------------------------------------------------------------------------
617 564
618 565 def save_sys_module_state(self):
619 566 """Save the state of hooks in the sys module.
620 567
621 568 This has to be called after self.user_ns is created.
622 569 """
623 570 self._orig_sys_module_state = {}
624 571 self._orig_sys_module_state['stdin'] = sys.stdin
625 572 self._orig_sys_module_state['stdout'] = sys.stdout
626 573 self._orig_sys_module_state['stderr'] = sys.stderr
627 574 self._orig_sys_module_state['excepthook'] = sys.excepthook
628 575 try:
629 576 self._orig_sys_modules_main_name = self.user_ns['__name__']
630 577 except KeyError:
631 578 pass
632 579
633 580 def restore_sys_module_state(self):
634 581 """Restore the state of the sys module."""
635 582 try:
636 583 for k, v in self._orig_sys_module_state.items():
637 584 setattr(sys, k, v)
638 585 except AttributeError:
639 586 pass
640 587 try:
641 588 delattr(sys, 'ipcompleter')
642 589 except AttributeError:
643 590 pass
644 591 # Reset what what done in self.init_sys_modules
645 592 try:
646 593 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
647 594 except (AttributeError, KeyError):
648 595 pass
649 596
650 597 #-------------------------------------------------------------------------
651 598 # Things related to hooks
652 599 #-------------------------------------------------------------------------
653 600
654 601 def init_hooks(self):
655 602 # hooks holds pointers used for user-side customizations
656 603 self.hooks = Struct()
657 604
658 605 self.strdispatchers = {}
659 606
660 607 # Set all default hooks, defined in the IPython.hooks module.
661 import IPython.core.hooks
662 608 hooks = IPython.core.hooks
663 609 for hook_name in hooks.__all__:
664 610 # default hooks have priority 100, i.e. low; user hooks should have
665 611 # 0-100 priority
666 612 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
667 613
668 614 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
669 615 """set_hook(name,hook) -> sets an internal IPython hook.
670 616
671 617 IPython exposes some of its internal API as user-modifiable hooks. By
672 618 adding your function to one of these hooks, you can modify IPython's
673 619 behavior to call at runtime your own routines."""
674 620
675 621 # At some point in the future, this should validate the hook before it
676 622 # accepts it. Probably at least check that the hook takes the number
677 623 # of args it's supposed to.
678 624
679 625 f = new.instancemethod(hook,self,self.__class__)
680 626
681 627 # check if the hook is for strdispatcher first
682 628 if str_key is not None:
683 629 sdp = self.strdispatchers.get(name, StrDispatch())
684 630 sdp.add_s(str_key, f, priority )
685 631 self.strdispatchers[name] = sdp
686 632 return
687 633 if re_key is not None:
688 634 sdp = self.strdispatchers.get(name, StrDispatch())
689 635 sdp.add_re(re.compile(re_key), f, priority )
690 636 self.strdispatchers[name] = sdp
691 637 return
692 638
693 639 dp = getattr(self.hooks, name, None)
694 640 if name not in IPython.core.hooks.__all__:
695 641 print "Warning! Hook '%s' is not one of %s" % (name, IPython.core.hooks.__all__ )
696 642 if not dp:
697 643 dp = IPython.core.hooks.CommandChainDispatcher()
698 644
699 645 try:
700 646 dp.add(f,priority)
701 647 except AttributeError:
702 648 # it was not commandchain, plain old func - replace
703 649 dp = f
704 650
705 651 setattr(self.hooks,name, dp)
706 652
707 653 #-------------------------------------------------------------------------
708 654 # Things related to the "main" module
709 655 #-------------------------------------------------------------------------
710 656
711 657 def new_main_mod(self,ns=None):
712 658 """Return a new 'main' module object for user code execution.
713 659 """
714 660 main_mod = self._user_main_module
715 661 init_fakemod_dict(main_mod,ns)
716 662 return main_mod
717 663
718 664 def cache_main_mod(self,ns,fname):
719 665 """Cache a main module's namespace.
720 666
721 667 When scripts are executed via %run, we must keep a reference to the
722 668 namespace of their __main__ module (a FakeModule instance) around so
723 669 that Python doesn't clear it, rendering objects defined therein
724 670 useless.
725 671
726 672 This method keeps said reference in a private dict, keyed by the
727 673 absolute path of the module object (which corresponds to the script
728 674 path). This way, for multiple executions of the same script we only
729 675 keep one copy of the namespace (the last one), thus preventing memory
730 676 leaks from old references while allowing the objects from the last
731 677 execution to be accessible.
732 678
733 679 Note: we can not allow the actual FakeModule instances to be deleted,
734 680 because of how Python tears down modules (it hard-sets all their
735 681 references to None without regard for reference counts). This method
736 682 must therefore make a *copy* of the given namespace, to allow the
737 683 original module's __dict__ to be cleared and reused.
738 684
739 685
740 686 Parameters
741 687 ----------
742 688 ns : a namespace (a dict, typically)
743 689
744 690 fname : str
745 691 Filename associated with the namespace.
746 692
747 693 Examples
748 694 --------
749 695
750 696 In [10]: import IPython
751 697
752 698 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
753 699
754 700 In [12]: IPython.__file__ in _ip._main_ns_cache
755 701 Out[12]: True
756 702 """
757 703 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
758 704
759 705 def clear_main_mod_cache(self):
760 706 """Clear the cache of main modules.
761 707
762 708 Mainly for use by utilities like %reset.
763 709
764 710 Examples
765 711 --------
766 712
767 713 In [15]: import IPython
768 714
769 715 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
770 716
771 717 In [17]: len(_ip._main_ns_cache) > 0
772 718 Out[17]: True
773 719
774 720 In [18]: _ip.clear_main_mod_cache()
775 721
776 722 In [19]: len(_ip._main_ns_cache) == 0
777 723 Out[19]: True
778 724 """
779 725 self._main_ns_cache.clear()
780 726
781 727 #-------------------------------------------------------------------------
782 728 # Things related to debugging
783 729 #-------------------------------------------------------------------------
784 730
785 731 def init_pdb(self):
786 732 # Set calling of pdb on exceptions
787 733 # self.call_pdb is a property
788 734 self.call_pdb = self.pdb
789 735
790 736 def _get_call_pdb(self):
791 737 return self._call_pdb
792 738
793 739 def _set_call_pdb(self,val):
794 740
795 741 if val not in (0,1,False,True):
796 742 raise ValueError,'new call_pdb value must be boolean'
797 743
798 744 # store value in instance
799 745 self._call_pdb = val
800 746
801 747 # notify the actual exception handlers
802 748 self.InteractiveTB.call_pdb = val
803 749 if self.isthreaded:
804 750 try:
805 751 self.sys_excepthook.call_pdb = val
806 752 except:
807 753 warn('Failed to activate pdb for threaded exception handler')
808 754
809 755 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
810 756 'Control auto-activation of pdb at exceptions')
811 757
812 758 def debugger(self,force=False):
813 759 """Call the pydb/pdb debugger.
814 760
815 761 Keywords:
816 762
817 763 - force(False): by default, this routine checks the instance call_pdb
818 764 flag and does not actually invoke the debugger if the flag is false.
819 765 The 'force' option forces the debugger to activate even if the flag
820 766 is false.
821 767 """
822 768
823 769 if not (force or self.call_pdb):
824 770 return
825 771
826 772 if not hasattr(sys,'last_traceback'):
827 773 error('No traceback has been produced, nothing to debug.')
828 774 return
829 775
830 776 # use pydb if available
831 777 if debugger.has_pydb:
832 778 from pydb import pm
833 779 else:
834 780 # fallback to our internal debugger
835 781 pm = lambda : self.InteractiveTB.debugger(force=True)
836 782 self.history_saving_wrapper(pm)()
837 783
838 784 #-------------------------------------------------------------------------
839 785 # Things related to IPython's various namespaces
840 786 #-------------------------------------------------------------------------
841 787
842 788 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
843 789 # Create the namespace where the user will operate. user_ns is
844 790 # normally the only one used, and it is passed to the exec calls as
845 791 # the locals argument. But we do carry a user_global_ns namespace
846 792 # given as the exec 'globals' argument, This is useful in embedding
847 793 # situations where the ipython shell opens in a context where the
848 794 # distinction between locals and globals is meaningful. For
849 795 # non-embedded contexts, it is just the same object as the user_ns dict.
850 796
851 797 # FIXME. For some strange reason, __builtins__ is showing up at user
852 798 # level as a dict instead of a module. This is a manual fix, but I
853 799 # should really track down where the problem is coming from. Alex
854 800 # Schmolck reported this problem first.
855 801
856 802 # A useful post by Alex Martelli on this topic:
857 803 # Re: inconsistent value from __builtins__
858 804 # Von: Alex Martelli <aleaxit@yahoo.com>
859 805 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
860 806 # Gruppen: comp.lang.python
861 807
862 808 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
863 809 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
864 810 # > <type 'dict'>
865 811 # > >>> print type(__builtins__)
866 812 # > <type 'module'>
867 813 # > Is this difference in return value intentional?
868 814
869 815 # Well, it's documented that '__builtins__' can be either a dictionary
870 816 # or a module, and it's been that way for a long time. Whether it's
871 817 # intentional (or sensible), I don't know. In any case, the idea is
872 818 # that if you need to access the built-in namespace directly, you
873 819 # should start with "import __builtin__" (note, no 's') which will
874 820 # definitely give you a module. Yeah, it's somewhat confusing:-(.
875 821
876 822 # These routines return properly built dicts as needed by the rest of
877 823 # the code, and can also be used by extension writers to generate
878 824 # properly initialized namespaces.
879 user_ns, user_global_ns = make_user_namespaces(user_ns, user_global_ns)
825 user_ns, user_global_ns = self.make_user_namespaces(user_ns, user_global_ns)
880 826
881 827 # Assign namespaces
882 828 # This is the namespace where all normal user variables live
883 829 self.user_ns = user_ns
884 830 self.user_global_ns = user_global_ns
885 831
886 832 # An auxiliary namespace that checks what parts of the user_ns were
887 833 # loaded at startup, so we can list later only variables defined in
888 834 # actual interactive use. Since it is always a subset of user_ns, it
889 835 # doesn't need to be separately tracked in the ns_table.
890 self.user_config_ns = {}
836 self.user_ns_hidden = {}
891 837
892 838 # A namespace to keep track of internal data structures to prevent
893 839 # them from cluttering user-visible stuff. Will be updated later
894 840 self.internal_ns = {}
895 841
896 842 # Now that FakeModule produces a real module, we've run into a nasty
897 843 # problem: after script execution (via %run), the module where the user
898 844 # code ran is deleted. Now that this object is a true module (needed
899 845 # so docetst and other tools work correctly), the Python module
900 846 # teardown mechanism runs over it, and sets to None every variable
901 847 # present in that module. Top-level references to objects from the
902 848 # script survive, because the user_ns is updated with them. However,
903 849 # calling functions defined in the script that use other things from
904 850 # the script will fail, because the function's closure had references
905 851 # to the original objects, which are now all None. So we must protect
906 852 # these modules from deletion by keeping a cache.
907 853 #
908 854 # To avoid keeping stale modules around (we only need the one from the
909 855 # last run), we use a dict keyed with the full path to the script, so
910 856 # only the last version of the module is held in the cache. Note,
911 857 # however, that we must cache the module *namespace contents* (their
912 858 # __dict__). Because if we try to cache the actual modules, old ones
913 859 # (uncached) could be destroyed while still holding references (such as
914 860 # those held by GUI objects that tend to be long-lived)>
915 861 #
916 862 # The %reset command will flush this cache. See the cache_main_mod()
917 863 # and clear_main_mod_cache() methods for details on use.
918 864
919 865 # This is the cache used for 'main' namespaces
920 866 self._main_ns_cache = {}
921 867 # And this is the single instance of FakeModule whose __dict__ we keep
922 868 # copying and clearing for reuse on each %run
923 869 self._user_main_module = FakeModule()
924 870
925 871 # A table holding all the namespaces IPython deals with, so that
926 872 # introspection facilities can search easily.
927 873 self.ns_table = {'user':user_ns,
928 874 'user_global':user_global_ns,
929 875 'internal':self.internal_ns,
930 876 'builtin':__builtin__.__dict__
931 877 }
932 878
933 879 # Similarly, track all namespaces where references can be held and that
934 880 # we can safely clear (so it can NOT include builtin). This one can be
935 881 # a simple list.
936 self.ns_refs_table = [ user_ns, user_global_ns, self.user_config_ns,
882 self.ns_refs_table = [ user_ns, user_global_ns, self.user_ns_hidden,
937 883 self.internal_ns, self._main_ns_cache ]
938 884
885 def make_user_namespaces(self, user_ns=None, user_global_ns=None):
886 """Return a valid local and global user interactive namespaces.
887
888 This builds a dict with the minimal information needed to operate as a
889 valid IPython user namespace, which you can pass to the various
890 embedding classes in ipython. The default implementation returns the
891 same dict for both the locals and the globals to allow functions to
892 refer to variables in the namespace. Customized implementations can
893 return different dicts. The locals dictionary can actually be anything
894 following the basic mapping protocol of a dict, but the globals dict
895 must be a true dict, not even a subclass. It is recommended that any
896 custom object for the locals namespace synchronize with the globals
897 dict somehow.
898
899 Raises TypeError if the provided globals namespace is not a true dict.
900
901 Parameters
902 ----------
903 user_ns : dict-like, optional
904 The current user namespace. The items in this namespace should
905 be included in the output. If None, an appropriate blank
906 namespace should be created.
907 user_global_ns : dict, optional
908 The current user global namespace. The items in this namespace
909 should be included in the output. If None, an appropriate
910 blank namespace should be created.
911
912 Returns
913 -------
914 A pair of dictionary-like object to be used as the local namespace
915 of the interpreter and a dict to be used as the global namespace.
916 """
917
918
919 # We must ensure that __builtin__ (without the final 's') is always
920 # available and pointing to the __builtin__ *module*. For more details:
921 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
922
923 if user_ns is None:
924 # Set __name__ to __main__ to better match the behavior of the
925 # normal interpreter.
926 user_ns = {'__name__' :'__main__',
927 '__builtin__' : __builtin__,
928 '__builtins__' : __builtin__,
929 }
930 else:
931 user_ns.setdefault('__name__','__main__')
932 user_ns.setdefault('__builtin__',__builtin__)
933 user_ns.setdefault('__builtins__',__builtin__)
934
935 if user_global_ns is None:
936 user_global_ns = user_ns
937 if type(user_global_ns) is not dict:
938 raise TypeError("user_global_ns must be a true dict; got %r"
939 % type(user_global_ns))
940
941 return user_ns, user_global_ns
942
939 943 def init_sys_modules(self):
940 944 # We need to insert into sys.modules something that looks like a
941 945 # module but which accesses the IPython namespace, for shelve and
942 946 # pickle to work interactively. Normally they rely on getting
943 947 # everything out of __main__, but for embedding purposes each IPython
944 948 # instance has its own private namespace, so we can't go shoving
945 949 # everything into __main__.
946 950
947 951 # note, however, that we should only do this for non-embedded
948 952 # ipythons, which really mimic the __main__.__dict__ with their own
949 953 # namespace. Embedded instances, on the other hand, should not do
950 954 # this because they need to manage the user local/global namespaces
951 955 # only, but they live within a 'normal' __main__ (meaning, they
952 956 # shouldn't overtake the execution environment of the script they're
953 957 # embedded in).
954 958
955 959 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
956 960
957 961 try:
958 962 main_name = self.user_ns['__name__']
959 963 except KeyError:
960 964 raise KeyError('user_ns dictionary MUST have a "__name__" key')
961 965 else:
962 966 sys.modules[main_name] = FakeModule(self.user_ns)
963 967
964 968 def init_user_ns(self):
965 969 """Initialize all user-visible namespaces to their minimum defaults.
966 970
967 971 Certain history lists are also initialized here, as they effectively
968 972 act as user namespaces.
969 973
970 974 Notes
971 975 -----
972 976 All data structures here are only filled in, they are NOT reset by this
973 977 method. If they were not empty before, data will simply be added to
974 978 therm.
975 979 """
976 980 # This function works in two parts: first we put a few things in
977 # user_ns, and we sync that contents into user_config_ns so that these
981 # user_ns, and we sync that contents into user_ns_hidden so that these
978 982 # initial variables aren't shown by %who. After the sync, we add the
979 983 # rest of what we *do* want the user to see with %who even on a new
980 984 # session (probably nothing, so theye really only see their own stuff)
981 985
982 986 # The user dict must *always* have a __builtin__ reference to the
983 987 # Python standard __builtin__ namespace, which must be imported.
984 988 # This is so that certain operations in prompt evaluation can be
985 989 # reliably executed with builtins. Note that we can NOT use
986 990 # __builtins__ (note the 's'), because that can either be a dict or a
987 991 # module, and can even mutate at runtime, depending on the context
988 992 # (Python makes no guarantees on it). In contrast, __builtin__ is
989 993 # always a module object, though it must be explicitly imported.
990 994
991 995 # For more details:
992 996 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
993 997 ns = dict(__builtin__ = __builtin__)
994 998
995 999 # Put 'help' in the user namespace
996 1000 try:
997 1001 from site import _Helper
998 1002 ns['help'] = _Helper()
999 1003 except ImportError:
1000 1004 warn('help() not available - check site.py')
1001 1005
1002 1006 # make global variables for user access to the histories
1003 1007 ns['_ih'] = self.input_hist
1004 1008 ns['_oh'] = self.output_hist
1005 1009 ns['_dh'] = self.dir_hist
1006 1010
1007 1011 ns['_sh'] = shadowns
1008 1012
1009 1013 # user aliases to input and output histories. These shouldn't show up
1010 1014 # in %who, as they can have very large reprs.
1011 1015 ns['In'] = self.input_hist
1012 1016 ns['Out'] = self.output_hist
1013 1017
1014 1018 # Store myself as the public api!!!
1015 1019 ns['get_ipython'] = self.get_ipython
1016 1020
1017 # Sync what we've added so far to user_config_ns so these aren't seen
1021 # Sync what we've added so far to user_ns_hidden so these aren't seen
1018 1022 # by %who
1019 self.user_config_ns.update(ns)
1023 self.user_ns_hidden.update(ns)
1020 1024
1021 1025 # Anything put into ns now would show up in %who. Think twice before
1022 1026 # putting anything here, as we really want %who to show the user their
1023 1027 # stuff, not our variables.
1024 1028
1025 1029 # Finally, update the real user's namespace
1026 1030 self.user_ns.update(ns)
1027 1031
1028 1032
1029 1033 def reset(self):
1030 1034 """Clear all internal namespaces.
1031 1035
1032 1036 Note that this is much more aggressive than %reset, since it clears
1033 1037 fully all namespaces, as well as all input/output lists.
1034 1038 """
1035 1039 for ns in self.ns_refs_table:
1036 1040 ns.clear()
1037 1041
1038 1042 self.alias_manager.clear_aliases()
1039 1043
1040 1044 # Clear input and output histories
1041 1045 self.input_hist[:] = []
1042 1046 self.input_hist_raw[:] = []
1043 1047 self.output_hist.clear()
1044 1048
1045 1049 # Restore the user namespaces to minimal usability
1046 1050 self.init_user_ns()
1047 1051
1048 1052 # Restore the default and user aliases
1049 1053 self.alias_manager.init_aliases()
1050 1054
1051 1055 def push(self, variables, interactive=True):
1052 1056 """Inject a group of variables into the IPython user namespace.
1053 1057
1054 1058 Parameters
1055 1059 ----------
1056 1060 variables : dict, str or list/tuple of str
1057 1061 The variables to inject into the user's namespace. If a dict,
1058 1062 a simple update is done. If a str, the string is assumed to
1059 1063 have variable names separated by spaces. A list/tuple of str
1060 1064 can also be used to give the variable names. If just the variable
1061 1065 names are give (list/tuple/str) then the variable values looked
1062 1066 up in the callers frame.
1063 1067 interactive : bool
1064 1068 If True (default), the variables will be listed with the ``who``
1065 1069 magic.
1066 1070 """
1067 1071 vdict = None
1068 1072
1069 1073 # We need a dict of name/value pairs to do namespace updates.
1070 1074 if isinstance(variables, dict):
1071 1075 vdict = variables
1072 1076 elif isinstance(variables, (basestring, list, tuple)):
1073 1077 if isinstance(variables, basestring):
1074 1078 vlist = variables.split()
1075 1079 else:
1076 1080 vlist = variables
1077 1081 vdict = {}
1078 1082 cf = sys._getframe(1)
1079 1083 for name in vlist:
1080 1084 try:
1081 1085 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1082 1086 except:
1083 1087 print ('Could not get variable %s from %s' %
1084 1088 (name,cf.f_code.co_name))
1085 1089 else:
1086 1090 raise ValueError('variables must be a dict/str/list/tuple')
1087 1091
1088 1092 # Propagate variables to user namespace
1089 1093 self.user_ns.update(vdict)
1090 1094
1091 1095 # And configure interactive visibility
1092 config_ns = self.user_config_ns
1096 config_ns = self.user_ns_hidden
1093 1097 if interactive:
1094 1098 for name, val in vdict.iteritems():
1095 1099 config_ns.pop(name, None)
1096 1100 else:
1097 1101 for name,val in vdict.iteritems():
1098 1102 config_ns[name] = val
1099 1103
1100 1104 #-------------------------------------------------------------------------
1101 1105 # Things related to history management
1102 1106 #-------------------------------------------------------------------------
1103 1107
1104 1108 def init_history(self):
1105 1109 # List of input with multi-line handling.
1106 1110 self.input_hist = InputList()
1107 1111 # This one will hold the 'raw' input history, without any
1108 1112 # pre-processing. This will allow users to retrieve the input just as
1109 1113 # it was exactly typed in by the user, with %hist -r.
1110 1114 self.input_hist_raw = InputList()
1111 1115
1112 1116 # list of visited directories
1113 1117 try:
1114 1118 self.dir_hist = [os.getcwd()]
1115 1119 except OSError:
1116 1120 self.dir_hist = []
1117 1121
1118 1122 # dict of output history
1119 1123 self.output_hist = {}
1120 1124
1121 1125 # Now the history file
1122 1126 if self.profile:
1123 1127 histfname = 'history-%s' % self.profile
1124 1128 else:
1125 1129 histfname = 'history'
1126 1130 self.histfile = os.path.join(self.ipython_dir, histfname)
1127 1131
1128 1132 # Fill the history zero entry, user counter starts at 1
1129 1133 self.input_hist.append('\n')
1130 1134 self.input_hist_raw.append('\n')
1131 1135
1132 1136 def init_shadow_hist(self):
1133 1137 try:
1134 1138 self.db = pickleshare.PickleShareDB(self.ipython_dir + "/db")
1135 1139 except exceptions.UnicodeDecodeError:
1136 1140 print "Your ipython_dir can't be decoded to unicode!"
1137 1141 print "Please set HOME environment variable to something that"
1138 1142 print r"only has ASCII characters, e.g. c:\home"
1139 1143 print "Now it is", self.ipython_dir
1140 1144 sys.exit()
1141 1145 self.shadowhist = ipcorehist.ShadowHist(self.db)
1142 1146
1143 1147 def savehist(self):
1144 1148 """Save input history to a file (via readline library)."""
1145 1149
1146 1150 try:
1147 1151 self.readline.write_history_file(self.histfile)
1148 1152 except:
1149 1153 print 'Unable to save IPython command history to file: ' + \
1150 1154 `self.histfile`
1151 1155
1152 1156 def reloadhist(self):
1153 1157 """Reload the input history from disk file."""
1154 1158
1155 1159 try:
1156 1160 self.readline.clear_history()
1157 1161 self.readline.read_history_file(self.shell.histfile)
1158 1162 except AttributeError:
1159 1163 pass
1160 1164
1161 1165 def history_saving_wrapper(self, func):
1162 1166 """ Wrap func for readline history saving
1163 1167
1164 1168 Convert func into callable that saves & restores
1165 1169 history around the call """
1166 1170
1167 if not self.has_readline:
1171 if self.has_readline:
1172 from IPython.utils import rlineimpl as readline
1173 else:
1168 1174 return func
1169 1175
1170 1176 def wrapper():
1171 1177 self.savehist()
1172 1178 try:
1173 1179 func()
1174 1180 finally:
1175 1181 readline.read_history_file(self.histfile)
1176 1182 return wrapper
1177 1183
1178 1184 #-------------------------------------------------------------------------
1179 1185 # Things related to exception handling and tracebacks (not debugging)
1180 1186 #-------------------------------------------------------------------------
1181 1187
1182 1188 def init_traceback_handlers(self, custom_exceptions):
1183 1189 # Syntax error handler.
1184 1190 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
1185 1191
1186 1192 # The interactive one is initialized with an offset, meaning we always
1187 1193 # want to remove the topmost item in the traceback, which is our own
1188 1194 # internal code. Valid modes: ['Plain','Context','Verbose']
1189 1195 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1190 1196 color_scheme='NoColor',
1191 1197 tb_offset = 1)
1192 1198
1193 1199 # The instance will store a pointer to the system-wide exception hook,
1194 1200 # so that runtime code (such as magics) can access it. This is because
1195 1201 # during the read-eval loop, it may get temporarily overwritten.
1196 1202 self.sys_excepthook = sys.excepthook
1197 1203
1198 1204 # and add any custom exception handlers the user may have specified
1199 1205 self.set_custom_exc(*custom_exceptions)
1200 1206
1207 # Set the exception mode
1208 self.InteractiveTB.set_mode(mode=self.xmode)
1209
1201 1210 def set_custom_exc(self,exc_tuple,handler):
1202 1211 """set_custom_exc(exc_tuple,handler)
1203 1212
1204 1213 Set a custom exception handler, which will be called if any of the
1205 1214 exceptions in exc_tuple occur in the mainloop (specifically, in the
1206 1215 runcode() method.
1207 1216
1208 1217 Inputs:
1209 1218
1210 1219 - exc_tuple: a *tuple* of valid exceptions to call the defined
1211 1220 handler for. It is very important that you use a tuple, and NOT A
1212 1221 LIST here, because of the way Python's except statement works. If
1213 1222 you only want to trap a single exception, use a singleton tuple:
1214 1223
1215 1224 exc_tuple == (MyCustomException,)
1216 1225
1217 1226 - handler: this must be defined as a function with the following
1218 1227 basic interface: def my_handler(self,etype,value,tb).
1219 1228
1220 1229 This will be made into an instance method (via new.instancemethod)
1221 1230 of IPython itself, and it will be called if any of the exceptions
1222 1231 listed in the exc_tuple are caught. If the handler is None, an
1223 1232 internal basic one is used, which just prints basic info.
1224 1233
1225 1234 WARNING: by putting in your own exception handler into IPython's main
1226 1235 execution loop, you run a very good chance of nasty crashes. This
1227 1236 facility should only be used if you really know what you are doing."""
1228 1237
1229 1238 assert type(exc_tuple)==type(()) , \
1230 1239 "The custom exceptions must be given AS A TUPLE."
1231 1240
1232 1241 def dummy_handler(self,etype,value,tb):
1233 1242 print '*** Simple custom exception handler ***'
1234 1243 print 'Exception type :',etype
1235 1244 print 'Exception value:',value
1236 1245 print 'Traceback :',tb
1237 1246 print 'Source code :','\n'.join(self.buffer)
1238 1247
1239 1248 if handler is None: handler = dummy_handler
1240 1249
1241 1250 self.CustomTB = new.instancemethod(handler,self,self.__class__)
1242 1251 self.custom_exceptions = exc_tuple
1243 1252
1244 1253 def excepthook(self, etype, value, tb):
1245 1254 """One more defense for GUI apps that call sys.excepthook.
1246 1255
1247 1256 GUI frameworks like wxPython trap exceptions and call
1248 1257 sys.excepthook themselves. I guess this is a feature that
1249 1258 enables them to keep running after exceptions that would
1250 1259 otherwise kill their mainloop. This is a bother for IPython
1251 1260 which excepts to catch all of the program exceptions with a try:
1252 1261 except: statement.
1253 1262
1254 1263 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1255 1264 any app directly invokes sys.excepthook, it will look to the user like
1256 1265 IPython crashed. In order to work around this, we can disable the
1257 1266 CrashHandler and replace it with this excepthook instead, which prints a
1258 1267 regular traceback using our InteractiveTB. In this fashion, apps which
1259 1268 call sys.excepthook will generate a regular-looking exception from
1260 1269 IPython, and the CrashHandler will only be triggered by real IPython
1261 1270 crashes.
1262 1271
1263 1272 This hook should be used sparingly, only in places which are not likely
1264 1273 to be true IPython errors.
1265 1274 """
1266 1275 self.showtraceback((etype,value,tb),tb_offset=0)
1267 1276
1268 1277 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1269 1278 exception_only=False):
1270 1279 """Display the exception that just occurred.
1271 1280
1272 1281 If nothing is known about the exception, this is the method which
1273 1282 should be used throughout the code for presenting user tracebacks,
1274 1283 rather than directly invoking the InteractiveTB object.
1275 1284
1276 1285 A specific showsyntaxerror() also exists, but this method can take
1277 1286 care of calling it if needed, so unless you are explicitly catching a
1278 1287 SyntaxError exception, don't try to analyze the stack manually and
1279 1288 simply call this method."""
1280 1289
1281 1290 try:
1282 1291 if exc_tuple is None:
1283 1292 etype, value, tb = sys.exc_info()
1284 1293 else:
1285 1294 etype, value, tb = exc_tuple
1286 1295
1287 1296 if etype is None:
1288 1297 if hasattr(sys, 'last_type'):
1289 1298 etype, value, tb = sys.last_type, sys.last_value, \
1290 1299 sys.last_traceback
1291 1300 else:
1292 1301 self.write('No traceback available to show.\n')
1293 1302 return
1294 1303
1295 1304 if etype is SyntaxError:
1296 1305 # Though this won't be called by syntax errors in the input
1297 1306 # line, there may be SyntaxError cases whith imported code.
1298 1307 self.showsyntaxerror(filename)
1299 1308 elif etype is UsageError:
1300 1309 print "UsageError:", value
1301 1310 else:
1302 1311 # WARNING: these variables are somewhat deprecated and not
1303 1312 # necessarily safe to use in a threaded environment, but tools
1304 1313 # like pdb depend on their existence, so let's set them. If we
1305 1314 # find problems in the field, we'll need to revisit their use.
1306 1315 sys.last_type = etype
1307 1316 sys.last_value = value
1308 1317 sys.last_traceback = tb
1309 1318
1310 1319 if etype in self.custom_exceptions:
1311 1320 self.CustomTB(etype,value,tb)
1312 1321 else:
1313 1322 if exception_only:
1314 1323 m = ('An exception has occurred, use %tb to see the '
1315 1324 'full traceback.')
1316 1325 print m
1317 1326 self.InteractiveTB.show_exception_only(etype, value)
1318 1327 else:
1319 1328 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1320 1329 if self.InteractiveTB.call_pdb:
1321 1330 # pdb mucks up readline, fix it back
1322 1331 self.set_completer()
1323 1332
1324 1333 except KeyboardInterrupt:
1325 1334 self.write("\nKeyboardInterrupt\n")
1326 1335
1327 1336
1328 1337 def showsyntaxerror(self, filename=None):
1329 1338 """Display the syntax error that just occurred.
1330 1339
1331 1340 This doesn't display a stack trace because there isn't one.
1332 1341
1333 1342 If a filename is given, it is stuffed in the exception instead
1334 1343 of what was there before (because Python's parser always uses
1335 1344 "<string>" when reading from a string).
1336 1345 """
1337 1346 etype, value, last_traceback = sys.exc_info()
1338 1347
1339 1348 # See note about these variables in showtraceback() above
1340 1349 sys.last_type = etype
1341 1350 sys.last_value = value
1342 1351 sys.last_traceback = last_traceback
1343 1352
1344 1353 if filename and etype is SyntaxError:
1345 1354 # Work hard to stuff the correct filename in the exception
1346 1355 try:
1347 1356 msg, (dummy_filename, lineno, offset, line) = value
1348 1357 except:
1349 1358 # Not the format we expect; leave it alone
1350 1359 pass
1351 1360 else:
1352 1361 # Stuff in the right filename
1353 1362 try:
1354 1363 # Assume SyntaxError is a class exception
1355 1364 value = SyntaxError(msg, (filename, lineno, offset, line))
1356 1365 except:
1357 1366 # If that failed, assume SyntaxError is a string
1358 1367 value = msg, (filename, lineno, offset, line)
1359 1368 self.SyntaxTB(etype,value,[])
1360 1369
1361 1370 def edit_syntax_error(self):
1362 1371 """The bottom half of the syntax error handler called in the main loop.
1363 1372
1364 1373 Loop until syntax error is fixed or user cancels.
1365 1374 """
1366 1375
1367 1376 while self.SyntaxTB.last_syntax_error:
1368 1377 # copy and clear last_syntax_error
1369 1378 err = self.SyntaxTB.clear_err_state()
1370 1379 if not self._should_recompile(err):
1371 1380 return
1372 1381 try:
1373 1382 # may set last_syntax_error again if a SyntaxError is raised
1374 1383 self.safe_execfile(err.filename,self.user_ns)
1375 1384 except:
1376 1385 self.showtraceback()
1377 1386 else:
1378 1387 try:
1379 1388 f = file(err.filename)
1380 1389 try:
1381 1390 # This should be inside a display_trap block and I
1382 1391 # think it is.
1383 1392 sys.displayhook(f.read())
1384 1393 finally:
1385 1394 f.close()
1386 1395 except:
1387 1396 self.showtraceback()
1388 1397
1389 1398 def _should_recompile(self,e):
1390 1399 """Utility routine for edit_syntax_error"""
1391 1400
1392 1401 if e.filename in ('<ipython console>','<input>','<string>',
1393 1402 '<console>','<BackgroundJob compilation>',
1394 1403 None):
1395 1404
1396 1405 return False
1397 1406 try:
1398 1407 if (self.autoedit_syntax and
1399 1408 not self.ask_yes_no('Return to editor to correct syntax error? '
1400 1409 '[Y/n] ','y')):
1401 1410 return False
1402 1411 except EOFError:
1403 1412 return False
1404 1413
1405 1414 def int0(x):
1406 1415 try:
1407 1416 return int(x)
1408 1417 except TypeError:
1409 1418 return 0
1410 1419 # always pass integer line and offset values to editor hook
1411 1420 try:
1412 1421 self.hooks.fix_error_editor(e.filename,
1413 1422 int0(e.lineno),int0(e.offset),e.msg)
1414 1423 except TryNext:
1415 1424 warn('Could not open editor')
1416 1425 return False
1417 1426 return True
1418 1427
1419 1428 #-------------------------------------------------------------------------
1420 1429 # Things related to tab completion
1421 1430 #-------------------------------------------------------------------------
1422 1431
1423 1432 def complete(self, text):
1424 1433 """Return a sorted list of all possible completions on text.
1425 1434
1426 1435 Inputs:
1427 1436
1428 1437 - text: a string of text to be completed on.
1429 1438
1430 1439 This is a wrapper around the completion mechanism, similar to what
1431 1440 readline does at the command line when the TAB key is hit. By
1432 1441 exposing it as a method, it can be used by other non-readline
1433 1442 environments (such as GUIs) for text completion.
1434 1443
1435 1444 Simple usage example:
1436 1445
1437 1446 In [7]: x = 'hello'
1438 1447
1439 1448 In [8]: x
1440 1449 Out[8]: 'hello'
1441 1450
1442 1451 In [9]: print x
1443 1452 hello
1444 1453
1445 1454 In [10]: _ip.complete('x.l')
1446 1455 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1447 1456 """
1448 1457
1449 1458 # Inject names into __builtin__ so we can complete on the added names.
1450 1459 with self.builtin_trap:
1451 1460 complete = self.Completer.complete
1452 1461 state = 0
1453 1462 # use a dict so we get unique keys, since ipyhton's multiple
1454 1463 # completers can return duplicates. When we make 2.4 a requirement,
1455 1464 # start using sets instead, which are faster.
1456 1465 comps = {}
1457 1466 while True:
1458 1467 newcomp = complete(text,state,line_buffer=text)
1459 1468 if newcomp is None:
1460 1469 break
1461 1470 comps[newcomp] = 1
1462 1471 state += 1
1463 1472 outcomps = comps.keys()
1464 1473 outcomps.sort()
1465 1474 #print "T:",text,"OC:",outcomps # dbg
1466 1475 #print "vars:",self.user_ns.keys()
1467 1476 return outcomps
1468 1477
1469 1478 def set_custom_completer(self,completer,pos=0):
1470 1479 """Adds a new custom completer function.
1471 1480
1472 1481 The position argument (defaults to 0) is the index in the completers
1473 1482 list where you want the completer to be inserted."""
1474 1483
1475 1484 newcomp = new.instancemethod(completer,self.Completer,
1476 1485 self.Completer.__class__)
1477 1486 self.Completer.matchers.insert(pos,newcomp)
1478 1487
1479 1488 def set_completer(self):
1480 1489 """Reset readline's completer to be our own."""
1481 1490 self.readline.set_completer(self.Completer.complete)
1482 1491
1483 1492 def set_completer_frame(self, frame=None):
1484 1493 """Set the frame of the completer."""
1485 1494 if frame:
1486 1495 self.Completer.namespace = frame.f_locals
1487 1496 self.Completer.global_namespace = frame.f_globals
1488 1497 else:
1489 1498 self.Completer.namespace = self.user_ns
1490 1499 self.Completer.global_namespace = self.user_global_ns
1491 1500
1492 1501 #-------------------------------------------------------------------------
1493 1502 # Things related to readline
1494 1503 #-------------------------------------------------------------------------
1495 1504
1496 1505 def init_readline(self):
1497 1506 """Command history completion/saving/reloading."""
1498 1507
1499 1508 if self.readline_use:
1500 1509 import IPython.utils.rlineimpl as readline
1501 1510
1502 1511 self.rl_next_input = None
1503 1512 self.rl_do_indent = False
1504 1513
1505 1514 if not self.readline_use or not readline.have_readline:
1506 1515 self.has_readline = False
1507 1516 self.readline = None
1508 1517 # Set a number of methods that depend on readline to be no-op
1509 1518 self.savehist = no_op
1510 1519 self.reloadhist = no_op
1511 1520 self.set_completer = no_op
1512 1521 self.set_custom_completer = no_op
1513 1522 self.set_completer_frame = no_op
1514 1523 warn('Readline services not available or not loaded.')
1515 1524 else:
1516 1525 self.has_readline = True
1517 1526 self.readline = readline
1518 1527 sys.modules['readline'] = readline
1519 1528 import atexit
1520 1529 from IPython.core.completer import IPCompleter
1521 1530 self.Completer = IPCompleter(self,
1522 1531 self.user_ns,
1523 1532 self.user_global_ns,
1524 1533 self.readline_omit__names,
1525 1534 self.alias_manager.alias_table)
1526 1535 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1527 1536 self.strdispatchers['complete_command'] = sdisp
1528 1537 self.Completer.custom_completers = sdisp
1529 1538 # Platform-specific configuration
1530 1539 if os.name == 'nt':
1531 1540 self.readline_startup_hook = readline.set_pre_input_hook
1532 1541 else:
1533 1542 self.readline_startup_hook = readline.set_startup_hook
1534 1543
1535 1544 # Load user's initrc file (readline config)
1536 1545 # Or if libedit is used, load editrc.
1537 1546 inputrc_name = os.environ.get('INPUTRC')
1538 1547 if inputrc_name is None:
1539 1548 home_dir = get_home_dir()
1540 1549 if home_dir is not None:
1541 1550 inputrc_name = '.inputrc'
1542 1551 if readline.uses_libedit:
1543 1552 inputrc_name = '.editrc'
1544 1553 inputrc_name = os.path.join(home_dir, inputrc_name)
1545 1554 if os.path.isfile(inputrc_name):
1546 1555 try:
1547 1556 readline.read_init_file(inputrc_name)
1548 1557 except:
1549 1558 warn('Problems reading readline initialization file <%s>'
1550 1559 % inputrc_name)
1551 1560
1552 1561 # save this in sys so embedded copies can restore it properly
1553 1562 sys.ipcompleter = self.Completer.complete
1554 1563 self.set_completer()
1555 1564
1556 1565 # Configure readline according to user's prefs
1557 1566 # This is only done if GNU readline is being used. If libedit
1558 1567 # is being used (as on Leopard) the readline config is
1559 1568 # not run as the syntax for libedit is different.
1560 1569 if not readline.uses_libedit:
1561 1570 for rlcommand in self.readline_parse_and_bind:
1562 1571 #print "loading rl:",rlcommand # dbg
1563 1572 readline.parse_and_bind(rlcommand)
1564 1573
1565 1574 # Remove some chars from the delimiters list. If we encounter
1566 1575 # unicode chars, discard them.
1567 1576 delims = readline.get_completer_delims().encode("ascii", "ignore")
1568 1577 delims = delims.translate(string._idmap,
1569 1578 self.readline_remove_delims)
1570 1579 readline.set_completer_delims(delims)
1571 1580 # otherwise we end up with a monster history after a while:
1572 1581 readline.set_history_length(1000)
1573 1582 try:
1574 1583 #print '*** Reading readline history' # dbg
1575 1584 readline.read_history_file(self.histfile)
1576 1585 except IOError:
1577 1586 pass # It doesn't exist yet.
1578 1587
1579 1588 atexit.register(self.atexit_operations)
1580 1589 del atexit
1581 1590
1582 1591 # Configure auto-indent for all platforms
1583 1592 self.set_autoindent(self.autoindent)
1584 1593
1585 1594 def set_next_input(self, s):
1586 1595 """ Sets the 'default' input string for the next command line.
1587 1596
1588 1597 Requires readline.
1589 1598
1590 1599 Example:
1591 1600
1592 1601 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1593 1602 [D:\ipython]|2> Hello Word_ # cursor is here
1594 1603 """
1595 1604
1596 1605 self.rl_next_input = s
1597 1606
1598 1607 def pre_readline(self):
1599 1608 """readline hook to be used at the start of each line.
1600 1609
1601 1610 Currently it handles auto-indent only."""
1602 1611
1603 1612 #debugx('self.indent_current_nsp','pre_readline:')
1604 1613
1605 1614 if self.rl_do_indent:
1606 1615 self.readline.insert_text(self._indent_current_str())
1607 1616 if self.rl_next_input is not None:
1608 1617 self.readline.insert_text(self.rl_next_input)
1609 1618 self.rl_next_input = None
1610 1619
1611 1620 def _indent_current_str(self):
1612 1621 """return the current level of indentation as a string"""
1613 1622 return self.indent_current_nsp * ' '
1614 1623
1615 1624 #-------------------------------------------------------------------------
1616 1625 # Things related to magics
1617 1626 #-------------------------------------------------------------------------
1618 1627
1619 1628 def init_magics(self):
1620 1629 # Set user colors (don't do it in the constructor above so that it
1621 1630 # doesn't crash if colors option is invalid)
1622 1631 self.magic_colors(self.colors)
1623 1632 # History was moved to a separate module
1624 1633 from . import history
1625 1634 history.init_ipython(self)
1626 1635
1627 1636 def magic(self,arg_s):
1628 1637 """Call a magic function by name.
1629 1638
1630 1639 Input: a string containing the name of the magic function to call and any
1631 1640 additional arguments to be passed to the magic.
1632 1641
1633 1642 magic('name -opt foo bar') is equivalent to typing at the ipython
1634 1643 prompt:
1635 1644
1636 1645 In[1]: %name -opt foo bar
1637 1646
1638 1647 To call a magic without arguments, simply use magic('name').
1639 1648
1640 1649 This provides a proper Python function to call IPython's magics in any
1641 1650 valid Python code you can type at the interpreter, including loops and
1642 1651 compound statements.
1643 1652 """
1644 1653 args = arg_s.split(' ',1)
1645 1654 magic_name = args[0]
1646 1655 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1647 1656
1648 1657 try:
1649 1658 magic_args = args[1]
1650 1659 except IndexError:
1651 1660 magic_args = ''
1652 1661 fn = getattr(self,'magic_'+magic_name,None)
1653 1662 if fn is None:
1654 1663 error("Magic function `%s` not found." % magic_name)
1655 1664 else:
1656 1665 magic_args = self.var_expand(magic_args,1)
1657 1666 with nested(self.builtin_trap,):
1658 1667 result = fn(magic_args)
1659 1668 return result
1660 1669
1661 1670 def define_magic(self, magicname, func):
1662 1671 """Expose own function as magic function for ipython
1663 1672
1664 1673 def foo_impl(self,parameter_s=''):
1665 1674 'My very own magic!. (Use docstrings, IPython reads them).'
1666 1675 print 'Magic function. Passed parameter is between < >:'
1667 1676 print '<%s>' % parameter_s
1668 1677 print 'The self object is:',self
1669 1678
1670 1679 self.define_magic('foo',foo_impl)
1671 1680 """
1672 1681
1673 1682 import new
1674 1683 im = new.instancemethod(func,self, self.__class__)
1675 1684 old = getattr(self, "magic_" + magicname, None)
1676 1685 setattr(self, "magic_" + magicname, im)
1677 1686 return old
1678 1687
1679 1688 #-------------------------------------------------------------------------
1680 1689 # Things related to macros
1681 1690 #-------------------------------------------------------------------------
1682 1691
1683 1692 def define_macro(self, name, themacro):
1684 1693 """Define a new macro
1685 1694
1686 1695 Parameters
1687 1696 ----------
1688 1697 name : str
1689 1698 The name of the macro.
1690 1699 themacro : str or Macro
1691 1700 The action to do upon invoking the macro. If a string, a new
1692 1701 Macro object is created by passing the string to it.
1693 1702 """
1694 1703
1695 1704 from IPython.core import macro
1696 1705
1697 1706 if isinstance(themacro, basestring):
1698 1707 themacro = macro.Macro(themacro)
1699 1708 if not isinstance(themacro, macro.Macro):
1700 1709 raise ValueError('A macro must be a string or a Macro instance.')
1701 1710 self.user_ns[name] = themacro
1702 1711
1703 1712 #-------------------------------------------------------------------------
1704 1713 # Things related to the running of system commands
1705 1714 #-------------------------------------------------------------------------
1706 1715
1707 1716 def system(self, cmd):
1708 1717 """Make a system call, using IPython."""
1709 1718 return self.hooks.shell_hook(self.var_expand(cmd, depth=2))
1710 1719
1711 1720 #-------------------------------------------------------------------------
1712 1721 # Things related to aliases
1713 1722 #-------------------------------------------------------------------------
1714 1723
1715 1724 def init_alias(self):
1716 1725 self.alias_manager = AliasManager(self, config=self.config)
1717 1726 self.ns_table['alias'] = self.alias_manager.alias_table,
1718 1727
1719 1728 #-------------------------------------------------------------------------
1720 1729 # Things related to the running of code
1721 1730 #-------------------------------------------------------------------------
1722 1731
1723 1732 def ex(self, cmd):
1724 1733 """Execute a normal python statement in user namespace."""
1725 1734 with nested(self.builtin_trap,):
1726 1735 exec cmd in self.user_global_ns, self.user_ns
1727 1736
1728 1737 def ev(self, expr):
1729 1738 """Evaluate python expression expr in user namespace.
1730 1739
1731 1740 Returns the result of evaluation
1732 1741 """
1733 1742 with nested(self.builtin_trap,):
1734 1743 return eval(expr, self.user_global_ns, self.user_ns)
1735 1744
1736 1745 def mainloop(self, display_banner=None):
1737 1746 """Start the mainloop.
1738 1747
1739 1748 If an optional banner argument is given, it will override the
1740 1749 internally created default banner.
1741 1750 """
1742 1751
1743 1752 with nested(self.builtin_trap, self.display_trap):
1744 1753
1745 1754 # if you run stuff with -c <cmd>, raw hist is not updated
1746 1755 # ensure that it's in sync
1747 1756 if len(self.input_hist) != len (self.input_hist_raw):
1748 1757 self.input_hist_raw = InputList(self.input_hist)
1749 1758
1750 1759 while 1:
1751 1760 try:
1752 1761 self.interact(display_banner=display_banner)
1753 1762 #self.interact_with_readline()
1754 1763 # XXX for testing of a readline-decoupled repl loop, call
1755 1764 # interact_with_readline above
1756 1765 break
1757 1766 except KeyboardInterrupt:
1758 1767 # this should not be necessary, but KeyboardInterrupt
1759 1768 # handling seems rather unpredictable...
1760 1769 self.write("\nKeyboardInterrupt in interact()\n")
1761 1770
1762 1771 def interact_prompt(self):
1763 1772 """ Print the prompt (in read-eval-print loop)
1764 1773
1765 1774 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1766 1775 used in standard IPython flow.
1767 1776 """
1768 1777 if self.more:
1769 1778 try:
1770 1779 prompt = self.hooks.generate_prompt(True)
1771 1780 except:
1772 1781 self.showtraceback()
1773 1782 if self.autoindent:
1774 1783 self.rl_do_indent = True
1775 1784
1776 1785 else:
1777 1786 try:
1778 1787 prompt = self.hooks.generate_prompt(False)
1779 1788 except:
1780 1789 self.showtraceback()
1781 1790 self.write(prompt)
1782 1791
1783 1792 def interact_handle_input(self,line):
1784 1793 """ Handle the input line (in read-eval-print loop)
1785 1794
1786 1795 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1787 1796 used in standard IPython flow.
1788 1797 """
1789 1798 if line.lstrip() == line:
1790 1799 self.shadowhist.add(line.strip())
1791 1800 lineout = self.prefilter_manager.prefilter_lines(line,self.more)
1792 1801
1793 1802 if line.strip():
1794 1803 if self.more:
1795 1804 self.input_hist_raw[-1] += '%s\n' % line
1796 1805 else:
1797 1806 self.input_hist_raw.append('%s\n' % line)
1798 1807
1799 1808
1800 1809 self.more = self.push_line(lineout)
1801 1810 if (self.SyntaxTB.last_syntax_error and
1802 1811 self.autoedit_syntax):
1803 1812 self.edit_syntax_error()
1804 1813
1805 1814 def interact_with_readline(self):
1806 1815 """ Demo of using interact_handle_input, interact_prompt
1807 1816
1808 1817 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1809 1818 it should work like this.
1810 1819 """
1811 1820 self.readline_startup_hook(self.pre_readline)
1812 1821 while not self.exit_now:
1813 1822 self.interact_prompt()
1814 1823 if self.more:
1815 1824 self.rl_do_indent = True
1816 1825 else:
1817 1826 self.rl_do_indent = False
1818 1827 line = raw_input_original().decode(self.stdin_encoding)
1819 1828 self.interact_handle_input(line)
1820 1829
1821 1830 def interact(self, display_banner=None):
1822 1831 """Closely emulate the interactive Python console."""
1823 1832
1824 1833 # batch run -> do not interact
1825 1834 if self.exit_now:
1826 1835 return
1827 1836
1828 1837 if display_banner is None:
1829 1838 display_banner = self.display_banner
1830 1839 if display_banner:
1831 1840 self.show_banner()
1832 1841
1833 1842 more = 0
1834 1843
1835 1844 # Mark activity in the builtins
1836 1845 __builtin__.__dict__['__IPYTHON__active'] += 1
1837 1846
1838 1847 if self.has_readline:
1839 1848 self.readline_startup_hook(self.pre_readline)
1840 1849 # exit_now is set by a call to %Exit or %Quit, through the
1841 1850 # ask_exit callback.
1842 1851
1843 1852 while not self.exit_now:
1844 1853 self.hooks.pre_prompt_hook()
1845 1854 if more:
1846 1855 try:
1847 1856 prompt = self.hooks.generate_prompt(True)
1848 1857 except:
1849 1858 self.showtraceback()
1850 1859 if self.autoindent:
1851 1860 self.rl_do_indent = True
1852 1861
1853 1862 else:
1854 1863 try:
1855 1864 prompt = self.hooks.generate_prompt(False)
1856 1865 except:
1857 1866 self.showtraceback()
1858 1867 try:
1859 1868 line = self.raw_input(prompt, more)
1860 1869 if self.exit_now:
1861 1870 # quick exit on sys.std[in|out] close
1862 1871 break
1863 1872 if self.autoindent:
1864 1873 self.rl_do_indent = False
1865 1874
1866 1875 except KeyboardInterrupt:
1867 1876 #double-guard against keyboardinterrupts during kbdint handling
1868 1877 try:
1869 1878 self.write('\nKeyboardInterrupt\n')
1870 1879 self.resetbuffer()
1871 1880 # keep cache in sync with the prompt counter:
1872 1881 self.outputcache.prompt_count -= 1
1873 1882
1874 1883 if self.autoindent:
1875 1884 self.indent_current_nsp = 0
1876 1885 more = 0
1877 1886 except KeyboardInterrupt:
1878 1887 pass
1879 1888 except EOFError:
1880 1889 if self.autoindent:
1881 1890 self.rl_do_indent = False
1882 1891 if self.has_readline:
1883 1892 self.readline_startup_hook(None)
1884 1893 self.write('\n')
1885 1894 self.exit()
1886 1895 except bdb.BdbQuit:
1887 1896 warn('The Python debugger has exited with a BdbQuit exception.\n'
1888 1897 'Because of how pdb handles the stack, it is impossible\n'
1889 1898 'for IPython to properly format this particular exception.\n'
1890 1899 'IPython will resume normal operation.')
1891 1900 except:
1892 1901 # exceptions here are VERY RARE, but they can be triggered
1893 1902 # asynchronously by signal handlers, for example.
1894 1903 self.showtraceback()
1895 1904 else:
1896 1905 more = self.push_line(line)
1897 1906 if (self.SyntaxTB.last_syntax_error and
1898 1907 self.autoedit_syntax):
1899 1908 self.edit_syntax_error()
1900 1909
1901 1910 # We are off again...
1902 1911 __builtin__.__dict__['__IPYTHON__active'] -= 1
1903 1912
1904 1913 # Turn off the exit flag, so the mainloop can be restarted if desired
1905 1914 self.exit_now = False
1906 1915
1907 1916 def safe_execfile(self, fname, *where, **kw):
1908 1917 """A safe version of the builtin execfile().
1909 1918
1910 1919 This version will never throw an exception, but instead print
1911 1920 helpful error messages to the screen. This only works on pure
1912 1921 Python files with the .py extension.
1913 1922
1914 1923 Parameters
1915 1924 ----------
1916 1925 fname : string
1917 1926 The name of the file to be executed.
1918 1927 where : tuple
1919 1928 One or two namespaces, passed to execfile() as (globals,locals).
1920 1929 If only one is given, it is passed as both.
1921 1930 exit_ignore : bool (False)
1922 1931 If True, then silence SystemExit for non-zero status (it is always
1923 1932 silenced for zero status, as it is so common).
1924 1933 """
1925 1934 kw.setdefault('exit_ignore', False)
1926 1935
1927 1936 fname = os.path.abspath(os.path.expanduser(fname))
1928 1937
1929 1938 # Make sure we have a .py file
1930 1939 if not fname.endswith('.py'):
1931 1940 warn('File must end with .py to be run using execfile: <%s>' % fname)
1932 1941
1933 1942 # Make sure we can open the file
1934 1943 try:
1935 1944 with open(fname) as thefile:
1936 1945 pass
1937 1946 except:
1938 1947 warn('Could not open file <%s> for safe execution.' % fname)
1939 1948 return
1940 1949
1941 1950 # Find things also in current directory. This is needed to mimic the
1942 1951 # behavior of running a script from the system command line, where
1943 1952 # Python inserts the script's directory into sys.path
1944 1953 dname = os.path.dirname(fname)
1945 1954
1946 1955 with prepended_to_syspath(dname):
1947 1956 try:
1948 1957 execfile(fname,*where)
1949 1958 except SystemExit, status:
1950 1959 # If the call was made with 0 or None exit status (sys.exit(0)
1951 1960 # or sys.exit() ), don't bother showing a traceback, as both of
1952 1961 # these are considered normal by the OS:
1953 1962 # > python -c'import sys;sys.exit(0)'; echo $?
1954 1963 # 0
1955 1964 # > python -c'import sys;sys.exit()'; echo $?
1956 1965 # 0
1957 1966 # For other exit status, we show the exception unless
1958 1967 # explicitly silenced, but only in short form.
1959 1968 if status.code not in (0, None) and not kw['exit_ignore']:
1960 1969 self.showtraceback(exception_only=True)
1961 1970 except:
1962 1971 self.showtraceback()
1963 1972
1964 1973 def safe_execfile_ipy(self, fname):
1965 1974 """Like safe_execfile, but for .ipy files with IPython syntax.
1966 1975
1967 1976 Parameters
1968 1977 ----------
1969 1978 fname : str
1970 1979 The name of the file to execute. The filename must have a
1971 1980 .ipy extension.
1972 1981 """
1973 1982 fname = os.path.abspath(os.path.expanduser(fname))
1974 1983
1975 1984 # Make sure we have a .py file
1976 1985 if not fname.endswith('.ipy'):
1977 1986 warn('File must end with .py to be run using execfile: <%s>' % fname)
1978 1987
1979 1988 # Make sure we can open the file
1980 1989 try:
1981 1990 with open(fname) as thefile:
1982 1991 pass
1983 1992 except:
1984 1993 warn('Could not open file <%s> for safe execution.' % fname)
1985 1994 return
1986 1995
1987 1996 # Find things also in current directory. This is needed to mimic the
1988 1997 # behavior of running a script from the system command line, where
1989 1998 # Python inserts the script's directory into sys.path
1990 1999 dname = os.path.dirname(fname)
1991 2000
1992 2001 with prepended_to_syspath(dname):
1993 2002 try:
1994 2003 with open(fname) as thefile:
1995 2004 script = thefile.read()
1996 2005 # self.runlines currently captures all exceptions
1997 2006 # raise in user code. It would be nice if there were
1998 2007 # versions of runlines, execfile that did raise, so
1999 2008 # we could catch the errors.
2000 2009 self.runlines(script, clean=True)
2001 2010 except:
2002 2011 self.showtraceback()
2003 2012 warn('Unknown failure executing file: <%s>' % fname)
2004 2013
2005 2014 def _is_secondary_block_start(self, s):
2006 2015 if not s.endswith(':'):
2007 2016 return False
2008 2017 if (s.startswith('elif') or
2009 2018 s.startswith('else') or
2010 2019 s.startswith('except') or
2011 2020 s.startswith('finally')):
2012 2021 return True
2013 2022
2014 2023 def cleanup_ipy_script(self, script):
2015 2024 """Make a script safe for self.runlines()
2016 2025
2017 2026 Currently, IPython is lines based, with blocks being detected by
2018 2027 empty lines. This is a problem for block based scripts that may
2019 2028 not have empty lines after blocks. This script adds those empty
2020 2029 lines to make scripts safe for running in the current line based
2021 2030 IPython.
2022 2031 """
2023 2032 res = []
2024 2033 lines = script.splitlines()
2025 2034 level = 0
2026 2035
2027 2036 for l in lines:
2028 2037 lstripped = l.lstrip()
2029 2038 stripped = l.strip()
2030 2039 if not stripped:
2031 2040 continue
2032 2041 newlevel = len(l) - len(lstripped)
2033 2042 if level > 0 and newlevel == 0 and \
2034 2043 not self._is_secondary_block_start(stripped):
2035 2044 # add empty line
2036 2045 res.append('')
2037 2046 res.append(l)
2038 2047 level = newlevel
2039 2048
2040 2049 return '\n'.join(res) + '\n'
2041 2050
2042 2051 def runlines(self, lines, clean=False):
2043 2052 """Run a string of one or more lines of source.
2044 2053
2045 2054 This method is capable of running a string containing multiple source
2046 2055 lines, as if they had been entered at the IPython prompt. Since it
2047 2056 exposes IPython's processing machinery, the given strings can contain
2048 2057 magic calls (%magic), special shell access (!cmd), etc.
2049 2058 """
2050 2059
2051 2060 if isinstance(lines, (list, tuple)):
2052 2061 lines = '\n'.join(lines)
2053 2062
2054 2063 if clean:
2055 2064 lines = self.cleanup_ipy_script(lines)
2056 2065
2057 2066 # We must start with a clean buffer, in case this is run from an
2058 2067 # interactive IPython session (via a magic, for example).
2059 2068 self.resetbuffer()
2060 2069 lines = lines.splitlines()
2061 2070 more = 0
2062 2071
2063 2072 with nested(self.builtin_trap, self.display_trap):
2064 2073 for line in lines:
2065 2074 # skip blank lines so we don't mess up the prompt counter, but do
2066 2075 # NOT skip even a blank line if we are in a code block (more is
2067 2076 # true)
2068 2077
2069 2078 if line or more:
2070 2079 # push to raw history, so hist line numbers stay in sync
2071 2080 self.input_hist_raw.append("# " + line + "\n")
2072 2081 prefiltered = self.prefilter_manager.prefilter_lines(line,more)
2073 2082 more = self.push_line(prefiltered)
2074 2083 # IPython's runsource returns None if there was an error
2075 2084 # compiling the code. This allows us to stop processing right
2076 2085 # away, so the user gets the error message at the right place.
2077 2086 if more is None:
2078 2087 break
2079 2088 else:
2080 2089 self.input_hist_raw.append("\n")
2081 2090 # final newline in case the input didn't have it, so that the code
2082 2091 # actually does get executed
2083 2092 if more:
2084 2093 self.push_line('\n')
2085 2094
2086 2095 def runsource(self, source, filename='<input>', symbol='single'):
2087 2096 """Compile and run some source in the interpreter.
2088 2097
2089 2098 Arguments are as for compile_command().
2090 2099
2091 2100 One several things can happen:
2092 2101
2093 2102 1) The input is incorrect; compile_command() raised an
2094 2103 exception (SyntaxError or OverflowError). A syntax traceback
2095 2104 will be printed by calling the showsyntaxerror() method.
2096 2105
2097 2106 2) The input is incomplete, and more input is required;
2098 2107 compile_command() returned None. Nothing happens.
2099 2108
2100 2109 3) The input is complete; compile_command() returned a code
2101 2110 object. The code is executed by calling self.runcode() (which
2102 2111 also handles run-time exceptions, except for SystemExit).
2103 2112
2104 2113 The return value is:
2105 2114
2106 2115 - True in case 2
2107 2116
2108 2117 - False in the other cases, unless an exception is raised, where
2109 2118 None is returned instead. This can be used by external callers to
2110 2119 know whether to continue feeding input or not.
2111 2120
2112 2121 The return value can be used to decide whether to use sys.ps1 or
2113 2122 sys.ps2 to prompt the next line."""
2114 2123
2115 2124 # if the source code has leading blanks, add 'if 1:\n' to it
2116 2125 # this allows execution of indented pasted code. It is tempting
2117 2126 # to add '\n' at the end of source to run commands like ' a=1'
2118 2127 # directly, but this fails for more complicated scenarios
2119 2128 source=source.encode(self.stdin_encoding)
2120 2129 if source[:1] in [' ', '\t']:
2121 2130 source = 'if 1:\n%s' % source
2122 2131
2123 2132 try:
2124 2133 code = self.compile(source,filename,symbol)
2125 2134 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
2126 2135 # Case 1
2127 2136 self.showsyntaxerror(filename)
2128 2137 return None
2129 2138
2130 2139 if code is None:
2131 2140 # Case 2
2132 2141 return True
2133 2142
2134 2143 # Case 3
2135 2144 # We store the code object so that threaded shells and
2136 2145 # custom exception handlers can access all this info if needed.
2137 2146 # The source corresponding to this can be obtained from the
2138 2147 # buffer attribute as '\n'.join(self.buffer).
2139 2148 self.code_to_run = code
2140 2149 # now actually execute the code object
2141 2150 if self.runcode(code) == 0:
2142 2151 return False
2143 2152 else:
2144 2153 return None
2145 2154
2146 2155 def runcode(self,code_obj):
2147 2156 """Execute a code object.
2148 2157
2149 2158 When an exception occurs, self.showtraceback() is called to display a
2150 2159 traceback.
2151 2160
2152 2161 Return value: a flag indicating whether the code to be run completed
2153 2162 successfully:
2154 2163
2155 2164 - 0: successful execution.
2156 2165 - 1: an error occurred.
2157 2166 """
2158 2167
2159 2168 # Set our own excepthook in case the user code tries to call it
2160 2169 # directly, so that the IPython crash handler doesn't get triggered
2161 2170 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2162 2171
2163 2172 # we save the original sys.excepthook in the instance, in case config
2164 2173 # code (such as magics) needs access to it.
2165 2174 self.sys_excepthook = old_excepthook
2166 2175 outflag = 1 # happens in more places, so it's easier as default
2167 2176 try:
2168 2177 try:
2169 2178 self.hooks.pre_runcode_hook()
2170 2179 exec code_obj in self.user_global_ns, self.user_ns
2171 2180 finally:
2172 2181 # Reset our crash handler in place
2173 2182 sys.excepthook = old_excepthook
2174 2183 except SystemExit:
2175 2184 self.resetbuffer()
2176 2185 self.showtraceback(exception_only=True)
2177 2186 warn("To exit: use any of 'exit', 'quit', %Exit or Ctrl-D.", level=1)
2178 2187 except self.custom_exceptions:
2179 2188 etype,value,tb = sys.exc_info()
2180 2189 self.CustomTB(etype,value,tb)
2181 2190 except:
2182 2191 self.showtraceback()
2183 2192 else:
2184 2193 outflag = 0
2185 2194 if softspace(sys.stdout, 0):
2186 2195 print
2187 2196 # Flush out code object which has been run (and source)
2188 2197 self.code_to_run = None
2189 2198 return outflag
2190 2199
2191 2200 def push_line(self, line):
2192 2201 """Push a line to the interpreter.
2193 2202
2194 2203 The line should not have a trailing newline; it may have
2195 2204 internal newlines. The line is appended to a buffer and the
2196 2205 interpreter's runsource() method is called with the
2197 2206 concatenated contents of the buffer as source. If this
2198 2207 indicates that the command was executed or invalid, the buffer
2199 2208 is reset; otherwise, the command is incomplete, and the buffer
2200 2209 is left as it was after the line was appended. The return
2201 2210 value is 1 if more input is required, 0 if the line was dealt
2202 2211 with in some way (this is the same as runsource()).
2203 2212 """
2204 2213
2205 2214 # autoindent management should be done here, and not in the
2206 2215 # interactive loop, since that one is only seen by keyboard input. We
2207 2216 # need this done correctly even for code run via runlines (which uses
2208 2217 # push).
2209 2218
2210 2219 #print 'push line: <%s>' % line # dbg
2211 2220 for subline in line.splitlines():
2212 2221 self._autoindent_update(subline)
2213 2222 self.buffer.append(line)
2214 2223 more = self.runsource('\n'.join(self.buffer), self.filename)
2215 2224 if not more:
2216 2225 self.resetbuffer()
2217 2226 return more
2218 2227
2219 2228 def _autoindent_update(self,line):
2220 2229 """Keep track of the indent level."""
2221 2230
2222 2231 #debugx('line')
2223 2232 #debugx('self.indent_current_nsp')
2224 2233 if self.autoindent:
2225 2234 if line:
2226 2235 inisp = num_ini_spaces(line)
2227 2236 if inisp < self.indent_current_nsp:
2228 2237 self.indent_current_nsp = inisp
2229 2238
2230 2239 if line[-1] == ':':
2231 2240 self.indent_current_nsp += 4
2232 2241 elif dedent_re.match(line):
2233 2242 self.indent_current_nsp -= 4
2234 2243 else:
2235 2244 self.indent_current_nsp = 0
2236 2245
2237 2246 def resetbuffer(self):
2238 2247 """Reset the input buffer."""
2239 2248 self.buffer[:] = []
2240 2249
2241 2250 def raw_input(self,prompt='',continue_prompt=False):
2242 2251 """Write a prompt and read a line.
2243 2252
2244 2253 The returned line does not include the trailing newline.
2245 2254 When the user enters the EOF key sequence, EOFError is raised.
2246 2255
2247 2256 Optional inputs:
2248 2257
2249 2258 - prompt(''): a string to be printed to prompt the user.
2250 2259
2251 2260 - continue_prompt(False): whether this line is the first one or a
2252 2261 continuation in a sequence of inputs.
2253 2262 """
2254 2263 # growl.notify("raw_input: ", "prompt = %r\ncontinue_prompt = %s" % (prompt, continue_prompt))
2255 2264
2256 2265 # Code run by the user may have modified the readline completer state.
2257 2266 # We must ensure that our completer is back in place.
2258 2267
2259 2268 if self.has_readline:
2260 2269 self.set_completer()
2261 2270
2262 2271 try:
2263 2272 line = raw_input_original(prompt).decode(self.stdin_encoding)
2264 2273 except ValueError:
2265 2274 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2266 2275 " or sys.stdout.close()!\nExiting IPython!")
2267 2276 self.ask_exit()
2268 2277 return ""
2269 2278
2270 2279 # Try to be reasonably smart about not re-indenting pasted input more
2271 2280 # than necessary. We do this by trimming out the auto-indent initial
2272 2281 # spaces, if the user's actual input started itself with whitespace.
2273 2282 #debugx('self.buffer[-1]')
2274 2283
2275 2284 if self.autoindent:
2276 2285 if num_ini_spaces(line) > self.indent_current_nsp:
2277 2286 line = line[self.indent_current_nsp:]
2278 2287 self.indent_current_nsp = 0
2279 2288
2280 2289 # store the unfiltered input before the user has any chance to modify
2281 2290 # it.
2282 2291 if line.strip():
2283 2292 if continue_prompt:
2284 2293 self.input_hist_raw[-1] += '%s\n' % line
2285 2294 if self.has_readline and self.readline_use:
2286 2295 try:
2287 2296 histlen = self.readline.get_current_history_length()
2288 2297 if histlen > 1:
2289 2298 newhist = self.input_hist_raw[-1].rstrip()
2290 2299 self.readline.remove_history_item(histlen-1)
2291 2300 self.readline.replace_history_item(histlen-2,
2292 2301 newhist.encode(self.stdin_encoding))
2293 2302 except AttributeError:
2294 2303 pass # re{move,place}_history_item are new in 2.4.
2295 2304 else:
2296 2305 self.input_hist_raw.append('%s\n' % line)
2297 2306 # only entries starting at first column go to shadow history
2298 2307 if line.lstrip() == line:
2299 2308 self.shadowhist.add(line.strip())
2300 2309 elif not continue_prompt:
2301 2310 self.input_hist_raw.append('\n')
2302 2311 try:
2303 2312 lineout = self.prefilter_manager.prefilter_lines(line,continue_prompt)
2304 2313 except:
2305 2314 # blanket except, in case a user-defined prefilter crashes, so it
2306 2315 # can't take all of ipython with it.
2307 2316 self.showtraceback()
2308 2317 return ''
2309 2318 else:
2310 2319 return lineout
2311 2320
2312 2321 #-------------------------------------------------------------------------
2313 2322 # Working with components
2314 2323 #-------------------------------------------------------------------------
2315 2324
2316 2325 def get_component(self, name=None, klass=None):
2317 2326 """Fetch a component by name and klass in my tree."""
2318 2327 c = Component.get_instances(root=self, name=name, klass=klass)
2319 2328 if len(c) == 0:
2320 2329 return None
2321 2330 if len(c) == 1:
2322 2331 return c[0]
2323 2332 else:
2324 2333 return c
2325 2334
2326 2335 #-------------------------------------------------------------------------
2327 2336 # IPython extensions
2328 2337 #-------------------------------------------------------------------------
2329 2338
2330 2339 def load_extension(self, module_str):
2331 2340 """Load an IPython extension by its module name.
2332 2341
2333 2342 An IPython extension is an importable Python module that has
2334 2343 a function with the signature::
2335 2344
2336 2345 def load_ipython_extension(ipython):
2337 2346 # Do things with ipython
2338 2347
2339 2348 This function is called after your extension is imported and the
2340 2349 currently active :class:`InteractiveShell` instance is passed as
2341 2350 the only argument. You can do anything you want with IPython at
2342 2351 that point, including defining new magic and aliases, adding new
2343 2352 components, etc.
2344 2353
2345 2354 The :func:`load_ipython_extension` will be called again is you
2346 2355 load or reload the extension again. It is up to the extension
2347 2356 author to add code to manage that.
2348 2357
2349 2358 You can put your extension modules anywhere you want, as long as
2350 2359 they can be imported by Python's standard import mechanism. However,
2351 2360 to make it easy to write extensions, you can also put your extensions
2352 2361 in ``os.path.join(self.ipython_dir, 'extensions')``. This directory
2353 2362 is added to ``sys.path`` automatically.
2363
2364 If :func:`load_ipython_extension` returns anything, this function
2365 will return that object.
2354 2366 """
2355 2367 from IPython.utils.syspathcontext import prepended_to_syspath
2356 2368
2357 2369 if module_str not in sys.modules:
2358 2370 with prepended_to_syspath(self.ipython_extension_dir):
2359 2371 __import__(module_str)
2360 2372 mod = sys.modules[module_str]
2361 2373 return self._call_load_ipython_extension(mod)
2362 2374
2363 2375 def unload_extension(self, module_str):
2364 2376 """Unload an IPython extension by its module name.
2365 2377
2366 2378 This function looks up the extension's name in ``sys.modules`` and
2367 2379 simply calls ``mod.unload_ipython_extension(self)``.
2368 2380 """
2369 2381 if module_str in sys.modules:
2370 2382 mod = sys.modules[module_str]
2371 2383 self._call_unload_ipython_extension(mod)
2372 2384
2373 2385 def reload_extension(self, module_str):
2374 2386 """Reload an IPython extension by calling reload.
2375 2387
2376 2388 If the module has not been loaded before,
2377 2389 :meth:`InteractiveShell.load_extension` is called. Otherwise
2378 2390 :func:`reload` is called and then the :func:`load_ipython_extension`
2379 2391 function of the module, if it exists is called.
2380 2392 """
2381 2393 from IPython.utils.syspathcontext import prepended_to_syspath
2382 2394
2383 2395 with prepended_to_syspath(self.ipython_extension_dir):
2384 2396 if module_str in sys.modules:
2385 2397 mod = sys.modules[module_str]
2386 2398 reload(mod)
2387 2399 self._call_load_ipython_extension(mod)
2388 2400 else:
2389 2401 self.load_extension(module_str)
2390 2402
2391 2403 def _call_load_ipython_extension(self, mod):
2392 2404 if hasattr(mod, 'load_ipython_extension'):
2393 2405 return mod.load_ipython_extension(self)
2394 2406
2395 2407 def _call_unload_ipython_extension(self, mod):
2396 2408 if hasattr(mod, 'unload_ipython_extension'):
2397 2409 return mod.unload_ipython_extension(self)
2398 2410
2399 2411 #-------------------------------------------------------------------------
2400 2412 # Things related to the prefilter
2401 2413 #-------------------------------------------------------------------------
2402 2414
2403 2415 def init_prefilter(self):
2404 2416 self.prefilter_manager = PrefilterManager(self, config=self.config)
2405 2417 # Ultimately this will be refactored in the new interpreter code, but
2406 2418 # for now, we should expose the main prefilter method (there's legacy
2407 2419 # code out there that may rely on this).
2408 2420 self.prefilter = self.prefilter_manager.prefilter_lines
2409 2421
2410 2422 #-------------------------------------------------------------------------
2411 2423 # Utilities
2412 2424 #-------------------------------------------------------------------------
2413 2425
2414 2426 def getoutput(self, cmd):
2415 2427 return getoutput(self.var_expand(cmd,depth=2),
2416 2428 header=self.system_header,
2417 2429 verbose=self.system_verbose)
2418 2430
2419 2431 def getoutputerror(self, cmd):
2420 2432 return getoutputerror(self.var_expand(cmd,depth=2),
2421 2433 header=self.system_header,
2422 2434 verbose=self.system_verbose)
2423 2435
2424 2436 def var_expand(self,cmd,depth=0):
2425 2437 """Expand python variables in a string.
2426 2438
2427 2439 The depth argument indicates how many frames above the caller should
2428 2440 be walked to look for the local namespace where to expand variables.
2429 2441
2430 2442 The global namespace for expansion is always the user's interactive
2431 2443 namespace.
2432 2444 """
2433 2445
2434 2446 return str(ItplNS(cmd,
2435 2447 self.user_ns, # globals
2436 2448 # Skip our own frame in searching for locals:
2437 2449 sys._getframe(depth+1).f_locals # locals
2438 2450 ))
2439 2451
2440 2452 def mktempfile(self,data=None):
2441 2453 """Make a new tempfile and return its filename.
2442 2454
2443 2455 This makes a call to tempfile.mktemp, but it registers the created
2444 2456 filename internally so ipython cleans it up at exit time.
2445 2457
2446 2458 Optional inputs:
2447 2459
2448 2460 - data(None): if data is given, it gets written out to the temp file
2449 2461 immediately, and the file is closed again."""
2450 2462
2451 2463 filename = tempfile.mktemp('.py','ipython_edit_')
2452 2464 self.tempfiles.append(filename)
2453 2465
2454 2466 if data:
2455 2467 tmp_file = open(filename,'w')
2456 2468 tmp_file.write(data)
2457 2469 tmp_file.close()
2458 2470 return filename
2459 2471
2460 2472 def write(self,data):
2461 2473 """Write a string to the default output"""
2462 2474 Term.cout.write(data)
2463 2475
2464 2476 def write_err(self,data):
2465 2477 """Write a string to the default error output"""
2466 2478 Term.cerr.write(data)
2467 2479
2468 2480 def ask_yes_no(self,prompt,default=True):
2469 2481 if self.quiet:
2470 2482 return True
2471 2483 return ask_yes_no(prompt,default)
2472 2484
2473 2485 #-------------------------------------------------------------------------
2474 2486 # Things related to GUI support and pylab
2475 2487 #-------------------------------------------------------------------------
2476 2488
2477 2489 def enable_pylab(self, gui=None):
2478 2490 """Activate pylab support at runtime.
2479 2491
2480 2492 This turns on support for matplotlib, preloads into the interactive
2481 2493 namespace all of numpy and pylab, and configures IPython to correcdtly
2482 2494 interact with the GUI event loop. The GUI backend to be used can be
2483 2495 optionally selected with the optional :param:`gui` argument.
2484 2496
2485 2497 Parameters
2486 2498 ----------
2487 2499 gui : optional, string
2488 2500
2489 2501 If given, dictates the choice of matplotlib GUI backend to use
2490 2502 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
2491 2503 'gtk'), otherwise we use the default chosen by matplotlib (as
2492 2504 dictated by the matplotlib build-time options plus the user's
2493 2505 matplotlibrc configuration file).
2494 2506 """
2495 2507 # We want to prevent the loading of pylab to pollute the user's
2496 2508 # namespace as shown by the %who* magics, so we execute the activation
2497 2509 # code in an empty namespace, and we update *both* user_ns and
2498 # user_config_ns with this information.
2510 # user_ns_hidden with this information.
2499 2511 ns = {}
2500 2512 gui = pylab_activate(ns, gui)
2501 2513 self.user_ns.update(ns)
2502 self.user_config_ns.update(ns)
2514 self.user_ns_hidden.update(ns)
2503 2515 # Now we must activate the gui pylab wants to use, and fix %run to take
2504 2516 # plot updates into account
2505 2517 enable_gui(gui)
2506 2518 self.magic_run = self._pylab_magic_run
2507 2519
2508 2520 #-------------------------------------------------------------------------
2509 2521 # Things related to IPython exiting
2510 2522 #-------------------------------------------------------------------------
2511 2523
2512 2524 def ask_exit(self):
2513 2525 """ Ask the shell to exit. Can be overiden and used as a callback. """
2514 2526 self.exit_now = True
2515 2527
2516 2528 def exit(self):
2517 2529 """Handle interactive exit.
2518 2530
2519 2531 This method calls the ask_exit callback."""
2520 2532 if self.confirm_exit:
2521 2533 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2522 2534 self.ask_exit()
2523 2535 else:
2524 2536 self.ask_exit()
2525 2537
2526 2538 def atexit_operations(self):
2527 2539 """This will be executed at the time of exit.
2528 2540
2529 2541 Saving of persistent data should be performed here.
2530 2542 """
2531 2543 self.savehist()
2532 2544
2533 2545 # Cleanup all tempfiles left around
2534 2546 for tfile in self.tempfiles:
2535 2547 try:
2536 2548 os.unlink(tfile)
2537 2549 except OSError:
2538 2550 pass
2539 2551
2540 2552 # Clear all user namespaces to release all references cleanly.
2541 2553 self.reset()
2542 2554
2543 2555 # Run user hooks
2544 2556 self.hooks.shutdown_hook()
2545 2557
2546 2558 def cleanup(self):
2547 2559 self.restore_sys_module_state()
2548 2560
2549 2561
@@ -1,41 +1,41 b''
1 1 """Support for interactive macros in IPython"""
2 2
3 3 #*****************************************************************************
4 4 # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu>
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #*****************************************************************************
9 9
10 from IPython.utils.genutils import Term
10 from IPython.utils.io import Term
11 11 from IPython.core.autocall import IPyAutocall
12 12
13 13 class Macro(IPyAutocall):
14 14 """Simple class to store the value of macros as strings.
15 15
16 16 Macro is just a callable that executes a string of IPython
17 17 input when called.
18 18
19 19 Args to macro are available in _margv list if you need them.
20 20 """
21 21
22 22 def __init__(self,data):
23 23
24 24 # store the macro value, as a single string which can be evaluated by
25 25 # runlines()
26 26 self.value = ''.join(data).rstrip()+'\n'
27 27
28 28 def __str__(self):
29 29 return self.value
30 30
31 31 def __repr__(self):
32 32 return 'IPython.macro.Macro(%s)' % repr(self.value)
33 33
34 34 def __call__(self,*args):
35 35 Term.cout.flush()
36 36 self._ip.user_ns['_margv'] = args
37 37 self._ip.runlines(self.value)
38 38
39 39 def __getstate__(self):
40 40 """ needed for safe pickling via %store """
41 41 return {'value': self.value}
@@ -1,3616 +1,3618 b''
1 # -*- coding: utf-8 -*-
1 # encoding: utf-8
2 2 """Magic functions for InteractiveShell.
3 3 """
4 4
5 #*****************************************************************************
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
8 #
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008-2009 The IPython Development Team
9
9 10 # Distributed under the terms of the BSD License. The full license is in
10 11 # the file COPYING, distributed as part of this software.
11 #*****************************************************************************
12 #-----------------------------------------------------------------------------
12 13
13 #****************************************************************************
14 # Modules and globals
14 #-----------------------------------------------------------------------------
15 # Imports
16 #-----------------------------------------------------------------------------
15 17
16 # Python standard modules
17 18 import __builtin__
18 19 import bdb
19 20 import inspect
20 21 import os
21 import pdb
22 import pydoc
23 22 import sys
24 23 import shutil
25 24 import re
26 import tempfile
27 25 import time
28 import cPickle as pickle
29 26 import textwrap
27 import types
30 28 from cStringIO import StringIO
31 29 from getopt import getopt,GetoptError
32 from pprint import pprint, pformat
30 from pprint import pformat
33 31
34 32 # cProfile was added in Python2.5
35 33 try:
36 34 import cProfile as profile
37 35 import pstats
38 36 except ImportError:
39 37 # profile isn't bundled by default in Debian for license reasons
40 38 try:
41 39 import profile,pstats
42 40 except ImportError:
43 41 profile = pstats = None
44 42
45 # Homebrewed
46 43 import IPython
47 import IPython.utils.generics
48
49 44 from IPython.core import debugger, oinspect
50 45 from IPython.core.error import TryNext
51 46 from IPython.core.error import UsageError
52 47 from IPython.core.fakemodule import FakeModule
53 48 from IPython.core.macro import Macro
54 49 from IPython.core.page import page
55 50 from IPython.core.prefilter import ESC_MAGIC
56 from IPython.core.pylabtools import mpl_runner
51 from IPython.lib.pylabtools import mpl_runner
57 52 from IPython.lib.inputhook import enable_gui
58 from IPython.external.Itpl import Itpl, itpl, printpl,itplns
53 from IPython.external.Itpl import itpl, printpl
59 54 from IPython.testing import decorators as testdec
60 from IPython.utils import platutils
61 from IPython.utils import wildcard
62 from IPython.utils.PyColorize import Parser
55 from IPython.utils.io import Term, file_read, nlprint
56 from IPython.utils.path import get_py_filename
57 from IPython.utils.process import arg_split, abbrev_cwd
58 from IPython.utils.terminal import set_term_title
59 from IPython.utils.text import LSString, SList, StringTypes
60 from IPython.utils.timing import clock, clock2
61 from IPython.utils.warn import warn, error
63 62 from IPython.utils.ipstruct import Struct
63 import IPython.utils.generics
64 64
65 # XXX - We need to switch to explicit imports here with genutils
66 from IPython.utils.genutils import *
67
68 #***************************************************************************
65 #-----------------------------------------------------------------------------
69 66 # Utility functions
67 #-----------------------------------------------------------------------------
68
70 69 def on_off(tag):
71 70 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
72 71 return ['OFF','ON'][tag]
73 72
74 73 class Bunch: pass
75 74
76 75 def compress_dhist(dh):
77 76 head, tail = dh[:-10], dh[-10:]
78 77
79 78 newhead = []
80 79 done = set()
81 80 for h in head:
82 81 if h in done:
83 82 continue
84 83 newhead.append(h)
85 84 done.add(h)
86 85
87 86 return newhead + tail
88 87
89 88
90 89 #***************************************************************************
91 90 # Main class implementing Magic functionality
92 91
93 92 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
94 93 # on construction of the main InteractiveShell object. Something odd is going
95 94 # on with super() calls, Component and the MRO... For now leave it as-is, but
96 95 # eventually this needs to be clarified.
96 # BG: This is because InteractiveShell inherits from this, but is itself a
97 # Component. This messes up the MRO in some way. The fix is that we need to
98 # make Magic a component that InteractiveShell does not subclass.
97 99
98 100 class Magic:
99 101 """Magic functions for InteractiveShell.
100 102
101 103 Shell functions which can be reached as %function_name. All magic
102 104 functions should accept a string, which they can parse for their own
103 105 needs. This can make some functions easier to type, eg `%cd ../`
104 106 vs. `%cd("../")`
105 107
106 108 ALL definitions MUST begin with the prefix magic_. The user won't need it
107 109 at the command line, but it is is needed in the definition. """
108 110
109 111 # class globals
110 112 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
111 113 'Automagic is ON, % prefix NOT needed for magic functions.']
112 114
113 115 #......................................................................
114 116 # some utility functions
115 117
116 118 def __init__(self,shell):
117 119
118 120 self.options_table = {}
119 121 if profile is None:
120 122 self.magic_prun = self.profile_missing_notice
121 123 self.shell = shell
122 124
123 125 # namespace for holding state we may need
124 126 self._magic_state = Bunch()
125 127
126 128 def profile_missing_notice(self, *args, **kwargs):
127 129 error("""\
128 130 The profile module could not be found. It has been removed from the standard
129 131 python packages because of its non-free license. To use profiling, install the
130 132 python-profiler package from non-free.""")
131 133
132 134 def default_option(self,fn,optstr):
133 135 """Make an entry in the options_table for fn, with value optstr"""
134 136
135 137 if fn not in self.lsmagic():
136 138 error("%s is not a magic function" % fn)
137 139 self.options_table[fn] = optstr
138 140
139 141 def lsmagic(self):
140 142 """Return a list of currently available magic functions.
141 143
142 144 Gives a list of the bare names after mangling (['ls','cd', ...], not
143 145 ['magic_ls','magic_cd',...]"""
144 146
145 147 # FIXME. This needs a cleanup, in the way the magics list is built.
146 148
147 149 # magics in class definition
148 150 class_magic = lambda fn: fn.startswith('magic_') and \
149 151 callable(Magic.__dict__[fn])
150 152 # in instance namespace (run-time user additions)
151 153 inst_magic = lambda fn: fn.startswith('magic_') and \
152 154 callable(self.__dict__[fn])
153 155 # and bound magics by user (so they can access self):
154 156 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
155 157 callable(self.__class__.__dict__[fn])
156 158 magics = filter(class_magic,Magic.__dict__.keys()) + \
157 159 filter(inst_magic,self.__dict__.keys()) + \
158 160 filter(inst_bound_magic,self.__class__.__dict__.keys())
159 161 out = []
160 162 for fn in set(magics):
161 163 out.append(fn.replace('magic_','',1))
162 164 out.sort()
163 165 return out
164 166
165 167 def extract_input_slices(self,slices,raw=False):
166 168 """Return as a string a set of input history slices.
167 169
168 170 Inputs:
169 171
170 172 - slices: the set of slices is given as a list of strings (like
171 173 ['1','4:8','9'], since this function is for use by magic functions
172 174 which get their arguments as strings.
173 175
174 176 Optional inputs:
175 177
176 178 - raw(False): by default, the processed input is used. If this is
177 179 true, the raw input history is used instead.
178 180
179 181 Note that slices can be called with two notations:
180 182
181 183 N:M -> standard python form, means including items N...(M-1).
182 184
183 185 N-M -> include items N..M (closed endpoint)."""
184 186
185 187 if raw:
186 188 hist = self.shell.input_hist_raw
187 189 else:
188 190 hist = self.shell.input_hist
189 191
190 192 cmds = []
191 193 for chunk in slices:
192 194 if ':' in chunk:
193 195 ini,fin = map(int,chunk.split(':'))
194 196 elif '-' in chunk:
195 197 ini,fin = map(int,chunk.split('-'))
196 198 fin += 1
197 199 else:
198 200 ini = int(chunk)
199 201 fin = ini+1
200 202 cmds.append(hist[ini:fin])
201 203 return cmds
202 204
203 205 def _ofind(self, oname, namespaces=None):
204 206 """Find an object in the available namespaces.
205 207
206 208 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
207 209
208 210 Has special code to detect magic functions.
209 211 """
210 212
211 213 oname = oname.strip()
212 214
213 215 alias_ns = None
214 216 if namespaces is None:
215 217 # Namespaces to search in:
216 218 # Put them in a list. The order is important so that we
217 219 # find things in the same order that Python finds them.
218 220 namespaces = [ ('Interactive', self.shell.user_ns),
219 221 ('IPython internal', self.shell.internal_ns),
220 222 ('Python builtin', __builtin__.__dict__),
221 223 ('Alias', self.shell.alias_manager.alias_table),
222 224 ]
223 225 alias_ns = self.shell.alias_manager.alias_table
224 226
225 227 # initialize results to 'null'
226 228 found = 0; obj = None; ospace = None; ds = None;
227 229 ismagic = 0; isalias = 0; parent = None
228 230
229 231 # Look for the given name by splitting it in parts. If the head is
230 232 # found, then we look for all the remaining parts as members, and only
231 233 # declare success if we can find them all.
232 234 oname_parts = oname.split('.')
233 235 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
234 236 for nsname,ns in namespaces:
235 237 try:
236 238 obj = ns[oname_head]
237 239 except KeyError:
238 240 continue
239 241 else:
240 242 #print 'oname_rest:', oname_rest # dbg
241 243 for part in oname_rest:
242 244 try:
243 245 parent = obj
244 246 obj = getattr(obj,part)
245 247 except:
246 248 # Blanket except b/c some badly implemented objects
247 249 # allow __getattr__ to raise exceptions other than
248 250 # AttributeError, which then crashes IPython.
249 251 break
250 252 else:
251 253 # If we finish the for loop (no break), we got all members
252 254 found = 1
253 255 ospace = nsname
254 256 if ns == alias_ns:
255 257 isalias = 1
256 258 break # namespace loop
257 259
258 260 # Try to see if it's magic
259 261 if not found:
260 262 if oname.startswith(ESC_MAGIC):
261 263 oname = oname[1:]
262 264 obj = getattr(self,'magic_'+oname,None)
263 265 if obj is not None:
264 266 found = 1
265 267 ospace = 'IPython internal'
266 268 ismagic = 1
267 269
268 270 # Last try: special-case some literals like '', [], {}, etc:
269 271 if not found and oname_head in ["''",'""','[]','{}','()']:
270 272 obj = eval(oname_head)
271 273 found = 1
272 274 ospace = 'Interactive'
273 275
274 276 return {'found':found, 'obj':obj, 'namespace':ospace,
275 277 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
276 278
277 279 def arg_err(self,func):
278 280 """Print docstring if incorrect arguments were passed"""
279 281 print 'Error in arguments:'
280 print OInspect.getdoc(func)
282 print oinspect.getdoc(func)
281 283
282 284 def format_latex(self,strng):
283 285 """Format a string for latex inclusion."""
284 286
285 287 # Characters that need to be escaped for latex:
286 288 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
287 289 # Magic command names as headers:
288 290 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
289 291 re.MULTILINE)
290 292 # Magic commands
291 293 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
292 294 re.MULTILINE)
293 295 # Paragraph continue
294 296 par_re = re.compile(r'\\$',re.MULTILINE)
295 297
296 298 # The "\n" symbol
297 299 newline_re = re.compile(r'\\n')
298 300
299 301 # Now build the string for output:
300 302 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
301 303 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
302 304 strng)
303 305 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
304 306 strng = par_re.sub(r'\\\\',strng)
305 307 strng = escape_re.sub(r'\\\1',strng)
306 308 strng = newline_re.sub(r'\\textbackslash{}n',strng)
307 309 return strng
308 310
309 311 def format_screen(self,strng):
310 312 """Format a string for screen printing.
311 313
312 314 This removes some latex-type format codes."""
313 315 # Paragraph continue
314 316 par_re = re.compile(r'\\$',re.MULTILINE)
315 317 strng = par_re.sub('',strng)
316 318 return strng
317 319
318 320 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
319 321 """Parse options passed to an argument string.
320 322
321 323 The interface is similar to that of getopt(), but it returns back a
322 324 Struct with the options as keys and the stripped argument string still
323 325 as a string.
324 326
325 327 arg_str is quoted as a true sys.argv vector by using shlex.split.
326 328 This allows us to easily expand variables, glob files, quote
327 329 arguments, etc.
328 330
329 331 Options:
330 332 -mode: default 'string'. If given as 'list', the argument string is
331 333 returned as a list (split on whitespace) instead of a string.
332 334
333 335 -list_all: put all option values in lists. Normally only options
334 336 appearing more than once are put in a list.
335 337
336 338 -posix (True): whether to split the input line in POSIX mode or not,
337 339 as per the conventions outlined in the shlex module from the
338 340 standard library."""
339 341
340 342 # inject default options at the beginning of the input line
341 343 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
342 344 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
343 345
344 346 mode = kw.get('mode','string')
345 347 if mode not in ['string','list']:
346 348 raise ValueError,'incorrect mode given: %s' % mode
347 349 # Get options
348 350 list_all = kw.get('list_all',0)
349 351 posix = kw.get('posix', os.name == 'posix')
350 352
351 353 # Check if we have more than one argument to warrant extra processing:
352 354 odict = {} # Dictionary with options
353 355 args = arg_str.split()
354 356 if len(args) >= 1:
355 357 # If the list of inputs only has 0 or 1 thing in it, there's no
356 358 # need to look for options
357 359 argv = arg_split(arg_str,posix)
358 360 # Do regular option processing
359 361 try:
360 362 opts,args = getopt(argv,opt_str,*long_opts)
361 363 except GetoptError,e:
362 364 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
363 365 " ".join(long_opts)))
364 366 for o,a in opts:
365 367 if o.startswith('--'):
366 368 o = o[2:]
367 369 else:
368 370 o = o[1:]
369 371 try:
370 372 odict[o].append(a)
371 373 except AttributeError:
372 374 odict[o] = [odict[o],a]
373 375 except KeyError:
374 376 if list_all:
375 377 odict[o] = [a]
376 378 else:
377 379 odict[o] = a
378 380
379 381 # Prepare opts,args for return
380 382 opts = Struct(odict)
381 383 if mode == 'string':
382 384 args = ' '.join(args)
383 385
384 386 return opts,args
385 387
386 388 #......................................................................
387 389 # And now the actual magic functions
388 390
389 391 # Functions for IPython shell work (vars,funcs, config, etc)
390 392 def magic_lsmagic(self, parameter_s = ''):
391 393 """List currently available magic functions."""
392 394 mesc = ESC_MAGIC
393 395 print 'Available magic functions:\n'+mesc+\
394 396 (' '+mesc).join(self.lsmagic())
395 397 print '\n' + Magic.auto_status[self.shell.automagic]
396 398 return None
397 399
398 400 def magic_magic(self, parameter_s = ''):
399 401 """Print information about the magic function system.
400 402
401 403 Supported formats: -latex, -brief, -rest
402 404 """
403 405
404 406 mode = ''
405 407 try:
406 408 if parameter_s.split()[0] == '-latex':
407 409 mode = 'latex'
408 410 if parameter_s.split()[0] == '-brief':
409 411 mode = 'brief'
410 412 if parameter_s.split()[0] == '-rest':
411 413 mode = 'rest'
412 414 rest_docs = []
413 415 except:
414 416 pass
415 417
416 418 magic_docs = []
417 419 for fname in self.lsmagic():
418 420 mname = 'magic_' + fname
419 421 for space in (Magic,self,self.__class__):
420 422 try:
421 423 fn = space.__dict__[mname]
422 424 except KeyError:
423 425 pass
424 426 else:
425 427 break
426 428 if mode == 'brief':
427 429 # only first line
428 430 if fn.__doc__:
429 431 fndoc = fn.__doc__.split('\n',1)[0]
430 432 else:
431 433 fndoc = 'No documentation'
432 434 else:
433 435 if fn.__doc__:
434 436 fndoc = fn.__doc__.rstrip()
435 437 else:
436 438 fndoc = 'No documentation'
437 439
438 440
439 441 if mode == 'rest':
440 442 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
441 443 fname,fndoc))
442 444
443 445 else:
444 446 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
445 447 fname,fndoc))
446 448
447 449 magic_docs = ''.join(magic_docs)
448 450
449 451 if mode == 'rest':
450 452 return "".join(rest_docs)
451 453
452 454 if mode == 'latex':
453 455 print self.format_latex(magic_docs)
454 456 return
455 457 else:
456 458 magic_docs = self.format_screen(magic_docs)
457 459 if mode == 'brief':
458 460 return magic_docs
459 461
460 462 outmsg = """
461 463 IPython's 'magic' functions
462 464 ===========================
463 465
464 466 The magic function system provides a series of functions which allow you to
465 467 control the behavior of IPython itself, plus a lot of system-type
466 468 features. All these functions are prefixed with a % character, but parameters
467 469 are given without parentheses or quotes.
468 470
469 471 NOTE: If you have 'automagic' enabled (via the command line option or with the
470 472 %automagic function), you don't need to type in the % explicitly. By default,
471 473 IPython ships with automagic on, so you should only rarely need the % escape.
472 474
473 475 Example: typing '%cd mydir' (without the quotes) changes you working directory
474 476 to 'mydir', if it exists.
475 477
476 478 You can define your own magic functions to extend the system. See the supplied
477 479 ipythonrc and example-magic.py files for details (in your ipython
478 480 configuration directory, typically $HOME/.ipython/).
479 481
480 482 You can also define your own aliased names for magic functions. In your
481 483 ipythonrc file, placing a line like:
482 484
483 485 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
484 486
485 487 will define %pf as a new name for %profile.
486 488
487 489 You can also call magics in code using the magic() function, which IPython
488 490 automatically adds to the builtin namespace. Type 'magic?' for details.
489 491
490 492 For a list of the available magic functions, use %lsmagic. For a description
491 493 of any of them, type %magic_name?, e.g. '%cd?'.
492 494
493 495 Currently the magic system has the following functions:\n"""
494 496
495 497 mesc = ESC_MAGIC
496 498 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
497 499 "\n\n%s%s\n\n%s" % (outmsg,
498 500 magic_docs,mesc,mesc,
499 501 (' '+mesc).join(self.lsmagic()),
500 502 Magic.auto_status[self.shell.automagic] ) )
501 503
502 504 page(outmsg,screen_lines=self.shell.usable_screen_length)
503 505
504 506
505 507 def magic_autoindent(self, parameter_s = ''):
506 508 """Toggle autoindent on/off (if available)."""
507 509
508 510 self.shell.set_autoindent()
509 511 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
510 512
511 513
512 514 def magic_automagic(self, parameter_s = ''):
513 515 """Make magic functions callable without having to type the initial %.
514 516
515 517 Without argumentsl toggles on/off (when off, you must call it as
516 518 %automagic, of course). With arguments it sets the value, and you can
517 519 use any of (case insensitive):
518 520
519 521 - on,1,True: to activate
520 522
521 523 - off,0,False: to deactivate.
522 524
523 525 Note that magic functions have lowest priority, so if there's a
524 526 variable whose name collides with that of a magic fn, automagic won't
525 527 work for that function (you get the variable instead). However, if you
526 528 delete the variable (del var), the previously shadowed magic function
527 529 becomes visible to automagic again."""
528 530
529 531 arg = parameter_s.lower()
530 532 if parameter_s in ('on','1','true'):
531 533 self.shell.automagic = True
532 534 elif parameter_s in ('off','0','false'):
533 535 self.shell.automagic = False
534 536 else:
535 537 self.shell.automagic = not self.shell.automagic
536 538 print '\n' + Magic.auto_status[self.shell.automagic]
537 539
538 540 @testdec.skip_doctest
539 541 def magic_autocall(self, parameter_s = ''):
540 542 """Make functions callable without having to type parentheses.
541 543
542 544 Usage:
543 545
544 546 %autocall [mode]
545 547
546 548 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
547 549 value is toggled on and off (remembering the previous state).
548 550
549 551 In more detail, these values mean:
550 552
551 553 0 -> fully disabled
552 554
553 555 1 -> active, but do not apply if there are no arguments on the line.
554 556
555 557 In this mode, you get:
556 558
557 559 In [1]: callable
558 560 Out[1]: <built-in function callable>
559 561
560 562 In [2]: callable 'hello'
561 563 ------> callable('hello')
562 564 Out[2]: False
563 565
564 566 2 -> Active always. Even if no arguments are present, the callable
565 567 object is called:
566 568
567 569 In [2]: float
568 570 ------> float()
569 571 Out[2]: 0.0
570 572
571 573 Note that even with autocall off, you can still use '/' at the start of
572 574 a line to treat the first argument on the command line as a function
573 575 and add parentheses to it:
574 576
575 577 In [8]: /str 43
576 578 ------> str(43)
577 579 Out[8]: '43'
578 580
579 581 # all-random (note for auto-testing)
580 582 """
581 583
582 584 if parameter_s:
583 585 arg = int(parameter_s)
584 586 else:
585 587 arg = 'toggle'
586 588
587 589 if not arg in (0,1,2,'toggle'):
588 590 error('Valid modes: (0->Off, 1->Smart, 2->Full')
589 591 return
590 592
591 593 if arg in (0,1,2):
592 594 self.shell.autocall = arg
593 595 else: # toggle
594 596 if self.shell.autocall:
595 597 self._magic_state.autocall_save = self.shell.autocall
596 598 self.shell.autocall = 0
597 599 else:
598 600 try:
599 601 self.shell.autocall = self._magic_state.autocall_save
600 602 except AttributeError:
601 603 self.shell.autocall = self._magic_state.autocall_save = 1
602 604
603 605 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
604 606
605 607 def magic_system_verbose(self, parameter_s = ''):
606 608 """Set verbose printing of system calls.
607 609
608 610 If called without an argument, act as a toggle"""
609 611
610 612 if parameter_s:
611 613 val = bool(eval(parameter_s))
612 614 else:
613 615 val = None
614 616
615 617 if self.shell.system_verbose:
616 618 self.shell.system_verbose = False
617 619 else:
618 620 self.shell.system_verbose = True
619 621 print "System verbose printing is:",\
620 622 ['OFF','ON'][self.shell.system_verbose]
621 623
622 624
623 625 def magic_page(self, parameter_s=''):
624 626 """Pretty print the object and display it through a pager.
625 627
626 628 %page [options] OBJECT
627 629
628 630 If no object is given, use _ (last output).
629 631
630 632 Options:
631 633
632 634 -r: page str(object), don't pretty-print it."""
633 635
634 636 # After a function contributed by Olivier Aubert, slightly modified.
635 637
636 638 # Process options/args
637 639 opts,args = self.parse_options(parameter_s,'r')
638 640 raw = 'r' in opts
639 641
640 642 oname = args and args or '_'
641 643 info = self._ofind(oname)
642 644 if info['found']:
643 645 txt = (raw and str or pformat)( info['obj'] )
644 646 page(txt)
645 647 else:
646 648 print 'Object `%s` not found' % oname
647 649
648 650 def magic_profile(self, parameter_s=''):
649 651 """Print your currently active IPyhton profile."""
650 652 if self.shell.profile:
651 653 printpl('Current IPython profile: $self.shell.profile.')
652 654 else:
653 655 print 'No profile active.'
654 656
655 657 def magic_pinfo(self, parameter_s='', namespaces=None):
656 658 """Provide detailed information about an object.
657 659
658 660 '%pinfo object' is just a synonym for object? or ?object."""
659 661
660 662 #print 'pinfo par: <%s>' % parameter_s # dbg
661 663
662 664
663 665 # detail_level: 0 -> obj? , 1 -> obj??
664 666 detail_level = 0
665 667 # We need to detect if we got called as 'pinfo pinfo foo', which can
666 668 # happen if the user types 'pinfo foo?' at the cmd line.
667 669 pinfo,qmark1,oname,qmark2 = \
668 670 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
669 671 if pinfo or qmark1 or qmark2:
670 672 detail_level = 1
671 673 if "*" in oname:
672 674 self.magic_psearch(oname)
673 675 else:
674 676 self._inspect('pinfo', oname, detail_level=detail_level,
675 677 namespaces=namespaces)
676 678
677 679 def magic_pdef(self, parameter_s='', namespaces=None):
678 680 """Print the definition header for any callable object.
679 681
680 682 If the object is a class, print the constructor information."""
681 683 self._inspect('pdef',parameter_s, namespaces)
682 684
683 685 def magic_pdoc(self, parameter_s='', namespaces=None):
684 686 """Print the docstring for an object.
685 687
686 688 If the given object is a class, it will print both the class and the
687 689 constructor docstrings."""
688 690 self._inspect('pdoc',parameter_s, namespaces)
689 691
690 692 def magic_psource(self, parameter_s='', namespaces=None):
691 693 """Print (or run through pager) the source code for an object."""
692 694 self._inspect('psource',parameter_s, namespaces)
693 695
694 696 def magic_pfile(self, parameter_s=''):
695 697 """Print (or run through pager) the file where an object is defined.
696 698
697 699 The file opens at the line where the object definition begins. IPython
698 700 will honor the environment variable PAGER if set, and otherwise will
699 701 do its best to print the file in a convenient form.
700 702
701 703 If the given argument is not an object currently defined, IPython will
702 704 try to interpret it as a filename (automatically adding a .py extension
703 705 if needed). You can thus use %pfile as a syntax highlighting code
704 706 viewer."""
705 707
706 708 # first interpret argument as an object name
707 709 out = self._inspect('pfile',parameter_s)
708 710 # if not, try the input as a filename
709 711 if out == 'not found':
710 712 try:
711 713 filename = get_py_filename(parameter_s)
712 714 except IOError,msg:
713 715 print msg
714 716 return
715 717 page(self.shell.inspector.format(file(filename).read()))
716 718
717 719 def _inspect(self,meth,oname,namespaces=None,**kw):
718 720 """Generic interface to the inspector system.
719 721
720 722 This function is meant to be called by pdef, pdoc & friends."""
721 723
722 724 #oname = oname.strip()
723 725 #print '1- oname: <%r>' % oname # dbg
724 726 try:
725 727 oname = oname.strip().encode('ascii')
726 728 #print '2- oname: <%r>' % oname # dbg
727 729 except UnicodeEncodeError:
728 730 print 'Python identifiers can only contain ascii characters.'
729 731 return 'not found'
730 732
731 733 info = Struct(self._ofind(oname, namespaces))
732 734
733 735 if info.found:
734 736 try:
735 737 IPython.utils.generics.inspect_object(info.obj)
736 738 return
737 739 except TryNext:
738 740 pass
739 741 # Get the docstring of the class property if it exists.
740 742 path = oname.split('.')
741 743 root = '.'.join(path[:-1])
742 744 if info.parent is not None:
743 745 try:
744 746 target = getattr(info.parent, '__class__')
745 747 # The object belongs to a class instance.
746 748 try:
747 749 target = getattr(target, path[-1])
748 750 # The class defines the object.
749 751 if isinstance(target, property):
750 752 oname = root + '.__class__.' + path[-1]
751 753 info = Struct(self._ofind(oname))
752 754 except AttributeError: pass
753 755 except AttributeError: pass
754 756
755 757 pmethod = getattr(self.shell.inspector,meth)
756 758 formatter = info.ismagic and self.format_screen or None
757 759 if meth == 'pdoc':
758 760 pmethod(info.obj,oname,formatter)
759 761 elif meth == 'pinfo':
760 762 pmethod(info.obj,oname,formatter,info,**kw)
761 763 else:
762 764 pmethod(info.obj,oname)
763 765 else:
764 766 print 'Object `%s` not found.' % oname
765 767 return 'not found' # so callers can take other action
766 768
767 769 def magic_psearch(self, parameter_s=''):
768 770 """Search for object in namespaces by wildcard.
769 771
770 772 %psearch [options] PATTERN [OBJECT TYPE]
771 773
772 774 Note: ? can be used as a synonym for %psearch, at the beginning or at
773 775 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
774 776 rest of the command line must be unchanged (options come first), so
775 777 for example the following forms are equivalent
776 778
777 779 %psearch -i a* function
778 780 -i a* function?
779 781 ?-i a* function
780 782
781 783 Arguments:
782 784
783 785 PATTERN
784 786
785 787 where PATTERN is a string containing * as a wildcard similar to its
786 788 use in a shell. The pattern is matched in all namespaces on the
787 789 search path. By default objects starting with a single _ are not
788 790 matched, many IPython generated objects have a single
789 791 underscore. The default is case insensitive matching. Matching is
790 792 also done on the attributes of objects and not only on the objects
791 793 in a module.
792 794
793 795 [OBJECT TYPE]
794 796
795 797 Is the name of a python type from the types module. The name is
796 798 given in lowercase without the ending type, ex. StringType is
797 799 written string. By adding a type here only objects matching the
798 800 given type are matched. Using all here makes the pattern match all
799 801 types (this is the default).
800 802
801 803 Options:
802 804
803 805 -a: makes the pattern match even objects whose names start with a
804 806 single underscore. These names are normally ommitted from the
805 807 search.
806 808
807 809 -i/-c: make the pattern case insensitive/sensitive. If neither of
808 810 these options is given, the default is read from your ipythonrc
809 811 file. The option name which sets this value is
810 812 'wildcards_case_sensitive'. If this option is not specified in your
811 813 ipythonrc file, IPython's internal default is to do a case sensitive
812 814 search.
813 815
814 816 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
815 817 specifiy can be searched in any of the following namespaces:
816 818 'builtin', 'user', 'user_global','internal', 'alias', where
817 819 'builtin' and 'user' are the search defaults. Note that you should
818 820 not use quotes when specifying namespaces.
819 821
820 822 'Builtin' contains the python module builtin, 'user' contains all
821 823 user data, 'alias' only contain the shell aliases and no python
822 824 objects, 'internal' contains objects used by IPython. The
823 825 'user_global' namespace is only used by embedded IPython instances,
824 826 and it contains module-level globals. You can add namespaces to the
825 827 search with -s or exclude them with -e (these options can be given
826 828 more than once).
827 829
828 830 Examples:
829 831
830 832 %psearch a* -> objects beginning with an a
831 833 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
832 834 %psearch a* function -> all functions beginning with an a
833 835 %psearch re.e* -> objects beginning with an e in module re
834 836 %psearch r*.e* -> objects that start with e in modules starting in r
835 837 %psearch r*.* string -> all strings in modules beginning with r
836 838
837 839 Case sensitve search:
838 840
839 841 %psearch -c a* list all object beginning with lower case a
840 842
841 843 Show objects beginning with a single _:
842 844
843 845 %psearch -a _* list objects beginning with a single underscore"""
844 846 try:
845 847 parameter_s = parameter_s.encode('ascii')
846 848 except UnicodeEncodeError:
847 849 print 'Python identifiers can only contain ascii characters.'
848 850 return
849 851
850 852 # default namespaces to be searched
851 853 def_search = ['user','builtin']
852 854
853 855 # Process options/args
854 856 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
855 857 opt = opts.get
856 858 shell = self.shell
857 859 psearch = shell.inspector.psearch
858 860
859 861 # select case options
860 862 if opts.has_key('i'):
861 863 ignore_case = True
862 864 elif opts.has_key('c'):
863 865 ignore_case = False
864 866 else:
865 867 ignore_case = not shell.wildcards_case_sensitive
866 868
867 869 # Build list of namespaces to search from user options
868 870 def_search.extend(opt('s',[]))
869 871 ns_exclude = ns_exclude=opt('e',[])
870 872 ns_search = [nm for nm in def_search if nm not in ns_exclude]
871 873
872 874 # Call the actual search
873 875 try:
874 876 psearch(args,shell.ns_table,ns_search,
875 877 show_all=opt('a'),ignore_case=ignore_case)
876 878 except:
877 879 shell.showtraceback()
878 880
879 881 def magic_who_ls(self, parameter_s=''):
880 882 """Return a sorted list of all interactive variables.
881 883
882 884 If arguments are given, only variables of types matching these
883 885 arguments are returned."""
884 886
885 887 user_ns = self.shell.user_ns
886 888 internal_ns = self.shell.internal_ns
887 user_config_ns = self.shell.user_config_ns
889 user_ns_hidden = self.shell.user_ns_hidden
888 890 out = [ i for i in user_ns
889 891 if not i.startswith('_') \
890 and not (i in internal_ns or i in user_config_ns) ]
892 and not (i in internal_ns or i in user_ns_hidden) ]
891 893
892 894 typelist = parameter_s.split()
893 895 if typelist:
894 896 typeset = set(typelist)
895 897 out = [i for i in out if type(i).__name__ in typeset]
896 898
897 899 out.sort()
898 900 return out
899 901
900 902 def magic_who(self, parameter_s=''):
901 903 """Print all interactive variables, with some minimal formatting.
902 904
903 905 If any arguments are given, only variables whose type matches one of
904 906 these are printed. For example:
905 907
906 908 %who function str
907 909
908 910 will only list functions and strings, excluding all other types of
909 911 variables. To find the proper type names, simply use type(var) at a
910 912 command line to see how python prints type names. For example:
911 913
912 914 In [1]: type('hello')\\
913 915 Out[1]: <type 'str'>
914 916
915 917 indicates that the type name for strings is 'str'.
916 918
917 919 %who always excludes executed names loaded through your configuration
918 920 file and things which are internal to IPython.
919 921
920 922 This is deliberate, as typically you may load many modules and the
921 923 purpose of %who is to show you only what you've manually defined."""
922 924
923 925 varlist = self.magic_who_ls(parameter_s)
924 926 if not varlist:
925 927 if parameter_s:
926 928 print 'No variables match your requested type.'
927 929 else:
928 930 print 'Interactive namespace is empty.'
929 931 return
930 932
931 933 # if we have variables, move on...
932 934 count = 0
933 935 for i in varlist:
934 936 print i+'\t',
935 937 count += 1
936 938 if count > 8:
937 939 count = 0
938 940 print
939 941 print
940 942
941 943 def magic_whos(self, parameter_s=''):
942 944 """Like %who, but gives some extra information about each variable.
943 945
944 946 The same type filtering of %who can be applied here.
945 947
946 948 For all variables, the type is printed. Additionally it prints:
947 949
948 950 - For {},[],(): their length.
949 951
950 952 - For numpy and Numeric arrays, a summary with shape, number of
951 953 elements, typecode and size in memory.
952 954
953 955 - Everything else: a string representation, snipping their middle if
954 956 too long."""
955 957
956 958 varnames = self.magic_who_ls(parameter_s)
957 959 if not varnames:
958 960 if parameter_s:
959 961 print 'No variables match your requested type.'
960 962 else:
961 963 print 'Interactive namespace is empty.'
962 964 return
963 965
964 966 # if we have variables, move on...
965 967
966 968 # for these types, show len() instead of data:
967 969 seq_types = [types.DictType,types.ListType,types.TupleType]
968 970
969 971 # for numpy/Numeric arrays, display summary info
970 972 try:
971 973 import numpy
972 974 except ImportError:
973 975 ndarray_type = None
974 976 else:
975 977 ndarray_type = numpy.ndarray.__name__
976 978 try:
977 979 import Numeric
978 980 except ImportError:
979 981 array_type = None
980 982 else:
981 983 array_type = Numeric.ArrayType.__name__
982 984
983 985 # Find all variable names and types so we can figure out column sizes
984 986 def get_vars(i):
985 987 return self.shell.user_ns[i]
986 988
987 989 # some types are well known and can be shorter
988 990 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
989 991 def type_name(v):
990 992 tn = type(v).__name__
991 993 return abbrevs.get(tn,tn)
992 994
993 995 varlist = map(get_vars,varnames)
994 996
995 997 typelist = []
996 998 for vv in varlist:
997 999 tt = type_name(vv)
998 1000
999 1001 if tt=='instance':
1000 1002 typelist.append( abbrevs.get(str(vv.__class__),
1001 1003 str(vv.__class__)))
1002 1004 else:
1003 1005 typelist.append(tt)
1004 1006
1005 1007 # column labels and # of spaces as separator
1006 1008 varlabel = 'Variable'
1007 1009 typelabel = 'Type'
1008 1010 datalabel = 'Data/Info'
1009 1011 colsep = 3
1010 1012 # variable format strings
1011 1013 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1012 1014 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1013 1015 aformat = "%s: %s elems, type `%s`, %s bytes"
1014 1016 # find the size of the columns to format the output nicely
1015 1017 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1016 1018 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1017 1019 # table header
1018 1020 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1019 1021 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1020 1022 # and the table itself
1021 1023 kb = 1024
1022 1024 Mb = 1048576 # kb**2
1023 1025 for vname,var,vtype in zip(varnames,varlist,typelist):
1024 1026 print itpl(vformat),
1025 1027 if vtype in seq_types:
1026 1028 print len(var)
1027 1029 elif vtype in [array_type,ndarray_type]:
1028 1030 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1029 1031 if vtype==ndarray_type:
1030 1032 # numpy
1031 1033 vsize = var.size
1032 1034 vbytes = vsize*var.itemsize
1033 1035 vdtype = var.dtype
1034 1036 else:
1035 1037 # Numeric
1036 1038 vsize = Numeric.size(var)
1037 1039 vbytes = vsize*var.itemsize()
1038 1040 vdtype = var.typecode()
1039 1041
1040 1042 if vbytes < 100000:
1041 1043 print aformat % (vshape,vsize,vdtype,vbytes)
1042 1044 else:
1043 1045 print aformat % (vshape,vsize,vdtype,vbytes),
1044 1046 if vbytes < Mb:
1045 1047 print '(%s kb)' % (vbytes/kb,)
1046 1048 else:
1047 1049 print '(%s Mb)' % (vbytes/Mb,)
1048 1050 else:
1049 1051 try:
1050 1052 vstr = str(var)
1051 1053 except UnicodeEncodeError:
1052 1054 vstr = unicode(var).encode(sys.getdefaultencoding(),
1053 1055 'backslashreplace')
1054 1056 vstr = vstr.replace('\n','\\n')
1055 1057 if len(vstr) < 50:
1056 1058 print vstr
1057 1059 else:
1058 1060 printpl(vfmt_short)
1059 1061
1060 1062 def magic_reset(self, parameter_s=''):
1061 1063 """Resets the namespace by removing all names defined by the user.
1062 1064
1063 1065 Input/Output history are left around in case you need them.
1064 1066
1065 1067 Parameters
1066 1068 ----------
1067 1069 -y : force reset without asking for confirmation.
1068 1070
1069 1071 Examples
1070 1072 --------
1071 1073 In [6]: a = 1
1072 1074
1073 1075 In [7]: a
1074 1076 Out[7]: 1
1075 1077
1076 1078 In [8]: 'a' in _ip.user_ns
1077 1079 Out[8]: True
1078 1080
1079 1081 In [9]: %reset -f
1080 1082
1081 1083 In [10]: 'a' in _ip.user_ns
1082 1084 Out[10]: False
1083 1085 """
1084 1086
1085 1087 if parameter_s == '-f':
1086 1088 ans = True
1087 1089 else:
1088 1090 ans = self.shell.ask_yes_no(
1089 1091 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1090 1092 if not ans:
1091 1093 print 'Nothing done.'
1092 1094 return
1093 1095 user_ns = self.shell.user_ns
1094 1096 for i in self.magic_who_ls():
1095 1097 del(user_ns[i])
1096 1098
1097 1099 # Also flush the private list of module references kept for script
1098 1100 # execution protection
1099 1101 self.shell.clear_main_mod_cache()
1100 1102
1101 1103 def magic_logstart(self,parameter_s=''):
1102 1104 """Start logging anywhere in a session.
1103 1105
1104 1106 %logstart [-o|-r|-t] [log_name [log_mode]]
1105 1107
1106 1108 If no name is given, it defaults to a file named 'ipython_log.py' in your
1107 1109 current directory, in 'rotate' mode (see below).
1108 1110
1109 1111 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1110 1112 history up to that point and then continues logging.
1111 1113
1112 1114 %logstart takes a second optional parameter: logging mode. This can be one
1113 1115 of (note that the modes are given unquoted):\\
1114 1116 append: well, that says it.\\
1115 1117 backup: rename (if exists) to name~ and start name.\\
1116 1118 global: single logfile in your home dir, appended to.\\
1117 1119 over : overwrite existing log.\\
1118 1120 rotate: create rotating logs name.1~, name.2~, etc.
1119 1121
1120 1122 Options:
1121 1123
1122 1124 -o: log also IPython's output. In this mode, all commands which
1123 1125 generate an Out[NN] prompt are recorded to the logfile, right after
1124 1126 their corresponding input line. The output lines are always
1125 1127 prepended with a '#[Out]# ' marker, so that the log remains valid
1126 1128 Python code.
1127 1129
1128 1130 Since this marker is always the same, filtering only the output from
1129 1131 a log is very easy, using for example a simple awk call:
1130 1132
1131 1133 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1132 1134
1133 1135 -r: log 'raw' input. Normally, IPython's logs contain the processed
1134 1136 input, so that user lines are logged in their final form, converted
1135 1137 into valid Python. For example, %Exit is logged as
1136 1138 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1137 1139 exactly as typed, with no transformations applied.
1138 1140
1139 1141 -t: put timestamps before each input line logged (these are put in
1140 1142 comments)."""
1141 1143
1142 1144 opts,par = self.parse_options(parameter_s,'ort')
1143 1145 log_output = 'o' in opts
1144 1146 log_raw_input = 'r' in opts
1145 1147 timestamp = 't' in opts
1146 1148
1147 1149 logger = self.shell.logger
1148 1150
1149 1151 # if no args are given, the defaults set in the logger constructor by
1150 1152 # ipytohn remain valid
1151 1153 if par:
1152 1154 try:
1153 1155 logfname,logmode = par.split()
1154 1156 except:
1155 1157 logfname = par
1156 1158 logmode = 'backup'
1157 1159 else:
1158 1160 logfname = logger.logfname
1159 1161 logmode = logger.logmode
1160 1162 # put logfname into rc struct as if it had been called on the command
1161 1163 # line, so it ends up saved in the log header Save it in case we need
1162 1164 # to restore it...
1163 1165 old_logfile = self.shell.logfile
1164 1166 if logfname:
1165 1167 logfname = os.path.expanduser(logfname)
1166 1168 self.shell.logfile = logfname
1167 1169
1168 1170 loghead = '# IPython log file\n\n'
1169 1171 try:
1170 1172 started = logger.logstart(logfname,loghead,logmode,
1171 1173 log_output,timestamp,log_raw_input)
1172 1174 except:
1173 rc.opts.logfile = old_logfile
1175 self.shell.logfile = old_logfile
1174 1176 warn("Couldn't start log: %s" % sys.exc_info()[1])
1175 1177 else:
1176 1178 # log input history up to this point, optionally interleaving
1177 1179 # output if requested
1178 1180
1179 1181 if timestamp:
1180 1182 # disable timestamping for the previous history, since we've
1181 1183 # lost those already (no time machine here).
1182 1184 logger.timestamp = False
1183 1185
1184 1186 if log_raw_input:
1185 1187 input_hist = self.shell.input_hist_raw
1186 1188 else:
1187 1189 input_hist = self.shell.input_hist
1188 1190
1189 1191 if log_output:
1190 1192 log_write = logger.log_write
1191 1193 output_hist = self.shell.output_hist
1192 1194 for n in range(1,len(input_hist)-1):
1193 1195 log_write(input_hist[n].rstrip())
1194 1196 if n in output_hist:
1195 1197 log_write(repr(output_hist[n]),'output')
1196 1198 else:
1197 1199 logger.log_write(input_hist[1:])
1198 1200 if timestamp:
1199 1201 # re-enable timestamping
1200 1202 logger.timestamp = True
1201 1203
1202 1204 print ('Activating auto-logging. '
1203 1205 'Current session state plus future input saved.')
1204 1206 logger.logstate()
1205 1207
1206 1208 def magic_logstop(self,parameter_s=''):
1207 1209 """Fully stop logging and close log file.
1208 1210
1209 1211 In order to start logging again, a new %logstart call needs to be made,
1210 1212 possibly (though not necessarily) with a new filename, mode and other
1211 1213 options."""
1212 1214 self.logger.logstop()
1213 1215
1214 1216 def magic_logoff(self,parameter_s=''):
1215 1217 """Temporarily stop logging.
1216 1218
1217 1219 You must have previously started logging."""
1218 1220 self.shell.logger.switch_log(0)
1219 1221
1220 1222 def magic_logon(self,parameter_s=''):
1221 1223 """Restart logging.
1222 1224
1223 1225 This function is for restarting logging which you've temporarily
1224 1226 stopped with %logoff. For starting logging for the first time, you
1225 1227 must use the %logstart function, which allows you to specify an
1226 1228 optional log filename."""
1227 1229
1228 1230 self.shell.logger.switch_log(1)
1229 1231
1230 1232 def magic_logstate(self,parameter_s=''):
1231 1233 """Print the status of the logging system."""
1232 1234
1233 1235 self.shell.logger.logstate()
1234 1236
1235 1237 def magic_pdb(self, parameter_s=''):
1236 1238 """Control the automatic calling of the pdb interactive debugger.
1237 1239
1238 1240 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1239 1241 argument it works as a toggle.
1240 1242
1241 1243 When an exception is triggered, IPython can optionally call the
1242 1244 interactive pdb debugger after the traceback printout. %pdb toggles
1243 1245 this feature on and off.
1244 1246
1245 1247 The initial state of this feature is set in your ipythonrc
1246 1248 configuration file (the variable is called 'pdb').
1247 1249
1248 1250 If you want to just activate the debugger AFTER an exception has fired,
1249 1251 without having to type '%pdb on' and rerunning your code, you can use
1250 1252 the %debug magic."""
1251 1253
1252 1254 par = parameter_s.strip().lower()
1253 1255
1254 1256 if par:
1255 1257 try:
1256 1258 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1257 1259 except KeyError:
1258 1260 print ('Incorrect argument. Use on/1, off/0, '
1259 1261 'or nothing for a toggle.')
1260 1262 return
1261 1263 else:
1262 1264 # toggle
1263 1265 new_pdb = not self.shell.call_pdb
1264 1266
1265 1267 # set on the shell
1266 1268 self.shell.call_pdb = new_pdb
1267 1269 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1268 1270
1269 1271 def magic_debug(self, parameter_s=''):
1270 1272 """Activate the interactive debugger in post-mortem mode.
1271 1273
1272 1274 If an exception has just occurred, this lets you inspect its stack
1273 1275 frames interactively. Note that this will always work only on the last
1274 1276 traceback that occurred, so you must call this quickly after an
1275 1277 exception that you wish to inspect has fired, because if another one
1276 1278 occurs, it clobbers the previous one.
1277 1279
1278 1280 If you want IPython to automatically do this on every exception, see
1279 1281 the %pdb magic for more details.
1280 1282 """
1281 1283 self.shell.debugger(force=True)
1282 1284
1283 1285 @testdec.skip_doctest
1284 1286 def magic_prun(self, parameter_s ='',user_mode=1,
1285 1287 opts=None,arg_lst=None,prog_ns=None):
1286 1288
1287 1289 """Run a statement through the python code profiler.
1288 1290
1289 1291 Usage:
1290 1292 %prun [options] statement
1291 1293
1292 1294 The given statement (which doesn't require quote marks) is run via the
1293 1295 python profiler in a manner similar to the profile.run() function.
1294 1296 Namespaces are internally managed to work correctly; profile.run
1295 1297 cannot be used in IPython because it makes certain assumptions about
1296 1298 namespaces which do not hold under IPython.
1297 1299
1298 1300 Options:
1299 1301
1300 1302 -l <limit>: you can place restrictions on what or how much of the
1301 1303 profile gets printed. The limit value can be:
1302 1304
1303 1305 * A string: only information for function names containing this string
1304 1306 is printed.
1305 1307
1306 1308 * An integer: only these many lines are printed.
1307 1309
1308 1310 * A float (between 0 and 1): this fraction of the report is printed
1309 1311 (for example, use a limit of 0.4 to see the topmost 40% only).
1310 1312
1311 1313 You can combine several limits with repeated use of the option. For
1312 1314 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1313 1315 information about class constructors.
1314 1316
1315 1317 -r: return the pstats.Stats object generated by the profiling. This
1316 1318 object has all the information about the profile in it, and you can
1317 1319 later use it for further analysis or in other functions.
1318 1320
1319 1321 -s <key>: sort profile by given key. You can provide more than one key
1320 1322 by using the option several times: '-s key1 -s key2 -s key3...'. The
1321 1323 default sorting key is 'time'.
1322 1324
1323 1325 The following is copied verbatim from the profile documentation
1324 1326 referenced below:
1325 1327
1326 1328 When more than one key is provided, additional keys are used as
1327 1329 secondary criteria when the there is equality in all keys selected
1328 1330 before them.
1329 1331
1330 1332 Abbreviations can be used for any key names, as long as the
1331 1333 abbreviation is unambiguous. The following are the keys currently
1332 1334 defined:
1333 1335
1334 1336 Valid Arg Meaning
1335 1337 "calls" call count
1336 1338 "cumulative" cumulative time
1337 1339 "file" file name
1338 1340 "module" file name
1339 1341 "pcalls" primitive call count
1340 1342 "line" line number
1341 1343 "name" function name
1342 1344 "nfl" name/file/line
1343 1345 "stdname" standard name
1344 1346 "time" internal time
1345 1347
1346 1348 Note that all sorts on statistics are in descending order (placing
1347 1349 most time consuming items first), where as name, file, and line number
1348 1350 searches are in ascending order (i.e., alphabetical). The subtle
1349 1351 distinction between "nfl" and "stdname" is that the standard name is a
1350 1352 sort of the name as printed, which means that the embedded line
1351 1353 numbers get compared in an odd way. For example, lines 3, 20, and 40
1352 1354 would (if the file names were the same) appear in the string order
1353 1355 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1354 1356 line numbers. In fact, sort_stats("nfl") is the same as
1355 1357 sort_stats("name", "file", "line").
1356 1358
1357 1359 -T <filename>: save profile results as shown on screen to a text
1358 1360 file. The profile is still shown on screen.
1359 1361
1360 1362 -D <filename>: save (via dump_stats) profile statistics to given
1361 1363 filename. This data is in a format understod by the pstats module, and
1362 1364 is generated by a call to the dump_stats() method of profile
1363 1365 objects. The profile is still shown on screen.
1364 1366
1365 1367 If you want to run complete programs under the profiler's control, use
1366 1368 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1367 1369 contains profiler specific options as described here.
1368 1370
1369 1371 You can read the complete documentation for the profile module with::
1370 1372
1371 1373 In [1]: import profile; profile.help()
1372 1374 """
1373 1375
1374 1376 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1375 1377 # protect user quote marks
1376 1378 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1377 1379
1378 1380 if user_mode: # regular user call
1379 1381 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1380 1382 list_all=1)
1381 1383 namespace = self.shell.user_ns
1382 1384 else: # called to run a program by %run -p
1383 1385 try:
1384 1386 filename = get_py_filename(arg_lst[0])
1385 1387 except IOError,msg:
1386 1388 error(msg)
1387 1389 return
1388 1390
1389 1391 arg_str = 'execfile(filename,prog_ns)'
1390 1392 namespace = locals()
1391 1393
1392 1394 opts.merge(opts_def)
1393 1395
1394 1396 prof = profile.Profile()
1395 1397 try:
1396 1398 prof = prof.runctx(arg_str,namespace,namespace)
1397 1399 sys_exit = ''
1398 1400 except SystemExit:
1399 1401 sys_exit = """*** SystemExit exception caught in code being profiled."""
1400 1402
1401 1403 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1402 1404
1403 1405 lims = opts.l
1404 1406 if lims:
1405 1407 lims = [] # rebuild lims with ints/floats/strings
1406 1408 for lim in opts.l:
1407 1409 try:
1408 1410 lims.append(int(lim))
1409 1411 except ValueError:
1410 1412 try:
1411 1413 lims.append(float(lim))
1412 1414 except ValueError:
1413 1415 lims.append(lim)
1414 1416
1415 1417 # Trap output.
1416 1418 stdout_trap = StringIO()
1417 1419
1418 1420 if hasattr(stats,'stream'):
1419 1421 # In newer versions of python, the stats object has a 'stream'
1420 1422 # attribute to write into.
1421 1423 stats.stream = stdout_trap
1422 1424 stats.print_stats(*lims)
1423 1425 else:
1424 1426 # For older versions, we manually redirect stdout during printing
1425 1427 sys_stdout = sys.stdout
1426 1428 try:
1427 1429 sys.stdout = stdout_trap
1428 1430 stats.print_stats(*lims)
1429 1431 finally:
1430 1432 sys.stdout = sys_stdout
1431 1433
1432 1434 output = stdout_trap.getvalue()
1433 1435 output = output.rstrip()
1434 1436
1435 1437 page(output,screen_lines=self.shell.usable_screen_length)
1436 1438 print sys_exit,
1437 1439
1438 1440 dump_file = opts.D[0]
1439 1441 text_file = opts.T[0]
1440 1442 if dump_file:
1441 1443 prof.dump_stats(dump_file)
1442 1444 print '\n*** Profile stats marshalled to file',\
1443 1445 `dump_file`+'.',sys_exit
1444 1446 if text_file:
1445 1447 pfile = file(text_file,'w')
1446 1448 pfile.write(output)
1447 1449 pfile.close()
1448 1450 print '\n*** Profile printout saved to text file',\
1449 1451 `text_file`+'.',sys_exit
1450 1452
1451 1453 if opts.has_key('r'):
1452 1454 return stats
1453 1455 else:
1454 1456 return None
1455 1457
1456 1458 @testdec.skip_doctest
1457 1459 def magic_run(self, parameter_s ='',runner=None,
1458 1460 file_finder=get_py_filename):
1459 1461 """Run the named file inside IPython as a program.
1460 1462
1461 1463 Usage:\\
1462 1464 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1463 1465
1464 1466 Parameters after the filename are passed as command-line arguments to
1465 1467 the program (put in sys.argv). Then, control returns to IPython's
1466 1468 prompt.
1467 1469
1468 1470 This is similar to running at a system prompt:\\
1469 1471 $ python file args\\
1470 1472 but with the advantage of giving you IPython's tracebacks, and of
1471 1473 loading all variables into your interactive namespace for further use
1472 1474 (unless -p is used, see below).
1473 1475
1474 1476 The file is executed in a namespace initially consisting only of
1475 1477 __name__=='__main__' and sys.argv constructed as indicated. It thus
1476 1478 sees its environment as if it were being run as a stand-alone program
1477 1479 (except for sharing global objects such as previously imported
1478 1480 modules). But after execution, the IPython interactive namespace gets
1479 1481 updated with all variables defined in the program (except for __name__
1480 1482 and sys.argv). This allows for very convenient loading of code for
1481 1483 interactive work, while giving each program a 'clean sheet' to run in.
1482 1484
1483 1485 Options:
1484 1486
1485 1487 -n: __name__ is NOT set to '__main__', but to the running file's name
1486 1488 without extension (as python does under import). This allows running
1487 1489 scripts and reloading the definitions in them without calling code
1488 1490 protected by an ' if __name__ == "__main__" ' clause.
1489 1491
1490 1492 -i: run the file in IPython's namespace instead of an empty one. This
1491 1493 is useful if you are experimenting with code written in a text editor
1492 1494 which depends on variables defined interactively.
1493 1495
1494 1496 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1495 1497 being run. This is particularly useful if IPython is being used to
1496 1498 run unittests, which always exit with a sys.exit() call. In such
1497 1499 cases you are interested in the output of the test results, not in
1498 1500 seeing a traceback of the unittest module.
1499 1501
1500 1502 -t: print timing information at the end of the run. IPython will give
1501 1503 you an estimated CPU time consumption for your script, which under
1502 1504 Unix uses the resource module to avoid the wraparound problems of
1503 1505 time.clock(). Under Unix, an estimate of time spent on system tasks
1504 1506 is also given (for Windows platforms this is reported as 0.0).
1505 1507
1506 1508 If -t is given, an additional -N<N> option can be given, where <N>
1507 1509 must be an integer indicating how many times you want the script to
1508 1510 run. The final timing report will include total and per run results.
1509 1511
1510 1512 For example (testing the script uniq_stable.py):
1511 1513
1512 1514 In [1]: run -t uniq_stable
1513 1515
1514 1516 IPython CPU timings (estimated):\\
1515 1517 User : 0.19597 s.\\
1516 1518 System: 0.0 s.\\
1517 1519
1518 1520 In [2]: run -t -N5 uniq_stable
1519 1521
1520 1522 IPython CPU timings (estimated):\\
1521 1523 Total runs performed: 5\\
1522 1524 Times : Total Per run\\
1523 1525 User : 0.910862 s, 0.1821724 s.\\
1524 1526 System: 0.0 s, 0.0 s.
1525 1527
1526 1528 -d: run your program under the control of pdb, the Python debugger.
1527 1529 This allows you to execute your program step by step, watch variables,
1528 1530 etc. Internally, what IPython does is similar to calling:
1529 1531
1530 1532 pdb.run('execfile("YOURFILENAME")')
1531 1533
1532 1534 with a breakpoint set on line 1 of your file. You can change the line
1533 1535 number for this automatic breakpoint to be <N> by using the -bN option
1534 1536 (where N must be an integer). For example:
1535 1537
1536 1538 %run -d -b40 myscript
1537 1539
1538 1540 will set the first breakpoint at line 40 in myscript.py. Note that
1539 1541 the first breakpoint must be set on a line which actually does
1540 1542 something (not a comment or docstring) for it to stop execution.
1541 1543
1542 1544 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1543 1545 first enter 'c' (without qoutes) to start execution up to the first
1544 1546 breakpoint.
1545 1547
1546 1548 Entering 'help' gives information about the use of the debugger. You
1547 1549 can easily see pdb's full documentation with "import pdb;pdb.help()"
1548 1550 at a prompt.
1549 1551
1550 1552 -p: run program under the control of the Python profiler module (which
1551 1553 prints a detailed report of execution times, function calls, etc).
1552 1554
1553 1555 You can pass other options after -p which affect the behavior of the
1554 1556 profiler itself. See the docs for %prun for details.
1555 1557
1556 1558 In this mode, the program's variables do NOT propagate back to the
1557 1559 IPython interactive namespace (because they remain in the namespace
1558 1560 where the profiler executes them).
1559 1561
1560 1562 Internally this triggers a call to %prun, see its documentation for
1561 1563 details on the options available specifically for profiling.
1562 1564
1563 1565 There is one special usage for which the text above doesn't apply:
1564 1566 if the filename ends with .ipy, the file is run as ipython script,
1565 1567 just as if the commands were written on IPython prompt.
1566 1568 """
1567 1569
1568 1570 # get arguments and set sys.argv for program to be run.
1569 1571 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1570 1572 mode='list',list_all=1)
1571 1573
1572 1574 try:
1573 1575 filename = file_finder(arg_lst[0])
1574 1576 except IndexError:
1575 1577 warn('you must provide at least a filename.')
1576 1578 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1577 1579 return
1578 1580 except IOError,msg:
1579 1581 error(msg)
1580 1582 return
1581 1583
1582 1584 if filename.lower().endswith('.ipy'):
1583 1585 self.shell.safe_execfile_ipy(filename)
1584 1586 return
1585 1587
1586 1588 # Control the response to exit() calls made by the script being run
1587 1589 exit_ignore = opts.has_key('e')
1588 1590
1589 1591 # Make sure that the running script gets a proper sys.argv as if it
1590 1592 # were run from a system shell.
1591 1593 save_argv = sys.argv # save it for later restoring
1592 1594 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1593 1595
1594 1596 if opts.has_key('i'):
1595 1597 # Run in user's interactive namespace
1596 1598 prog_ns = self.shell.user_ns
1597 1599 __name__save = self.shell.user_ns['__name__']
1598 1600 prog_ns['__name__'] = '__main__'
1599 1601 main_mod = self.shell.new_main_mod(prog_ns)
1600 1602 else:
1601 1603 # Run in a fresh, empty namespace
1602 1604 if opts.has_key('n'):
1603 1605 name = os.path.splitext(os.path.basename(filename))[0]
1604 1606 else:
1605 1607 name = '__main__'
1606 1608
1607 1609 main_mod = self.shell.new_main_mod()
1608 1610 prog_ns = main_mod.__dict__
1609 1611 prog_ns['__name__'] = name
1610 1612
1611 1613 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1612 1614 # set the __file__ global in the script's namespace
1613 1615 prog_ns['__file__'] = filename
1614 1616
1615 1617 # pickle fix. See iplib for an explanation. But we need to make sure
1616 1618 # that, if we overwrite __main__, we replace it at the end
1617 1619 main_mod_name = prog_ns['__name__']
1618 1620
1619 1621 if main_mod_name == '__main__':
1620 1622 restore_main = sys.modules['__main__']
1621 1623 else:
1622 1624 restore_main = False
1623 1625
1624 1626 # This needs to be undone at the end to prevent holding references to
1625 1627 # every single object ever created.
1626 1628 sys.modules[main_mod_name] = main_mod
1627 1629
1628 1630 stats = None
1629 1631 try:
1630 1632 self.shell.savehist()
1631 1633
1632 1634 if opts.has_key('p'):
1633 1635 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1634 1636 else:
1635 1637 if opts.has_key('d'):
1636 1638 deb = debugger.Pdb(self.shell.colors)
1637 1639 # reset Breakpoint state, which is moronically kept
1638 1640 # in a class
1639 1641 bdb.Breakpoint.next = 1
1640 1642 bdb.Breakpoint.bplist = {}
1641 1643 bdb.Breakpoint.bpbynumber = [None]
1642 1644 # Set an initial breakpoint to stop execution
1643 1645 maxtries = 10
1644 1646 bp = int(opts.get('b',[1])[0])
1645 1647 checkline = deb.checkline(filename,bp)
1646 1648 if not checkline:
1647 1649 for bp in range(bp+1,bp+maxtries+1):
1648 1650 if deb.checkline(filename,bp):
1649 1651 break
1650 1652 else:
1651 1653 msg = ("\nI failed to find a valid line to set "
1652 1654 "a breakpoint\n"
1653 1655 "after trying up to line: %s.\n"
1654 1656 "Please set a valid breakpoint manually "
1655 1657 "with the -b option." % bp)
1656 1658 error(msg)
1657 1659 return
1658 1660 # if we find a good linenumber, set the breakpoint
1659 1661 deb.do_break('%s:%s' % (filename,bp))
1660 1662 # Start file run
1661 1663 print "NOTE: Enter 'c' at the",
1662 1664 print "%s prompt to start your script." % deb.prompt
1663 1665 try:
1664 1666 deb.run('execfile("%s")' % filename,prog_ns)
1665 1667
1666 1668 except:
1667 1669 etype, value, tb = sys.exc_info()
1668 1670 # Skip three frames in the traceback: the %run one,
1669 1671 # one inside bdb.py, and the command-line typed by the
1670 1672 # user (run by exec in pdb itself).
1671 1673 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1672 1674 else:
1673 1675 if runner is None:
1674 1676 runner = self.shell.safe_execfile
1675 1677 if opts.has_key('t'):
1676 1678 # timed execution
1677 1679 try:
1678 1680 nruns = int(opts['N'][0])
1679 1681 if nruns < 1:
1680 1682 error('Number of runs must be >=1')
1681 1683 return
1682 1684 except (KeyError):
1683 1685 nruns = 1
1684 1686 if nruns == 1:
1685 1687 t0 = clock2()
1686 1688 runner(filename,prog_ns,prog_ns,
1687 1689 exit_ignore=exit_ignore)
1688 1690 t1 = clock2()
1689 1691 t_usr = t1[0]-t0[0]
1690 1692 t_sys = t1[1]-t0[1]
1691 1693 print "\nIPython CPU timings (estimated):"
1692 1694 print " User : %10s s." % t_usr
1693 1695 print " System: %10s s." % t_sys
1694 1696 else:
1695 1697 runs = range(nruns)
1696 1698 t0 = clock2()
1697 1699 for nr in runs:
1698 1700 runner(filename,prog_ns,prog_ns,
1699 1701 exit_ignore=exit_ignore)
1700 1702 t1 = clock2()
1701 1703 t_usr = t1[0]-t0[0]
1702 1704 t_sys = t1[1]-t0[1]
1703 1705 print "\nIPython CPU timings (estimated):"
1704 1706 print "Total runs performed:",nruns
1705 1707 print " Times : %10s %10s" % ('Total','Per run')
1706 1708 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1707 1709 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1708 1710
1709 1711 else:
1710 1712 # regular execution
1711 1713 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1712 1714
1713 1715 if opts.has_key('i'):
1714 1716 self.shell.user_ns['__name__'] = __name__save
1715 1717 else:
1716 1718 # The shell MUST hold a reference to prog_ns so after %run
1717 1719 # exits, the python deletion mechanism doesn't zero it out
1718 1720 # (leaving dangling references).
1719 1721 self.shell.cache_main_mod(prog_ns,filename)
1720 1722 # update IPython interactive namespace
1721 1723
1722 1724 # Some forms of read errors on the file may mean the
1723 1725 # __name__ key was never set; using pop we don't have to
1724 1726 # worry about a possible KeyError.
1725 1727 prog_ns.pop('__name__', None)
1726 1728
1727 1729 self.shell.user_ns.update(prog_ns)
1728 1730 finally:
1729 1731 # It's a bit of a mystery why, but __builtins__ can change from
1730 1732 # being a module to becoming a dict missing some key data after
1731 1733 # %run. As best I can see, this is NOT something IPython is doing
1732 1734 # at all, and similar problems have been reported before:
1733 1735 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1734 1736 # Since this seems to be done by the interpreter itself, the best
1735 1737 # we can do is to at least restore __builtins__ for the user on
1736 1738 # exit.
1737 1739 self.shell.user_ns['__builtins__'] = __builtin__
1738 1740
1739 1741 # Ensure key global structures are restored
1740 1742 sys.argv = save_argv
1741 1743 if restore_main:
1742 1744 sys.modules['__main__'] = restore_main
1743 1745 else:
1744 1746 # Remove from sys.modules the reference to main_mod we'd
1745 1747 # added. Otherwise it will trap references to objects
1746 1748 # contained therein.
1747 1749 del sys.modules[main_mod_name]
1748 1750
1749 1751 self.shell.reloadhist()
1750 1752
1751 1753 return stats
1752 1754
1753 1755 @testdec.skip_doctest
1754 1756 def magic_timeit(self, parameter_s =''):
1755 1757 """Time execution of a Python statement or expression
1756 1758
1757 1759 Usage:\\
1758 1760 %timeit [-n<N> -r<R> [-t|-c]] statement
1759 1761
1760 1762 Time execution of a Python statement or expression using the timeit
1761 1763 module.
1762 1764
1763 1765 Options:
1764 1766 -n<N>: execute the given statement <N> times in a loop. If this value
1765 1767 is not given, a fitting value is chosen.
1766 1768
1767 1769 -r<R>: repeat the loop iteration <R> times and take the best result.
1768 1770 Default: 3
1769 1771
1770 1772 -t: use time.time to measure the time, which is the default on Unix.
1771 1773 This function measures wall time.
1772 1774
1773 1775 -c: use time.clock to measure the time, which is the default on
1774 1776 Windows and measures wall time. On Unix, resource.getrusage is used
1775 1777 instead and returns the CPU user time.
1776 1778
1777 1779 -p<P>: use a precision of <P> digits to display the timing result.
1778 1780 Default: 3
1779 1781
1780 1782
1781 1783 Examples:
1782 1784
1783 1785 In [1]: %timeit pass
1784 1786 10000000 loops, best of 3: 53.3 ns per loop
1785 1787
1786 1788 In [2]: u = None
1787 1789
1788 1790 In [3]: %timeit u is None
1789 1791 10000000 loops, best of 3: 184 ns per loop
1790 1792
1791 1793 In [4]: %timeit -r 4 u == None
1792 1794 1000000 loops, best of 4: 242 ns per loop
1793 1795
1794 1796 In [5]: import time
1795 1797
1796 1798 In [6]: %timeit -n1 time.sleep(2)
1797 1799 1 loops, best of 3: 2 s per loop
1798 1800
1799 1801
1800 1802 The times reported by %timeit will be slightly higher than those
1801 1803 reported by the timeit.py script when variables are accessed. This is
1802 1804 due to the fact that %timeit executes the statement in the namespace
1803 1805 of the shell, compared with timeit.py, which uses a single setup
1804 1806 statement to import function or create variables. Generally, the bias
1805 1807 does not matter as long as results from timeit.py are not mixed with
1806 1808 those from %timeit."""
1807 1809
1808 1810 import timeit
1809 1811 import math
1810 1812
1811 1813 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1812 1814 # certain terminals. Until we figure out a robust way of
1813 1815 # auto-detecting if the terminal can deal with it, use plain 'us' for
1814 1816 # microseconds. I am really NOT happy about disabling the proper
1815 1817 # 'micro' prefix, but crashing is worse... If anyone knows what the
1816 1818 # right solution for this is, I'm all ears...
1817 1819 #
1818 1820 # Note: using
1819 1821 #
1820 1822 # s = u'\xb5'
1821 1823 # s.encode(sys.getdefaultencoding())
1822 1824 #
1823 1825 # is not sufficient, as I've seen terminals where that fails but
1824 1826 # print s
1825 1827 #
1826 1828 # succeeds
1827 1829 #
1828 1830 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1829 1831
1830 1832 #units = [u"s", u"ms",u'\xb5',"ns"]
1831 1833 units = [u"s", u"ms",u'us',"ns"]
1832 1834
1833 1835 scaling = [1, 1e3, 1e6, 1e9]
1834 1836
1835 1837 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1836 1838 posix=False)
1837 1839 if stmt == "":
1838 1840 return
1839 1841 timefunc = timeit.default_timer
1840 1842 number = int(getattr(opts, "n", 0))
1841 1843 repeat = int(getattr(opts, "r", timeit.default_repeat))
1842 1844 precision = int(getattr(opts, "p", 3))
1843 1845 if hasattr(opts, "t"):
1844 1846 timefunc = time.time
1845 1847 if hasattr(opts, "c"):
1846 1848 timefunc = clock
1847 1849
1848 1850 timer = timeit.Timer(timer=timefunc)
1849 1851 # this code has tight coupling to the inner workings of timeit.Timer,
1850 1852 # but is there a better way to achieve that the code stmt has access
1851 1853 # to the shell namespace?
1852 1854
1853 1855 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1854 1856 'setup': "pass"}
1855 1857 # Track compilation time so it can be reported if too long
1856 1858 # Minimum time above which compilation time will be reported
1857 1859 tc_min = 0.1
1858 1860
1859 1861 t0 = clock()
1860 1862 code = compile(src, "<magic-timeit>", "exec")
1861 1863 tc = clock()-t0
1862 1864
1863 1865 ns = {}
1864 1866 exec code in self.shell.user_ns, ns
1865 1867 timer.inner = ns["inner"]
1866 1868
1867 1869 if number == 0:
1868 1870 # determine number so that 0.2 <= total time < 2.0
1869 1871 number = 1
1870 1872 for i in range(1, 10):
1871 1873 if timer.timeit(number) >= 0.2:
1872 1874 break
1873 1875 number *= 10
1874 1876
1875 1877 best = min(timer.repeat(repeat, number)) / number
1876 1878
1877 1879 if best > 0.0:
1878 1880 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1879 1881 else:
1880 1882 order = 3
1881 1883 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1882 1884 precision,
1883 1885 best * scaling[order],
1884 1886 units[order])
1885 1887 if tc > tc_min:
1886 1888 print "Compiler time: %.2f s" % tc
1887 1889
1888 1890 @testdec.skip_doctest
1889 1891 def magic_time(self,parameter_s = ''):
1890 1892 """Time execution of a Python statement or expression.
1891 1893
1892 1894 The CPU and wall clock times are printed, and the value of the
1893 1895 expression (if any) is returned. Note that under Win32, system time
1894 1896 is always reported as 0, since it can not be measured.
1895 1897
1896 1898 This function provides very basic timing functionality. In Python
1897 1899 2.3, the timeit module offers more control and sophistication, so this
1898 1900 could be rewritten to use it (patches welcome).
1899 1901
1900 1902 Some examples:
1901 1903
1902 1904 In [1]: time 2**128
1903 1905 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1904 1906 Wall time: 0.00
1905 1907 Out[1]: 340282366920938463463374607431768211456L
1906 1908
1907 1909 In [2]: n = 1000000
1908 1910
1909 1911 In [3]: time sum(range(n))
1910 1912 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1911 1913 Wall time: 1.37
1912 1914 Out[3]: 499999500000L
1913 1915
1914 1916 In [4]: time print 'hello world'
1915 1917 hello world
1916 1918 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1917 1919 Wall time: 0.00
1918 1920
1919 1921 Note that the time needed by Python to compile the given expression
1920 1922 will be reported if it is more than 0.1s. In this example, the
1921 1923 actual exponentiation is done by Python at compilation time, so while
1922 1924 the expression can take a noticeable amount of time to compute, that
1923 1925 time is purely due to the compilation:
1924 1926
1925 1927 In [5]: time 3**9999;
1926 1928 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1927 1929 Wall time: 0.00 s
1928 1930
1929 1931 In [6]: time 3**999999;
1930 1932 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1931 1933 Wall time: 0.00 s
1932 1934 Compiler : 0.78 s
1933 1935 """
1934 1936
1935 1937 # fail immediately if the given expression can't be compiled
1936 1938
1937 1939 expr = self.shell.prefilter(parameter_s,False)
1938 1940
1939 1941 # Minimum time above which compilation time will be reported
1940 1942 tc_min = 0.1
1941 1943
1942 1944 try:
1943 1945 mode = 'eval'
1944 1946 t0 = clock()
1945 1947 code = compile(expr,'<timed eval>',mode)
1946 1948 tc = clock()-t0
1947 1949 except SyntaxError:
1948 1950 mode = 'exec'
1949 1951 t0 = clock()
1950 1952 code = compile(expr,'<timed exec>',mode)
1951 1953 tc = clock()-t0
1952 1954 # skew measurement as little as possible
1953 1955 glob = self.shell.user_ns
1954 1956 clk = clock2
1955 1957 wtime = time.time
1956 1958 # time execution
1957 1959 wall_st = wtime()
1958 1960 if mode=='eval':
1959 1961 st = clk()
1960 1962 out = eval(code,glob)
1961 1963 end = clk()
1962 1964 else:
1963 1965 st = clk()
1964 1966 exec code in glob
1965 1967 end = clk()
1966 1968 out = None
1967 1969 wall_end = wtime()
1968 1970 # Compute actual times and report
1969 1971 wall_time = wall_end-wall_st
1970 1972 cpu_user = end[0]-st[0]
1971 1973 cpu_sys = end[1]-st[1]
1972 1974 cpu_tot = cpu_user+cpu_sys
1973 1975 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1974 1976 (cpu_user,cpu_sys,cpu_tot)
1975 1977 print "Wall time: %.2f s" % wall_time
1976 1978 if tc > tc_min:
1977 1979 print "Compiler : %.2f s" % tc
1978 1980 return out
1979 1981
1980 1982 @testdec.skip_doctest
1981 1983 def magic_macro(self,parameter_s = ''):
1982 1984 """Define a set of input lines as a macro for future re-execution.
1983 1985
1984 1986 Usage:\\
1985 1987 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1986 1988
1987 1989 Options:
1988 1990
1989 1991 -r: use 'raw' input. By default, the 'processed' history is used,
1990 1992 so that magics are loaded in their transformed version to valid
1991 1993 Python. If this option is given, the raw input as typed as the
1992 1994 command line is used instead.
1993 1995
1994 1996 This will define a global variable called `name` which is a string
1995 1997 made of joining the slices and lines you specify (n1,n2,... numbers
1996 1998 above) from your input history into a single string. This variable
1997 1999 acts like an automatic function which re-executes those lines as if
1998 2000 you had typed them. You just type 'name' at the prompt and the code
1999 2001 executes.
2000 2002
2001 2003 The notation for indicating number ranges is: n1-n2 means 'use line
2002 2004 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
2003 2005 using the lines numbered 5,6 and 7.
2004 2006
2005 2007 Note: as a 'hidden' feature, you can also use traditional python slice
2006 2008 notation, where N:M means numbers N through M-1.
2007 2009
2008 2010 For example, if your history contains (%hist prints it):
2009 2011
2010 2012 44: x=1
2011 2013 45: y=3
2012 2014 46: z=x+y
2013 2015 47: print x
2014 2016 48: a=5
2015 2017 49: print 'x',x,'y',y
2016 2018
2017 2019 you can create a macro with lines 44 through 47 (included) and line 49
2018 2020 called my_macro with:
2019 2021
2020 2022 In [55]: %macro my_macro 44-47 49
2021 2023
2022 2024 Now, typing `my_macro` (without quotes) will re-execute all this code
2023 2025 in one pass.
2024 2026
2025 2027 You don't need to give the line-numbers in order, and any given line
2026 2028 number can appear multiple times. You can assemble macros with any
2027 2029 lines from your input history in any order.
2028 2030
2029 2031 The macro is a simple object which holds its value in an attribute,
2030 2032 but IPython's display system checks for macros and executes them as
2031 2033 code instead of printing them when you type their name.
2032 2034
2033 2035 You can view a macro's contents by explicitly printing it with:
2034 2036
2035 2037 'print macro_name'.
2036 2038
2037 2039 For one-off cases which DON'T contain magic function calls in them you
2038 2040 can obtain similar results by explicitly executing slices from your
2039 2041 input history with:
2040 2042
2041 2043 In [60]: exec In[44:48]+In[49]"""
2042 2044
2043 2045 opts,args = self.parse_options(parameter_s,'r',mode='list')
2044 2046 if not args:
2045 2047 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2046 2048 macs.sort()
2047 2049 return macs
2048 2050 if len(args) == 1:
2049 2051 raise UsageError(
2050 2052 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2051 2053 name,ranges = args[0], args[1:]
2052 2054
2053 2055 #print 'rng',ranges # dbg
2054 2056 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2055 2057 macro = Macro(lines)
2056 2058 self.shell.define_macro(name, macro)
2057 2059 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2058 2060 print 'Macro contents:'
2059 2061 print macro,
2060 2062
2061 2063 def magic_save(self,parameter_s = ''):
2062 2064 """Save a set of lines to a given filename.
2063 2065
2064 2066 Usage:\\
2065 2067 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2066 2068
2067 2069 Options:
2068 2070
2069 2071 -r: use 'raw' input. By default, the 'processed' history is used,
2070 2072 so that magics are loaded in their transformed version to valid
2071 2073 Python. If this option is given, the raw input as typed as the
2072 2074 command line is used instead.
2073 2075
2074 2076 This function uses the same syntax as %macro for line extraction, but
2075 2077 instead of creating a macro it saves the resulting string to the
2076 2078 filename you specify.
2077 2079
2078 2080 It adds a '.py' extension to the file if you don't do so yourself, and
2079 2081 it asks for confirmation before overwriting existing files."""
2080 2082
2081 2083 opts,args = self.parse_options(parameter_s,'r',mode='list')
2082 2084 fname,ranges = args[0], args[1:]
2083 2085 if not fname.endswith('.py'):
2084 2086 fname += '.py'
2085 2087 if os.path.isfile(fname):
2086 2088 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2087 2089 if ans.lower() not in ['y','yes']:
2088 2090 print 'Operation cancelled.'
2089 2091 return
2090 2092 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2091 2093 f = file(fname,'w')
2092 2094 f.write(cmds)
2093 2095 f.close()
2094 2096 print 'The following commands were written to file `%s`:' % fname
2095 2097 print cmds
2096 2098
2097 2099 def _edit_macro(self,mname,macro):
2098 2100 """open an editor with the macro data in a file"""
2099 2101 filename = self.shell.mktempfile(macro.value)
2100 2102 self.shell.hooks.editor(filename)
2101 2103
2102 2104 # and make a new macro object, to replace the old one
2103 2105 mfile = open(filename)
2104 2106 mvalue = mfile.read()
2105 2107 mfile.close()
2106 2108 self.shell.user_ns[mname] = Macro(mvalue)
2107 2109
2108 2110 def magic_ed(self,parameter_s=''):
2109 2111 """Alias to %edit."""
2110 2112 return self.magic_edit(parameter_s)
2111 2113
2112 2114 @testdec.skip_doctest
2113 2115 def magic_edit(self,parameter_s='',last_call=['','']):
2114 2116 """Bring up an editor and execute the resulting code.
2115 2117
2116 2118 Usage:
2117 2119 %edit [options] [args]
2118 2120
2119 2121 %edit runs IPython's editor hook. The default version of this hook is
2120 2122 set to call the __IPYTHON__.rc.editor command. This is read from your
2121 2123 environment variable $EDITOR. If this isn't found, it will default to
2122 2124 vi under Linux/Unix and to notepad under Windows. See the end of this
2123 2125 docstring for how to change the editor hook.
2124 2126
2125 2127 You can also set the value of this editor via the command line option
2126 2128 '-editor' or in your ipythonrc file. This is useful if you wish to use
2127 2129 specifically for IPython an editor different from your typical default
2128 2130 (and for Windows users who typically don't set environment variables).
2129 2131
2130 2132 This command allows you to conveniently edit multi-line code right in
2131 2133 your IPython session.
2132 2134
2133 2135 If called without arguments, %edit opens up an empty editor with a
2134 2136 temporary file and will execute the contents of this file when you
2135 2137 close it (don't forget to save it!).
2136 2138
2137 2139
2138 2140 Options:
2139 2141
2140 2142 -n <number>: open the editor at a specified line number. By default,
2141 2143 the IPython editor hook uses the unix syntax 'editor +N filename', but
2142 2144 you can configure this by providing your own modified hook if your
2143 2145 favorite editor supports line-number specifications with a different
2144 2146 syntax.
2145 2147
2146 2148 -p: this will call the editor with the same data as the previous time
2147 2149 it was used, regardless of how long ago (in your current session) it
2148 2150 was.
2149 2151
2150 2152 -r: use 'raw' input. This option only applies to input taken from the
2151 2153 user's history. By default, the 'processed' history is used, so that
2152 2154 magics are loaded in their transformed version to valid Python. If
2153 2155 this option is given, the raw input as typed as the command line is
2154 2156 used instead. When you exit the editor, it will be executed by
2155 2157 IPython's own processor.
2156 2158
2157 2159 -x: do not execute the edited code immediately upon exit. This is
2158 2160 mainly useful if you are editing programs which need to be called with
2159 2161 command line arguments, which you can then do using %run.
2160 2162
2161 2163
2162 2164 Arguments:
2163 2165
2164 2166 If arguments are given, the following possibilites exist:
2165 2167
2166 2168 - The arguments are numbers or pairs of colon-separated numbers (like
2167 2169 1 4:8 9). These are interpreted as lines of previous input to be
2168 2170 loaded into the editor. The syntax is the same of the %macro command.
2169 2171
2170 2172 - If the argument doesn't start with a number, it is evaluated as a
2171 2173 variable and its contents loaded into the editor. You can thus edit
2172 2174 any string which contains python code (including the result of
2173 2175 previous edits).
2174 2176
2175 2177 - If the argument is the name of an object (other than a string),
2176 2178 IPython will try to locate the file where it was defined and open the
2177 2179 editor at the point where it is defined. You can use `%edit function`
2178 2180 to load an editor exactly at the point where 'function' is defined,
2179 2181 edit it and have the file be executed automatically.
2180 2182
2181 2183 If the object is a macro (see %macro for details), this opens up your
2182 2184 specified editor with a temporary file containing the macro's data.
2183 2185 Upon exit, the macro is reloaded with the contents of the file.
2184 2186
2185 2187 Note: opening at an exact line is only supported under Unix, and some
2186 2188 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2187 2189 '+NUMBER' parameter necessary for this feature. Good editors like
2188 2190 (X)Emacs, vi, jed, pico and joe all do.
2189 2191
2190 2192 - If the argument is not found as a variable, IPython will look for a
2191 2193 file with that name (adding .py if necessary) and load it into the
2192 2194 editor. It will execute its contents with execfile() when you exit,
2193 2195 loading any code in the file into your interactive namespace.
2194 2196
2195 2197 After executing your code, %edit will return as output the code you
2196 2198 typed in the editor (except when it was an existing file). This way
2197 2199 you can reload the code in further invocations of %edit as a variable,
2198 2200 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2199 2201 the output.
2200 2202
2201 2203 Note that %edit is also available through the alias %ed.
2202 2204
2203 2205 This is an example of creating a simple function inside the editor and
2204 2206 then modifying it. First, start up the editor:
2205 2207
2206 2208 In [1]: ed
2207 2209 Editing... done. Executing edited code...
2208 2210 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2209 2211
2210 2212 We can then call the function foo():
2211 2213
2212 2214 In [2]: foo()
2213 2215 foo() was defined in an editing session
2214 2216
2215 2217 Now we edit foo. IPython automatically loads the editor with the
2216 2218 (temporary) file where foo() was previously defined:
2217 2219
2218 2220 In [3]: ed foo
2219 2221 Editing... done. Executing edited code...
2220 2222
2221 2223 And if we call foo() again we get the modified version:
2222 2224
2223 2225 In [4]: foo()
2224 2226 foo() has now been changed!
2225 2227
2226 2228 Here is an example of how to edit a code snippet successive
2227 2229 times. First we call the editor:
2228 2230
2229 2231 In [5]: ed
2230 2232 Editing... done. Executing edited code...
2231 2233 hello
2232 2234 Out[5]: "print 'hello'n"
2233 2235
2234 2236 Now we call it again with the previous output (stored in _):
2235 2237
2236 2238 In [6]: ed _
2237 2239 Editing... done. Executing edited code...
2238 2240 hello world
2239 2241 Out[6]: "print 'hello world'n"
2240 2242
2241 2243 Now we call it with the output #8 (stored in _8, also as Out[8]):
2242 2244
2243 2245 In [7]: ed _8
2244 2246 Editing... done. Executing edited code...
2245 2247 hello again
2246 2248 Out[7]: "print 'hello again'n"
2247 2249
2248 2250
2249 2251 Changing the default editor hook:
2250 2252
2251 2253 If you wish to write your own editor hook, you can put it in a
2252 2254 configuration file which you load at startup time. The default hook
2253 2255 is defined in the IPython.core.hooks module, and you can use that as a
2254 2256 starting example for further modifications. That file also has
2255 2257 general instructions on how to set a new hook for use once you've
2256 2258 defined it."""
2257 2259
2258 2260 # FIXME: This function has become a convoluted mess. It needs a
2259 2261 # ground-up rewrite with clean, simple logic.
2260 2262
2261 2263 def make_filename(arg):
2262 2264 "Make a filename from the given args"
2263 2265 try:
2264 2266 filename = get_py_filename(arg)
2265 2267 except IOError:
2266 2268 if args.endswith('.py'):
2267 2269 filename = arg
2268 2270 else:
2269 2271 filename = None
2270 2272 return filename
2271 2273
2272 2274 # custom exceptions
2273 2275 class DataIsObject(Exception): pass
2274 2276
2275 2277 opts,args = self.parse_options(parameter_s,'prxn:')
2276 2278 # Set a few locals from the options for convenience:
2277 2279 opts_p = opts.has_key('p')
2278 2280 opts_r = opts.has_key('r')
2279 2281
2280 2282 # Default line number value
2281 2283 lineno = opts.get('n',None)
2282 2284
2283 2285 if opts_p:
2284 2286 args = '_%s' % last_call[0]
2285 2287 if not self.shell.user_ns.has_key(args):
2286 2288 args = last_call[1]
2287 2289
2288 2290 # use last_call to remember the state of the previous call, but don't
2289 2291 # let it be clobbered by successive '-p' calls.
2290 2292 try:
2291 2293 last_call[0] = self.shell.outputcache.prompt_count
2292 2294 if not opts_p:
2293 2295 last_call[1] = parameter_s
2294 2296 except:
2295 2297 pass
2296 2298
2297 2299 # by default this is done with temp files, except when the given
2298 2300 # arg is a filename
2299 2301 use_temp = 1
2300 2302
2301 2303 if re.match(r'\d',args):
2302 2304 # Mode where user specifies ranges of lines, like in %macro.
2303 2305 # This means that you can't edit files whose names begin with
2304 2306 # numbers this way. Tough.
2305 2307 ranges = args.split()
2306 2308 data = ''.join(self.extract_input_slices(ranges,opts_r))
2307 2309 elif args.endswith('.py'):
2308 2310 filename = make_filename(args)
2309 2311 data = ''
2310 2312 use_temp = 0
2311 2313 elif args:
2312 2314 try:
2313 2315 # Load the parameter given as a variable. If not a string,
2314 2316 # process it as an object instead (below)
2315 2317
2316 2318 #print '*** args',args,'type',type(args) # dbg
2317 2319 data = eval(args,self.shell.user_ns)
2318 2320 if not type(data) in StringTypes:
2319 2321 raise DataIsObject
2320 2322
2321 2323 except (NameError,SyntaxError):
2322 2324 # given argument is not a variable, try as a filename
2323 2325 filename = make_filename(args)
2324 2326 if filename is None:
2325 2327 warn("Argument given (%s) can't be found as a variable "
2326 2328 "or as a filename." % args)
2327 2329 return
2328 2330
2329 2331 data = ''
2330 2332 use_temp = 0
2331 2333 except DataIsObject:
2332 2334
2333 2335 # macros have a special edit function
2334 2336 if isinstance(data,Macro):
2335 2337 self._edit_macro(args,data)
2336 2338 return
2337 2339
2338 2340 # For objects, try to edit the file where they are defined
2339 2341 try:
2340 2342 filename = inspect.getabsfile(data)
2341 2343 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2342 2344 # class created by %edit? Try to find source
2343 2345 # by looking for method definitions instead, the
2344 2346 # __module__ in those classes is FakeModule.
2345 2347 attrs = [getattr(data, aname) for aname in dir(data)]
2346 2348 for attr in attrs:
2347 2349 if not inspect.ismethod(attr):
2348 2350 continue
2349 2351 filename = inspect.getabsfile(attr)
2350 2352 if filename and 'fakemodule' not in filename.lower():
2351 2353 # change the attribute to be the edit target instead
2352 2354 data = attr
2353 2355 break
2354 2356
2355 2357 datafile = 1
2356 2358 except TypeError:
2357 2359 filename = make_filename(args)
2358 2360 datafile = 1
2359 2361 warn('Could not find file where `%s` is defined.\n'
2360 2362 'Opening a file named `%s`' % (args,filename))
2361 2363 # Now, make sure we can actually read the source (if it was in
2362 2364 # a temp file it's gone by now).
2363 2365 if datafile:
2364 2366 try:
2365 2367 if lineno is None:
2366 2368 lineno = inspect.getsourcelines(data)[1]
2367 2369 except IOError:
2368 2370 filename = make_filename(args)
2369 2371 if filename is None:
2370 2372 warn('The file `%s` where `%s` was defined cannot '
2371 2373 'be read.' % (filename,data))
2372 2374 return
2373 2375 use_temp = 0
2374 2376 else:
2375 2377 data = ''
2376 2378
2377 2379 if use_temp:
2378 2380 filename = self.shell.mktempfile(data)
2379 2381 print 'IPython will make a temporary file named:',filename
2380 2382
2381 2383 # do actual editing here
2382 2384 print 'Editing...',
2383 2385 sys.stdout.flush()
2384 2386 try:
2385 2387 self.shell.hooks.editor(filename,lineno)
2386 2388 except TryNext:
2387 2389 warn('Could not open editor')
2388 2390 return
2389 2391
2390 2392 # XXX TODO: should this be generalized for all string vars?
2391 2393 # For now, this is special-cased to blocks created by cpaste
2392 2394 if args.strip() == 'pasted_block':
2393 2395 self.shell.user_ns['pasted_block'] = file_read(filename)
2394 2396
2395 2397 if opts.has_key('x'): # -x prevents actual execution
2396 2398 print
2397 2399 else:
2398 2400 print 'done. Executing edited code...'
2399 2401 if opts_r:
2400 2402 self.shell.runlines(file_read(filename))
2401 2403 else:
2402 2404 self.shell.safe_execfile(filename,self.shell.user_ns,
2403 2405 self.shell.user_ns)
2404 2406
2405 2407
2406 2408 if use_temp:
2407 2409 try:
2408 2410 return open(filename).read()
2409 2411 except IOError,msg:
2410 2412 if msg.filename == filename:
2411 2413 warn('File not found. Did you forget to save?')
2412 2414 return
2413 2415 else:
2414 2416 self.shell.showtraceback()
2415 2417
2416 2418 def magic_xmode(self,parameter_s = ''):
2417 2419 """Switch modes for the exception handlers.
2418 2420
2419 2421 Valid modes: Plain, Context and Verbose.
2420 2422
2421 2423 If called without arguments, acts as a toggle."""
2422 2424
2423 2425 def xmode_switch_err(name):
2424 2426 warn('Error changing %s exception modes.\n%s' %
2425 2427 (name,sys.exc_info()[1]))
2426 2428
2427 2429 shell = self.shell
2428 2430 new_mode = parameter_s.strip().capitalize()
2429 2431 try:
2430 2432 shell.InteractiveTB.set_mode(mode=new_mode)
2431 2433 print 'Exception reporting mode:',shell.InteractiveTB.mode
2432 2434 except:
2433 2435 xmode_switch_err('user')
2434 2436
2435 2437 # threaded shells use a special handler in sys.excepthook
2436 2438 if shell.isthreaded:
2437 2439 try:
2438 2440 shell.sys_excepthook.set_mode(mode=new_mode)
2439 2441 except:
2440 2442 xmode_switch_err('threaded')
2441 2443
2442 2444 def magic_colors(self,parameter_s = ''):
2443 2445 """Switch color scheme for prompts, info system and exception handlers.
2444 2446
2445 2447 Currently implemented schemes: NoColor, Linux, LightBG.
2446 2448
2447 2449 Color scheme names are not case-sensitive."""
2448 2450
2449 2451 def color_switch_err(name):
2450 2452 warn('Error changing %s color schemes.\n%s' %
2451 2453 (name,sys.exc_info()[1]))
2452 2454
2453 2455
2454 2456 new_scheme = parameter_s.strip()
2455 2457 if not new_scheme:
2456 2458 raise UsageError(
2457 2459 "%colors: you must specify a color scheme. See '%colors?'")
2458 2460 return
2459 2461 # local shortcut
2460 2462 shell = self.shell
2461 2463
2462 2464 import IPython.utils.rlineimpl as readline
2463 2465
2464 2466 if not readline.have_readline and sys.platform == "win32":
2465 2467 msg = """\
2466 2468 Proper color support under MS Windows requires the pyreadline library.
2467 2469 You can find it at:
2468 2470 http://ipython.scipy.org/moin/PyReadline/Intro
2469 2471 Gary's readline needs the ctypes module, from:
2470 2472 http://starship.python.net/crew/theller/ctypes
2471 2473 (Note that ctypes is already part of Python versions 2.5 and newer).
2472 2474
2473 2475 Defaulting color scheme to 'NoColor'"""
2474 2476 new_scheme = 'NoColor'
2475 2477 warn(msg)
2476 2478
2477 2479 # readline option is 0
2478 2480 if not shell.has_readline:
2479 2481 new_scheme = 'NoColor'
2480 2482
2481 2483 # Set prompt colors
2482 2484 try:
2483 2485 shell.outputcache.set_colors(new_scheme)
2484 2486 except:
2485 2487 color_switch_err('prompt')
2486 2488 else:
2487 2489 shell.colors = \
2488 2490 shell.outputcache.color_table.active_scheme_name
2489 2491 # Set exception colors
2490 2492 try:
2491 2493 shell.InteractiveTB.set_colors(scheme = new_scheme)
2492 2494 shell.SyntaxTB.set_colors(scheme = new_scheme)
2493 2495 except:
2494 2496 color_switch_err('exception')
2495 2497
2496 2498 # threaded shells use a verbose traceback in sys.excepthook
2497 2499 if shell.isthreaded:
2498 2500 try:
2499 2501 shell.sys_excepthook.set_colors(scheme=new_scheme)
2500 2502 except:
2501 2503 color_switch_err('system exception handler')
2502 2504
2503 2505 # Set info (for 'object?') colors
2504 2506 if shell.color_info:
2505 2507 try:
2506 2508 shell.inspector.set_active_scheme(new_scheme)
2507 2509 except:
2508 2510 color_switch_err('object inspector')
2509 2511 else:
2510 2512 shell.inspector.set_active_scheme('NoColor')
2511 2513
2512 2514 def magic_color_info(self,parameter_s = ''):
2513 2515 """Toggle color_info.
2514 2516
2515 2517 The color_info configuration parameter controls whether colors are
2516 2518 used for displaying object details (by things like %psource, %pfile or
2517 2519 the '?' system). This function toggles this value with each call.
2518 2520
2519 2521 Note that unless you have a fairly recent pager (less works better
2520 2522 than more) in your system, using colored object information displays
2521 2523 will not work properly. Test it and see."""
2522 2524
2523 2525 self.shell.color_info = not self.shell.color_info
2524 2526 self.magic_colors(self.shell.colors)
2525 2527 print 'Object introspection functions have now coloring:',
2526 2528 print ['OFF','ON'][int(self.shell.color_info)]
2527 2529
2528 2530 def magic_Pprint(self, parameter_s=''):
2529 2531 """Toggle pretty printing on/off."""
2530 2532
2531 2533 self.shell.pprint = 1 - self.shell.pprint
2532 2534 print 'Pretty printing has been turned', \
2533 2535 ['OFF','ON'][self.shell.pprint]
2534 2536
2535 2537 def magic_Exit(self, parameter_s=''):
2536 2538 """Exit IPython without confirmation."""
2537 2539
2538 2540 self.shell.ask_exit()
2539 2541
2540 2542 # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.
2541 2543 magic_exit = magic_quit = magic_Quit = magic_Exit
2542 2544
2543 2545 #......................................................................
2544 2546 # Functions to implement unix shell-type things
2545 2547
2546 2548 @testdec.skip_doctest
2547 2549 def magic_alias(self, parameter_s = ''):
2548 2550 """Define an alias for a system command.
2549 2551
2550 2552 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2551 2553
2552 2554 Then, typing 'alias_name params' will execute the system command 'cmd
2553 2555 params' (from your underlying operating system).
2554 2556
2555 2557 Aliases have lower precedence than magic functions and Python normal
2556 2558 variables, so if 'foo' is both a Python variable and an alias, the
2557 2559 alias can not be executed until 'del foo' removes the Python variable.
2558 2560
2559 2561 You can use the %l specifier in an alias definition to represent the
2560 2562 whole line when the alias is called. For example:
2561 2563
2562 2564 In [2]: alias all echo "Input in brackets: <%l>"
2563 2565 In [3]: all hello world
2564 2566 Input in brackets: <hello world>
2565 2567
2566 2568 You can also define aliases with parameters using %s specifiers (one
2567 2569 per parameter):
2568 2570
2569 2571 In [1]: alias parts echo first %s second %s
2570 2572 In [2]: %parts A B
2571 2573 first A second B
2572 2574 In [3]: %parts A
2573 2575 Incorrect number of arguments: 2 expected.
2574 2576 parts is an alias to: 'echo first %s second %s'
2575 2577
2576 2578 Note that %l and %s are mutually exclusive. You can only use one or
2577 2579 the other in your aliases.
2578 2580
2579 2581 Aliases expand Python variables just like system calls using ! or !!
2580 2582 do: all expressions prefixed with '$' get expanded. For details of
2581 2583 the semantic rules, see PEP-215:
2582 2584 http://www.python.org/peps/pep-0215.html. This is the library used by
2583 2585 IPython for variable expansion. If you want to access a true shell
2584 2586 variable, an extra $ is necessary to prevent its expansion by IPython:
2585 2587
2586 2588 In [6]: alias show echo
2587 2589 In [7]: PATH='A Python string'
2588 2590 In [8]: show $PATH
2589 2591 A Python string
2590 2592 In [9]: show $$PATH
2591 2593 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2592 2594
2593 2595 You can use the alias facility to acess all of $PATH. See the %rehash
2594 2596 and %rehashx functions, which automatically create aliases for the
2595 2597 contents of your $PATH.
2596 2598
2597 2599 If called with no parameters, %alias prints the current alias table."""
2598 2600
2599 2601 par = parameter_s.strip()
2600 2602 if not par:
2601 2603 stored = self.db.get('stored_aliases', {} )
2602 2604 aliases = sorted(self.shell.alias_manager.aliases)
2603 2605 # for k, v in stored:
2604 2606 # atab.append(k, v[0])
2605 2607
2606 2608 print "Total number of aliases:", len(aliases)
2607 2609 return aliases
2608 2610
2609 2611 # Now try to define a new one
2610 2612 try:
2611 2613 alias,cmd = par.split(None, 1)
2612 2614 except:
2613 2615 print oinspect.getdoc(self.magic_alias)
2614 2616 else:
2615 2617 self.shell.alias_manager.soft_define_alias(alias, cmd)
2616 2618 # end magic_alias
2617 2619
2618 2620 def magic_unalias(self, parameter_s = ''):
2619 2621 """Remove an alias"""
2620 2622
2621 2623 aname = parameter_s.strip()
2622 2624 self.shell.alias_manager.undefine_alias(aname)
2623 2625 stored = self.db.get('stored_aliases', {} )
2624 2626 if aname in stored:
2625 2627 print "Removing %stored alias",aname
2626 2628 del stored[aname]
2627 2629 self.db['stored_aliases'] = stored
2628 2630
2629 2631
2630 2632 def magic_rehashx(self, parameter_s = ''):
2631 2633 """Update the alias table with all executable files in $PATH.
2632 2634
2633 2635 This version explicitly checks that every entry in $PATH is a file
2634 2636 with execute access (os.X_OK), so it is much slower than %rehash.
2635 2637
2636 2638 Under Windows, it checks executability as a match agains a
2637 2639 '|'-separated string of extensions, stored in the IPython config
2638 2640 variable win_exec_ext. This defaults to 'exe|com|bat'.
2639 2641
2640 2642 This function also resets the root module cache of module completer,
2641 2643 used on slow filesystems.
2642 2644 """
2643 2645 from IPython.core.alias import InvalidAliasError
2644 2646
2645 2647 # for the benefit of module completer in ipy_completers.py
2646 2648 del self.db['rootmodules']
2647 2649
2648 2650 path = [os.path.abspath(os.path.expanduser(p)) for p in
2649 2651 os.environ.get('PATH','').split(os.pathsep)]
2650 2652 path = filter(os.path.isdir,path)
2651 2653
2652 2654 syscmdlist = []
2653 2655 # Now define isexec in a cross platform manner.
2654 2656 if os.name == 'posix':
2655 2657 isexec = lambda fname:os.path.isfile(fname) and \
2656 2658 os.access(fname,os.X_OK)
2657 2659 else:
2658 2660 try:
2659 2661 winext = os.environ['pathext'].replace(';','|').replace('.','')
2660 2662 except KeyError:
2661 2663 winext = 'exe|com|bat|py'
2662 2664 if 'py' not in winext:
2663 2665 winext += '|py'
2664 2666 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2665 2667 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2666 2668 savedir = os.getcwd()
2667 2669
2668 2670 # Now walk the paths looking for executables to alias.
2669 2671 try:
2670 2672 # write the whole loop for posix/Windows so we don't have an if in
2671 2673 # the innermost part
2672 2674 if os.name == 'posix':
2673 2675 for pdir in path:
2674 2676 os.chdir(pdir)
2675 2677 for ff in os.listdir(pdir):
2676 2678 if isexec(ff):
2677 2679 try:
2678 2680 # Removes dots from the name since ipython
2679 2681 # will assume names with dots to be python.
2680 2682 self.shell.alias_manager.define_alias(
2681 2683 ff.replace('.',''), ff)
2682 2684 except InvalidAliasError:
2683 2685 pass
2684 2686 else:
2685 2687 syscmdlist.append(ff)
2686 2688 else:
2687 2689 no_alias = self.shell.alias_manager.no_alias
2688 2690 for pdir in path:
2689 2691 os.chdir(pdir)
2690 2692 for ff in os.listdir(pdir):
2691 2693 base, ext = os.path.splitext(ff)
2692 2694 if isexec(ff) and base.lower() not in no_alias:
2693 2695 if ext.lower() == '.exe':
2694 2696 ff = base
2695 2697 try:
2696 2698 # Removes dots from the name since ipython
2697 2699 # will assume names with dots to be python.
2698 2700 self.shell.alias_manager.define_alias(
2699 2701 base.lower().replace('.',''), ff)
2700 2702 except InvalidAliasError:
2701 2703 pass
2702 2704 syscmdlist.append(ff)
2703 2705 db = self.db
2704 2706 db['syscmdlist'] = syscmdlist
2705 2707 finally:
2706 2708 os.chdir(savedir)
2707 2709
2708 2710 def magic_pwd(self, parameter_s = ''):
2709 2711 """Return the current working directory path."""
2710 2712 return os.getcwd()
2711 2713
2712 2714 def magic_cd(self, parameter_s=''):
2713 2715 """Change the current working directory.
2714 2716
2715 2717 This command automatically maintains an internal list of directories
2716 2718 you visit during your IPython session, in the variable _dh. The
2717 2719 command %dhist shows this history nicely formatted. You can also
2718 2720 do 'cd -<tab>' to see directory history conveniently.
2719 2721
2720 2722 Usage:
2721 2723
2722 2724 cd 'dir': changes to directory 'dir'.
2723 2725
2724 2726 cd -: changes to the last visited directory.
2725 2727
2726 2728 cd -<n>: changes to the n-th directory in the directory history.
2727 2729
2728 2730 cd --foo: change to directory that matches 'foo' in history
2729 2731
2730 2732 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2731 2733 (note: cd <bookmark_name> is enough if there is no
2732 2734 directory <bookmark_name>, but a bookmark with the name exists.)
2733 2735 'cd -b <tab>' allows you to tab-complete bookmark names.
2734 2736
2735 2737 Options:
2736 2738
2737 2739 -q: quiet. Do not print the working directory after the cd command is
2738 2740 executed. By default IPython's cd command does print this directory,
2739 2741 since the default prompts do not display path information.
2740 2742
2741 2743 Note that !cd doesn't work for this purpose because the shell where
2742 2744 !command runs is immediately discarded after executing 'command'."""
2743 2745
2744 2746 parameter_s = parameter_s.strip()
2745 2747 #bkms = self.shell.persist.get("bookmarks",{})
2746 2748
2747 2749 oldcwd = os.getcwd()
2748 2750 numcd = re.match(r'(-)(\d+)$',parameter_s)
2749 2751 # jump in directory history by number
2750 2752 if numcd:
2751 2753 nn = int(numcd.group(2))
2752 2754 try:
2753 2755 ps = self.shell.user_ns['_dh'][nn]
2754 2756 except IndexError:
2755 2757 print 'The requested directory does not exist in history.'
2756 2758 return
2757 2759 else:
2758 2760 opts = {}
2759 2761 elif parameter_s.startswith('--'):
2760 2762 ps = None
2761 2763 fallback = None
2762 2764 pat = parameter_s[2:]
2763 2765 dh = self.shell.user_ns['_dh']
2764 2766 # first search only by basename (last component)
2765 2767 for ent in reversed(dh):
2766 2768 if pat in os.path.basename(ent) and os.path.isdir(ent):
2767 2769 ps = ent
2768 2770 break
2769 2771
2770 2772 if fallback is None and pat in ent and os.path.isdir(ent):
2771 2773 fallback = ent
2772 2774
2773 2775 # if we have no last part match, pick the first full path match
2774 2776 if ps is None:
2775 2777 ps = fallback
2776 2778
2777 2779 if ps is None:
2778 2780 print "No matching entry in directory history"
2779 2781 return
2780 2782 else:
2781 2783 opts = {}
2782 2784
2783 2785
2784 2786 else:
2785 2787 #turn all non-space-escaping backslashes to slashes,
2786 2788 # for c:\windows\directory\names\
2787 2789 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2788 2790 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2789 2791 # jump to previous
2790 2792 if ps == '-':
2791 2793 try:
2792 2794 ps = self.shell.user_ns['_dh'][-2]
2793 2795 except IndexError:
2794 2796 raise UsageError('%cd -: No previous directory to change to.')
2795 2797 # jump to bookmark if needed
2796 2798 else:
2797 2799 if not os.path.isdir(ps) or opts.has_key('b'):
2798 2800 bkms = self.db.get('bookmarks', {})
2799 2801
2800 2802 if bkms.has_key(ps):
2801 2803 target = bkms[ps]
2802 2804 print '(bookmark:%s) -> %s' % (ps,target)
2803 2805 ps = target
2804 2806 else:
2805 2807 if opts.has_key('b'):
2806 2808 raise UsageError("Bookmark '%s' not found. "
2807 2809 "Use '%%bookmark -l' to see your bookmarks." % ps)
2808 2810
2809 2811 # at this point ps should point to the target dir
2810 2812 if ps:
2811 2813 try:
2812 2814 os.chdir(os.path.expanduser(ps))
2813 2815 if self.shell.term_title:
2814 platutils.set_term_title('IPython: ' + abbrev_cwd())
2816 set_term_title('IPython: ' + abbrev_cwd())
2815 2817 except OSError:
2816 2818 print sys.exc_info()[1]
2817 2819 else:
2818 2820 cwd = os.getcwd()
2819 2821 dhist = self.shell.user_ns['_dh']
2820 2822 if oldcwd != cwd:
2821 2823 dhist.append(cwd)
2822 2824 self.db['dhist'] = compress_dhist(dhist)[-100:]
2823 2825
2824 2826 else:
2825 2827 os.chdir(self.shell.home_dir)
2826 2828 if self.shell.term_title:
2827 platutils.set_term_title('IPython: ' + '~')
2829 set_term_title('IPython: ' + '~')
2828 2830 cwd = os.getcwd()
2829 2831 dhist = self.shell.user_ns['_dh']
2830 2832
2831 2833 if oldcwd != cwd:
2832 2834 dhist.append(cwd)
2833 2835 self.db['dhist'] = compress_dhist(dhist)[-100:]
2834 2836 if not 'q' in opts and self.shell.user_ns['_dh']:
2835 2837 print self.shell.user_ns['_dh'][-1]
2836 2838
2837 2839
2838 2840 def magic_env(self, parameter_s=''):
2839 2841 """List environment variables."""
2840 2842
2841 2843 return os.environ.data
2842 2844
2843 2845 def magic_pushd(self, parameter_s=''):
2844 2846 """Place the current dir on stack and change directory.
2845 2847
2846 2848 Usage:\\
2847 2849 %pushd ['dirname']
2848 2850 """
2849 2851
2850 2852 dir_s = self.shell.dir_stack
2851 2853 tgt = os.path.expanduser(parameter_s)
2852 2854 cwd = os.getcwd().replace(self.home_dir,'~')
2853 2855 if tgt:
2854 2856 self.magic_cd(parameter_s)
2855 2857 dir_s.insert(0,cwd)
2856 2858 return self.magic_dirs()
2857 2859
2858 2860 def magic_popd(self, parameter_s=''):
2859 2861 """Change to directory popped off the top of the stack.
2860 2862 """
2861 2863 if not self.shell.dir_stack:
2862 2864 raise UsageError("%popd on empty stack")
2863 2865 top = self.shell.dir_stack.pop(0)
2864 2866 self.magic_cd(top)
2865 2867 print "popd ->",top
2866 2868
2867 2869 def magic_dirs(self, parameter_s=''):
2868 2870 """Return the current directory stack."""
2869 2871
2870 2872 return self.shell.dir_stack
2871 2873
2872 2874 def magic_dhist(self, parameter_s=''):
2873 2875 """Print your history of visited directories.
2874 2876
2875 2877 %dhist -> print full history\\
2876 2878 %dhist n -> print last n entries only\\
2877 2879 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2878 2880
2879 2881 This history is automatically maintained by the %cd command, and
2880 2882 always available as the global list variable _dh. You can use %cd -<n>
2881 2883 to go to directory number <n>.
2882 2884
2883 2885 Note that most of time, you should view directory history by entering
2884 2886 cd -<TAB>.
2885 2887
2886 2888 """
2887 2889
2888 2890 dh = self.shell.user_ns['_dh']
2889 2891 if parameter_s:
2890 2892 try:
2891 2893 args = map(int,parameter_s.split())
2892 2894 except:
2893 2895 self.arg_err(Magic.magic_dhist)
2894 2896 return
2895 2897 if len(args) == 1:
2896 2898 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2897 2899 elif len(args) == 2:
2898 2900 ini,fin = args
2899 2901 else:
2900 2902 self.arg_err(Magic.magic_dhist)
2901 2903 return
2902 2904 else:
2903 2905 ini,fin = 0,len(dh)
2904 2906 nlprint(dh,
2905 2907 header = 'Directory history (kept in _dh)',
2906 2908 start=ini,stop=fin)
2907 2909
2908 2910 @testdec.skip_doctest
2909 2911 def magic_sc(self, parameter_s=''):
2910 2912 """Shell capture - execute a shell command and capture its output.
2911 2913
2912 2914 DEPRECATED. Suboptimal, retained for backwards compatibility.
2913 2915
2914 2916 You should use the form 'var = !command' instead. Example:
2915 2917
2916 2918 "%sc -l myfiles = ls ~" should now be written as
2917 2919
2918 2920 "myfiles = !ls ~"
2919 2921
2920 2922 myfiles.s, myfiles.l and myfiles.n still apply as documented
2921 2923 below.
2922 2924
2923 2925 --
2924 2926 %sc [options] varname=command
2925 2927
2926 2928 IPython will run the given command using commands.getoutput(), and
2927 2929 will then update the user's interactive namespace with a variable
2928 2930 called varname, containing the value of the call. Your command can
2929 2931 contain shell wildcards, pipes, etc.
2930 2932
2931 2933 The '=' sign in the syntax is mandatory, and the variable name you
2932 2934 supply must follow Python's standard conventions for valid names.
2933 2935
2934 2936 (A special format without variable name exists for internal use)
2935 2937
2936 2938 Options:
2937 2939
2938 2940 -l: list output. Split the output on newlines into a list before
2939 2941 assigning it to the given variable. By default the output is stored
2940 2942 as a single string.
2941 2943
2942 2944 -v: verbose. Print the contents of the variable.
2943 2945
2944 2946 In most cases you should not need to split as a list, because the
2945 2947 returned value is a special type of string which can automatically
2946 2948 provide its contents either as a list (split on newlines) or as a
2947 2949 space-separated string. These are convenient, respectively, either
2948 2950 for sequential processing or to be passed to a shell command.
2949 2951
2950 2952 For example:
2951 2953
2952 2954 # all-random
2953 2955
2954 2956 # Capture into variable a
2955 2957 In [1]: sc a=ls *py
2956 2958
2957 2959 # a is a string with embedded newlines
2958 2960 In [2]: a
2959 2961 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2960 2962
2961 2963 # which can be seen as a list:
2962 2964 In [3]: a.l
2963 2965 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2964 2966
2965 2967 # or as a whitespace-separated string:
2966 2968 In [4]: a.s
2967 2969 Out[4]: 'setup.py win32_manual_post_install.py'
2968 2970
2969 2971 # a.s is useful to pass as a single command line:
2970 2972 In [5]: !wc -l $a.s
2971 2973 146 setup.py
2972 2974 130 win32_manual_post_install.py
2973 2975 276 total
2974 2976
2975 2977 # while the list form is useful to loop over:
2976 2978 In [6]: for f in a.l:
2977 2979 ...: !wc -l $f
2978 2980 ...:
2979 2981 146 setup.py
2980 2982 130 win32_manual_post_install.py
2981 2983
2982 2984 Similiarly, the lists returned by the -l option are also special, in
2983 2985 the sense that you can equally invoke the .s attribute on them to
2984 2986 automatically get a whitespace-separated string from their contents:
2985 2987
2986 2988 In [7]: sc -l b=ls *py
2987 2989
2988 2990 In [8]: b
2989 2991 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2990 2992
2991 2993 In [9]: b.s
2992 2994 Out[9]: 'setup.py win32_manual_post_install.py'
2993 2995
2994 2996 In summary, both the lists and strings used for ouptut capture have
2995 2997 the following special attributes:
2996 2998
2997 2999 .l (or .list) : value as list.
2998 3000 .n (or .nlstr): value as newline-separated string.
2999 3001 .s (or .spstr): value as space-separated string.
3000 3002 """
3001 3003
3002 3004 opts,args = self.parse_options(parameter_s,'lv')
3003 3005 # Try to get a variable name and command to run
3004 3006 try:
3005 3007 # the variable name must be obtained from the parse_options
3006 3008 # output, which uses shlex.split to strip options out.
3007 3009 var,_ = args.split('=',1)
3008 3010 var = var.strip()
3009 3011 # But the the command has to be extracted from the original input
3010 3012 # parameter_s, not on what parse_options returns, to avoid the
3011 3013 # quote stripping which shlex.split performs on it.
3012 3014 _,cmd = parameter_s.split('=',1)
3013 3015 except ValueError:
3014 3016 var,cmd = '',''
3015 3017 # If all looks ok, proceed
3016 3018 out,err = self.shell.getoutputerror(cmd)
3017 3019 if err:
3018 3020 print >> Term.cerr,err
3019 3021 if opts.has_key('l'):
3020 3022 out = SList(out.split('\n'))
3021 3023 else:
3022 3024 out = LSString(out)
3023 3025 if opts.has_key('v'):
3024 3026 print '%s ==\n%s' % (var,pformat(out))
3025 3027 if var:
3026 3028 self.shell.user_ns.update({var:out})
3027 3029 else:
3028 3030 return out
3029 3031
3030 3032 def magic_sx(self, parameter_s=''):
3031 3033 """Shell execute - run a shell command and capture its output.
3032 3034
3033 3035 %sx command
3034 3036
3035 3037 IPython will run the given command using commands.getoutput(), and
3036 3038 return the result formatted as a list (split on '\\n'). Since the
3037 3039 output is _returned_, it will be stored in ipython's regular output
3038 3040 cache Out[N] and in the '_N' automatic variables.
3039 3041
3040 3042 Notes:
3041 3043
3042 3044 1) If an input line begins with '!!', then %sx is automatically
3043 3045 invoked. That is, while:
3044 3046 !ls
3045 3047 causes ipython to simply issue system('ls'), typing
3046 3048 !!ls
3047 3049 is a shorthand equivalent to:
3048 3050 %sx ls
3049 3051
3050 3052 2) %sx differs from %sc in that %sx automatically splits into a list,
3051 3053 like '%sc -l'. The reason for this is to make it as easy as possible
3052 3054 to process line-oriented shell output via further python commands.
3053 3055 %sc is meant to provide much finer control, but requires more
3054 3056 typing.
3055 3057
3056 3058 3) Just like %sc -l, this is a list with special attributes:
3057 3059
3058 3060 .l (or .list) : value as list.
3059 3061 .n (or .nlstr): value as newline-separated string.
3060 3062 .s (or .spstr): value as whitespace-separated string.
3061 3063
3062 3064 This is very useful when trying to use such lists as arguments to
3063 3065 system commands."""
3064 3066
3065 3067 if parameter_s:
3066 3068 out,err = self.shell.getoutputerror(parameter_s)
3067 3069 if err:
3068 3070 print >> Term.cerr,err
3069 3071 return SList(out.split('\n'))
3070 3072
3071 3073 def magic_bg(self, parameter_s=''):
3072 3074 """Run a job in the background, in a separate thread.
3073 3075
3074 3076 For example,
3075 3077
3076 3078 %bg myfunc(x,y,z=1)
3077 3079
3078 3080 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3079 3081 execution starts, a message will be printed indicating the job
3080 3082 number. If your job number is 5, you can use
3081 3083
3082 3084 myvar = jobs.result(5) or myvar = jobs[5].result
3083 3085
3084 3086 to assign this result to variable 'myvar'.
3085 3087
3086 3088 IPython has a job manager, accessible via the 'jobs' object. You can
3087 3089 type jobs? to get more information about it, and use jobs.<TAB> to see
3088 3090 its attributes. All attributes not starting with an underscore are
3089 3091 meant for public use.
3090 3092
3091 3093 In particular, look at the jobs.new() method, which is used to create
3092 3094 new jobs. This magic %bg function is just a convenience wrapper
3093 3095 around jobs.new(), for expression-based jobs. If you want to create a
3094 3096 new job with an explicit function object and arguments, you must call
3095 3097 jobs.new() directly.
3096 3098
3097 3099 The jobs.new docstring also describes in detail several important
3098 3100 caveats associated with a thread-based model for background job
3099 3101 execution. Type jobs.new? for details.
3100 3102
3101 3103 You can check the status of all jobs with jobs.status().
3102 3104
3103 3105 The jobs variable is set by IPython into the Python builtin namespace.
3104 3106 If you ever declare a variable named 'jobs', you will shadow this
3105 3107 name. You can either delete your global jobs variable to regain
3106 3108 access to the job manager, or make a new name and assign it manually
3107 3109 to the manager (stored in IPython's namespace). For example, to
3108 3110 assign the job manager to the Jobs name, use:
3109 3111
3110 3112 Jobs = __builtins__.jobs"""
3111 3113
3112 3114 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3113 3115
3114 3116 def magic_r(self, parameter_s=''):
3115 3117 """Repeat previous input.
3116 3118
3117 3119 Note: Consider using the more powerfull %rep instead!
3118 3120
3119 3121 If given an argument, repeats the previous command which starts with
3120 3122 the same string, otherwise it just repeats the previous input.
3121 3123
3122 3124 Shell escaped commands (with ! as first character) are not recognized
3123 3125 by this system, only pure python code and magic commands.
3124 3126 """
3125 3127
3126 3128 start = parameter_s.strip()
3127 3129 esc_magic = ESC_MAGIC
3128 3130 # Identify magic commands even if automagic is on (which means
3129 3131 # the in-memory version is different from that typed by the user).
3130 3132 if self.shell.automagic:
3131 3133 start_magic = esc_magic+start
3132 3134 else:
3133 3135 start_magic = start
3134 3136 # Look through the input history in reverse
3135 3137 for n in range(len(self.shell.input_hist)-2,0,-1):
3136 3138 input = self.shell.input_hist[n]
3137 3139 # skip plain 'r' lines so we don't recurse to infinity
3138 3140 if input != '_ip.magic("r")\n' and \
3139 3141 (input.startswith(start) or input.startswith(start_magic)):
3140 3142 #print 'match',`input` # dbg
3141 3143 print 'Executing:',input,
3142 3144 self.shell.runlines(input)
3143 3145 return
3144 3146 print 'No previous input matching `%s` found.' % start
3145 3147
3146 3148
3147 3149 def magic_bookmark(self, parameter_s=''):
3148 3150 """Manage IPython's bookmark system.
3149 3151
3150 3152 %bookmark <name> - set bookmark to current dir
3151 3153 %bookmark <name> <dir> - set bookmark to <dir>
3152 3154 %bookmark -l - list all bookmarks
3153 3155 %bookmark -d <name> - remove bookmark
3154 3156 %bookmark -r - remove all bookmarks
3155 3157
3156 3158 You can later on access a bookmarked folder with:
3157 3159 %cd -b <name>
3158 3160 or simply '%cd <name>' if there is no directory called <name> AND
3159 3161 there is such a bookmark defined.
3160 3162
3161 3163 Your bookmarks persist through IPython sessions, but they are
3162 3164 associated with each profile."""
3163 3165
3164 3166 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3165 3167 if len(args) > 2:
3166 3168 raise UsageError("%bookmark: too many arguments")
3167 3169
3168 3170 bkms = self.db.get('bookmarks',{})
3169 3171
3170 3172 if opts.has_key('d'):
3171 3173 try:
3172 3174 todel = args[0]
3173 3175 except IndexError:
3174 3176 raise UsageError(
3175 3177 "%bookmark -d: must provide a bookmark to delete")
3176 3178 else:
3177 3179 try:
3178 3180 del bkms[todel]
3179 3181 except KeyError:
3180 3182 raise UsageError(
3181 3183 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3182 3184
3183 3185 elif opts.has_key('r'):
3184 3186 bkms = {}
3185 3187 elif opts.has_key('l'):
3186 3188 bks = bkms.keys()
3187 3189 bks.sort()
3188 3190 if bks:
3189 3191 size = max(map(len,bks))
3190 3192 else:
3191 3193 size = 0
3192 3194 fmt = '%-'+str(size)+'s -> %s'
3193 3195 print 'Current bookmarks:'
3194 3196 for bk in bks:
3195 3197 print fmt % (bk,bkms[bk])
3196 3198 else:
3197 3199 if not args:
3198 3200 raise UsageError("%bookmark: You must specify the bookmark name")
3199 3201 elif len(args)==1:
3200 3202 bkms[args[0]] = os.getcwd()
3201 3203 elif len(args)==2:
3202 3204 bkms[args[0]] = args[1]
3203 3205 self.db['bookmarks'] = bkms
3204 3206
3205 3207 def magic_pycat(self, parameter_s=''):
3206 3208 """Show a syntax-highlighted file through a pager.
3207 3209
3208 3210 This magic is similar to the cat utility, but it will assume the file
3209 3211 to be Python source and will show it with syntax highlighting. """
3210 3212
3211 3213 try:
3212 3214 filename = get_py_filename(parameter_s)
3213 3215 cont = file_read(filename)
3214 3216 except IOError:
3215 3217 try:
3216 3218 cont = eval(parameter_s,self.user_ns)
3217 3219 except NameError:
3218 3220 cont = None
3219 3221 if cont is None:
3220 3222 print "Error: no such file or variable"
3221 3223 return
3222 3224
3223 3225 page(self.shell.pycolorize(cont),
3224 3226 screen_lines=self.shell.usable_screen_length)
3225 3227
3226 3228 def _rerun_pasted(self):
3227 3229 """ Rerun a previously pasted command.
3228 3230 """
3229 3231 b = self.user_ns.get('pasted_block', None)
3230 3232 if b is None:
3231 3233 raise UsageError('No previous pasted block available')
3232 3234 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3233 3235 exec b in self.user_ns
3234 3236
3235 3237 def _get_pasted_lines(self, sentinel):
3236 3238 """ Yield pasted lines until the user enters the given sentinel value.
3237 3239 """
3238 3240 from IPython.core import iplib
3239 3241 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3240 3242 while True:
3241 3243 l = iplib.raw_input_original(':')
3242 3244 if l == sentinel:
3243 3245 return
3244 3246 else:
3245 3247 yield l
3246 3248
3247 3249 def _strip_pasted_lines_for_code(self, raw_lines):
3248 3250 """ Strip non-code parts of a sequence of lines to return a block of
3249 3251 code.
3250 3252 """
3251 3253 # Regular expressions that declare text we strip from the input:
3252 3254 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3253 3255 r'^\s*(\s?>)+', # Python input prompt
3254 3256 r'^\s*\.{3,}', # Continuation prompts
3255 3257 r'^\++',
3256 3258 ]
3257 3259
3258 3260 strip_from_start = map(re.compile,strip_re)
3259 3261
3260 3262 lines = []
3261 3263 for l in raw_lines:
3262 3264 for pat in strip_from_start:
3263 3265 l = pat.sub('',l)
3264 3266 lines.append(l)
3265 3267
3266 3268 block = "\n".join(lines) + '\n'
3267 3269 #print "block:\n",block
3268 3270 return block
3269 3271
3270 3272 def _execute_block(self, block, par):
3271 3273 """ Execute a block, or store it in a variable, per the user's request.
3272 3274 """
3273 3275 if not par:
3274 3276 b = textwrap.dedent(block)
3275 3277 self.user_ns['pasted_block'] = b
3276 3278 exec b in self.user_ns
3277 3279 else:
3278 3280 self.user_ns[par] = SList(block.splitlines())
3279 3281 print "Block assigned to '%s'" % par
3280 3282
3281 3283 def magic_cpaste(self, parameter_s=''):
3282 3284 """Allows you to paste & execute a pre-formatted code block from clipboard.
3283 3285
3284 3286 You must terminate the block with '--' (two minus-signs) alone on the
3285 3287 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3286 3288 is the new sentinel for this operation)
3287 3289
3288 3290 The block is dedented prior to execution to enable execution of method
3289 3291 definitions. '>' and '+' characters at the beginning of a line are
3290 3292 ignored, to allow pasting directly from e-mails, diff files and
3291 3293 doctests (the '...' continuation prompt is also stripped). The
3292 3294 executed block is also assigned to variable named 'pasted_block' for
3293 3295 later editing with '%edit pasted_block'.
3294 3296
3295 3297 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3296 3298 This assigns the pasted block to variable 'foo' as string, without
3297 3299 dedenting or executing it (preceding >>> and + is still stripped)
3298 3300
3299 3301 '%cpaste -r' re-executes the block previously entered by cpaste.
3300 3302
3301 3303 Do not be alarmed by garbled output on Windows (it's a readline bug).
3302 3304 Just press enter and type -- (and press enter again) and the block
3303 3305 will be what was just pasted.
3304 3306
3305 3307 IPython statements (magics, shell escapes) are not supported (yet).
3306 3308
3307 3309 See also
3308 3310 --------
3309 3311 paste: automatically pull code from clipboard.
3310 3312 """
3311 3313
3312 3314 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3313 3315 par = args.strip()
3314 3316 if opts.has_key('r'):
3315 3317 self._rerun_pasted()
3316 3318 return
3317 3319
3318 3320 sentinel = opts.get('s','--')
3319 3321
3320 3322 block = self._strip_pasted_lines_for_code(
3321 3323 self._get_pasted_lines(sentinel))
3322 3324
3323 3325 self._execute_block(block, par)
3324 3326
3325 3327 def magic_paste(self, parameter_s=''):
3326 3328 """Allows you to paste & execute a pre-formatted code block from clipboard.
3327 3329
3328 3330 The text is pulled directly from the clipboard without user
3329 3331 intervention and printed back on the screen before execution (unless
3330 3332 the -q flag is given to force quiet mode).
3331 3333
3332 3334 The block is dedented prior to execution to enable execution of method
3333 3335 definitions. '>' and '+' characters at the beginning of a line are
3334 3336 ignored, to allow pasting directly from e-mails, diff files and
3335 3337 doctests (the '...' continuation prompt is also stripped). The
3336 3338 executed block is also assigned to variable named 'pasted_block' for
3337 3339 later editing with '%edit pasted_block'.
3338 3340
3339 3341 You can also pass a variable name as an argument, e.g. '%paste foo'.
3340 3342 This assigns the pasted block to variable 'foo' as string, without
3341 3343 dedenting or executing it (preceding >>> and + is still stripped)
3342 3344
3343 3345 Options
3344 3346 -------
3345 3347
3346 3348 -r: re-executes the block previously entered by cpaste.
3347 3349
3348 3350 -q: quiet mode: do not echo the pasted text back to the terminal.
3349 3351
3350 3352 IPython statements (magics, shell escapes) are not supported (yet).
3351 3353
3352 3354 See also
3353 3355 --------
3354 3356 cpaste: manually paste code into terminal until you mark its end.
3355 3357 """
3356 3358 opts,args = self.parse_options(parameter_s,'rq',mode='string')
3357 3359 par = args.strip()
3358 3360 if opts.has_key('r'):
3359 3361 self._rerun_pasted()
3360 3362 return
3361 3363
3362 3364 text = self.shell.hooks.clipboard_get()
3363 3365 block = self._strip_pasted_lines_for_code(text.splitlines())
3364 3366
3365 3367 # By default, echo back to terminal unless quiet mode is requested
3366 3368 if not opts.has_key('q'):
3367 3369 write = self.shell.write
3368 3370 write(self.shell.pycolorize(block))
3369 3371 if not block.endswith('\n'):
3370 3372 write('\n')
3371 3373 write("## -- End pasted text --\n")
3372 3374
3373 3375 self._execute_block(block, par)
3374 3376
3375 3377 def magic_quickref(self,arg):
3376 3378 """ Show a quick reference sheet """
3377 3379 import IPython.core.usage
3378 3380 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3379 3381
3380 3382 page(qr)
3381 3383
3382 3384 def magic_doctest_mode(self,parameter_s=''):
3383 3385 """Toggle doctest mode on and off.
3384 3386
3385 3387 This mode allows you to toggle the prompt behavior between normal
3386 3388 IPython prompts and ones that are as similar to the default IPython
3387 3389 interpreter as possible.
3388 3390
3389 3391 It also supports the pasting of code snippets that have leading '>>>'
3390 3392 and '...' prompts in them. This means that you can paste doctests from
3391 3393 files or docstrings (even if they have leading whitespace), and the
3392 3394 code will execute correctly. You can then use '%history -tn' to see
3393 3395 the translated history without line numbers; this will give you the
3394 3396 input after removal of all the leading prompts and whitespace, which
3395 3397 can be pasted back into an editor.
3396 3398
3397 3399 With these features, you can switch into this mode easily whenever you
3398 3400 need to do testing and changes to doctests, without having to leave
3399 3401 your existing IPython session.
3400 3402 """
3401 3403
3402 3404 from IPython.utils.ipstruct import Struct
3403 3405
3404 3406 # Shorthands
3405 3407 shell = self.shell
3406 3408 oc = shell.outputcache
3407 3409 meta = shell.meta
3408 3410 # dstore is a data store kept in the instance metadata bag to track any
3409 3411 # changes we make, so we can undo them later.
3410 3412 dstore = meta.setdefault('doctest_mode',Struct())
3411 3413 save_dstore = dstore.setdefault
3412 3414
3413 3415 # save a few values we'll need to recover later
3414 3416 mode = save_dstore('mode',False)
3415 3417 save_dstore('rc_pprint',shell.pprint)
3416 3418 save_dstore('xmode',shell.InteractiveTB.mode)
3417 3419 save_dstore('rc_separate_out',shell.separate_out)
3418 3420 save_dstore('rc_separate_out2',shell.separate_out2)
3419 3421 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3420 3422 save_dstore('rc_separate_in',shell.separate_in)
3421 3423
3422 3424 if mode == False:
3423 3425 # turn on
3424 3426 oc.prompt1.p_template = '>>> '
3425 3427 oc.prompt2.p_template = '... '
3426 3428 oc.prompt_out.p_template = ''
3427 3429
3428 3430 # Prompt separators like plain python
3429 3431 oc.input_sep = oc.prompt1.sep = ''
3430 3432 oc.output_sep = ''
3431 3433 oc.output_sep2 = ''
3432 3434
3433 3435 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3434 3436 oc.prompt_out.pad_left = False
3435 3437
3436 3438 shell.pprint = False
3437 3439
3438 3440 shell.magic_xmode('Plain')
3439 3441
3440 3442 else:
3441 3443 # turn off
3442 3444 oc.prompt1.p_template = shell.prompt_in1
3443 3445 oc.prompt2.p_template = shell.prompt_in2
3444 3446 oc.prompt_out.p_template = shell.prompt_out
3445 3447
3446 3448 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3447 3449
3448 3450 oc.output_sep = dstore.rc_separate_out
3449 3451 oc.output_sep2 = dstore.rc_separate_out2
3450 3452
3451 3453 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3452 3454 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3453 3455
3454 3456 shell.pprint = dstore.rc_pprint
3455 3457
3456 3458 shell.magic_xmode(dstore.xmode)
3457 3459
3458 3460 # Store new mode and inform
3459 3461 dstore.mode = bool(1-int(mode))
3460 3462 print 'Doctest mode is:',
3461 3463 print ['OFF','ON'][dstore.mode]
3462 3464
3463 3465 def magic_gui(self, parameter_s=''):
3464 3466 """Enable or disable IPython GUI event loop integration.
3465 3467
3466 3468 %gui [-a] [GUINAME]
3467 3469
3468 3470 This magic replaces IPython's threaded shells that were activated
3469 3471 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3470 3472 can now be enabled, disabled and swtiched at runtime and keyboard
3471 3473 interrupts should work without any problems. The following toolkits
3472 3474 are supported: wxPython, PyQt4, PyGTK, and Tk::
3473 3475
3474 3476 %gui wx # enable wxPython event loop integration
3475 3477 %gui qt4|qt # enable PyQt4 event loop integration
3476 3478 %gui gtk # enable PyGTK event loop integration
3477 3479 %gui tk # enable Tk event loop integration
3478 3480 %gui # disable all event loop integration
3479 3481
3480 3482 WARNING: after any of these has been called you can simply create
3481 3483 an application object, but DO NOT start the event loop yourself, as
3482 3484 we have already handled that.
3483 3485
3484 3486 If you want us to create an appropriate application object add the
3485 3487 "-a" flag to your command::
3486 3488
3487 3489 %gui -a wx
3488 3490
3489 3491 This is highly recommended for most users.
3490 3492 """
3491 3493 opts, arg = self.parse_options(parameter_s,'a')
3492 3494 if arg=='': arg = None
3493 3495 return enable_gui(arg, 'a' in opts)
3494 3496
3495 3497 def magic_load_ext(self, module_str):
3496 3498 """Load an IPython extension by its module name."""
3497 3499 return self.load_extension(module_str)
3498 3500
3499 3501 def magic_unload_ext(self, module_str):
3500 3502 """Unload an IPython extension by its module name."""
3501 3503 self.unload_extension(module_str)
3502 3504
3503 3505 def magic_reload_ext(self, module_str):
3504 3506 """Reload an IPython extension by its module name."""
3505 3507 self.reload_extension(module_str)
3506 3508
3507 3509 @testdec.skip_doctest
3508 3510 def magic_install_profiles(self, s):
3509 3511 """Install the default IPython profiles into the .ipython dir.
3510 3512
3511 3513 If the default profiles have already been installed, they will not
3512 3514 be overwritten. You can force overwriting them by using the ``-o``
3513 3515 option::
3514 3516
3515 3517 In [1]: %install_profiles -o
3516 3518 """
3517 3519 if '-o' in s:
3518 3520 overwrite = True
3519 3521 else:
3520 3522 overwrite = False
3521 3523 from IPython.config import profile
3522 3524 profile_dir = os.path.split(profile.__file__)[0]
3523 3525 ipython_dir = self.ipython_dir
3524 3526 files = os.listdir(profile_dir)
3525 3527
3526 3528 to_install = []
3527 3529 for f in files:
3528 3530 if f.startswith('ipython_config'):
3529 3531 src = os.path.join(profile_dir, f)
3530 3532 dst = os.path.join(ipython_dir, f)
3531 3533 if (not os.path.isfile(dst)) or overwrite:
3532 3534 to_install.append((f, src, dst))
3533 3535 if len(to_install)>0:
3534 3536 print "Installing profiles to: ", ipython_dir
3535 3537 for (f, src, dst) in to_install:
3536 3538 shutil.copy(src, dst)
3537 3539 print " %s" % f
3538 3540
3539 3541 def magic_install_default_config(self, s):
3540 3542 """Install IPython's default config file into the .ipython dir.
3541 3543
3542 3544 If the default config file (:file:`ipython_config.py`) is already
3543 3545 installed, it will not be overwritten. You can force overwriting
3544 3546 by using the ``-o`` option::
3545 3547
3546 3548 In [1]: %install_default_config
3547 3549 """
3548 3550 if '-o' in s:
3549 3551 overwrite = True
3550 3552 else:
3551 3553 overwrite = False
3552 3554 from IPython.config import default
3553 3555 config_dir = os.path.split(default.__file__)[0]
3554 3556 ipython_dir = self.ipython_dir
3555 3557 default_config_file_name = 'ipython_config.py'
3556 3558 src = os.path.join(config_dir, default_config_file_name)
3557 3559 dst = os.path.join(ipython_dir, default_config_file_name)
3558 3560 if (not os.path.isfile(dst)) or overwrite:
3559 3561 shutil.copy(src, dst)
3560 3562 print "Installing default config file: %s" % dst
3561 3563
3562 3564 # Pylab support: simple wrappers that activate pylab, load gui input
3563 3565 # handling and modify slightly %run
3564 3566
3565 3567 @testdec.skip_doctest
3566 3568 def _pylab_magic_run(self, parameter_s=''):
3567 3569 Magic.magic_run(self, parameter_s,
3568 3570 runner=mpl_runner(self.shell.safe_execfile))
3569 3571
3570 3572 _pylab_magic_run.__doc__ = magic_run.__doc__
3571 3573
3572 3574 @testdec.skip_doctest
3573 3575 def magic_pylab(self, s):
3574 3576 """Load numpy and matplotlib to work interactively.
3575 3577
3576 3578 %pylab [GUINAME]
3577 3579
3578 3580 This function lets you activate pylab (matplotlib, numpy and
3579 3581 interactive support) at any point during an IPython session.
3580 3582
3581 3583 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3582 3584 pylab and mlab, as well as all names from numpy and pylab.
3583 3585
3584 3586 Parameters
3585 3587 ----------
3586 3588 guiname : optional
3587 3589 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk' or
3588 3590 'tk'). If given, the corresponding Matplotlib backend is used,
3589 3591 otherwise matplotlib's default (which you can override in your
3590 3592 matplotlib config file) is used.
3591 3593
3592 3594 Examples
3593 3595 --------
3594 3596 In this case, where the MPL default is TkAgg:
3595 3597 In [2]: %pylab
3596 3598
3597 3599 Welcome to pylab, a matplotlib-based Python environment.
3598 3600 Backend in use: TkAgg
3599 3601 For more information, type 'help(pylab)'.
3600 3602
3601 3603 But you can explicitly request a different backend:
3602 3604 In [3]: %pylab qt
3603 3605
3604 3606 Welcome to pylab, a matplotlib-based Python environment.
3605 3607 Backend in use: Qt4Agg
3606 3608 For more information, type 'help(pylab)'.
3607 3609 """
3608 3610 self.shell.enable_pylab(s)
3609 3611
3610 3612 def magic_tb(self, s):
3611 3613 """Print the last traceback with the currently active exception mode.
3612 3614
3613 3615 See %xmode for changing exception reporting modes."""
3614 3616 self.shell.showtraceback()
3615 3617
3616 3618 # end Magic
@@ -1,608 +1,609 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Tools for inspecting Python objects.
3 3
4 4 Uses syntax highlighting for presenting the various information elements.
5 5
6 6 Similar in spirit to the inspect module, but all calls take a name argument to
7 7 reference the name under which an object is being read.
8 8 """
9 9
10 10 #*****************************************************************************
11 11 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #*****************************************************************************
16 16
17 17 __all__ = ['Inspector','InspectColors']
18 18
19 19 # stdlib modules
20 20 import __builtin__
21 21 import StringIO
22 22 import inspect
23 23 import linecache
24 24 import os
25 25 import string
26 26 import sys
27 27 import types
28 28
29 29 # IPython's own
30 from IPython.utils import PyColorize
31 from IPython.utils.genutils import indent, Term
32 30 from IPython.core.page import page
33 31 from IPython.external.Itpl import itpl
32 from IPython.utils import PyColorize
33 from IPython.utils.io import Term
34 from IPython.utils.text import indent
34 35 from IPython.utils.wildcard import list_namespace
35 36 from IPython.utils.coloransi import *
36 37
37 38 #****************************************************************************
38 39 # HACK!!! This is a crude fix for bugs in python 2.3's inspect module. We
39 40 # simply monkeypatch inspect with code copied from python 2.4.
40 41 if sys.version_info[:2] == (2,3):
41 42 from inspect import ismodule, getabsfile, modulesbyfile
42 43 def getmodule(object):
43 44 """Return the module an object was defined in, or None if not found."""
44 45 if ismodule(object):
45 46 return object
46 47 if hasattr(object, '__module__'):
47 48 return sys.modules.get(object.__module__)
48 49 try:
49 50 file = getabsfile(object)
50 51 except TypeError:
51 52 return None
52 53 if file in modulesbyfile:
53 54 return sys.modules.get(modulesbyfile[file])
54 55 for module in sys.modules.values():
55 56 if hasattr(module, '__file__'):
56 57 modulesbyfile[
57 58 os.path.realpath(
58 59 getabsfile(module))] = module.__name__
59 60 if file in modulesbyfile:
60 61 return sys.modules.get(modulesbyfile[file])
61 62 main = sys.modules['__main__']
62 63 if not hasattr(object, '__name__'):
63 64 return None
64 65 if hasattr(main, object.__name__):
65 66 mainobject = getattr(main, object.__name__)
66 67 if mainobject is object:
67 68 return main
68 69 builtin = sys.modules['__builtin__']
69 70 if hasattr(builtin, object.__name__):
70 71 builtinobject = getattr(builtin, object.__name__)
71 72 if builtinobject is object:
72 73 return builtin
73 74
74 75 inspect.getmodule = getmodule
75 76
76 77 #****************************************************************************
77 78 # Builtin color schemes
78 79
79 80 Colors = TermColors # just a shorthand
80 81
81 82 # Build a few color schemes
82 83 NoColor = ColorScheme(
83 84 'NoColor',{
84 85 'header' : Colors.NoColor,
85 86 'normal' : Colors.NoColor # color off (usu. Colors.Normal)
86 87 } )
87 88
88 89 LinuxColors = ColorScheme(
89 90 'Linux',{
90 91 'header' : Colors.LightRed,
91 92 'normal' : Colors.Normal # color off (usu. Colors.Normal)
92 93 } )
93 94
94 95 LightBGColors = ColorScheme(
95 96 'LightBG',{
96 97 'header' : Colors.Red,
97 98 'normal' : Colors.Normal # color off (usu. Colors.Normal)
98 99 } )
99 100
100 101 # Build table of color schemes (needed by the parser)
101 102 InspectColors = ColorSchemeTable([NoColor,LinuxColors,LightBGColors],
102 103 'Linux')
103 104
104 105 #****************************************************************************
105 106 # Auxiliary functions
106 107 def getdoc(obj):
107 108 """Stable wrapper around inspect.getdoc.
108 109
109 110 This can't crash because of attribute problems.
110 111
111 112 It also attempts to call a getdoc() method on the given object. This
112 113 allows objects which provide their docstrings via non-standard mechanisms
113 114 (like Pyro proxies) to still be inspected by ipython's ? system."""
114 115
115 116 ds = None # default return value
116 117 try:
117 118 ds = inspect.getdoc(obj)
118 119 except:
119 120 # Harden against an inspect failure, which can occur with
120 121 # SWIG-wrapped extensions.
121 122 pass
122 123 # Allow objects to offer customized documentation via a getdoc method:
123 124 try:
124 125 ds2 = obj.getdoc()
125 126 except:
126 127 pass
127 128 else:
128 129 # if we get extra info, we add it to the normal docstring.
129 130 if ds is None:
130 131 ds = ds2
131 132 else:
132 133 ds = '%s\n%s' % (ds,ds2)
133 134 return ds
134 135
135 136
136 137 def getsource(obj,is_binary=False):
137 138 """Wrapper around inspect.getsource.
138 139
139 140 This can be modified by other projects to provide customized source
140 141 extraction.
141 142
142 143 Inputs:
143 144
144 145 - obj: an object whose source code we will attempt to extract.
145 146
146 147 Optional inputs:
147 148
148 149 - is_binary: whether the object is known to come from a binary source.
149 150 This implementation will skip returning any output for binary objects, but
150 151 custom extractors may know how to meaningfully process them."""
151 152
152 153 if is_binary:
153 154 return None
154 155 else:
155 156 try:
156 157 src = inspect.getsource(obj)
157 158 except TypeError:
158 159 if hasattr(obj,'__class__'):
159 160 src = inspect.getsource(obj.__class__)
160 161 return src
161 162
162 163 def getargspec(obj):
163 164 """Get the names and default values of a function's arguments.
164 165
165 166 A tuple of four things is returned: (args, varargs, varkw, defaults).
166 167 'args' is a list of the argument names (it may contain nested lists).
167 168 'varargs' and 'varkw' are the names of the * and ** arguments or None.
168 169 'defaults' is an n-tuple of the default values of the last n arguments.
169 170
170 171 Modified version of inspect.getargspec from the Python Standard
171 172 Library."""
172 173
173 174 if inspect.isfunction(obj):
174 175 func_obj = obj
175 176 elif inspect.ismethod(obj):
176 177 func_obj = obj.im_func
177 178 else:
178 179 raise TypeError, 'arg is not a Python function'
179 180 args, varargs, varkw = inspect.getargs(func_obj.func_code)
180 181 return args, varargs, varkw, func_obj.func_defaults
181 182
182 183 #****************************************************************************
183 184 # Class definitions
184 185
185 186 class myStringIO(StringIO.StringIO):
186 187 """Adds a writeln method to normal StringIO."""
187 188 def writeln(self,*arg,**kw):
188 189 """Does a write() and then a write('\n')"""
189 190 self.write(*arg,**kw)
190 191 self.write('\n')
191 192
192 193
193 194 class Inspector:
194 195 def __init__(self,color_table,code_color_table,scheme,
195 196 str_detail_level=0):
196 197 self.color_table = color_table
197 198 self.parser = PyColorize.Parser(code_color_table,out='str')
198 199 self.format = self.parser.format
199 200 self.str_detail_level = str_detail_level
200 201 self.set_active_scheme(scheme)
201 202
202 203 def __getdef(self,obj,oname=''):
203 204 """Return the definition header for any callable object.
204 205
205 206 If any exception is generated, None is returned instead and the
206 207 exception is suppressed."""
207 208
208 209 try:
209 210 return oname + inspect.formatargspec(*getargspec(obj))
210 211 except:
211 212 return None
212 213
213 214 def __head(self,h):
214 215 """Return a header string with proper colors."""
215 216 return '%s%s%s' % (self.color_table.active_colors.header,h,
216 217 self.color_table.active_colors.normal)
217 218
218 219 def set_active_scheme(self,scheme):
219 220 self.color_table.set_active_scheme(scheme)
220 221 self.parser.color_table.set_active_scheme(scheme)
221 222
222 223 def noinfo(self,msg,oname):
223 224 """Generic message when no information is found."""
224 225 print 'No %s found' % msg,
225 226 if oname:
226 227 print 'for %s' % oname
227 228 else:
228 229 print
229 230
230 231 def pdef(self,obj,oname=''):
231 232 """Print the definition header for any callable object.
232 233
233 234 If the object is a class, print the constructor information."""
234 235
235 236 if not callable(obj):
236 237 print 'Object is not callable.'
237 238 return
238 239
239 240 header = ''
240 241
241 242 if inspect.isclass(obj):
242 243 header = self.__head('Class constructor information:\n')
243 244 obj = obj.__init__
244 245 elif type(obj) is types.InstanceType:
245 246 obj = obj.__call__
246 247
247 248 output = self.__getdef(obj,oname)
248 249 if output is None:
249 250 self.noinfo('definition header',oname)
250 251 else:
251 252 print >>Term.cout, header,self.format(output),
252 253
253 254 def pdoc(self,obj,oname='',formatter = None):
254 255 """Print the docstring for any object.
255 256
256 257 Optional:
257 258 -formatter: a function to run the docstring through for specially
258 259 formatted docstrings."""
259 260
260 261 head = self.__head # so that itpl can find it even if private
261 262 ds = getdoc(obj)
262 263 if formatter:
263 264 ds = formatter(ds)
264 265 if inspect.isclass(obj):
265 266 init_ds = getdoc(obj.__init__)
266 267 output = itpl('$head("Class Docstring:")\n'
267 268 '$indent(ds)\n'
268 269 '$head("Constructor Docstring"):\n'
269 270 '$indent(init_ds)')
270 271 elif (type(obj) is types.InstanceType or isinstance(obj,object)) \
271 272 and hasattr(obj,'__call__'):
272 273 call_ds = getdoc(obj.__call__)
273 274 if call_ds:
274 275 output = itpl('$head("Class Docstring:")\n$indent(ds)\n'
275 276 '$head("Calling Docstring:")\n$indent(call_ds)')
276 277 else:
277 278 output = ds
278 279 else:
279 280 output = ds
280 281 if output is None:
281 282 self.noinfo('documentation',oname)
282 283 return
283 284 page(output)
284 285
285 286 def psource(self,obj,oname=''):
286 287 """Print the source code for an object."""
287 288
288 289 # Flush the source cache because inspect can return out-of-date source
289 290 linecache.checkcache()
290 291 try:
291 292 src = getsource(obj)
292 293 except:
293 294 self.noinfo('source',oname)
294 295 else:
295 296 page(self.format(src))
296 297
297 298 def pfile(self,obj,oname=''):
298 299 """Show the whole file where an object was defined."""
299 300
300 301 try:
301 302 try:
302 303 lineno = inspect.getsourcelines(obj)[1]
303 304 except TypeError:
304 305 # For instances, try the class object like getsource() does
305 306 if hasattr(obj,'__class__'):
306 307 lineno = inspect.getsourcelines(obj.__class__)[1]
307 308 # Adjust the inspected object so getabsfile() below works
308 309 obj = obj.__class__
309 310 except:
310 311 self.noinfo('file',oname)
311 312 return
312 313
313 314 # We only reach this point if object was successfully queried
314 315
315 316 # run contents of file through pager starting at line
316 317 # where the object is defined
317 318 ofile = inspect.getabsfile(obj)
318 319
319 320 if (ofile.endswith('.so') or ofile.endswith('.dll')):
320 321 print 'File %r is binary, not printing.' % ofile
321 322 elif not os.path.isfile(ofile):
322 323 print 'File %r does not exist, not printing.' % ofile
323 324 else:
324 325 # Print only text files, not extension binaries. Note that
325 326 # getsourcelines returns lineno with 1-offset and page() uses
326 327 # 0-offset, so we must adjust.
327 328 page(self.format(open(ofile).read()),lineno-1)
328 329
329 330 def pinfo(self,obj,oname='',formatter=None,info=None,detail_level=0):
330 331 """Show detailed information about an object.
331 332
332 333 Optional arguments:
333 334
334 335 - oname: name of the variable pointing to the object.
335 336
336 337 - formatter: special formatter for docstrings (see pdoc)
337 338
338 339 - info: a structure with some information fields which may have been
339 340 precomputed already.
340 341
341 342 - detail_level: if set to 1, more information is given.
342 343 """
343 344
344 345 obj_type = type(obj)
345 346
346 347 header = self.__head
347 348 if info is None:
348 349 ismagic = 0
349 350 isalias = 0
350 351 ospace = ''
351 352 else:
352 353 ismagic = info.ismagic
353 354 isalias = info.isalias
354 355 ospace = info.namespace
355 356 # Get docstring, special-casing aliases:
356 357 if isalias:
357 358 if not callable(obj):
358 359 try:
359 360 ds = "Alias to the system command:\n %s" % obj[1]
360 361 except:
361 362 ds = "Alias: " + str(obj)
362 363 else:
363 364 ds = "Alias to " + str(obj)
364 365 if obj.__doc__:
365 366 ds += "\nDocstring:\n" + obj.__doc__
366 367 else:
367 368 ds = getdoc(obj)
368 369 if ds is None:
369 370 ds = '<no docstring>'
370 371 if formatter is not None:
371 372 ds = formatter(ds)
372 373
373 374 # store output in a list which gets joined with \n at the end.
374 375 out = myStringIO()
375 376
376 377 string_max = 200 # max size of strings to show (snipped if longer)
377 378 shalf = int((string_max -5)/2)
378 379
379 380 if ismagic:
380 381 obj_type_name = 'Magic function'
381 382 elif isalias:
382 383 obj_type_name = 'System alias'
383 384 else:
384 385 obj_type_name = obj_type.__name__
385 386 out.writeln(header('Type:\t\t')+obj_type_name)
386 387
387 388 try:
388 389 bclass = obj.__class__
389 390 out.writeln(header('Base Class:\t')+str(bclass))
390 391 except: pass
391 392
392 393 # String form, but snip if too long in ? form (full in ??)
393 394 if detail_level >= self.str_detail_level:
394 395 try:
395 396 ostr = str(obj)
396 397 str_head = 'String Form:'
397 398 if not detail_level and len(ostr)>string_max:
398 399 ostr = ostr[:shalf] + ' <...> ' + ostr[-shalf:]
399 400 ostr = ("\n" + " " * len(str_head.expandtabs())).\
400 401 join(map(string.strip,ostr.split("\n")))
401 402 if ostr.find('\n') > -1:
402 403 # Print multi-line strings starting at the next line.
403 404 str_sep = '\n'
404 405 else:
405 406 str_sep = '\t'
406 407 out.writeln("%s%s%s" % (header(str_head),str_sep,ostr))
407 408 except:
408 409 pass
409 410
410 411 if ospace:
411 412 out.writeln(header('Namespace:\t')+ospace)
412 413
413 414 # Length (for strings and lists)
414 415 try:
415 416 length = str(len(obj))
416 417 out.writeln(header('Length:\t\t')+length)
417 418 except: pass
418 419
419 420 # Filename where object was defined
420 421 binary_file = False
421 422 try:
422 423 try:
423 424 fname = inspect.getabsfile(obj)
424 425 except TypeError:
425 426 # For an instance, the file that matters is where its class was
426 427 # declared.
427 428 if hasattr(obj,'__class__'):
428 429 fname = inspect.getabsfile(obj.__class__)
429 430 if fname.endswith('<string>'):
430 431 fname = 'Dynamically generated function. No source code available.'
431 432 if (fname.endswith('.so') or fname.endswith('.dll')):
432 433 binary_file = True
433 434 out.writeln(header('File:\t\t')+fname)
434 435 except:
435 436 # if anything goes wrong, we don't want to show source, so it's as
436 437 # if the file was binary
437 438 binary_file = True
438 439
439 440 # reconstruct the function definition and print it:
440 441 defln = self.__getdef(obj,oname)
441 442 if defln:
442 443 out.write(header('Definition:\t')+self.format(defln))
443 444
444 445 # Docstrings only in detail 0 mode, since source contains them (we
445 446 # avoid repetitions). If source fails, we add them back, see below.
446 447 if ds and detail_level == 0:
447 448 out.writeln(header('Docstring:\n') + indent(ds))
448 449
449 450 # Original source code for any callable
450 451 if detail_level:
451 452 # Flush the source cache because inspect can return out-of-date
452 453 # source
453 454 linecache.checkcache()
454 455 source_success = False
455 456 try:
456 457 try:
457 458 src = getsource(obj,binary_file)
458 459 except TypeError:
459 460 if hasattr(obj,'__class__'):
460 461 src = getsource(obj.__class__,binary_file)
461 462 if src is not None:
462 463 source = self.format(src)
463 464 out.write(header('Source:\n')+source.rstrip())
464 465 source_success = True
465 466 except Exception, msg:
466 467 pass
467 468
468 469 if ds and not source_success:
469 470 out.writeln(header('Docstring [source file open failed]:\n')
470 471 + indent(ds))
471 472
472 473 # Constructor docstring for classes
473 474 if inspect.isclass(obj):
474 475 # reconstruct the function definition and print it:
475 476 try:
476 477 obj_init = obj.__init__
477 478 except AttributeError:
478 479 init_def = init_ds = None
479 480 else:
480 481 init_def = self.__getdef(obj_init,oname)
481 482 init_ds = getdoc(obj_init)
482 483 # Skip Python's auto-generated docstrings
483 484 if init_ds and \
484 485 init_ds.startswith('x.__init__(...) initializes'):
485 486 init_ds = None
486 487
487 488 if init_def or init_ds:
488 489 out.writeln(header('\nConstructor information:'))
489 490 if init_def:
490 491 out.write(header('Definition:\t')+ self.format(init_def))
491 492 if init_ds:
492 493 out.writeln(header('Docstring:\n') + indent(init_ds))
493 494 # and class docstring for instances:
494 495 elif obj_type is types.InstanceType or \
495 496 isinstance(obj,object):
496 497
497 498 # First, check whether the instance docstring is identical to the
498 499 # class one, and print it separately if they don't coincide. In
499 500 # most cases they will, but it's nice to print all the info for
500 501 # objects which use instance-customized docstrings.
501 502 if ds:
502 503 try:
503 504 cls = getattr(obj,'__class__')
504 505 except:
505 506 class_ds = None
506 507 else:
507 508 class_ds = getdoc(cls)
508 509 # Skip Python's auto-generated docstrings
509 510 if class_ds and \
510 511 (class_ds.startswith('function(code, globals[,') or \
511 512 class_ds.startswith('instancemethod(function, instance,') or \
512 513 class_ds.startswith('module(name[,') ):
513 514 class_ds = None
514 515 if class_ds and ds != class_ds:
515 516 out.writeln(header('Class Docstring:\n') +
516 517 indent(class_ds))
517 518
518 519 # Next, try to show constructor docstrings
519 520 try:
520 521 init_ds = getdoc(obj.__init__)
521 522 # Skip Python's auto-generated docstrings
522 523 if init_ds and \
523 524 init_ds.startswith('x.__init__(...) initializes'):
524 525 init_ds = None
525 526 except AttributeError:
526 527 init_ds = None
527 528 if init_ds:
528 529 out.writeln(header('Constructor Docstring:\n') +
529 530 indent(init_ds))
530 531
531 532 # Call form docstring for callable instances
532 533 if hasattr(obj,'__call__'):
533 534 #out.writeln(header('Callable:\t')+'Yes')
534 535 call_def = self.__getdef(obj.__call__,oname)
535 536 #if call_def is None:
536 537 # out.writeln(header('Call def:\t')+
537 538 # 'Calling definition not available.')
538 539 if call_def is not None:
539 540 out.writeln(header('Call def:\t')+self.format(call_def))
540 541 call_ds = getdoc(obj.__call__)
541 542 # Skip Python's auto-generated docstrings
542 543 if call_ds and call_ds.startswith('x.__call__(...) <==> x(...)'):
543 544 call_ds = None
544 545 if call_ds:
545 546 out.writeln(header('Call docstring:\n') + indent(call_ds))
546 547
547 548 # Finally send to printer/pager
548 549 output = out.getvalue()
549 550 if output:
550 551 page(output)
551 552 # end pinfo
552 553
553 554 def psearch(self,pattern,ns_table,ns_search=[],
554 555 ignore_case=False,show_all=False):
555 556 """Search namespaces with wildcards for objects.
556 557
557 558 Arguments:
558 559
559 560 - pattern: string containing shell-like wildcards to use in namespace
560 561 searches and optionally a type specification to narrow the search to
561 562 objects of that type.
562 563
563 564 - ns_table: dict of name->namespaces for search.
564 565
565 566 Optional arguments:
566 567
567 568 - ns_search: list of namespace names to include in search.
568 569
569 570 - ignore_case(False): make the search case-insensitive.
570 571
571 572 - show_all(False): show all names, including those starting with
572 573 underscores.
573 574 """
574 575 #print 'ps pattern:<%r>' % pattern # dbg
575 576
576 577 # defaults
577 578 type_pattern = 'all'
578 579 filter = ''
579 580
580 581 cmds = pattern.split()
581 582 len_cmds = len(cmds)
582 583 if len_cmds == 1:
583 584 # Only filter pattern given
584 585 filter = cmds[0]
585 586 elif len_cmds == 2:
586 587 # Both filter and type specified
587 588 filter,type_pattern = cmds
588 589 else:
589 590 raise ValueError('invalid argument string for psearch: <%s>' %
590 591 pattern)
591 592
592 593 # filter search namespaces
593 594 for name in ns_search:
594 595 if name not in ns_table:
595 596 raise ValueError('invalid namespace <%s>. Valid names: %s' %
596 597 (name,ns_table.keys()))
597 598
598 599 #print 'type_pattern:',type_pattern # dbg
599 600 search_result = []
600 601 for ns_name in ns_search:
601 602 ns = ns_table[ns_name]
602 603 tmp_res = list(list_namespace(ns,type_pattern,filter,
603 604 ignore_case=ignore_case,
604 605 show_all=show_all))
605 606 search_result.extend(tmp_res)
606 607 search_result.sort()
607 608
608 609 page('\n'.join(search_result))
@@ -1,308 +1,306 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Paging capabilities for IPython.core
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10
11 11 Notes
12 12 -----
13 13
14 14 For now this uses ipapi, so it can't be in IPython.utils. If we can get
15 15 rid of that dependency, we could move it there.
16 16 -----
17 17 """
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Copyright (C) 2008-2009 The IPython Development Team
21 21 #
22 22 # Distributed under the terms of the BSD License. The full license is in
23 23 # the file COPYING, distributed as part of this software.
24 24 #-----------------------------------------------------------------------------
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Imports
28 28 #-----------------------------------------------------------------------------
29 29
30 30 import os
31 31 import re
32 32 import sys
33 import tempfile
33 34
34 35 from IPython.core import ipapi
35 36 from IPython.core.error import TryNext
36 from IPython.utils.genutils import (
37 chop, Term, USE_CURSES
38 )
39
40 if os.name == "nt":
41 from IPython.utils.winconsole import get_console_size
37 from IPython.utils.cursesimport import use_curses
38 from IPython.utils.data import chop
39 from IPython.utils.io import Term
40 from IPython.utils.process import xsys
41 from IPython.utils.terminal import get_terminal_size
42 42
43 43
44 44 #-----------------------------------------------------------------------------
45 45 # Classes and functions
46 46 #-----------------------------------------------------------------------------
47 47
48 48 esc_re = re.compile(r"(\x1b[^m]+m)")
49 49
50 def page_dumb(strng,start=0,screen_lines=25):
50 def page_dumb(strng, start=0, screen_lines=25):
51 51 """Very dumb 'pager' in Python, for when nothing else works.
52 52
53 53 Only moves forward, same interface as page(), except for pager_cmd and
54 54 mode."""
55 55
56 56 out_ln = strng.splitlines()[start:]
57 57 screens = chop(out_ln,screen_lines-1)
58 58 if len(screens) == 1:
59 59 print >>Term.cout, os.linesep.join(screens[0])
60 60 else:
61 61 last_escape = ""
62 62 for scr in screens[0:-1]:
63 63 hunk = os.linesep.join(scr)
64 64 print >>Term.cout, last_escape + hunk
65 65 if not page_more():
66 66 return
67 67 esc_list = esc_re.findall(hunk)
68 68 if len(esc_list) > 0:
69 69 last_escape = esc_list[-1]
70 70 print >>Term.cout, last_escape + os.linesep.join(screens[-1])
71 71
72 #----------------------------------------------------------------------------
73 def page(strng,start=0,screen_lines=0,pager_cmd = None):
72
73 def page(strng, start=0, screen_lines=0, pager_cmd=None):
74 74 """Print a string, piping through a pager after a certain length.
75 75
76 76 The screen_lines parameter specifies the number of *usable* lines of your
77 77 terminal screen (total lines minus lines you need to reserve to show other
78 78 information).
79 79
80 80 If you set screen_lines to a number <=0, page() will try to auto-determine
81 81 your screen size and will only use up to (screen_size+screen_lines) for
82 82 printing, paging after that. That is, if you want auto-detection but need
83 83 to reserve the bottom 3 lines of the screen, use screen_lines = -3, and for
84 84 auto-detection without any lines reserved simply use screen_lines = 0.
85 85
86 86 If a string won't fit in the allowed lines, it is sent through the
87 87 specified pager command. If none given, look for PAGER in the environment,
88 88 and ultimately default to less.
89 89
90 90 If no system pager works, the string is sent through a 'dumb pager'
91 91 written in python, very simplistic.
92 92 """
93 93
94 94 # Some routines may auto-compute start offsets incorrectly and pass a
95 95 # negative value. Offset to 0 for robustness.
96 start = max(0,start)
96 start = max(0, start)
97 97
98 98 # first, try the hook
99 99 ip = ipapi.get()
100 100 if ip:
101 101 try:
102 102 ip.hooks.show_in_pager(strng)
103 103 return
104 104 except TryNext:
105 105 pass
106 106
107 107 # Ugly kludge, but calling curses.initscr() flat out crashes in emacs
108 108 TERM = os.environ.get('TERM','dumb')
109 109 if TERM in ['dumb','emacs'] and os.name != 'nt':
110 110 print strng
111 111 return
112 112 # chop off the topmost part of the string we don't want to see
113 113 str_lines = strng.split(os.linesep)[start:]
114 114 str_toprint = os.linesep.join(str_lines)
115 115 num_newlines = len(str_lines)
116 116 len_str = len(str_toprint)
117 117
118 118 # Dumb heuristics to guesstimate number of on-screen lines the string
119 119 # takes. Very basic, but good enough for docstrings in reasonable
120 120 # terminals. If someone later feels like refining it, it's not hard.
121 121 numlines = max(num_newlines,int(len_str/80)+1)
122 122
123 if os.name == "nt":
124 screen_lines_def = get_console_size(defaulty=25)[1]
125 else:
126 screen_lines_def = 25 # default value if we can't auto-determine
123 screen_lines_def = get_terminal_size()[1]
127 124
128 125 # auto-determine screen size
129 126 if screen_lines <= 0:
130 127 if TERM=='xterm' or TERM=='xterm-color':
131 use_curses = USE_CURSES
128 local_use_curses = use_curses
132 129 else:
133 130 # curses causes problems on many terminals other than xterm.
134 use_curses = False
135 if use_curses:
131 local_use_curses = False
132 if local_use_curses:
136 133 import termios
137 134 import curses
138 135 # There is a bug in curses, where *sometimes* it fails to properly
139 136 # initialize, and then after the endwin() call is made, the
140 137 # terminal is left in an unusable state. Rather than trying to
141 138 # check everytime for this (by requesting and comparing termios
142 139 # flags each time), we just save the initial terminal state and
143 140 # unconditionally reset it every time. It's cheaper than making
144 141 # the checks.
145 142 term_flags = termios.tcgetattr(sys.stdout)
146 143 scr = curses.initscr()
147 144 screen_lines_real,screen_cols = scr.getmaxyx()
148 145 curses.endwin()
149 146 # Restore terminal state in case endwin() didn't.
150 147 termios.tcsetattr(sys.stdout,termios.TCSANOW,term_flags)
151 148 # Now we have what we needed: the screen size in rows/columns
152 149 screen_lines += screen_lines_real
153 150 #print '***Screen size:',screen_lines_real,'lines x',\
154 151 #screen_cols,'columns.' # dbg
155 152 else:
156 153 screen_lines += screen_lines_def
157 154
158 155 #print 'numlines',numlines,'screenlines',screen_lines # dbg
159 156 if numlines <= screen_lines :
160 157 #print '*** normal print' # dbg
161 158 print >>Term.cout, str_toprint
162 159 else:
163 160 # Try to open pager and default to internal one if that fails.
164 161 # All failure modes are tagged as 'retval=1', to match the return
165 162 # value of a failed system command. If any intermediate attempt
166 163 # sets retval to 1, at the end we resort to our own page_dumb() pager.
167 164 pager_cmd = get_pager_cmd(pager_cmd)
168 165 pager_cmd += ' ' + get_pager_start(pager_cmd,start)
169 166 if os.name == 'nt':
170 167 if pager_cmd.startswith('type'):
171 168 # The default WinXP 'type' command is failing on complex strings.
172 169 retval = 1
173 170 else:
174 171 tmpname = tempfile.mktemp('.txt')
175 172 tmpfile = file(tmpname,'wt')
176 173 tmpfile.write(strng)
177 174 tmpfile.close()
178 175 cmd = "%s < %s" % (pager_cmd,tmpname)
179 176 if os.system(cmd):
180 177 retval = 1
181 178 else:
182 179 retval = None
183 180 os.remove(tmpname)
184 181 else:
185 182 try:
186 183 retval = None
187 184 # if I use popen4, things hang. No idea why.
188 185 #pager,shell_out = os.popen4(pager_cmd)
189 186 pager = os.popen(pager_cmd,'w')
190 187 pager.write(strng)
191 188 pager.close()
192 189 retval = pager.close() # success returns None
193 190 except IOError,msg: # broken pipe when user quits
194 191 if msg.args == (32,'Broken pipe'):
195 192 retval = None
196 193 else:
197 194 retval = 1
198 195 except OSError:
199 196 # Other strange problems, sometimes seen in Win2k/cygwin
200 197 retval = 1
201 198 if retval is not None:
202 199 page_dumb(strng,screen_lines=screen_lines)
203 200
204 #----------------------------------------------------------------------------
205 def page_file(fname,start = 0, pager_cmd = None):
201
202 def page_file(fname, start=0, pager_cmd=None):
206 203 """Page a file, using an optional pager command and starting line.
207 204 """
208 205
209 206 pager_cmd = get_pager_cmd(pager_cmd)
210 207 pager_cmd += ' ' + get_pager_start(pager_cmd,start)
211 208
212 209 try:
213 210 if os.environ['TERM'] in ['emacs','dumb']:
214 211 raise EnvironmentError
215 212 xsys(pager_cmd + ' ' + fname)
216 213 except:
217 214 try:
218 215 if start > 0:
219 216 start -= 1
220 217 page(open(fname).read(),start)
221 218 except:
222 219 print 'Unable to show file',`fname`
223 220
224 #----------------------------------------------------------------------------
225 def get_pager_cmd(pager_cmd = None):
226 """Return a pager command.
227 221
228 Makes some attempts at finding an OS-correct one."""
222 def get_pager_cmd(pager_cmd=None):
223 """Return a pager command.
229 224
225 Makes some attempts at finding an OS-correct one.
226 """
230 227 if os.name == 'posix':
231 228 default_pager_cmd = 'less -r' # -r for color control sequences
232 229 elif os.name in ['nt','dos']:
233 230 default_pager_cmd = 'type'
234 231
235 232 if pager_cmd is None:
236 233 try:
237 234 pager_cmd = os.environ['PAGER']
238 235 except:
239 236 pager_cmd = default_pager_cmd
240 237 return pager_cmd
241 238
242 #-----------------------------------------------------------------------------
243 def get_pager_start(pager,start):
239
240 def get_pager_start(pager, start):
244 241 """Return the string for paging files with an offset.
245 242
246 243 This is the '+N' argument which less and more (under Unix) accept.
247 244 """
248 245
249 246 if pager in ['less','more']:
250 247 if start:
251 248 start_string = '+' + str(start)
252 249 else:
253 250 start_string = ''
254 251 else:
255 252 start_string = ''
256 253 return start_string
257 254
258 #----------------------------------------------------------------------------
259 # (X)emacs on W32 doesn't like to be bypassed with msvcrt.getch()
255
256 # (X)emacs on win32 doesn't like to be bypassed with msvcrt.getch()
260 257 if os.name == 'nt' and os.environ.get('TERM','dumb') != 'emacs':
261 258 import msvcrt
262 259 def page_more():
263 260 """ Smart pausing between pages
264 261
265 262 @return: True if need print more lines, False if quit
266 263 """
267 264 Term.cout.write('---Return to continue, q to quit--- ')
268 265 ans = msvcrt.getch()
269 266 if ans in ("q", "Q"):
270 267 result = False
271 268 else:
272 269 result = True
273 270 Term.cout.write("\b"*37 + " "*37 + "\b"*37)
274 271 return result
275 272 else:
276 273 def page_more():
277 274 ans = raw_input('---Return to continue, q to quit--- ')
278 275 if ans.lower().startswith('q'):
279 276 return False
280 277 else:
281 278 return True
282 279
283 #----------------------------------------------------------------------------
280
284 281 def snip_print(str,width = 75,print_full = 0,header = ''):
285 282 """Print a string snipping the midsection to fit in width.
286 283
287 284 print_full: mode control:
288 285 - 0: only snip long strings
289 286 - 1: send to page() directly.
290 287 - 2: snip long strings and ask for full length viewing with page()
291 288 Return 1 if snipping was necessary, 0 otherwise."""
292 289
293 290 if print_full == 1:
294 291 page(header+str)
295 292 return 0
296 293
297 294 print header,
298 295 if len(str) < width:
299 296 print str
300 297 snip = 0
301 298 else:
302 299 whalf = int((width -5)/2)
303 300 print str[:whalf] + ' <...> ' + str[-whalf:]
304 301 snip = 1
305 302 if snip and print_full == 2:
306 303 if raw_input(header+' Snipped. View (y/n)? [N]').lower() == 'y':
307 304 page(str)
308 return snip No newline at end of file
305 return snip
306
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/core/pylabtools.py to IPython/lib/pylabtools.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/utils/tests/test_genutils.py to IPython/utils/tests/test_path.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/utils/tests/test_platutils.py to IPython/utils/tests/test_process.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now