##// END OF EJS Templates
add config file note to failed load_extension message
MinRK -
Show More
@@ -1,289 +1,291
1 1 # encoding: utf-8
2 2 """
3 3 A mixin for :class:`~IPython.core.application.Application` classes that
4 4 launch InteractiveShell instances, load extensions, etc.
5 5
6 6 Authors
7 7 -------
8 8
9 9 * Min Ragan-Kelley
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2011 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 __future__ import absolute_import
24 24
25 25 import glob
26 26 import os
27 27 import sys
28 28
29 29 from IPython.config.application import boolean_flag
30 30 from IPython.config.configurable import Configurable
31 31 from IPython.config.loader import Config
32 32 from IPython.utils import py3compat
33 33 from IPython.utils.path import filefind
34 34 from IPython.utils.traitlets import Unicode, Instance, List, Bool
35 35
36 36 #-----------------------------------------------------------------------------
37 37 # Aliases and Flags
38 38 #-----------------------------------------------------------------------------
39 39
40 40 shell_flags = {}
41 41
42 42 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
43 43 addflag('autoindent', 'InteractiveShell.autoindent',
44 44 'Turn on autoindenting.', 'Turn off autoindenting.'
45 45 )
46 46 addflag('automagic', 'InteractiveShell.automagic',
47 47 """Turn on the auto calling of magic commands. Type %%magic at the
48 48 IPython prompt for more information.""",
49 49 'Turn off the auto calling of magic commands.'
50 50 )
51 51 addflag('pdb', 'InteractiveShell.pdb',
52 52 "Enable auto calling the pdb debugger after every exception.",
53 53 "Disable auto calling the pdb debugger after every exception."
54 54 )
55 55 # pydb flag doesn't do any config, as core.debugger switches on import,
56 56 # which is before parsing. This just allows the flag to be passed.
57 57 shell_flags.update(dict(
58 58 pydb = ({},
59 59 """"Use the third party 'pydb' package as debugger, instead of pdb.
60 60 Requires that pydb is installed."""
61 61 )
62 62 ))
63 63 addflag('pprint', 'PlainTextFormatter.pprint',
64 64 "Enable auto pretty printing of results.",
65 65 "Disable auto auto pretty printing of results."
66 66 )
67 67 addflag('color-info', 'InteractiveShell.color_info',
68 68 """IPython can display information about objects via a set of func-
69 69 tions, and optionally can use colors for this, syntax highlighting
70 70 source code and various other elements. However, because this
71 71 information is passed through a pager (like 'less') and many pagers get
72 72 confused with color codes, this option is off by default. You can test
73 73 it and turn it on permanently in your ipython_config.py file if it
74 74 works for you. Test it and turn it on permanently if it works with
75 75 your system. The magic function %%color_info allows you to toggle this
76 76 interactively for testing.""",
77 77 "Disable using colors for info related things."
78 78 )
79 79 addflag('deep-reload', 'InteractiveShell.deep_reload',
80 80 """Enable deep (recursive) reloading by default. IPython can use the
81 81 deep_reload module which reloads changes in modules recursively (it
82 82 replaces the reload() function, so you don't need to change anything to
83 83 use it). deep_reload() forces a full reload of modules whose code may
84 84 have changed, which the default reload() function does not. When
85 85 deep_reload is off, IPython will use the normal reload(), but
86 86 deep_reload will still be available as dreload(). This feature is off
87 87 by default [which means that you have both normal reload() and
88 88 dreload()].""",
89 89 "Disable deep (recursive) reloading by default."
90 90 )
91 91 nosep_config = Config()
92 92 nosep_config.InteractiveShell.separate_in = ''
93 93 nosep_config.InteractiveShell.separate_out = ''
94 94 nosep_config.InteractiveShell.separate_out2 = ''
95 95
96 96 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
97 97
98 98
99 99 # it's possible we don't want short aliases for *all* of these:
100 100 shell_aliases = dict(
101 101 autocall='InteractiveShell.autocall',
102 102 colors='InteractiveShell.colors',
103 103 logfile='InteractiveShell.logfile',
104 104 logappend='InteractiveShell.logappend',
105 105 c='InteractiveShellApp.code_to_run',
106 106 ext='InteractiveShellApp.extra_extension',
107 107 )
108 108 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
109 109
110 110 #-----------------------------------------------------------------------------
111 111 # Main classes and functions
112 112 #-----------------------------------------------------------------------------
113 113
114 114 class InteractiveShellApp(Configurable):
115 115 """A Mixin for applications that start InteractiveShell instances.
116 116
117 117 Provides configurables for loading extensions and executing files
118 118 as part of configuring a Shell environment.
119 119
120 120 Provides init_extensions() and init_code() methods, to be called
121 121 after init_shell(), which must be implemented by subclasses.
122 122 """
123 123 extensions = List(Unicode, config=True,
124 124 help="A list of dotted module names of IPython extensions to load."
125 125 )
126 126 extra_extension = Unicode('', config=True,
127 127 help="dotted module name of an IPython extension to load."
128 128 )
129 129 def _extra_extension_changed(self, name, old, new):
130 130 if new:
131 131 # add to self.extensions
132 132 self.extensions.append(new)
133 133
134 134 exec_files = List(Unicode, config=True,
135 135 help="""List of files to run at IPython startup."""
136 136 )
137 137 file_to_run = Unicode('', config=True,
138 138 help="""A file to be run""")
139 139
140 140 exec_lines = List(Unicode, config=True,
141 141 help="""lines of code to run at IPython startup."""
142 142 )
143 143 code_to_run = Unicode('', config=True,
144 144 help="Execute the given command string."
145 145 )
146 146 pylab_import_all = Bool(True, config=True,
147 147 help="""If true, an 'import *' is done from numpy and pylab,
148 148 when using pylab"""
149 149 )
150 150 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
151 151
152 152 def init_shell(self):
153 153 raise NotImplementedError("Override in subclasses")
154 154
155 155 def init_extensions(self):
156 156 """Load all IPython extensions in IPythonApp.extensions.
157 157
158 158 This uses the :meth:`ExtensionManager.load_extensions` to load all
159 159 the extensions listed in ``self.extensions``.
160 160 """
161 161 if not self.extensions:
162 162 return
163 163 try:
164 164 self.log.debug("Loading IPython extensions...")
165 165 extensions = self.extensions
166 166 for ext in extensions:
167 167 try:
168 168 self.log.info("Loading IPython extension: %s" % ext)
169 169 self.shell.extension_manager.load_extension(ext)
170 170 except:
171 self.log.warn("Error in loading extension: %s" % ext)
171 self.log.warn("Error in loading extension: %s" % ext +
172 "\nCheck your config files in %s" % self.profile_dir.location
173 )
172 174 self.shell.showtraceback()
173 175 except:
174 176 self.log.warn("Unknown error in loading extensions:")
175 177 self.shell.showtraceback()
176 178
177 179 def init_code(self):
178 180 """run the pre-flight code, specified via exec_lines"""
179 181 self._run_startup_files()
180 182 self._run_exec_lines()
181 183 self._run_exec_files()
182 184 self._run_cmd_line_code()
183 185
184 186 # Hide variables defined here from %who etc.
185 187 self.shell.user_ns_hidden.update(self.shell.user_ns)
186 188
187 189 def _run_exec_lines(self):
188 190 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
189 191 if not self.exec_lines:
190 192 return
191 193 try:
192 194 self.log.debug("Running code from IPythonApp.exec_lines...")
193 195 for line in self.exec_lines:
194 196 try:
195 197 self.log.info("Running code in user namespace: %s" %
196 198 line)
197 199 self.shell.run_cell(line, store_history=False)
198 200 except:
199 201 self.log.warn("Error in executing line in user "
200 202 "namespace: %s" % line)
201 203 self.shell.showtraceback()
202 204 except:
203 205 self.log.warn("Unknown error in handling IPythonApp.exec_lines:")
204 206 self.shell.showtraceback()
205 207
206 208 def _exec_file(self, fname):
207 209 try:
208 210 full_filename = filefind(fname, [u'.', self.ipython_dir])
209 211 except IOError as e:
210 212 self.log.warn("File not found: %r"%fname)
211 213 return
212 214 # Make sure that the running script gets a proper sys.argv as if it
213 215 # were run from a system shell.
214 216 save_argv = sys.argv
215 217 sys.argv = [full_filename] + self.extra_args[1:]
216 218 # protect sys.argv from potential unicode strings on Python 2:
217 219 if not py3compat.PY3:
218 220 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
219 221 try:
220 222 if os.path.isfile(full_filename):
221 223 if full_filename.endswith('.ipy'):
222 224 self.log.info("Running file in user namespace: %s" %
223 225 full_filename)
224 226 self.shell.safe_execfile_ipy(full_filename)
225 227 else:
226 228 # default to python, even without extension
227 229 self.log.info("Running file in user namespace: %s" %
228 230 full_filename)
229 231 # Ensure that __file__ is always defined to match Python behavior
230 232 self.shell.user_ns['__file__'] = fname
231 233 try:
232 234 self.shell.safe_execfile(full_filename, self.shell.user_ns)
233 235 finally:
234 236 del self.shell.user_ns['__file__']
235 237 finally:
236 238 sys.argv = save_argv
237 239
238 240 def _run_startup_files(self):
239 241 """Run files from profile startup directory"""
240 242 startup_dir = self.profile_dir.startup_dir
241 243 startup_files = glob.glob(os.path.join(startup_dir, '*.py'))
242 244 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
243 245 if not startup_files:
244 246 return
245 247
246 248 self.log.debug("Running startup files from %s...", startup_dir)
247 249 try:
248 250 for fname in sorted(startup_files):
249 251 self._exec_file(fname)
250 252 except:
251 253 self.log.warn("Unknown error in handling startup files:")
252 254 self.shell.showtraceback()
253 255
254 256 def _run_exec_files(self):
255 257 """Run files from IPythonApp.exec_files"""
256 258 if not self.exec_files:
257 259 return
258 260
259 261 self.log.debug("Running files in IPythonApp.exec_files...")
260 262 try:
261 263 for fname in self.exec_files:
262 264 self._exec_file(fname)
263 265 except:
264 266 self.log.warn("Unknown error in handling IPythonApp.exec_files:")
265 267 self.shell.showtraceback()
266 268
267 269 def _run_cmd_line_code(self):
268 270 """Run code or file specified at the command-line"""
269 271 if self.code_to_run:
270 272 line = self.code_to_run
271 273 try:
272 274 self.log.info("Running code given at command line (c=): %s" %
273 275 line)
274 276 self.shell.run_cell(line, store_history=False)
275 277 except:
276 278 self.log.warn("Error in executing line in user namespace: %s" %
277 279 line)
278 280 self.shell.showtraceback()
279 281
280 282 # Like Python itself, ignore the second if the first of these is present
281 283 elif self.file_to_run:
282 284 fname = self.file_to_run
283 285 try:
284 286 self._exec_file(fname)
285 287 except:
286 288 self.log.warn("Error in executing file in user namespace: %s" %
287 289 fname)
288 290 self.shell.showtraceback()
289 291
General Comments 0
You need to be logged in to leave comments. Login now