##// END OF EJS Templates
Do not exist if self.interact is True
Quentin Peter -
Show More
@@ -1,440 +1,441 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 A mixin for :class:`~IPython.core.application.Application` classes that
3 A mixin for :class:`~IPython.core.application.Application` classes that
4 launch InteractiveShell instances, load extensions, etc.
4 launch InteractiveShell instances, load extensions, etc.
5 """
5 """
6
6
7 # Copyright (c) IPython Development Team.
7 # Copyright (c) IPython Development Team.
8 # Distributed under the terms of the Modified BSD License.
8 # Distributed under the terms of the Modified BSD License.
9
9
10 import glob
10 import glob
11 from itertools import chain
11 from itertools import chain
12 import os
12 import os
13 import sys
13 import sys
14
14
15 from traitlets.config.application import boolean_flag
15 from traitlets.config.application import boolean_flag
16 from traitlets.config.configurable import Configurable
16 from traitlets.config.configurable import Configurable
17 from traitlets.config.loader import Config
17 from traitlets.config.loader import Config
18 from IPython.core.application import SYSTEM_CONFIG_DIRS, ENV_CONFIG_DIRS
18 from IPython.core.application import SYSTEM_CONFIG_DIRS, ENV_CONFIG_DIRS
19 from IPython.core import pylabtools
19 from IPython.core import pylabtools
20 from IPython.utils.contexts import preserve_keys
20 from IPython.utils.contexts import preserve_keys
21 from IPython.utils.path import filefind
21 from IPython.utils.path import filefind
22 from traitlets import (
22 from traitlets import (
23 Unicode, Instance, List, Bool, CaselessStrEnum, observe,
23 Unicode, Instance, List, Bool, CaselessStrEnum, observe,
24 )
24 )
25 from IPython.terminal import pt_inputhooks
25 from IPython.terminal import pt_inputhooks
26
26
27 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
28 # Aliases and Flags
28 # Aliases and Flags
29 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
30
30
31 gui_keys = tuple(sorted(pt_inputhooks.backends) + sorted(pt_inputhooks.aliases))
31 gui_keys = tuple(sorted(pt_inputhooks.backends) + sorted(pt_inputhooks.aliases))
32
32
33 backend_keys = sorted(pylabtools.backends.keys())
33 backend_keys = sorted(pylabtools.backends.keys())
34 backend_keys.insert(0, 'auto')
34 backend_keys.insert(0, 'auto')
35
35
36 shell_flags = {}
36 shell_flags = {}
37
37
38 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
38 addflag = lambda *args: shell_flags.update(boolean_flag(*args))
39 addflag('autoindent', 'InteractiveShell.autoindent',
39 addflag('autoindent', 'InteractiveShell.autoindent',
40 'Turn on autoindenting.', 'Turn off autoindenting.'
40 'Turn on autoindenting.', 'Turn off autoindenting.'
41 )
41 )
42 addflag('automagic', 'InteractiveShell.automagic',
42 addflag('automagic', 'InteractiveShell.automagic',
43 """Turn on the auto calling of magic commands. Type %%magic at the
43 """Turn on the auto calling of magic commands. Type %%magic at the
44 IPython prompt for more information.""",
44 IPython prompt for more information.""",
45 'Turn off the auto calling of magic commands.'
45 'Turn off the auto calling of magic commands.'
46 )
46 )
47 addflag('pdb', 'InteractiveShell.pdb',
47 addflag('pdb', 'InteractiveShell.pdb',
48 "Enable auto calling the pdb debugger after every exception.",
48 "Enable auto calling the pdb debugger after every exception.",
49 "Disable auto calling the pdb debugger after every exception."
49 "Disable auto calling the pdb debugger after every exception."
50 )
50 )
51 addflag('pprint', 'PlainTextFormatter.pprint',
51 addflag('pprint', 'PlainTextFormatter.pprint',
52 "Enable auto pretty printing of results.",
52 "Enable auto pretty printing of results.",
53 "Disable auto pretty printing of results."
53 "Disable auto pretty printing of results."
54 )
54 )
55 addflag('color-info', 'InteractiveShell.color_info',
55 addflag('color-info', 'InteractiveShell.color_info',
56 """IPython can display information about objects via a set of functions,
56 """IPython can display information about objects via a set of functions,
57 and optionally can use colors for this, syntax highlighting
57 and optionally can use colors for this, syntax highlighting
58 source code and various other elements. This is on by default, but can cause
58 source code and various other elements. This is on by default, but can cause
59 problems with some pagers. If you see such problems, you can disable the
59 problems with some pagers. If you see such problems, you can disable the
60 colours.""",
60 colours.""",
61 "Disable using colors for info related things."
61 "Disable using colors for info related things."
62 )
62 )
63 addflag('ignore-cwd', 'InteractiveShellApp.ignore_cwd',
63 addflag('ignore-cwd', 'InteractiveShellApp.ignore_cwd',
64 "Exclude the current working directory from sys.path",
64 "Exclude the current working directory from sys.path",
65 "Include the current working directory in sys.path",
65 "Include the current working directory in sys.path",
66 )
66 )
67 nosep_config = Config()
67 nosep_config = Config()
68 nosep_config.InteractiveShell.separate_in = ''
68 nosep_config.InteractiveShell.separate_in = ''
69 nosep_config.InteractiveShell.separate_out = ''
69 nosep_config.InteractiveShell.separate_out = ''
70 nosep_config.InteractiveShell.separate_out2 = ''
70 nosep_config.InteractiveShell.separate_out2 = ''
71
71
72 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
72 shell_flags['nosep']=(nosep_config, "Eliminate all spacing between prompts.")
73 shell_flags['pylab'] = (
73 shell_flags['pylab'] = (
74 {'InteractiveShellApp' : {'pylab' : 'auto'}},
74 {'InteractiveShellApp' : {'pylab' : 'auto'}},
75 """Pre-load matplotlib and numpy for interactive use with
75 """Pre-load matplotlib and numpy for interactive use with
76 the default matplotlib backend."""
76 the default matplotlib backend."""
77 )
77 )
78 shell_flags['matplotlib'] = (
78 shell_flags['matplotlib'] = (
79 {'InteractiveShellApp' : {'matplotlib' : 'auto'}},
79 {'InteractiveShellApp' : {'matplotlib' : 'auto'}},
80 """Configure matplotlib for interactive use with
80 """Configure matplotlib for interactive use with
81 the default matplotlib backend."""
81 the default matplotlib backend."""
82 )
82 )
83
83
84 # it's possible we don't want short aliases for *all* of these:
84 # it's possible we don't want short aliases for *all* of these:
85 shell_aliases = dict(
85 shell_aliases = dict(
86 autocall='InteractiveShell.autocall',
86 autocall='InteractiveShell.autocall',
87 colors='InteractiveShell.colors',
87 colors='InteractiveShell.colors',
88 logfile='InteractiveShell.logfile',
88 logfile='InteractiveShell.logfile',
89 logappend='InteractiveShell.logappend',
89 logappend='InteractiveShell.logappend',
90 c='InteractiveShellApp.code_to_run',
90 c='InteractiveShellApp.code_to_run',
91 m='InteractiveShellApp.module_to_run',
91 m='InteractiveShellApp.module_to_run',
92 ext='InteractiveShellApp.extra_extension',
92 ext='InteractiveShellApp.extra_extension',
93 gui='InteractiveShellApp.gui',
93 gui='InteractiveShellApp.gui',
94 pylab='InteractiveShellApp.pylab',
94 pylab='InteractiveShellApp.pylab',
95 matplotlib='InteractiveShellApp.matplotlib',
95 matplotlib='InteractiveShellApp.matplotlib',
96 )
96 )
97 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
97 shell_aliases['cache-size'] = 'InteractiveShell.cache_size'
98
98
99 #-----------------------------------------------------------------------------
99 #-----------------------------------------------------------------------------
100 # Main classes and functions
100 # Main classes and functions
101 #-----------------------------------------------------------------------------
101 #-----------------------------------------------------------------------------
102
102
103 class InteractiveShellApp(Configurable):
103 class InteractiveShellApp(Configurable):
104 """A Mixin for applications that start InteractiveShell instances.
104 """A Mixin for applications that start InteractiveShell instances.
105
105
106 Provides configurables for loading extensions and executing files
106 Provides configurables for loading extensions and executing files
107 as part of configuring a Shell environment.
107 as part of configuring a Shell environment.
108
108
109 The following methods should be called by the :meth:`initialize` method
109 The following methods should be called by the :meth:`initialize` method
110 of the subclass:
110 of the subclass:
111
111
112 - :meth:`init_path`
112 - :meth:`init_path`
113 - :meth:`init_shell` (to be implemented by the subclass)
113 - :meth:`init_shell` (to be implemented by the subclass)
114 - :meth:`init_gui_pylab`
114 - :meth:`init_gui_pylab`
115 - :meth:`init_extensions`
115 - :meth:`init_extensions`
116 - :meth:`init_code`
116 - :meth:`init_code`
117 """
117 """
118 extensions = List(Unicode(),
118 extensions = List(Unicode(),
119 help="A list of dotted module names of IPython extensions to load."
119 help="A list of dotted module names of IPython extensions to load."
120 ).tag(config=True)
120 ).tag(config=True)
121 extra_extension = Unicode('',
121 extra_extension = Unicode('',
122 help="dotted module name of an IPython extension to load."
122 help="dotted module name of an IPython extension to load."
123 ).tag(config=True)
123 ).tag(config=True)
124
124
125 reraise_ipython_extension_failures = Bool(False,
125 reraise_ipython_extension_failures = Bool(False,
126 help="Reraise exceptions encountered loading IPython extensions?",
126 help="Reraise exceptions encountered loading IPython extensions?",
127 ).tag(config=True)
127 ).tag(config=True)
128
128
129 # Extensions that are always loaded (not configurable)
129 # Extensions that are always loaded (not configurable)
130 default_extensions = List(Unicode(), [u'storemagic']).tag(config=False)
130 default_extensions = List(Unicode(), [u'storemagic']).tag(config=False)
131
131
132 hide_initial_ns = Bool(True,
132 hide_initial_ns = Bool(True,
133 help="""Should variables loaded at startup (by startup files, exec_lines, etc.)
133 help="""Should variables loaded at startup (by startup files, exec_lines, etc.)
134 be hidden from tools like %who?"""
134 be hidden from tools like %who?"""
135 ).tag(config=True)
135 ).tag(config=True)
136
136
137 exec_files = List(Unicode(),
137 exec_files = List(Unicode(),
138 help="""List of files to run at IPython startup."""
138 help="""List of files to run at IPython startup."""
139 ).tag(config=True)
139 ).tag(config=True)
140 exec_PYTHONSTARTUP = Bool(True,
140 exec_PYTHONSTARTUP = Bool(True,
141 help="""Run the file referenced by the PYTHONSTARTUP environment
141 help="""Run the file referenced by the PYTHONSTARTUP environment
142 variable at IPython startup."""
142 variable at IPython startup."""
143 ).tag(config=True)
143 ).tag(config=True)
144 file_to_run = Unicode('',
144 file_to_run = Unicode('',
145 help="""A file to be run""").tag(config=True)
145 help="""A file to be run""").tag(config=True)
146
146
147 exec_lines = List(Unicode(),
147 exec_lines = List(Unicode(),
148 help="""lines of code to run at IPython startup."""
148 help="""lines of code to run at IPython startup."""
149 ).tag(config=True)
149 ).tag(config=True)
150 code_to_run = Unicode('',
150 code_to_run = Unicode('',
151 help="Execute the given command string."
151 help="Execute the given command string."
152 ).tag(config=True)
152 ).tag(config=True)
153 module_to_run = Unicode('',
153 module_to_run = Unicode('',
154 help="Run the module as a script."
154 help="Run the module as a script."
155 ).tag(config=True)
155 ).tag(config=True)
156 gui = CaselessStrEnum(gui_keys, allow_none=True,
156 gui = CaselessStrEnum(gui_keys, allow_none=True,
157 help="Enable GUI event loop integration with any of {0}.".format(gui_keys)
157 help="Enable GUI event loop integration with any of {0}.".format(gui_keys)
158 ).tag(config=True)
158 ).tag(config=True)
159 matplotlib = CaselessStrEnum(backend_keys, allow_none=True,
159 matplotlib = CaselessStrEnum(backend_keys, allow_none=True,
160 help="""Configure matplotlib for interactive use with
160 help="""Configure matplotlib for interactive use with
161 the default matplotlib backend."""
161 the default matplotlib backend."""
162 ).tag(config=True)
162 ).tag(config=True)
163 pylab = CaselessStrEnum(backend_keys, allow_none=True,
163 pylab = CaselessStrEnum(backend_keys, allow_none=True,
164 help="""Pre-load matplotlib and numpy for interactive use,
164 help="""Pre-load matplotlib and numpy for interactive use,
165 selecting a particular matplotlib backend and loop integration.
165 selecting a particular matplotlib backend and loop integration.
166 """
166 """
167 ).tag(config=True)
167 ).tag(config=True)
168 pylab_import_all = Bool(True,
168 pylab_import_all = Bool(True,
169 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
169 help="""If true, IPython will populate the user namespace with numpy, pylab, etc.
170 and an ``import *`` is done from numpy and pylab, when using pylab mode.
170 and an ``import *`` is done from numpy and pylab, when using pylab mode.
171
171
172 When False, pylab mode should not import any names into the user namespace.
172 When False, pylab mode should not import any names into the user namespace.
173 """
173 """
174 ).tag(config=True)
174 ).tag(config=True)
175 ignore_cwd = Bool(
175 ignore_cwd = Bool(
176 False,
176 False,
177 help="""If True, IPython will not add the current working directory to sys.path.
177 help="""If True, IPython will not add the current working directory to sys.path.
178 When False, the current working directory is added to sys.path, allowing imports
178 When False, the current working directory is added to sys.path, allowing imports
179 of modules defined in the current directory."""
179 of modules defined in the current directory."""
180 ).tag(config=True)
180 ).tag(config=True)
181 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC',
181 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC',
182 allow_none=True)
182 allow_none=True)
183 # whether interact-loop should start
183 # whether interact-loop should start
184 interact = Bool(True)
184 interact = Bool(True)
185
185
186 user_ns = Instance(dict, args=None, allow_none=True)
186 user_ns = Instance(dict, args=None, allow_none=True)
187 @observe('user_ns')
187 @observe('user_ns')
188 def _user_ns_changed(self, change):
188 def _user_ns_changed(self, change):
189 if self.shell is not None:
189 if self.shell is not None:
190 self.shell.user_ns = change['new']
190 self.shell.user_ns = change['new']
191 self.shell.init_user_ns()
191 self.shell.init_user_ns()
192
192
193 def init_path(self):
193 def init_path(self):
194 """Add current working directory, '', to sys.path
194 """Add current working directory, '', to sys.path
195
195
196 Unlike Python's default, we insert before the first `site-packages`
196 Unlike Python's default, we insert before the first `site-packages`
197 or `dist-packages` directory,
197 or `dist-packages` directory,
198 so that it is after the standard library.
198 so that it is after the standard library.
199
199
200 .. versionchanged:: 7.2
200 .. versionchanged:: 7.2
201 Try to insert after the standard library, instead of first.
201 Try to insert after the standard library, instead of first.
202 .. versionchanged:: 8.0
202 .. versionchanged:: 8.0
203 Allow optionally not including the current directory in sys.path
203 Allow optionally not including the current directory in sys.path
204 """
204 """
205 if '' in sys.path or self.ignore_cwd:
205 if '' in sys.path or self.ignore_cwd:
206 return
206 return
207 for idx, path in enumerate(sys.path):
207 for idx, path in enumerate(sys.path):
208 parent, last_part = os.path.split(path)
208 parent, last_part = os.path.split(path)
209 if last_part in {'site-packages', 'dist-packages'}:
209 if last_part in {'site-packages', 'dist-packages'}:
210 break
210 break
211 else:
211 else:
212 # no site-packages or dist-packages found (?!)
212 # no site-packages or dist-packages found (?!)
213 # back to original behavior of inserting at the front
213 # back to original behavior of inserting at the front
214 idx = 0
214 idx = 0
215 sys.path.insert(idx, '')
215 sys.path.insert(idx, '')
216
216
217 def init_shell(self):
217 def init_shell(self):
218 raise NotImplementedError("Override in subclasses")
218 raise NotImplementedError("Override in subclasses")
219
219
220 def init_gui_pylab(self):
220 def init_gui_pylab(self):
221 """Enable GUI event loop integration, taking pylab into account."""
221 """Enable GUI event loop integration, taking pylab into account."""
222 enable = False
222 enable = False
223 shell = self.shell
223 shell = self.shell
224 if self.pylab:
224 if self.pylab:
225 enable = lambda key: shell.enable_pylab(key, import_all=self.pylab_import_all)
225 enable = lambda key: shell.enable_pylab(key, import_all=self.pylab_import_all)
226 key = self.pylab
226 key = self.pylab
227 elif self.matplotlib:
227 elif self.matplotlib:
228 enable = shell.enable_matplotlib
228 enable = shell.enable_matplotlib
229 key = self.matplotlib
229 key = self.matplotlib
230 elif self.gui:
230 elif self.gui:
231 enable = shell.enable_gui
231 enable = shell.enable_gui
232 key = self.gui
232 key = self.gui
233
233
234 if not enable:
234 if not enable:
235 return
235 return
236
236
237 try:
237 try:
238 r = enable(key)
238 r = enable(key)
239 except ImportError:
239 except ImportError:
240 self.log.warning("Eventloop or matplotlib integration failed. Is matplotlib installed?")
240 self.log.warning("Eventloop or matplotlib integration failed. Is matplotlib installed?")
241 self.shell.showtraceback()
241 self.shell.showtraceback()
242 return
242 return
243 except Exception:
243 except Exception:
244 self.log.warning("GUI event loop or pylab initialization failed")
244 self.log.warning("GUI event loop or pylab initialization failed")
245 self.shell.showtraceback()
245 self.shell.showtraceback()
246 return
246 return
247
247
248 if isinstance(r, tuple):
248 if isinstance(r, tuple):
249 gui, backend = r[:2]
249 gui, backend = r[:2]
250 self.log.info("Enabling GUI event loop integration, "
250 self.log.info("Enabling GUI event loop integration, "
251 "eventloop=%s, matplotlib=%s", gui, backend)
251 "eventloop=%s, matplotlib=%s", gui, backend)
252 if key == "auto":
252 if key == "auto":
253 print("Using matplotlib backend: %s" % backend)
253 print("Using matplotlib backend: %s" % backend)
254 else:
254 else:
255 gui = r
255 gui = r
256 self.log.info("Enabling GUI event loop integration, "
256 self.log.info("Enabling GUI event loop integration, "
257 "eventloop=%s", gui)
257 "eventloop=%s", gui)
258
258
259 def init_extensions(self):
259 def init_extensions(self):
260 """Load all IPython extensions in IPythonApp.extensions.
260 """Load all IPython extensions in IPythonApp.extensions.
261
261
262 This uses the :meth:`ExtensionManager.load_extensions` to load all
262 This uses the :meth:`ExtensionManager.load_extensions` to load all
263 the extensions listed in ``self.extensions``.
263 the extensions listed in ``self.extensions``.
264 """
264 """
265 try:
265 try:
266 self.log.debug("Loading IPython extensions...")
266 self.log.debug("Loading IPython extensions...")
267 extensions = self.default_extensions + self.extensions
267 extensions = self.default_extensions + self.extensions
268 if self.extra_extension:
268 if self.extra_extension:
269 extensions.append(self.extra_extension)
269 extensions.append(self.extra_extension)
270 for ext in extensions:
270 for ext in extensions:
271 try:
271 try:
272 self.log.info("Loading IPython extension: %s" % ext)
272 self.log.info("Loading IPython extension: %s" % ext)
273 self.shell.extension_manager.load_extension(ext)
273 self.shell.extension_manager.load_extension(ext)
274 except:
274 except:
275 if self.reraise_ipython_extension_failures:
275 if self.reraise_ipython_extension_failures:
276 raise
276 raise
277 msg = ("Error in loading extension: {ext}\n"
277 msg = ("Error in loading extension: {ext}\n"
278 "Check your config files in {location}".format(
278 "Check your config files in {location}".format(
279 ext=ext,
279 ext=ext,
280 location=self.profile_dir.location
280 location=self.profile_dir.location
281 ))
281 ))
282 self.log.warning(msg, exc_info=True)
282 self.log.warning(msg, exc_info=True)
283 except:
283 except:
284 if self.reraise_ipython_extension_failures:
284 if self.reraise_ipython_extension_failures:
285 raise
285 raise
286 self.log.warning("Unknown error in loading extensions:", exc_info=True)
286 self.log.warning("Unknown error in loading extensions:", exc_info=True)
287
287
288 def init_code(self):
288 def init_code(self):
289 """run the pre-flight code, specified via exec_lines"""
289 """run the pre-flight code, specified via exec_lines"""
290 self._run_startup_files()
290 self._run_startup_files()
291 self._run_exec_lines()
291 self._run_exec_lines()
292 self._run_exec_files()
292 self._run_exec_files()
293
293
294 # Hide variables defined here from %who etc.
294 # Hide variables defined here from %who etc.
295 if self.hide_initial_ns:
295 if self.hide_initial_ns:
296 self.shell.user_ns_hidden.update(self.shell.user_ns)
296 self.shell.user_ns_hidden.update(self.shell.user_ns)
297
297
298 # command-line execution (ipython -i script.py, ipython -m module)
298 # command-line execution (ipython -i script.py, ipython -m module)
299 # should *not* be excluded from %whos
299 # should *not* be excluded from %whos
300 self._run_cmd_line_code()
300 self._run_cmd_line_code()
301 self._run_module()
301 self._run_module()
302
302
303 # flush output, so itwon't be attached to the first cell
303 # flush output, so itwon't be attached to the first cell
304 sys.stdout.flush()
304 sys.stdout.flush()
305 sys.stderr.flush()
305 sys.stderr.flush()
306
306
307 def _run_exec_lines(self):
307 def _run_exec_lines(self):
308 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
308 """Run lines of code in IPythonApp.exec_lines in the user's namespace."""
309 if not self.exec_lines:
309 if not self.exec_lines:
310 return
310 return
311 try:
311 try:
312 self.log.debug("Running code from IPythonApp.exec_lines...")
312 self.log.debug("Running code from IPythonApp.exec_lines...")
313 for line in self.exec_lines:
313 for line in self.exec_lines:
314 try:
314 try:
315 self.log.info("Running code in user namespace: %s" %
315 self.log.info("Running code in user namespace: %s" %
316 line)
316 line)
317 self.shell.run_cell(line, store_history=False)
317 self.shell.run_cell(line, store_history=False)
318 except:
318 except:
319 self.log.warning("Error in executing line in user "
319 self.log.warning("Error in executing line in user "
320 "namespace: %s" % line)
320 "namespace: %s" % line)
321 self.shell.showtraceback()
321 self.shell.showtraceback()
322 except:
322 except:
323 self.log.warning("Unknown error in handling IPythonApp.exec_lines:")
323 self.log.warning("Unknown error in handling IPythonApp.exec_lines:")
324 self.shell.showtraceback()
324 self.shell.showtraceback()
325
325
326 def _exec_file(self, fname, shell_futures=False):
326 def _exec_file(self, fname, shell_futures=False):
327 try:
327 try:
328 full_filename = filefind(fname, [u'.', self.ipython_dir])
328 full_filename = filefind(fname, [u'.', self.ipython_dir])
329 except IOError:
329 except IOError:
330 self.log.warning("File not found: %r"%fname)
330 self.log.warning("File not found: %r"%fname)
331 return
331 return
332 # Make sure that the running script gets a proper sys.argv as if it
332 # Make sure that the running script gets a proper sys.argv as if it
333 # were run from a system shell.
333 # were run from a system shell.
334 save_argv = sys.argv
334 save_argv = sys.argv
335 sys.argv = [full_filename] + self.extra_args[1:]
335 sys.argv = [full_filename] + self.extra_args[1:]
336 try:
336 try:
337 if os.path.isfile(full_filename):
337 if os.path.isfile(full_filename):
338 self.log.info("Running file in user namespace: %s" %
338 self.log.info("Running file in user namespace: %s" %
339 full_filename)
339 full_filename)
340 # Ensure that __file__ is always defined to match Python
340 # Ensure that __file__ is always defined to match Python
341 # behavior.
341 # behavior.
342 with preserve_keys(self.shell.user_ns, '__file__'):
342 with preserve_keys(self.shell.user_ns, '__file__'):
343 self.shell.user_ns['__file__'] = fname
343 self.shell.user_ns['__file__'] = fname
344 if full_filename.endswith('.ipy') or full_filename.endswith('.ipynb'):
344 if full_filename.endswith('.ipy') or full_filename.endswith('.ipynb'):
345 self.shell.safe_execfile_ipy(full_filename,
345 self.shell.safe_execfile_ipy(full_filename,
346 shell_futures=shell_futures)
346 shell_futures=shell_futures)
347 else:
347 else:
348 # default to python, even without extension
348 # default to python, even without extension
349 self.shell.safe_execfile(full_filename,
349 self.shell.safe_execfile(full_filename,
350 self.shell.user_ns,
350 self.shell.user_ns,
351 shell_futures=shell_futures,
351 shell_futures=shell_futures,
352 raise_exceptions=True)
352 raise_exceptions=True)
353 finally:
353 finally:
354 sys.argv = save_argv
354 sys.argv = save_argv
355
355
356 def _run_startup_files(self):
356 def _run_startup_files(self):
357 """Run files from profile startup directory"""
357 """Run files from profile startup directory"""
358 startup_dirs = [self.profile_dir.startup_dir] + [
358 startup_dirs = [self.profile_dir.startup_dir] + [
359 os.path.join(p, 'startup') for p in chain(ENV_CONFIG_DIRS, SYSTEM_CONFIG_DIRS)
359 os.path.join(p, 'startup') for p in chain(ENV_CONFIG_DIRS, SYSTEM_CONFIG_DIRS)
360 ]
360 ]
361 startup_files = []
361 startup_files = []
362
362
363 if self.exec_PYTHONSTARTUP and os.environ.get('PYTHONSTARTUP', False) and \
363 if self.exec_PYTHONSTARTUP and os.environ.get('PYTHONSTARTUP', False) and \
364 not (self.file_to_run or self.code_to_run or self.module_to_run):
364 not (self.file_to_run or self.code_to_run or self.module_to_run):
365 python_startup = os.environ['PYTHONSTARTUP']
365 python_startup = os.environ['PYTHONSTARTUP']
366 self.log.debug("Running PYTHONSTARTUP file %s...", python_startup)
366 self.log.debug("Running PYTHONSTARTUP file %s...", python_startup)
367 try:
367 try:
368 self._exec_file(python_startup)
368 self._exec_file(python_startup)
369 except:
369 except:
370 self.log.warning("Unknown error in handling PYTHONSTARTUP file %s:", python_startup)
370 self.log.warning("Unknown error in handling PYTHONSTARTUP file %s:", python_startup)
371 self.shell.showtraceback()
371 self.shell.showtraceback()
372 for startup_dir in startup_dirs[::-1]:
372 for startup_dir in startup_dirs[::-1]:
373 startup_files += glob.glob(os.path.join(startup_dir, '*.py'))
373 startup_files += glob.glob(os.path.join(startup_dir, '*.py'))
374 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
374 startup_files += glob.glob(os.path.join(startup_dir, '*.ipy'))
375 if not startup_files:
375 if not startup_files:
376 return
376 return
377
377
378 self.log.debug("Running startup files from %s...", startup_dir)
378 self.log.debug("Running startup files from %s...", startup_dir)
379 try:
379 try:
380 for fname in sorted(startup_files):
380 for fname in sorted(startup_files):
381 self._exec_file(fname)
381 self._exec_file(fname)
382 except:
382 except:
383 self.log.warning("Unknown error in handling startup files:")
383 self.log.warning("Unknown error in handling startup files:")
384 self.shell.showtraceback()
384 self.shell.showtraceback()
385
385
386 def _run_exec_files(self):
386 def _run_exec_files(self):
387 """Run files from IPythonApp.exec_files"""
387 """Run files from IPythonApp.exec_files"""
388 if not self.exec_files:
388 if not self.exec_files:
389 return
389 return
390
390
391 self.log.debug("Running files in IPythonApp.exec_files...")
391 self.log.debug("Running files in IPythonApp.exec_files...")
392 try:
392 try:
393 for fname in self.exec_files:
393 for fname in self.exec_files:
394 self._exec_file(fname)
394 self._exec_file(fname)
395 except:
395 except:
396 self.log.warning("Unknown error in handling IPythonApp.exec_files:")
396 self.log.warning("Unknown error in handling IPythonApp.exec_files:")
397 self.shell.showtraceback()
397 self.shell.showtraceback()
398
398
399 def _run_cmd_line_code(self):
399 def _run_cmd_line_code(self):
400 """Run code or file specified at the command-line"""
400 """Run code or file specified at the command-line"""
401 if self.code_to_run:
401 if self.code_to_run:
402 line = self.code_to_run
402 line = self.code_to_run
403 try:
403 try:
404 self.log.info("Running code given at command line (c=): %s" %
404 self.log.info("Running code given at command line (c=): %s" %
405 line)
405 line)
406 self.shell.run_cell(line, store_history=False)
406 self.shell.run_cell(line, store_history=False)
407 except:
407 except:
408 self.log.warning("Error in executing line in user namespace: %s" %
408 self.log.warning("Error in executing line in user namespace: %s" %
409 line)
409 line)
410 self.shell.showtraceback()
410 self.shell.showtraceback()
411 if not self.interact:
411 if not self.interact:
412 self.exit(1)
412 self.exit(1)
413
413
414 # Like Python itself, ignore the second if the first of these is present
414 # Like Python itself, ignore the second if the first of these is present
415 elif self.file_to_run:
415 elif self.file_to_run:
416 fname = self.file_to_run
416 fname = self.file_to_run
417 if os.path.isdir(fname):
417 if os.path.isdir(fname):
418 fname = os.path.join(fname, "__main__.py")
418 fname = os.path.join(fname, "__main__.py")
419 if not os.path.exists(fname):
419 if not os.path.exists(fname):
420 self.log.warning("File '%s' doesn't exist", fname)
420 self.log.warning("File '%s' doesn't exist", fname)
421 self.exit(2)
421 if not self.interact:
422 self.exit(2)
422 try:
423 try:
423 self._exec_file(fname, shell_futures=True)
424 self._exec_file(fname, shell_futures=True)
424 except:
425 except:
425 self.shell.showtraceback(tb_offset=4)
426 self.shell.showtraceback(tb_offset=4)
426 if not self.interact:
427 if not self.interact:
427 self.exit(1)
428 self.exit(1)
428
429
429 def _run_module(self):
430 def _run_module(self):
430 """Run module specified at the command-line."""
431 """Run module specified at the command-line."""
431 if self.module_to_run:
432 if self.module_to_run:
432 # Make sure that the module gets a proper sys.argv as if it were
433 # Make sure that the module gets a proper sys.argv as if it were
433 # run using `python -m`.
434 # run using `python -m`.
434 save_argv = sys.argv
435 save_argv = sys.argv
435 sys.argv = [sys.executable] + self.extra_args
436 sys.argv = [sys.executable] + self.extra_args
436 try:
437 try:
437 self.shell.safe_run_module(self.module_to_run,
438 self.shell.safe_run_module(self.module_to_run,
438 self.shell.user_ns)
439 self.shell.user_ns)
439 finally:
440 finally:
440 sys.argv = save_argv
441 sys.argv = save_argv
General Comments 0
You need to be logged in to leave comments. Login now