Show More
@@ -0,0 +1,67 b'' | |||||
|
1 | #!/usr/bin/env python | |||
|
2 | # encoding: utf-8 | |||
|
3 | """ | |||
|
4 | Context managers for adding things to sys.path temporarily. | |||
|
5 | ||||
|
6 | Authors: | |||
|
7 | ||||
|
8 | * Brian Granger | |||
|
9 | """ | |||
|
10 | ||||
|
11 | #----------------------------------------------------------------------------- | |||
|
12 | # Copyright (C) 2008-2009 The IPython Development Team | |||
|
13 | # | |||
|
14 | # Distributed under the terms of the BSD License. The full license is in | |||
|
15 | # the file COPYING, distributed as part of this software. | |||
|
16 | #----------------------------------------------------------------------------- | |||
|
17 | ||||
|
18 | #----------------------------------------------------------------------------- | |||
|
19 | # Imports | |||
|
20 | #----------------------------------------------------------------------------- | |||
|
21 | ||||
|
22 | ||||
|
23 | import sys | |||
|
24 | ||||
|
25 | class appended_to_syspath(object): | |||
|
26 | """A context for appending a directory to sys.path for a second.""" | |||
|
27 | ||||
|
28 | def __init__(self, dir): | |||
|
29 | self.dir = dir | |||
|
30 | ||||
|
31 | def __enter__(self): | |||
|
32 | if self.dir not in sys.path: | |||
|
33 | sys.path.append(self.dir) | |||
|
34 | self.added = True | |||
|
35 | else: | |||
|
36 | self.added = False | |||
|
37 | ||||
|
38 | def __exit__(self, type, value, traceback): | |||
|
39 | if self.added: | |||
|
40 | try: | |||
|
41 | sys.path.remove(self.dir) | |||
|
42 | except ValueError: | |||
|
43 | pass | |||
|
44 | # Returning False causes any exceptions to be re-raised. | |||
|
45 | return False | |||
|
46 | ||||
|
47 | class prepended_to_syspath(object): | |||
|
48 | """A context for prepending a directory to sys.path for a second.""" | |||
|
49 | ||||
|
50 | def __init__(self, dir): | |||
|
51 | self.dir = dir | |||
|
52 | ||||
|
53 | def __enter__(self): | |||
|
54 | if self.dir not in sys.path: | |||
|
55 | sys.path.insert(0,self.dir) | |||
|
56 | self.added = True | |||
|
57 | else: | |||
|
58 | self.added = False | |||
|
59 | ||||
|
60 | def __exit__(self, type, value, traceback): | |||
|
61 | if self.added: | |||
|
62 | try: | |||
|
63 | sys.path.remove(self.dir) | |||
|
64 | except ValueError: | |||
|
65 | pass | |||
|
66 | # Returning False causes any exceptions to be re-raised. | |||
|
67 | return False |
@@ -1,9 +1,8 b'' | |||||
1 | from ipython_config import * |
|
1 | from ipython_config import * | |
2 |
|
2 | |||
3 | EXECUTE.extend([ |
|
3 | Global.exec_lines.extend([ | |
4 | 'import cmath', |
|
4 | 'import cmath', | |
5 | 'from math import *', |
|
5 | 'from math import *', | |
6 | 'print "*** math functions available globally, cmath as a module"' |
|
6 | 'print "*** math functions available globally, cmath as a module"' | |
7 |
|
||||
8 | ]) |
|
7 | ]) | |
9 |
|
8 |
@@ -1,6 +1,6 b'' | |||||
1 | from ipython_config import * |
|
1 | from ipython_config import * | |
2 |
|
2 | |||
3 | EXECUTE.extend([ |
|
3 | Global.exec_lines.extend([ | |
4 | 'import numpy', |
|
4 | 'import numpy', | |
5 | 'import scipy', |
|
5 | 'import scipy', | |
6 | 'import numpy as np', |
|
6 | 'import numpy as np', |
@@ -1,7 +1,8 b'' | |||||
1 | from ipython_config_numeric import * |
|
1 | from ipython_config_numeric import * | |
2 |
|
2 | |||
3 | EXECUTE.extend([ |
|
3 | Global.exec_lines.extend([ | |
4 |
|
4 | 'import matplotlib', | ||
5 |
|
5 | 'from matplotlib import pyplot as plt', | ||
|
6 | 'from matplotlib.pyplot import *' | |||
6 | ]) |
|
7 | ]) | |
7 |
|
8 |
@@ -1,15 +1,13 b'' | |||||
1 | from ipython_config import * |
|
1 | from ipython_config import * | |
2 |
|
2 | |||
3 | EXECUTE.insert(0, 'from IPython.extensions.InterpreterExec import *') |
|
3 | InteractiveShell.prompt_in2 = '\C_LightGreen\u@\h\C_LightBlue[\C_LightCyan\Y1\C_LightBlue]\C_Green|\#> ' | |
|
4 | InteractiveShell.prompt_in2 = '\C_Green|\C_LightGreen\D\C_Green> ' | |||
|
5 | InteractiveShell.prompt_out = '<\#> ' | |||
4 |
|
6 | |||
5 | PROMPT_IN1 = '\C_LightGreen\u@\h\C_LightBlue[\C_LightCyan\Y1\C_LightBlue]\C_Green|\#> ' |
|
7 | InteractiveShell.prompts_pad_left = True | |
6 | PROMPT_IN2 = '\C_Green|\C_LightGreen\D\C_Green> ' |
|
|||
7 | PROMPT_OUT = '<\#> ' |
|
|||
8 |
|
8 | |||
9 | PROMPTS_PAD_LEFT = True |
|
9 | InteractiveShell.separate_in = '' | |
|
10 | InteractiveShell.separate_out = '' | |||
|
11 | InteractiveShell.separate_out2 = '' | |||
10 |
|
12 | |||
11 | SEPARATE_IN = 0 |
|
13 | PrefilterManager.multi_line_specials = True No newline at end of file | |
12 | SEPARATE_OUT = 0 |
|
|||
13 | SEPARATE_OUT2 = 0 |
|
|||
14 |
|
||||
15 | MULTI_LINE_SPECIALS = True No newline at end of file |
|
@@ -1,9 +1,9 b'' | |||||
1 | from ipython_config import * |
|
1 | from ipython_config import * | |
2 |
|
2 | |||
3 | EXECUTE.extend([ |
|
3 | Global.exec_lines.extend([ | |
4 |
|
|
4 | "from __future__ import division" | |
5 |
|
|
5 | "from sympy import *" | |
6 |
|
|
6 | "x, y, z = symbols('xyz')" | |
7 |
|
|
7 | "k, m, n = symbols('kmn', integer=True)" | |
8 |
|
|
8 | "f, g, h = map(Function, 'fgh')" | |
9 | ]) |
|
9 | ]) |
@@ -112,11 +112,9 b' class AliasManager(Component):' | |||||
112 |
|
112 | |||
113 | @auto_attr |
|
113 | @auto_attr | |
114 | def shell(self): |
|
114 | def shell(self): | |
115 |
|
|
115 | return Component.get_instances( | |
116 | root=self.root, |
|
116 | root=self.root, | |
117 | klass='IPython.core.iplib.InteractiveShell' |
|
117 | klass='IPython.core.iplib.InteractiveShell')[0] | |
118 | )[0] |
|
|||
119 | return shell |
|
|||
120 |
|
118 | |||
121 | def __contains__(self, name): |
|
119 | def __contains__(self, name): | |
122 | if name in self.alias_table: |
|
120 | if name in self.alias_table: |
@@ -23,6 +23,7 b' Notes' | |||||
23 | # Imports |
|
23 | # Imports | |
24 | #----------------------------------------------------------------------------- |
|
24 | #----------------------------------------------------------------------------- | |
25 |
|
25 | |||
|
26 | import logging | |||
26 | import os |
|
27 | import os | |
27 | import sys |
|
28 | import sys | |
28 | import traceback |
|
29 | import traceback | |
@@ -53,8 +54,8 b' class IPythonArgParseConfigLoader(ArgParseConfigLoader):' | |||||
53 | help='The string name of the ipython profile to be used.', |
|
54 | help='The string name of the ipython profile to be used.', | |
54 | default=NoConfigDefault, |
|
55 | default=NoConfigDefault, | |
55 | metavar='Global.profile') |
|
56 | metavar='Global.profile') | |
56 |
self.parser.add_argument('- |
|
57 | self.parser.add_argument('-log_level',dest="Global.log_level",type=int, | |
57 | help='Debug the application startup process.', |
|
58 | help='Set the log level (0,10,20,30,40,50). Default is 30.', | |
58 | default=NoConfigDefault) |
|
59 | default=NoConfigDefault) | |
59 | self.parser.add_argument('-config_file',dest='Global.config_file',type=str, |
|
60 | self.parser.add_argument('-config_file',dest='Global.config_file',type=str, | |
60 | help='Set the config file name to override default.', |
|
61 | help='Set the config file name to override default.', | |
@@ -72,10 +73,26 b' class Application(object):' | |||||
72 |
|
73 | |||
73 | config_file_name = 'ipython_config.py' |
|
74 | config_file_name = 'ipython_config.py' | |
74 | name = 'ipython' |
|
75 | name = 'ipython' | |
75 | debug = False |
|
|||
76 |
|
76 | |||
77 | def __init__(self): |
|
77 | def __init__(self): | |
78 | pass |
|
78 | self.init_logger() | |
|
79 | ||||
|
80 | def init_logger(self): | |||
|
81 | self.log = logging.getLogger(self.__class__.__name__) | |||
|
82 | # This is used as the default until the command line arguments are read. | |||
|
83 | self.log.setLevel(logging.WARN) | |||
|
84 | self._log_handler = logging.StreamHandler() | |||
|
85 | self._log_formatter = logging.Formatter("[%(name)s] %(message)s") | |||
|
86 | self._log_handler.setFormatter(self._log_formatter) | |||
|
87 | self.log.addHandler(self._log_handler) | |||
|
88 | ||||
|
89 | def _set_log_level(self, level): | |||
|
90 | self.log.setLevel(level) | |||
|
91 | ||||
|
92 | def _get_log_level(self): | |||
|
93 | return self.log.level | |||
|
94 | ||||
|
95 | log_level = property(_get_log_level, _set_log_level) | |||
79 |
|
96 | |||
80 | def start(self): |
|
97 | def start(self): | |
81 | """Start the application.""" |
|
98 | """Start the application.""" | |
@@ -103,6 +120,8 b' class Application(object):' | |||||
103 | """Create defaults that can't be set elsewhere.""" |
|
120 | """Create defaults that can't be set elsewhere.""" | |
104 | self.default_config = Config() |
|
121 | self.default_config = Config() | |
105 | self.default_config.Global.ipythondir = get_ipython_dir() |
|
122 | self.default_config.Global.ipythondir = get_ipython_dir() | |
|
123 | self.log.debug('Default config loaded:') | |||
|
124 | self.log.debug(repr(self.default_config)) | |||
106 |
|
125 | |||
107 | def create_command_line_config(self): |
|
126 | def create_command_line_config(self): | |
108 | """Create and return a command line config loader.""" |
|
127 | """Create and return a command line config loader.""" | |
@@ -120,12 +139,14 b' class Application(object):' | |||||
120 |
|
139 | |||
121 | loader = self.create_command_line_config() |
|
140 | loader = self.create_command_line_config() | |
122 | self.command_line_config = loader.load_config() |
|
141 | self.command_line_config = loader.load_config() | |
|
142 | ||||
123 | try: |
|
143 | try: | |
124 |
self. |
|
144 | self.log_level = self.command_line_config.Global.log_level | |
125 | except AttributeError: |
|
145 | except AttributeError: | |
126 | pass # use class default |
|
146 | pass # Use existing value which is set in Application.init_logger. | |
127 | self.log("Default config loaded:", self.default_config) |
|
147 | ||
128 |
self.log("Command line config loaded:" |
|
148 | self.log.debug("Command line config loaded:") | |
|
149 | self.log.debug(repr(self.command_line_config)) | |||
129 |
|
150 | |||
130 | def post_load_command_line_config(self): |
|
151 | def post_load_command_line_config(self): | |
131 | """Do actions just after loading the command line config.""" |
|
152 | """Do actions just after loading the command line config.""" | |
@@ -148,7 +169,7 b' class Application(object):' | |||||
148 | sys.path.append(os.path.abspath(self.ipythondir)) |
|
169 | sys.path.append(os.path.abspath(self.ipythondir)) | |
149 | if not os.path.isdir(self.ipythondir): |
|
170 | if not os.path.isdir(self.ipythondir): | |
150 | os.makedirs(self.ipythondir, mode = 0777) |
|
171 | os.makedirs(self.ipythondir, mode = 0777) | |
151 | self.log("IPYTHONDIR set to: %s" % self.ipythondir) |
|
172 | self.log.debug("IPYTHONDIR set to: %s" % self.ipythondir) | |
152 |
|
173 | |||
153 | def find_config_file_name(self): |
|
174 | def find_config_file_name(self): | |
154 | """Find the config file name for this application. |
|
175 | """Find the config file name for this application. | |
@@ -187,18 +208,28 b' class Application(object):' | |||||
187 | ``CONFIG_FILE`` config variable is set to the resolved config file |
|
208 | ``CONFIG_FILE`` config variable is set to the resolved config file | |
188 | location. If not successful, an empty config is used. |
|
209 | location. If not successful, an empty config is used. | |
189 | """ |
|
210 | """ | |
|
211 | self.log.debug("Attempting to load config file: <%s>" % self.config_file_name) | |||
190 | loader = PyFileConfigLoader(self.config_file_name, |
|
212 | loader = PyFileConfigLoader(self.config_file_name, | |
191 | path=self.config_file_paths) |
|
213 | path=self.config_file_paths) | |
192 | try: |
|
214 | try: | |
193 | self.file_config = loader.load_config() |
|
215 | self.file_config = loader.load_config() | |
194 | self.file_config.Global.config_file = loader.full_filename |
|
216 | self.file_config.Global.config_file = loader.full_filename | |
195 | except IOError: |
|
217 | except IOError: | |
196 | self.log("Config file not found, skipping: %s" % \ |
|
218 | self.log.warn("Config file not found, skipping: <%s>" % \ | |
197 | self.config_file_name) |
|
219 | self.config_file_name, exc_info=True) | |
|
220 | self.file_config = Config() | |||
|
221 | except: | |||
|
222 | self.log.warn("Error loading config file: <%s>" % \ | |||
|
223 | self.config_file_name, exc_info=True) | |||
198 | self.file_config = Config() |
|
224 | self.file_config = Config() | |
199 | else: |
|
225 | else: | |
200 |
self.log("Config file loaded: %s" % loader.full_filename |
|
226 | self.log.debug("Config file loaded: <%s>" % loader.full_filename) | |
201 |
|
|
227 | self.log.debug(repr(self.file_config)) | |
|
228 | # We need to keeep self.log_level updated. | |||
|
229 | try: | |||
|
230 | self.log_level = self.file_config.Global.log_level | |||
|
231 | except AttributeError: | |||
|
232 | pass # Use existing value | |||
202 |
|
233 | |||
203 | def post_load_file_config(self): |
|
234 | def post_load_file_config(self): | |
204 | """Do actions after the config file is loaded.""" |
|
235 | """Do actions after the config file is loaded.""" | |
@@ -211,7 +242,8 b' class Application(object):' | |||||
211 | config._merge(self.file_config) |
|
242 | config._merge(self.file_config) | |
212 | config._merge(self.command_line_config) |
|
243 | config._merge(self.command_line_config) | |
213 | self.master_config = config |
|
244 | self.master_config = config | |
214 |
self.log("Master config created:" |
|
245 | self.log.debug("Master config created:") | |
|
246 | self.log.debug(repr(self.master_config)) | |||
215 |
|
247 | |||
216 | def pre_construct(self): |
|
248 | def pre_construct(self): | |
217 | """Do actions after the config has been built, but before construct.""" |
|
249 | """Do actions after the config has been built, but before construct.""" | |
@@ -219,7 +251,7 b' class Application(object):' | |||||
219 |
|
251 | |||
220 | def construct(self): |
|
252 | def construct(self): | |
221 | """Construct the main components that make up this app.""" |
|
253 | """Construct the main components that make up this app.""" | |
222 |
self.log("Constructing components for application |
|
254 | self.log.debug("Constructing components for application") | |
223 |
|
255 | |||
224 | def post_construct(self): |
|
256 | def post_construct(self): | |
225 | """Do actions after construct, but before starting the app.""" |
|
257 | """Do actions after construct, but before starting the app.""" | |
@@ -227,7 +259,7 b' class Application(object):' | |||||
227 |
|
259 | |||
228 | def start_app(self): |
|
260 | def start_app(self): | |
229 | """Actually start the app.""" |
|
261 | """Actually start the app.""" | |
230 |
self.log("Starting application |
|
262 | self.log.debug("Starting application") | |
231 |
|
263 | |||
232 | #------------------------------------------------------------------------- |
|
264 | #------------------------------------------------------------------------- | |
233 | # Utility methods |
|
265 | # Utility methods | |
@@ -235,11 +267,11 b' class Application(object):' | |||||
235 |
|
267 | |||
236 | def abort(self): |
|
268 | def abort(self): | |
237 | """Abort the starting of the application.""" |
|
269 | """Abort the starting of the application.""" | |
238 |
|
|
270 | self.log.critical("Aborting application: %s" % self.name, exc_info=True) | |
239 | sys.exit(1) |
|
271 | sys.exit(1) | |
240 |
|
272 | |||
241 | def exit(self): |
|
273 | def exit(self): | |
242 |
|
|
274 | self.log.critical("Aborting application: %s" % self.name) | |
243 | sys.exit(1) |
|
275 | sys.exit(1) | |
244 |
|
276 | |||
245 | def attempt(self, func, action='abort'): |
|
277 | def attempt(self, func, action='abort'): | |
@@ -249,17 +281,7 b' class Application(object):' | |||||
249 | self.exit() |
|
281 | self.exit() | |
250 | except: |
|
282 | except: | |
251 | if action == 'abort': |
|
283 | if action == 'abort': | |
252 | self.print_traceback() |
|
|||
253 | self.abort() |
|
284 | self.abort() | |
254 | elif action == 'exit': |
|
285 | elif action == 'exit': | |
255 | self.exit() |
|
286 | self.exit() | |
256 |
|
287 | No newline at end of file | ||
257 | def print_traceback(self): |
|
|||
258 | print "Error in appliction startup: ", self.name |
|
|||
259 |
|
||||
260 | traceback.print_exc() |
|
|||
261 |
|
||||
262 | def log(self, *args): |
|
|||
263 | if self.debug: |
|
|||
264 | for arg in args: |
|
|||
265 | print "[%s] %s" % (self.name, arg) No newline at end of file |
|
@@ -46,11 +46,9 b' class BuiltinTrap(Component):' | |||||
46 |
|
46 | |||
47 | @auto_attr |
|
47 | @auto_attr | |
48 | def shell(self): |
|
48 | def shell(self): | |
49 |
|
|
49 | return Component.get_instances( | |
50 | root=self.root, |
|
50 | root=self.root, | |
51 | klass='IPython.core.iplib.InteractiveShell' |
|
51 | klass='IPython.core.iplib.InteractiveShell')[0] | |
52 | )[0] |
|
|||
53 | return shell |
|
|||
54 |
|
52 | |||
55 | def __enter__(self): |
|
53 | def __enter__(self): | |
56 | if self._nested_level == 0: |
|
54 | if self._nested_level == 0: |
@@ -48,11 +48,9 b' class DisplayTrap(Component):' | |||||
48 |
|
48 | |||
49 | @auto_attr |
|
49 | @auto_attr | |
50 | def shell(self): |
|
50 | def shell(self): | |
51 |
|
|
51 | return Component.get_instances( | |
52 | root=self.root, |
|
52 | root=self.root, | |
53 | klass='IPython.core.iplib.InteractiveShell' |
|
53 | klass='IPython.core.iplib.InteractiveShell')[0] | |
54 | )[0] |
|
|||
55 | return shell |
|
|||
56 |
|
54 | |||
57 | def __enter__(self): |
|
55 | def __enter__(self): | |
58 | if self._nested_level == 0: |
|
56 | if self._nested_level == 0: |
@@ -64,10 +64,13 b' class InteractiveShellEmbed(InteractiveShell):' | |||||
64 | exit_msg = Str('') |
|
64 | exit_msg = Str('') | |
65 | embedded = CBool(True) |
|
65 | embedded = CBool(True) | |
66 | embedded_active = CBool(True) |
|
66 | embedded_active = CBool(True) | |
|
67 | # Like the base class display_banner is not configurable, but here it | |||
|
68 | # is True by default. | |||
|
69 | display_banner = CBool(True) | |||
67 |
|
70 | |||
68 | def __init__(self, parent=None, config=None, ipythondir=None, usage=None, |
|
71 | def __init__(self, parent=None, config=None, ipythondir=None, usage=None, | |
69 | user_ns=None, user_global_ns=None, |
|
72 | user_ns=None, user_global_ns=None, | |
70 | banner1=None, banner2=None, |
|
73 | banner1=None, banner2=None, display_banner=None, | |
71 | custom_exceptions=((),None), exit_msg=''): |
|
74 | custom_exceptions=((),None), exit_msg=''): | |
72 |
|
75 | |||
73 | self.save_sys_ipcompleter() |
|
76 | self.save_sys_ipcompleter() | |
@@ -75,7 +78,7 b' class InteractiveShellEmbed(InteractiveShell):' | |||||
75 | super(InteractiveShellEmbed,self).__init__( |
|
78 | super(InteractiveShellEmbed,self).__init__( | |
76 | parent=parent, config=config, ipythondir=ipythondir, usage=usage, |
|
79 | parent=parent, config=config, ipythondir=ipythondir, usage=usage, | |
77 | user_ns=user_ns, user_global_ns=user_global_ns, |
|
80 | user_ns=user_ns, user_global_ns=user_global_ns, | |
78 | banner1=banner1, banner2=banner2, |
|
81 | banner1=banner1, banner2=banner2, display_banner=display_banner, | |
79 | custom_exceptions=custom_exceptions) |
|
82 | custom_exceptions=custom_exceptions) | |
80 |
|
83 | |||
81 | self.exit_msg = exit_msg |
|
84 | self.exit_msg = exit_msg | |
@@ -148,23 +151,24 b' class InteractiveShellEmbed(InteractiveShell):' | |||||
148 | if self.has_readline: |
|
151 | if self.has_readline: | |
149 | self.set_completer() |
|
152 | self.set_completer() | |
150 |
|
153 | |||
151 |
|
|
154 | # self.banner is auto computed | |
152 | format = '%s\n%s\n' |
|
155 | if header: | |
153 | else: |
|
156 | self.old_banner2 = self.banner2 | |
154 | format = '%s%s\n' |
|
157 | self.banner2 = self.banner2 + '\n' + header + '\n' | |
155 | banner = format % (self.banner,header) |
|
|||
156 |
|
158 | |||
157 | # Call the embedding code with a stack depth of 1 so it can skip over |
|
159 | # Call the embedding code with a stack depth of 1 so it can skip over | |
158 | # our call and get the original caller's namespaces. |
|
160 | # our call and get the original caller's namespaces. | |
159 |
self.mainloop( |
|
161 | self.mainloop(local_ns, global_ns, stack_depth=stack_depth) | |
160 | stack_depth=stack_depth) |
|
162 | ||
|
163 | self.banner2 = self.old_banner2 | |||
161 |
|
164 | |||
162 | if self.exit_msg is not None: |
|
165 | if self.exit_msg is not None: | |
163 | print self.exit_msg |
|
166 | print self.exit_msg | |
164 |
|
167 | |||
165 | self.restore_sys_ipcompleter() |
|
168 | self.restore_sys_ipcompleter() | |
166 |
|
169 | |||
167 |
def mainloop(self, |
|
170 | def mainloop(self, local_ns=None, global_ns=None, stack_depth=0, | |
|
171 | display_banner=None): | |||
168 | """Embeds IPython into a running python program. |
|
172 | """Embeds IPython into a running python program. | |
169 |
|
173 | |||
170 | Input: |
|
174 | Input: | |
@@ -221,7 +225,7 b' class InteractiveShellEmbed(InteractiveShell):' | |||||
221 | self.set_completer_frame() |
|
225 | self.set_completer_frame() | |
222 |
|
226 | |||
223 | with nested(self.builtin_trap, self.display_trap): |
|
227 | with nested(self.builtin_trap, self.display_trap): | |
224 |
self.interact( |
|
228 | self.interact(display_banner=display_banner) | |
225 |
|
229 | |||
226 | # now, purge out the user namespace from anything we might have added |
|
230 | # now, purge out the user namespace from anything we might have added | |
227 | # from the caller's local namespace |
|
231 | # from the caller's local namespace | |
@@ -242,7 +246,7 b' _embedded_shell = None' | |||||
242 |
|
246 | |||
243 |
|
247 | |||
244 | def embed(header='', config=None, usage=None, banner1=None, banner2=None, |
|
248 | def embed(header='', config=None, usage=None, banner1=None, banner2=None, | |
245 | exit_msg=''): |
|
249 | display_banner=True, exit_msg=''): | |
246 | """Call this to embed IPython at the current point in your program. |
|
250 | """Call this to embed IPython at the current point in your program. | |
247 |
|
251 | |||
248 | The first invocation of this will create an :class:`InteractiveShellEmbed` |
|
252 | The first invocation of this will create an :class:`InteractiveShellEmbed` | |
@@ -264,9 +268,13 b" def embed(header='', config=None, usage=None, banner1=None, banner2=None," | |||||
264 | """ |
|
268 | """ | |
265 | if config is None: |
|
269 | if config is None: | |
266 | config = load_default_config() |
|
270 | config = load_default_config() | |
|
271 | config.InteractiveShellEmbed = config.InteractiveShell | |||
267 | global _embedded_shell |
|
272 | global _embedded_shell | |
268 | if _embedded_shell is None: |
|
273 | if _embedded_shell is None: | |
269 |
_embedded_shell = InteractiveShellEmbed( |
|
274 | _embedded_shell = InteractiveShellEmbed( | |
270 | usage=usage, banner1=banner1, banner2=banner2, exit_msg=exit_msg) |
|
275 | config=config, usage=usage, | |
|
276 | banner1=banner1, banner2=banner2, | |||
|
277 | display_banner=display_banner, exit_msg=exit_msg | |||
|
278 | ) | |||
271 | _embedded_shell(header=header, stack_depth=2) |
|
279 | _embedded_shell(header=header, stack_depth=2) | |
272 |
|
280 |
@@ -23,6 +23,7 b' Notes' | |||||
23 | # Imports |
|
23 | # Imports | |
24 | #----------------------------------------------------------------------------- |
|
24 | #----------------------------------------------------------------------------- | |
25 |
|
25 | |||
|
26 | import logging | |||
26 | import os |
|
27 | import os | |
27 | import sys |
|
28 | import sys | |
28 | import warnings |
|
29 | import warnings | |
@@ -33,11 +34,12 b' from IPython.core.iplib import InteractiveShell' | |||||
33 | from IPython.config.loader import ( |
|
34 | from IPython.config.loader import ( | |
34 | NoConfigDefault, |
|
35 | NoConfigDefault, | |
35 | Config, |
|
36 | Config, | |
|
37 | ConfigError, | |||
36 | PyFileConfigLoader |
|
38 | PyFileConfigLoader | |
37 | ) |
|
39 | ) | |
38 |
|
40 | |||
39 | from IPython.utils.ipstruct import Struct |
|
41 | from IPython.utils.ipstruct import Struct | |
40 | from IPython.utils.genutils import get_ipython_dir |
|
42 | from IPython.utils.genutils import filefind, get_ipython_dir | |
41 |
|
43 | |||
42 | #----------------------------------------------------------------------------- |
|
44 | #----------------------------------------------------------------------------- | |
43 | # Utilities and helpers |
|
45 | # Utilities and helpers | |
@@ -95,11 +97,11 b' cl_args = (' | |||||
95 | help='Turn off auto editing of files with syntax errors.') |
|
97 | help='Turn off auto editing of files with syntax errors.') | |
96 | ), |
|
98 | ), | |
97 | (('-banner',), dict( |
|
99 | (('-banner',), dict( | |
98 |
action='store_true', dest=' |
|
100 | action='store_true', dest='Global.display_banner', default=NoConfigDefault, | |
99 | help='Display a banner upon starting IPython.') |
|
101 | help='Display a banner upon starting IPython.') | |
100 | ), |
|
102 | ), | |
101 | (('-nobanner',), dict( |
|
103 | (('-nobanner',), dict( | |
102 |
action='store_false', dest=' |
|
104 | action='store_false', dest='Global.display_banner', default=NoConfigDefault, | |
103 | help="Don't display a banner upon starting IPython.") |
|
105 | help="Don't display a banner upon starting IPython.") | |
104 | ), |
|
106 | ), | |
105 | (('-c',), dict( |
|
107 | (('-c',), dict( | |
@@ -244,6 +246,11 b' cl_args = (' | |||||
244 | help="Exception mode ('Plain','Context','Verbose')", |
|
246 | help="Exception mode ('Plain','Context','Verbose')", | |
245 | metavar='InteractiveShell.xmode') |
|
247 | metavar='InteractiveShell.xmode') | |
246 | ), |
|
248 | ), | |
|
249 | (('-ext',), dict( | |||
|
250 | type=str, dest='Global.extra_extension', default=NoConfigDefault, | |||
|
251 | help="The dotted module name of an IPython extension to load.", | |||
|
252 | metavar='Global.extra_extension') | |||
|
253 | ), | |||
247 | # These are only here to get the proper deprecation warnings |
|
254 | # These are only here to get the proper deprecation warnings | |
248 | (('-pylab','-wthread','-qthread','-q4thread','-gthread'), dict( |
|
255 | (('-pylab','-wthread','-qthread','-q4thread','-gthread'), dict( | |
249 | action='store_true', dest='Global.threaded_shell', default=NoConfigDefault, |
|
256 | action='store_true', dest='Global.threaded_shell', default=NoConfigDefault, | |
@@ -263,6 +270,14 b' class IPythonApp(Application):' | |||||
263 | name = 'ipython' |
|
270 | name = 'ipython' | |
264 | config_file_name = _default_config_file_name |
|
271 | config_file_name = _default_config_file_name | |
265 |
|
272 | |||
|
273 | def create_default_config(self): | |||
|
274 | super(IPythonApp, self).create_default_config() | |||
|
275 | self.default_config.Global.display_banner=True | |||
|
276 | # Let the parent class set the default, but each time log_level | |||
|
277 | # changes from config, we need to update self.log_level as that is | |||
|
278 | # what updates the actual log level in self.log. | |||
|
279 | self.default_config.Global.log_level = self.log_level | |||
|
280 | ||||
266 | def create_command_line_config(self): |
|
281 | def create_command_line_config(self): | |
267 | """Create and return a command line config loader.""" |
|
282 | """Create and return a command line config loader.""" | |
268 | return IPythonAppCLConfigLoader( |
|
283 | return IPythonAppCLConfigLoader( | |
@@ -286,7 +301,12 b' class IPythonApp(Application):' | |||||
286 | super(IPythonApp, self).load_file_config() |
|
301 | super(IPythonApp, self).load_file_config() | |
287 |
|
302 | |||
288 | def post_load_file_config(self): |
|
303 | def post_load_file_config(self): | |
289 | """Logic goes here.""" |
|
304 | if hasattr(self.command_line_config.Global, 'extra_extension'): | |
|
305 | if not hasattr(self.file_config.Global, 'extensions'): | |||
|
306 | self.file_config.Global.extensions = [] | |||
|
307 | self.file_config.Global.extensions.append( | |||
|
308 | self.command_line_config.Global.extra_extension) | |||
|
309 | del self.command_line_config.Global.extra_extension | |||
290 |
|
310 | |||
291 | def pre_construct(self): |
|
311 | def pre_construct(self): | |
292 | config = self.master_config |
|
312 | config = self.master_config | |
@@ -318,17 +338,90 b' class IPythonApp(Application):' | |||||
318 | # I am a little hesitant to put these into InteractiveShell itself. |
|
338 | # I am a little hesitant to put these into InteractiveShell itself. | |
319 | # But that might be the place for them |
|
339 | # But that might be the place for them | |
320 | sys.path.insert(0, '') |
|
340 | sys.path.insert(0, '') | |
321 | # add personal ipythondir to sys.path so that users can put things in |
|
341 | ||
322 | # there for customization |
|
|||
323 | sys.path.append(os.path.abspath(self.ipythondir)) |
|
|||
324 |
|
||||
325 | # Create an InteractiveShell instance |
|
342 | # Create an InteractiveShell instance | |
326 | self.shell = InteractiveShell( |
|
343 | self.shell = InteractiveShell( | |
327 | parent=None, |
|
344 | parent=None, | |
328 | config=self.master_config |
|
345 | config=self.master_config | |
329 | ) |
|
346 | ) | |
330 |
|
347 | |||
|
348 | def post_construct(self): | |||
|
349 | """Do actions after construct, but before starting the app.""" | |||
|
350 | # shell.display_banner should always be False for the terminal | |||
|
351 | # based app, because we call shell.show_banner() by hand below | |||
|
352 | # so the banner shows *before* all extension loading stuff. | |||
|
353 | self.shell.display_banner = False | |||
|
354 | ||||
|
355 | if self.master_config.Global.display_banner: | |||
|
356 | self.shell.show_banner() | |||
|
357 | ||||
|
358 | # Make sure there is a space below the banner. | |||
|
359 | if self.log_level <= logging.INFO: print | |||
|
360 | ||||
|
361 | self._load_extensions() | |||
|
362 | self._run_exec_lines() | |||
|
363 | self._run_exec_files() | |||
|
364 | ||||
|
365 | def _load_extensions(self): | |||
|
366 | """Load all IPython extensions in Global.extensions. | |||
|
367 | ||||
|
368 | This uses the :meth:`InteractiveShell.load_extensions` to load all | |||
|
369 | the extensions listed in ``self.master_config.Global.extensions``. | |||
|
370 | """ | |||
|
371 | try: | |||
|
372 | if hasattr(self.master_config.Global, 'extensions'): | |||
|
373 | self.log.debug("Loading IPython extensions...") | |||
|
374 | extensions = self.master_config.Global.extensions | |||
|
375 | for ext in extensions: | |||
|
376 | try: | |||
|
377 | self.log.info("Loading IPython extension: %s" % ext) | |||
|
378 | self.shell.load_extension(ext) | |||
|
379 | except: | |||
|
380 | self.log.warn("Error in loading extension: %s" % ext) | |||
|
381 | self.shell.showtraceback() | |||
|
382 | except: | |||
|
383 | self.log.warn("Unknown error in loading extensions:") | |||
|
384 | self.shell.showtraceback() | |||
|
385 | ||||
|
386 | def _run_exec_lines(self): | |||
|
387 | """Run lines of code in Global.exec_lines in the user's namespace.""" | |||
|
388 | try: | |||
|
389 | if hasattr(self.master_config.Global, 'exec_lines'): | |||
|
390 | self.log.debug("Running code from Global.exec_lines...") | |||
|
391 | exec_lines = self.master_config.Global.exec_lines | |||
|
392 | for line in exec_lines: | |||
|
393 | try: | |||
|
394 | self.log.info("Running code in user namespace: %s" % line) | |||
|
395 | self.shell.runlines(line) | |||
|
396 | except: | |||
|
397 | self.log.warn("Error in executing line in user namespace: %s" % line) | |||
|
398 | self.shell.showtraceback() | |||
|
399 | except: | |||
|
400 | self.log.warn("Unknown error in handling Global.exec_lines:") | |||
|
401 | self.shell.showtraceback() | |||
|
402 | ||||
|
403 | def _run_exec_files(self): | |||
|
404 | try: | |||
|
405 | if hasattr(self.master_config.Global, 'exec_files'): | |||
|
406 | self.log.debug("Running files in Global.exec_files...") | |||
|
407 | exec_files = self.master_config.Global.exec_files | |||
|
408 | for fname in exec_files: | |||
|
409 | full_filename = filefind(fname, ['.', self.ipythondir]) | |||
|
410 | if os.path.isfile(full_filename): | |||
|
411 | if full_filename.endswith('.py'): | |||
|
412 | self.log.info("Running file in user namespace: %s" % full_filename) | |||
|
413 | self.shell.safe_execfile(full_filename, self.shell.user_ns) | |||
|
414 | elif full_filename.endswith('.ipy'): | |||
|
415 | self.log.info("Running file in user namespace: %s" % full_filename) | |||
|
416 | self.shell.safe_execfile_ipy(full_filename) | |||
|
417 | else: | |||
|
418 | self.log.warn("File does not have a .py or .ipy extension: <%s>" % full_filename) | |||
|
419 | except: | |||
|
420 | self.log.warn("Unknown error in handling Global.exec_files:") | |||
|
421 | self.shell.showtraceback() | |||
|
422 | ||||
331 | def start_app(self): |
|
423 | def start_app(self): | |
|
424 | self.log.debug("Starting IPython's mainloop...") | |||
332 | self.shell.mainloop() |
|
425 | self.shell.mainloop() | |
333 |
|
426 | |||
334 |
|
427 |
@@ -55,8 +55,9 b' from IPython.utils.ipstruct import Struct' | |||||
55 | from IPython.utils import PyColorize |
|
55 | from IPython.utils import PyColorize | |
56 | from IPython.utils.genutils import * |
|
56 | from IPython.utils.genutils import * | |
57 | from IPython.utils.genutils import get_ipython_dir |
|
57 | from IPython.utils.genutils import get_ipython_dir | |
58 | from IPython.utils.strdispatch import StrDispatch |
|
|||
59 | from IPython.utils.platutils import toggle_set_term_title, set_term_title |
|
58 | from IPython.utils.platutils import toggle_set_term_title, set_term_title | |
|
59 | from IPython.utils.strdispatch import StrDispatch | |||
|
60 | from IPython.utils.syspathcontext import prepended_to_syspath | |||
60 |
|
61 | |||
61 | # from IPython.utils import growl |
|
62 | # from IPython.utils import growl | |
62 | # growl.start("IPython") |
|
63 | # growl.start("IPython") | |
@@ -185,7 +186,6 b' class InteractiveShell(Component, Magic):' | |||||
185 | autoedit_syntax = CBool(False, config=True) |
|
186 | autoedit_syntax = CBool(False, config=True) | |
186 | autoindent = CBool(True, config=True) |
|
187 | autoindent = CBool(True, config=True) | |
187 | automagic = CBool(True, config=True) |
|
188 | automagic = CBool(True, config=True) | |
188 | display_banner = CBool(True, config=True) |
|
|||
189 | banner = Str('') |
|
189 | banner = Str('') | |
190 | banner1 = Str(default_banner, config=True) |
|
190 | banner1 = Str(default_banner, config=True) | |
191 | banner2 = Str('', config=True) |
|
191 | banner2 = Str('', config=True) | |
@@ -197,6 +197,12 b' class InteractiveShell(Component, Magic):' | |||||
197 | confirm_exit = CBool(True, config=True) |
|
197 | confirm_exit = CBool(True, config=True) | |
198 | debug = CBool(False, config=True) |
|
198 | debug = CBool(False, config=True) | |
199 | deep_reload = CBool(False, config=True) |
|
199 | deep_reload = CBool(False, config=True) | |
|
200 | # This display_banner only controls whether or not self.show_banner() | |||
|
201 | # is called when mainloop/interact are called. The default is False | |||
|
202 | # because for the terminal based application, the banner behavior | |||
|
203 | # is controlled by Global.display_banner, which IPythonApp looks at | |||
|
204 | # to determine if *it* should call show_banner() by hand or not. | |||
|
205 | display_banner = CBool(False) # This isn't configurable! | |||
200 | embedded = CBool(False) |
|
206 | embedded = CBool(False) | |
201 | embedded_active = CBool(False) |
|
207 | embedded_active = CBool(False) | |
202 | editor = Str(get_default_editor(), config=True) |
|
208 | editor = Str(get_default_editor(), config=True) | |
@@ -262,7 +268,7 b' class InteractiveShell(Component, Magic):' | |||||
262 |
|
268 | |||
263 | def __init__(self, parent=None, config=None, ipythondir=None, usage=None, |
|
269 | def __init__(self, parent=None, config=None, ipythondir=None, usage=None, | |
264 | user_ns=None, user_global_ns=None, |
|
270 | user_ns=None, user_global_ns=None, | |
265 | banner1=None, banner2=None, |
|
271 | banner1=None, banner2=None, display_banner=None, | |
266 | custom_exceptions=((),None)): |
|
272 | custom_exceptions=((),None)): | |
267 |
|
273 | |||
268 | # This is where traitlets with a config_key argument are updated |
|
274 | # This is where traitlets with a config_key argument are updated | |
@@ -274,7 +280,7 b' class InteractiveShell(Component, Magic):' | |||||
274 | self.init_instance_attrs() |
|
280 | self.init_instance_attrs() | |
275 | self.init_term_title() |
|
281 | self.init_term_title() | |
276 | self.init_usage(usage) |
|
282 | self.init_usage(usage) | |
277 | self.init_banner(banner1, banner2) |
|
283 | self.init_banner(banner1, banner2, display_banner) | |
278 |
|
284 | |||
279 | # Create namespaces (user_ns, user_global_ns, etc.) |
|
285 | # Create namespaces (user_ns, user_global_ns, etc.) | |
280 | self.init_create_namespaces(user_ns, user_global_ns) |
|
286 | self.init_create_namespaces(user_ns, user_global_ns) | |
@@ -331,6 +337,12 b' class InteractiveShell(Component, Magic):' | |||||
331 | def _ipythondir_changed(self, name, new): |
|
337 | def _ipythondir_changed(self, name, new): | |
332 | if not os.path.isdir(new): |
|
338 | if not os.path.isdir(new): | |
333 | os.makedirs(new, mode = 0777) |
|
339 | os.makedirs(new, mode = 0777) | |
|
340 | if not os.path.isdir(self.ipython_extension_dir): | |||
|
341 | os.makedirs(self.ipython_extension_dir, mode = 0777) | |||
|
342 | ||||
|
343 | @property | |||
|
344 | def ipython_extension_dir(self): | |||
|
345 | return os.path.join(self.ipythondir, 'extensions') | |||
334 |
|
346 | |||
335 | @property |
|
347 | @property | |
336 | def usable_screen_length(self): |
|
348 | def usable_screen_length(self): | |
@@ -429,22 +441,6 b' class InteractiveShell(Component, Magic):' | |||||
429 | else: |
|
441 | else: | |
430 | self.usage = usage |
|
442 | self.usage = usage | |
431 |
|
443 | |||
432 | def init_banner(self, banner1, banner2): |
|
|||
433 | if self.c: # regular python doesn't print the banner with -c |
|
|||
434 | self.display_banner = False |
|
|||
435 | if banner1 is not None: |
|
|||
436 | self.banner1 = banner1 |
|
|||
437 | if banner2 is not None: |
|
|||
438 | self.banner2 = banner2 |
|
|||
439 | self.compute_banner() |
|
|||
440 |
|
||||
441 | def compute_banner(self): |
|
|||
442 | self.banner = self.banner1 + '\n' |
|
|||
443 | if self.profile: |
|
|||
444 | self.banner += '\nIPython profile: %s\n' % self.profile |
|
|||
445 | if self.banner2: |
|
|||
446 | self.banner += '\n' + self.banner2 + '\n' |
|
|||
447 |
|
||||
448 | def init_encoding(self): |
|
444 | def init_encoding(self): | |
449 | # Get system encoding at startup time. Certain terminals (like Emacs |
|
445 | # Get system encoding at startup time. Certain terminals (like Emacs | |
450 | # under Win32 have it set to None, and we need to have a known valid |
|
446 | # under Win32 have it set to None, and we need to have a known valid | |
@@ -486,7 +482,7 b' class InteractiveShell(Component, Magic):' | |||||
486 | def init_logstart(self): |
|
482 | def init_logstart(self): | |
487 | if self.logplay: |
|
483 | if self.logplay: | |
488 | self.magic_logstart(self.logplay + ' append') |
|
484 | self.magic_logstart(self.logplay + ' append') | |
489 |
elif |
|
485 | elif self.logfile: | |
490 | self.magic_logstart(self.logfile) |
|
486 | self.magic_logstart(self.logfile) | |
491 | elif self.logstart: |
|
487 | elif self.logstart: | |
492 | self.magic_logstart() |
|
488 | self.magic_logstart() | |
@@ -532,6 +528,31 b' class InteractiveShell(Component, Magic):' | |||||
532 | warn("doctest module does not exist.") |
|
528 | warn("doctest module does not exist.") | |
533 |
|
529 | |||
534 | #------------------------------------------------------------------------- |
|
530 | #------------------------------------------------------------------------- | |
|
531 | # Things related to the banner | |||
|
532 | #------------------------------------------------------------------------- | |||
|
533 | ||||
|
534 | def init_banner(self, banner1, banner2, display_banner): | |||
|
535 | if banner1 is not None: | |||
|
536 | self.banner1 = banner1 | |||
|
537 | if banner2 is not None: | |||
|
538 | self.banner2 = banner2 | |||
|
539 | if display_banner is not None: | |||
|
540 | self.display_banner = display_banner | |||
|
541 | self.compute_banner() | |||
|
542 | ||||
|
543 | def show_banner(self, banner=None): | |||
|
544 | if banner is None: | |||
|
545 | banner = self.banner | |||
|
546 | self.write(banner) | |||
|
547 | ||||
|
548 | def compute_banner(self): | |||
|
549 | self.banner = self.banner1 + '\n' | |||
|
550 | if self.profile: | |||
|
551 | self.banner += '\nIPython profile: %s\n' % self.profile | |||
|
552 | if self.banner2: | |||
|
553 | self.banner += '\n' + self.banner2 + '\n' | |||
|
554 | ||||
|
555 | #------------------------------------------------------------------------- | |||
535 | # Things related to injections into the sys module |
|
556 | # Things related to injections into the sys module | |
536 | #------------------------------------------------------------------------- |
|
557 | #------------------------------------------------------------------------- | |
537 |
|
558 | |||
@@ -1673,7 +1694,7 b' class InteractiveShell(Component, Magic):' | |||||
1673 | with nested(self.builtin_trap,): |
|
1694 | with nested(self.builtin_trap,): | |
1674 | return eval(expr, self.user_global_ns, self.user_ns) |
|
1695 | return eval(expr, self.user_global_ns, self.user_ns) | |
1675 |
|
1696 | |||
1676 | def mainloop(self, banner=None): |
|
1697 | def mainloop(self, display_banner=None): | |
1677 | """Start the mainloop. |
|
1698 | """Start the mainloop. | |
1678 |
|
1699 | |||
1679 | If an optional banner argument is given, it will override the |
|
1700 | If an optional banner argument is given, it will override the | |
@@ -1684,10 +1705,6 b' class InteractiveShell(Component, Magic):' | |||||
1684 | if self.c: # Emulate Python's -c option |
|
1705 | if self.c: # Emulate Python's -c option | |
1685 | self.exec_init_cmd() |
|
1706 | self.exec_init_cmd() | |
1686 |
|
1707 | |||
1687 | if self.display_banner: |
|
|||
1688 | if banner is None: |
|
|||
1689 | banner = self.banner |
|
|||
1690 |
|
||||
1691 | # if you run stuff with -c <cmd>, raw hist is not updated |
|
1708 | # if you run stuff with -c <cmd>, raw hist is not updated | |
1692 | # ensure that it's in sync |
|
1709 | # ensure that it's in sync | |
1693 | if len(self.input_hist) != len (self.input_hist_raw): |
|
1710 | if len(self.input_hist) != len (self.input_hist_raw): | |
@@ -1695,7 +1712,7 b' class InteractiveShell(Component, Magic):' | |||||
1695 |
|
1712 | |||
1696 | while 1: |
|
1713 | while 1: | |
1697 | try: |
|
1714 | try: | |
1698 | self.interact() |
|
1715 | self.interact(display_banner=display_banner) | |
1699 | #self.interact_with_readline() |
|
1716 | #self.interact_with_readline() | |
1700 | # XXX for testing of a readline-decoupled repl loop, call |
|
1717 | # XXX for testing of a readline-decoupled repl loop, call | |
1701 | # interact_with_readline above |
|
1718 | # interact_with_readline above | |
@@ -1774,17 +1791,17 b' class InteractiveShell(Component, Magic):' | |||||
1774 | line = raw_input_original().decode(self.stdin_encoding) |
|
1791 | line = raw_input_original().decode(self.stdin_encoding) | |
1775 | self.interact_handle_input(line) |
|
1792 | self.interact_handle_input(line) | |
1776 |
|
1793 | |||
1777 | def interact(self, banner=None): |
|
1794 | def interact(self, display_banner=None): | |
1778 | """Closely emulate the interactive Python console.""" |
|
1795 | """Closely emulate the interactive Python console.""" | |
1779 |
|
1796 | |||
1780 | # batch run -> do not interact |
|
1797 | # batch run -> do not interact | |
1781 | if self.exit_now: |
|
1798 | if self.exit_now: | |
1782 | return |
|
1799 | return | |
1783 |
|
1800 | |||
1784 |
if |
|
1801 | if display_banner is None: | |
1785 |
|
|
1802 | display_banner = self.display_banner | |
1786 | banner = self.banner |
|
1803 | if display_banner: | |
1787 |
self. |
|
1804 | self.show_banner() | |
1788 |
|
1805 | |||
1789 | more = 0 |
|
1806 | more = 0 | |
1790 |
|
1807 | |||
@@ -1856,128 +1873,45 b' class InteractiveShell(Component, Magic):' | |||||
1856 | # We are off again... |
|
1873 | # We are off again... | |
1857 | __builtin__.__dict__['__IPYTHON__active'] -= 1 |
|
1874 | __builtin__.__dict__['__IPYTHON__active'] -= 1 | |
1858 |
|
1875 | |||
1859 | def safe_execfile(self,fname,*where,**kw): |
|
1876 | def safe_execfile(self, fname, *where, **kw): | |
1860 | """A safe version of the builtin execfile(). |
|
1877 | """A safe version of the builtin execfile(). | |
1861 |
|
1878 | |||
1862 |
This version will never throw an exception, |
|
1879 | This version will never throw an exception, but instead print | |
1863 | ipython logs as well. |
|
1880 | helpful error messages to the screen. This only works on pure | |
|
1881 | Python files with the .py extension. | |||
1864 |
|
1882 | |||
1865 |
|
|
1883 | Parameters | |
1866 | fname : string |
|
1884 | ---------- | |
1867 | Name of the file to be executed. |
|
1885 | fname : string | |
1868 |
|
1886 | The name of the file to be executed. | ||
1869 |
|
|
1887 | where : tuple | |
1870 | One or two namespaces, passed to execfile() as (globals,locals). |
|
1888 | One or two namespaces, passed to execfile() as (globals,locals). | |
1871 | If only one is given, it is passed as both. |
|
1889 | If only one is given, it is passed as both. | |
|
1890 | exit_ignore : bool (False) | |||
|
1891 | If True, then don't print errors for non-zero exit statuses. | |||
|
1892 | """ | |||
|
1893 | kw.setdefault('exit_ignore', False) | |||
1872 |
|
1894 | |||
1873 | :Keywords: |
|
1895 | fname = os.path.abspath(os.path.expanduser(fname)) | |
1874 | islog : boolean (False) |
|
|||
1875 |
|
||||
1876 | quiet : boolean (True) |
|
|||
1877 |
|
1896 | |||
1878 | exit_ignore : boolean (False) |
|
1897 | # Make sure we have a .py file | |
1879 | """ |
|
1898 | if not fname.endswith('.py'): | |
|
1899 | warn('File must end with .py to be run using execfile: <%s>' % fname) | |||
1880 |
|
1900 | |||
1881 | def syspath_cleanup(): |
|
1901 | # Make sure we can open the file | |
1882 | """Internal cleanup routine for sys.path.""" |
|
1902 | try: | |
1883 | if add_dname: |
|
1903 | with open(fname) as thefile: | |
1884 |
|
|
1904 | pass | |
1885 | sys.path.remove(dname) |
|
1905 | except: | |
1886 | except ValueError: |
|
1906 | warn('Could not open file <%s> for safe execution.' % fname) | |
1887 | # For some reason the user has already removed it, ignore. |
|
1907 | return | |
1888 | pass |
|
|||
1889 |
|
||||
1890 | fname = os.path.expanduser(fname) |
|
|||
1891 |
|
1908 | |||
1892 | # Find things also in current directory. This is needed to mimic the |
|
1909 | # Find things also in current directory. This is needed to mimic the | |
1893 | # behavior of running a script from the system command line, where |
|
1910 | # behavior of running a script from the system command line, where | |
1894 | # Python inserts the script's directory into sys.path |
|
1911 | # Python inserts the script's directory into sys.path | |
1895 |
dname = os.path.dirname( |
|
1912 | dname = os.path.dirname(fname) | |
1896 | add_dname = False |
|
|||
1897 | if dname not in sys.path: |
|
|||
1898 | sys.path.insert(0,dname) |
|
|||
1899 | add_dname = True |
|
|||
1900 |
|
||||
1901 | try: |
|
|||
1902 | xfile = open(fname) |
|
|||
1903 | except: |
|
|||
1904 | print >> Term.cerr, \ |
|
|||
1905 | 'Could not open file <%s> for safe execution.' % fname |
|
|||
1906 | syspath_cleanup() |
|
|||
1907 | return None |
|
|||
1908 |
|
1913 | |||
1909 | kw.setdefault('islog',0) |
|
1914 | with prepended_to_syspath(dname): | |
1910 | kw.setdefault('quiet',1) |
|
|||
1911 | kw.setdefault('exit_ignore',0) |
|
|||
1912 |
|
||||
1913 | first = xfile.readline() |
|
|||
1914 | loghead = str(self.loghead_tpl).split('\n',1)[0].strip() |
|
|||
1915 | xfile.close() |
|
|||
1916 | # line by line execution |
|
|||
1917 | if first.startswith(loghead) or kw['islog']: |
|
|||
1918 | print 'Loading log file <%s> one line at a time...' % fname |
|
|||
1919 | if kw['quiet']: |
|
|||
1920 | stdout_save = sys.stdout |
|
|||
1921 | sys.stdout = StringIO.StringIO() |
|
|||
1922 | try: |
|
|||
1923 | globs,locs = where[0:2] |
|
|||
1924 | except: |
|
|||
1925 | try: |
|
|||
1926 | globs = locs = where[0] |
|
|||
1927 | except: |
|
|||
1928 | globs = locs = globals() |
|
|||
1929 | badblocks = [] |
|
|||
1930 |
|
||||
1931 | # we also need to identify indented blocks of code when replaying |
|
|||
1932 | # logs and put them together before passing them to an exec |
|
|||
1933 | # statement. This takes a bit of regexp and look-ahead work in the |
|
|||
1934 | # file. It's easiest if we swallow the whole thing in memory |
|
|||
1935 | # first, and manually walk through the lines list moving the |
|
|||
1936 | # counter ourselves. |
|
|||
1937 | indent_re = re.compile('\s+\S') |
|
|||
1938 | xfile = open(fname) |
|
|||
1939 | filelines = xfile.readlines() |
|
|||
1940 | xfile.close() |
|
|||
1941 | nlines = len(filelines) |
|
|||
1942 | lnum = 0 |
|
|||
1943 | while lnum < nlines: |
|
|||
1944 | line = filelines[lnum] |
|
|||
1945 | lnum += 1 |
|
|||
1946 | # don't re-insert logger status info into cache |
|
|||
1947 | if line.startswith('#log#'): |
|
|||
1948 | continue |
|
|||
1949 | else: |
|
|||
1950 | # build a block of code (maybe a single line) for execution |
|
|||
1951 | block = line |
|
|||
1952 | try: |
|
|||
1953 | next = filelines[lnum] # lnum has already incremented |
|
|||
1954 | except: |
|
|||
1955 | next = None |
|
|||
1956 | while next and indent_re.match(next): |
|
|||
1957 | block += next |
|
|||
1958 | lnum += 1 |
|
|||
1959 | try: |
|
|||
1960 | next = filelines[lnum] |
|
|||
1961 | except: |
|
|||
1962 | next = None |
|
|||
1963 | # now execute the block of one or more lines |
|
|||
1964 | try: |
|
|||
1965 | exec block in globs,locs |
|
|||
1966 | except SystemExit: |
|
|||
1967 | pass |
|
|||
1968 | except: |
|
|||
1969 | badblocks.append(block.rstrip()) |
|
|||
1970 | if kw['quiet']: # restore stdout |
|
|||
1971 | sys.stdout.close() |
|
|||
1972 | sys.stdout = stdout_save |
|
|||
1973 | print 'Finished replaying log file <%s>' % fname |
|
|||
1974 | if badblocks: |
|
|||
1975 | print >> sys.stderr, ('\nThe following lines/blocks in file ' |
|
|||
1976 | '<%s> reported errors:' % fname) |
|
|||
1977 |
|
||||
1978 | for badline in badblocks: |
|
|||
1979 | print >> sys.stderr, badline |
|
|||
1980 | else: # regular file execution |
|
|||
1981 | try: |
|
1915 | try: | |
1982 | if sys.platform == 'win32' and sys.version_info < (2,5,1): |
|
1916 | if sys.platform == 'win32' and sys.version_info < (2,5,1): | |
1983 | # Work around a bug in Python for Windows. The bug was |
|
1917 | # Work around a bug in Python for Windows. The bug was | |
@@ -1997,7 +1931,7 b' class InteractiveShell(Component, Magic):' | |||||
1997 | except SyntaxError: |
|
1931 | except SyntaxError: | |
1998 | self.showsyntaxerror() |
|
1932 | self.showsyntaxerror() | |
1999 | warn('Failure executing file: <%s>' % fname) |
|
1933 | warn('Failure executing file: <%s>' % fname) | |
2000 | except SystemExit,status: |
|
1934 | except SystemExit, status: | |
2001 | # Code that correctly sets the exit status flag to success (0) |
|
1935 | # Code that correctly sets the exit status flag to success (0) | |
2002 | # shouldn't be bothered with a traceback. Note that a plain |
|
1936 | # shouldn't be bothered with a traceback. Note that a plain | |
2003 | # sys.exit() does NOT set the message to 0 (it's empty) so that |
|
1937 | # sys.exit() does NOT set the message to 0 (it's empty) so that | |
@@ -2005,13 +1939,8 b' class InteractiveShell(Component, Magic):' | |||||
2005 | # SystemExit exception changed between Python 2.4 and 2.5, so |
|
1939 | # SystemExit exception changed between Python 2.4 and 2.5, so | |
2006 | # the checks must be done in a version-dependent way. |
|
1940 | # the checks must be done in a version-dependent way. | |
2007 | show = False |
|
1941 | show = False | |
2008 |
|
1942 | if status.message!=0 and not kw['exit_ignore']: | ||
2009 | if sys.version_info[:2] > (2,5): |
|
1943 | show = True | |
2010 | if status.message!=0 and not kw['exit_ignore']: |
|
|||
2011 | show = True |
|
|||
2012 | else: |
|
|||
2013 | if status.code and not kw['exit_ignore']: |
|
|||
2014 | show = True |
|
|||
2015 | if show: |
|
1944 | if show: | |
2016 | self.showtraceback() |
|
1945 | self.showtraceback() | |
2017 | warn('Failure executing file: <%s>' % fname) |
|
1946 | warn('Failure executing file: <%s>' % fname) | |
@@ -2019,46 +1948,82 b' class InteractiveShell(Component, Magic):' | |||||
2019 | self.showtraceback() |
|
1948 | self.showtraceback() | |
2020 | warn('Failure executing file: <%s>' % fname) |
|
1949 | warn('Failure executing file: <%s>' % fname) | |
2021 |
|
1950 | |||
2022 | syspath_cleanup() |
|
1951 | def safe_execfile_ipy(self, fname): | |
|
1952 | """Like safe_execfile, but for .ipy files with IPython syntax. | |||
|
1953 | ||||
|
1954 | Parameters | |||
|
1955 | ---------- | |||
|
1956 | fname : str | |||
|
1957 | The name of the file to execute. The filename must have a | |||
|
1958 | .ipy extension. | |||
|
1959 | """ | |||
|
1960 | fname = os.path.abspath(os.path.expanduser(fname)) | |||
|
1961 | ||||
|
1962 | # Make sure we have a .py file | |||
|
1963 | if not fname.endswith('.ipy'): | |||
|
1964 | warn('File must end with .py to be run using execfile: <%s>' % fname) | |||
|
1965 | ||||
|
1966 | # Make sure we can open the file | |||
|
1967 | try: | |||
|
1968 | with open(fname) as thefile: | |||
|
1969 | pass | |||
|
1970 | except: | |||
|
1971 | warn('Could not open file <%s> for safe execution.' % fname) | |||
|
1972 | return | |||
|
1973 | ||||
|
1974 | # Find things also in current directory. This is needed to mimic the | |||
|
1975 | # behavior of running a script from the system command line, where | |||
|
1976 | # Python inserts the script's directory into sys.path | |||
|
1977 | dname = os.path.dirname(fname) | |||
|
1978 | ||||
|
1979 | with prepended_to_syspath(dname): | |||
|
1980 | try: | |||
|
1981 | with open(fname) as thefile: | |||
|
1982 | script = thefile.read() | |||
|
1983 | # self.runlines currently captures all exceptions | |||
|
1984 | # raise in user code. It would be nice if there were | |||
|
1985 | # versions of runlines, execfile that did raise, so | |||
|
1986 | # we could catch the errors. | |||
|
1987 | self.runlines(script, clean=True) | |||
|
1988 | except: | |||
|
1989 | self.showtraceback() | |||
|
1990 | warn('Unknown failure executing file: <%s>' % fname) | |||
|
1991 | ||||
|
1992 | def _is_secondary_block_start(self, s): | |||
|
1993 | if not s.endswith(':'): | |||
|
1994 | return False | |||
|
1995 | if (s.startswith('elif') or | |||
|
1996 | s.startswith('else') or | |||
|
1997 | s.startswith('except') or | |||
|
1998 | s.startswith('finally')): | |||
|
1999 | return True | |||
2023 |
|
2000 | |||
2024 | def cleanup_ipy_script(self, script): |
|
2001 | def cleanup_ipy_script(self, script): | |
2025 | """Make a script safe for self.runlines() |
|
2002 | """Make a script safe for self.runlines() | |
2026 |
|
2003 | |||
2027 | Notes |
|
2004 | Currently, IPython is lines based, with blocks being detected by | |
2028 | ----- |
|
2005 | empty lines. This is a problem for block based scripts that may | |
2029 | This was copied over from the old ipapi and probably can be done |
|
2006 | not have empty lines after blocks. This script adds those empty | |
2030 | away with once we move to block based interpreter. |
|
2007 | lines to make scripts safe for running in the current line based | |
2031 |
|
2008 | IPython. | ||
2032 | - Removes empty lines Suffixes all indented blocks that end with |
|
|||
2033 | - unindented lines with empty lines |
|
|||
2034 | """ |
|
2009 | """ | |
2035 |
|
||||
2036 | res = [] |
|
2010 | res = [] | |
2037 | lines = script.splitlines() |
|
2011 | lines = script.splitlines() | |
2038 |
|
||||
2039 | level = 0 |
|
2012 | level = 0 | |
|
2013 | ||||
2040 | for l in lines: |
|
2014 | for l in lines: | |
2041 | lstripped = l.lstrip() |
|
2015 | lstripped = l.lstrip() | |
2042 | stripped = l.strip() |
|
2016 | stripped = l.strip() | |
2043 | if not stripped: |
|
2017 | if not stripped: | |
2044 | continue |
|
2018 | continue | |
2045 | newlevel = len(l) - len(lstripped) |
|
2019 | newlevel = len(l) - len(lstripped) | |
2046 | def is_secondary_block_start(s): |
|
|||
2047 | if not s.endswith(':'): |
|
|||
2048 | return False |
|
|||
2049 | if (s.startswith('elif') or |
|
|||
2050 | s.startswith('else') or |
|
|||
2051 | s.startswith('except') or |
|
|||
2052 | s.startswith('finally')): |
|
|||
2053 | return True |
|
|||
2054 |
|
||||
2055 | if level > 0 and newlevel == 0 and \ |
|
2020 | if level > 0 and newlevel == 0 and \ | |
2056 | not is_secondary_block_start(stripped): |
|
2021 | not self._is_secondary_block_start(stripped): | |
2057 | # add empty line |
|
2022 | # add empty line | |
2058 | res.append('') |
|
2023 | res.append('') | |
2059 |
|
||||
2060 | res.append(l) |
|
2024 | res.append(l) | |
2061 | level = newlevel |
|
2025 | level = newlevel | |
|
2026 | ||||
2062 | return '\n'.join(res) + '\n' |
|
2027 | return '\n'.join(res) + '\n' | |
2063 |
|
2028 | |||
2064 | def runlines(self, lines, clean=False): |
|
2029 | def runlines(self, lines, clean=False): | |
@@ -2091,7 +2056,8 b' class InteractiveShell(Component, Magic):' | |||||
2091 | if line or more: |
|
2056 | if line or more: | |
2092 | # push to raw history, so hist line numbers stay in sync |
|
2057 | # push to raw history, so hist line numbers stay in sync | |
2093 | self.input_hist_raw.append("# " + line + "\n") |
|
2058 | self.input_hist_raw.append("# " + line + "\n") | |
2094 |
|
|
2059 | prefiltered = self.prefilter_manager.prefilter_lines(line,more) | |
|
2060 | more = self.push_line(prefiltered) | |||
2095 | # IPython's runsource returns None if there was an error |
|
2061 | # IPython's runsource returns None if there was an error | |
2096 | # compiling the code. This allows us to stop processing right |
|
2062 | # compiling the code. This allows us to stop processing right | |
2097 | # away, so the user gets the error message at the right place. |
|
2063 | # away, so the user gets the error message at the right place. | |
@@ -2304,7 +2270,7 b' class InteractiveShell(Component, Magic):' | |||||
2304 | if line.strip(): |
|
2270 | if line.strip(): | |
2305 | if continue_prompt: |
|
2271 | if continue_prompt: | |
2306 | self.input_hist_raw[-1] += '%s\n' % line |
|
2272 | self.input_hist_raw[-1] += '%s\n' % line | |
2307 |
if self.has_readline: |
|
2273 | if self.has_readline and self.readline_use: | |
2308 | try: |
|
2274 | try: | |
2309 | histlen = self.readline.get_current_history_length() |
|
2275 | histlen = self.readline.get_current_history_length() | |
2310 | if histlen > 1: |
|
2276 | if histlen > 1: | |
@@ -2349,37 +2315,56 b' class InteractiveShell(Component, Magic):' | |||||
2349 | # if batchrun and not self.interactive: |
|
2315 | # if batchrun and not self.interactive: | |
2350 | # self.ask_exit() |
|
2316 | # self.ask_exit() | |
2351 |
|
2317 | |||
2352 | # def load(self, mod): |
|
2318 | #------------------------------------------------------------------------- | |
2353 |
# |
|
2319 | # IPython extensions | |
2354 | # |
|
2320 | #------------------------------------------------------------------------- | |
2355 | # Some modules should (or must) be 'load()':ed, rather than just imported. |
|
2321 | ||
2356 | # |
|
2322 | def load_extension(self, module_str): | |
2357 | # Loading will do: |
|
2323 | """Load an IPython extension. | |
2358 | # |
|
2324 | ||
2359 | # - run init_ipython(ip) |
|
2325 | An IPython extension is an importable Python module that has | |
2360 | # - run ipython_firstrun(ip) |
|
2326 | a function with the signature:: | |
2361 | # """ |
|
2327 | ||
2362 | # |
|
2328 | def load_in_ipython(ipython): | |
2363 | # if mod in self.extensions: |
|
2329 | # Do things with ipython | |
2364 | # # just to make sure we don't init it twice |
|
2330 | ||
2365 | # # note that if you 'load' a module that has already been |
|
2331 | This function is called after your extension is imported and the | |
2366 | # # imported, init_ipython gets run anyway |
|
2332 | currently active :class:`InteractiveShell` instance is passed as | |
2367 | # |
|
2333 | the only argument. You can do anything you want with IPython at | |
2368 | # return self.extensions[mod] |
|
2334 | that point, including defining new magic and aliases, adding new | |
2369 | # __import__(mod) |
|
2335 | components, etc. | |
2370 | # m = sys.modules[mod] |
|
2336 | ||
2371 | # if hasattr(m,'init_ipython'): |
|
2337 | You can put your extension modules anywhere you want, as long as | |
2372 | # m.init_ipython(self) |
|
2338 | they can be imported by Python's standard import mechanism. However, | |
2373 | # |
|
2339 | to make it easy to write extensions, you can also put your extensions | |
2374 | # if hasattr(m,'ipython_firstrun'): |
|
2340 | in ``os.path.join(self.ipythondir, 'extensions')``. This directory | |
2375 | # already_loaded = self.db.get('firstrun_done', set()) |
|
2341 | is added to ``sys.path`` automatically. | |
2376 | # if mod not in already_loaded: |
|
2342 | """ | |
2377 | # m.ipython_firstrun(self) |
|
2343 | from IPython.utils.syspathcontext import prepended_to_syspath | |
2378 | # already_loaded.add(mod) |
|
2344 | ||
2379 | # self.db['firstrun_done'] = already_loaded |
|
2345 | if module_str in sys.modules: | |
2380 | # |
|
2346 | return | |
2381 | # self.extensions[mod] = m |
|
2347 | ||
2382 | # return m |
|
2348 | with prepended_to_syspath(self.ipython_extension_dir): | |
|
2349 | __import__(module_str) | |||
|
2350 | mod = sys.modules[module_str] | |||
|
2351 | self._call_load_in_ipython(mod) | |||
|
2352 | ||||
|
2353 | def reload_extension(self, module_str): | |||
|
2354 | """Reload an IPython extension by doing reload.""" | |||
|
2355 | from IPython.utils.syspathcontext import prepended_to_syspath | |||
|
2356 | ||||
|
2357 | with prepended_to_syspath(self.ipython_extension_dir): | |||
|
2358 | if module_str in sys.modules: | |||
|
2359 | mod = sys.modules[module_str] | |||
|
2360 | reload(mod) | |||
|
2361 | self._call_load_in_ipython(mod) | |||
|
2362 | else: | |||
|
2363 | self.load_extension(self, module_str) | |||
|
2364 | ||||
|
2365 | def _call_load_in_ipython(self, mod): | |||
|
2366 | if hasattr(mod, 'load_in_ipython'): | |||
|
2367 | mod.load_in_ipython(self) | |||
2383 |
|
2368 | |||
2384 | #------------------------------------------------------------------------- |
|
2369 | #------------------------------------------------------------------------- | |
2385 | # Things related to the prefilter |
|
2370 | # Things related to the prefilter |
@@ -1573,7 +1573,7 b' Currently the magic system has the following functions:\\n"""' | |||||
1573 | return |
|
1573 | return | |
1574 |
|
1574 | |||
1575 | if filename.lower().endswith('.ipy'): |
|
1575 | if filename.lower().endswith('.ipy'): | |
1576 | self.runlines(open(filename).read(), clean=True) |
|
1576 | self.safe_execfile_ipy(filename) | |
1577 | return |
|
1577 | return | |
1578 |
|
1578 | |||
1579 | # Control the response to exit() calls made by the script being run |
|
1579 | # Control the response to exit() calls made by the script being run | |
@@ -1743,25 +1743,6 b' Currently the magic system has the following functions:\\n"""' | |||||
1743 |
|
1743 | |||
1744 | return stats |
|
1744 | return stats | |
1745 |
|
1745 | |||
1746 | def magic_runlog(self, parameter_s =''): |
|
|||
1747 | """Run files as logs. |
|
|||
1748 |
|
||||
1749 | Usage:\\ |
|
|||
1750 | %runlog file1 file2 ... |
|
|||
1751 |
|
||||
1752 | Run the named files (treating them as log files) in sequence inside |
|
|||
1753 | the interpreter, and return to the prompt. This is much slower than |
|
|||
1754 | %run because each line is executed in a try/except block, but it |
|
|||
1755 | allows running files with syntax errors in them. |
|
|||
1756 |
|
||||
1757 | Normally IPython will guess when a file is one of its own logfiles, so |
|
|||
1758 | you can typically use %run even for logs. This shorthand allows you to |
|
|||
1759 | force any file to be treated as a log file.""" |
|
|||
1760 |
|
||||
1761 | for f in parameter_s.split(): |
|
|||
1762 | self.shell.safe_execfile(f,self.shell.user_ns, |
|
|||
1763 | self.shell.user_ns,islog=1) |
|
|||
1764 |
|
||||
1765 | @testdec.skip_doctest |
|
1746 | @testdec.skip_doctest | |
1766 | def magic_timeit(self, parameter_s =''): |
|
1747 | def magic_timeit(self, parameter_s =''): | |
1767 | """Time execution of a Python statement or expression |
|
1748 | """Time execution of a Python statement or expression |
@@ -127,12 +127,14 b' def page(strng,start=0,screen_lines=0,pager_cmd = None):' | |||||
127 |
|
127 | |||
128 | # auto-determine screen size |
|
128 | # auto-determine screen size | |
129 | if screen_lines <= 0: |
|
129 | if screen_lines <= 0: | |
130 | if TERM=='xterm': |
|
130 | if TERM=='xterm' or TERM=='xterm-color': | |
131 | use_curses = USE_CURSES |
|
131 | use_curses = USE_CURSES | |
132 | else: |
|
132 | else: | |
133 | # curses causes problems on many terminals other than xterm. |
|
133 | # curses causes problems on many terminals other than xterm. | |
134 | use_curses = False |
|
134 | use_curses = False | |
135 | if use_curses: |
|
135 | if use_curses: | |
|
136 | import termios | |||
|
137 | import curses | |||
136 | # There is a bug in curses, where *sometimes* it fails to properly |
|
138 | # There is a bug in curses, where *sometimes* it fails to properly | |
137 | # initialize, and then after the endwin() call is made, the |
|
139 | # initialize, and then after the endwin() call is made, the | |
138 | # terminal is left in an unusable state. Rather than trying to |
|
140 | # terminal is left in an unusable state. Rather than trying to |
@@ -32,6 +32,7 b' from IPython.core.alias import AliasManager' | |||||
32 | from IPython.core.autocall import IPyAutocall |
|
32 | from IPython.core.autocall import IPyAutocall | |
33 | from IPython.core.component import Component |
|
33 | from IPython.core.component import Component | |
34 | from IPython.core.splitinput import split_user_input |
|
34 | from IPython.core.splitinput import split_user_input | |
|
35 | from IPython.core.page import page | |||
35 |
|
36 | |||
36 | from IPython.utils.traitlets import List, Int, Any, Str, CBool |
|
37 | from IPython.utils.traitlets import List, Int, Any, Str, CBool | |
37 | from IPython.utils.genutils import make_quoted_expr |
|
38 | from IPython.utils.genutils import make_quoted_expr | |
@@ -183,11 +184,9 b' class PrefilterManager(Component):' | |||||
183 |
|
184 | |||
184 | @auto_attr |
|
185 | @auto_attr | |
185 | def shell(self): |
|
186 | def shell(self): | |
186 |
|
|
187 | return Component.get_instances( | |
187 | root=self.root, |
|
188 | root=self.root, | |
188 | klass='IPython.core.iplib.InteractiveShell' |
|
189 | klass='IPython.core.iplib.InteractiveShell')[0] | |
189 | )[0] |
|
|||
190 | return shell |
|
|||
191 |
|
190 | |||
192 | def init_checkers(self): |
|
191 | def init_checkers(self): | |
193 | self._checkers = [] |
|
192 | self._checkers = [] | |
@@ -319,11 +318,9 b' class PrefilterChecker(Component):' | |||||
319 |
|
318 | |||
320 | @auto_attr |
|
319 | @auto_attr | |
321 | def shell(self): |
|
320 | def shell(self): | |
322 |
|
|
321 | return Component.get_instances( | |
323 | root=self.root, |
|
322 | root=self.root, | |
324 | klass='IPython.core.iplib.InteractiveShell' |
|
323 | klass='IPython.core.iplib.InteractiveShell')[0] | |
325 | )[0] |
|
|||
326 | return shell |
|
|||
327 |
|
324 | |||
328 | @auto_attr |
|
325 | @auto_attr | |
329 | def prefilter_manager(self): |
|
326 | def prefilter_manager(self): | |
@@ -523,11 +520,9 b' class PrefilterHandler(Component):' | |||||
523 |
|
520 | |||
524 | @auto_attr |
|
521 | @auto_attr | |
525 | def shell(self): |
|
522 | def shell(self): | |
526 |
|
|
523 | return Component.get_instances( | |
527 | root=self.root, |
|
524 | root=self.root, | |
528 | klass='IPython.core.iplib.InteractiveShell' |
|
525 | klass='IPython.core.iplib.InteractiveShell')[0] | |
529 | )[0] |
|
|||
530 | return shell |
|
|||
531 |
|
526 | |||
532 | @auto_attr |
|
527 | @auto_attr | |
533 | def prefilter_manager(self): |
|
528 | def prefilter_manager(self): |
General Comments 0
You need to be logged in to leave comments.
Login now