##// END OF EJS Templates
Fix imports for plain terminal ipython and use a proper warn() call.
Fernando Perez -
Show More
@@ -1,86 +1,86 b''
1 1 # encoding: utf-8
2 2 """
3 3 IPython: tools for interactive and parallel computing in Python.
4 4
5 5 http://ipython.org
6 6 """
7 7 #-----------------------------------------------------------------------------
8 8 # Copyright (c) 2008-2011, IPython Development Team.
9 9 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
10 10 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
11 11 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
12 12 #
13 13 # Distributed under the terms of the Modified BSD License.
14 14 #
15 15 # The full license is in the file COPYING.txt, distributed with this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21 from __future__ import absolute_import
22 22
23 23 import os
24 24 import sys
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Setup everything
28 28 #-----------------------------------------------------------------------------
29 29
30 30 # Don't forget to also update setup.py when this changes!
31 31 if sys.version[0:3] < '2.6':
32 32 raise ImportError('Python Version 2.6 or above is required for IPython.')
33 33
34 34 # Make it easy to import extensions - they are always directly on pythonpath.
35 35 # Therefore, non-IPython modules can be added to extensions directory.
36 36 # This should probably be in ipapp.py.
37 37 sys.path.append(os.path.join(os.path.dirname(__file__), "extensions"))
38 38
39 39 #-----------------------------------------------------------------------------
40 40 # Setup the top level names
41 41 #-----------------------------------------------------------------------------
42 42
43 43 from .config.loader import Config
44 44 from .core.getipython import get_ipython
45 45 from .core import release
46 46 from .core.application import Application
47 from .frontend.terminal.embed import embed
47 from .terminal.embed import embed
48 48
49 49 from .core.error import TryNext
50 50 from .core.interactiveshell import InteractiveShell
51 51 from .testing import test
52 52 from .utils.sysinfo import sys_info
53 53 from .utils.frame import extract_module_locals
54 54
55 55 # Release data
56 56 __author__ = '%s <%s>' % (release.author, release.author_email)
57 57 __license__ = release.license
58 58 __version__ = release.version
59 59 version_info = release.version_info
60 60
61 61 def embed_kernel(module=None, local_ns=None, **kwargs):
62 62 """Embed and start an IPython kernel in a given scope.
63 63
64 64 Parameters
65 65 ----------
66 66 module : ModuleType, optional
67 67 The module to load into IPython globals (default: caller)
68 68 local_ns : dict, optional
69 69 The namespace to load into IPython user namespace (default: caller)
70 70
71 71 kwargs : various, optional
72 72 Further keyword args are relayed to the IPKernelApp constructor,
73 73 allowing configuration of the Kernel. Will only have an effect
74 74 on the first embed_kernel call for a given process.
75 75
76 76 """
77 77
78 78 (caller_module, caller_locals) = extract_module_locals(1)
79 79 if module is None:
80 80 module = caller_module
81 81 if local_ns is None:
82 82 local_ns = caller_locals
83 83
84 84 # Only import .zmq when we really need it
85 85 from IPython.kernel.zmq.embed import embed_kernel as real_embed_kernel
86 86 real_embed_kernel(module=module, local_ns=local_ns, **kwargs)
@@ -1,77 +1,72 b''
1 1 """
2 2 Shim to maintain backwards compatibility with old frontend imports.
3 3
4 4 We have moved all contents of the old `frontend` subpackage into top-level
5 5 subpackages (`html`, `qt` and `terminal`). This will let code that was making
6 6 `from IPython.frontend...` calls continue working, though a warning will be
7 7 printed.
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (c) 2013, IPython Development Team.
12 12 #
13 13 # Distributed under the terms of the Modified BSD License.
14 14 #
15 15 # The full license is in the file COPYING.txt, distributed with this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21 from __future__ import print_function
22 22
23 23 # Stdlib
24 24 import sys
25 25 import types
26 from warnings import warn
26 27
27 m = """\
28 *** WARNING*** : The top-level `frontend` package has been deprecated.
29 All its subpackages have been moved to the top `IPython` level."""
30
31 print(m, file=sys.stderr)
32
33 # FIXME: turn this into a Warning once we've fixed all our own imports.
34 #raise DeprecationWarning(m)
28 warn("The top-level `frontend` package has been deprecated. "
29 "All its subpackages have been moved to the top `IPython` level.")
35 30
36 31 #-----------------------------------------------------------------------------
37 32 # Class declarations
38 33 #-----------------------------------------------------------------------------
39 34
40 35 class ShimModule(types.ModuleType):
41 36
42 37 def __getattribute__(self, key):
43 38 # Use the equivalent of import_item(name), see below
44 39 name = 'IPython.' + key
45 40
46 41 # NOTE: the code below is copied *verbatim* from
47 42 # importstring.import_item. For some very strange reason that makes no
48 43 # sense to me, if we call it *as a function*, it doesn't work. This
49 44 # has something to do with the deep bowels of the import machinery and
50 45 # I couldn't find a way to make the code work as a standard function
51 46 # call. But at least since it's an unmodified copy of import_item,
52 47 # which is used extensively and has a test suite, we can be reasonably
53 48 # confident this is OK. If anyone finds how to call the function, all
54 49 # the below could be replaced simply with:
55 50 #
56 51 # from IPython.utils.importstring import import_item
57 52 # return import_item('IPython.' + key)
58 53
59 54 parts = name.rsplit('.', 1)
60 55 if len(parts) == 2:
61 56 # called with 'foo.bar....'
62 57 package, obj = parts
63 58 module = __import__(package, fromlist=[obj])
64 59 try:
65 60 pak = module.__dict__[obj]
66 61 except KeyError:
67 62 raise ImportError('No module named %s' % obj)
68 63 return pak
69 64 else:
70 65 # called with un-dotted string
71 66 return __import__(parts[0])
72 67
73 68
74 69 # Unconditionally insert the shim into sys.modules so that further import calls
75 70 # trigger the custom attribute access above
76 71
77 72 sys.modules['IPython.frontend'] = ShimModule('frontend')
@@ -1,7 +1,7 b''
1 1 #!/usr/bin/env python
2 2 """Terminal-based IPython entry point.
3 3 """
4 4
5 from IPython.frontend.terminal.ipapp import launch_new_instance
5 from IPython.terminal.ipapp import launch_new_instance
6 6
7 7 launch_new_instance()
@@ -1,296 +1,296 b''
1 1 # encoding: utf-8
2 2 """
3 3 An embedded IPython shell.
4 4
5 5 Authors:
6 6
7 7 * Brian Granger
8 8 * Fernando Perez
9 9
10 10 Notes
11 11 -----
12 12 """
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Copyright (C) 2008-2011 The IPython Development Team
16 16 #
17 17 # Distributed under the terms of the BSD License. The full license is in
18 18 # the file COPYING, distributed as part of this software.
19 19 #-----------------------------------------------------------------------------
20 20
21 21 #-----------------------------------------------------------------------------
22 22 # Imports
23 23 #-----------------------------------------------------------------------------
24 24
25 25 from __future__ import with_statement
26 26
27 27 import sys
28 28 import warnings
29 29
30 30 # We need to use nested to support python 2.6, once we move to >=2.7, we can
31 31 # use the with keyword's new builtin support for nested managers
32 32 try:
33 33 from contextlib import nested
34 34 except:
35 35 from IPython.utils.nested_context import nested
36 36
37 37 from IPython.core import ultratb, compilerop
38 38 from IPython.core.magic import Magics, magics_class, line_magic
39 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
40 from IPython.frontend.terminal.ipapp import load_default_config
39 from IPython.terminal.interactiveshell import TerminalInteractiveShell
40 from IPython.terminal.ipapp import load_default_config
41 41
42 42 from IPython.utils.traitlets import Bool, CBool, Unicode
43 43 from IPython.utils.io import ask_yes_no
44 44
45 45
46 46 #-----------------------------------------------------------------------------
47 47 # Classes and functions
48 48 #-----------------------------------------------------------------------------
49 49
50 50 # This is an additional magic that is exposed in embedded shells.
51 51 @magics_class
52 52 class EmbeddedMagics(Magics):
53 53
54 54 @line_magic
55 55 def kill_embedded(self, parameter_s=''):
56 56 """%kill_embedded : deactivate for good the current embedded IPython.
57 57
58 58 This function (after asking for confirmation) sets an internal flag so
59 59 that an embedded IPython will never activate again. This is useful to
60 60 permanently disable a shell that is being called inside a loop: once
61 61 you've figured out what you needed from it, you may then kill it and
62 62 the program will then continue to run without the interactive shell
63 63 interfering again.
64 64 """
65 65
66 66 kill = ask_yes_no("Are you sure you want to kill this embedded instance "
67 67 "(y/n)? [y/N] ",'n')
68 68 if kill:
69 69 self.shell.embedded_active = False
70 70 print ("This embedded IPython will not reactivate anymore "
71 71 "once you exit.")
72 72
73 73
74 74 class InteractiveShellEmbed(TerminalInteractiveShell):
75 75
76 76 dummy_mode = Bool(False)
77 77 exit_msg = Unicode('')
78 78 embedded = CBool(True)
79 79 embedded_active = CBool(True)
80 80 # Like the base class display_banner is not configurable, but here it
81 81 # is True by default.
82 82 display_banner = CBool(True)
83 83
84 84 def __init__(self, config=None, ipython_dir=None, user_ns=None,
85 85 user_module=None, custom_exceptions=((),None),
86 86 usage=None, banner1=None, banner2=None,
87 87 display_banner=None, exit_msg=u'', user_global_ns=None):
88 88
89 89 if user_global_ns is not None:
90 90 warnings.warn("user_global_ns has been replaced by user_module. The\
91 91 parameter will be ignored.", DeprecationWarning)
92 92
93 93 super(InteractiveShellEmbed,self).__init__(
94 94 config=config, ipython_dir=ipython_dir, user_ns=user_ns,
95 95 user_module=user_module, custom_exceptions=custom_exceptions,
96 96 usage=usage, banner1=banner1, banner2=banner2,
97 97 display_banner=display_banner
98 98 )
99 99
100 100 self.exit_msg = exit_msg
101 101
102 102 # don't use the ipython crash handler so that user exceptions aren't
103 103 # trapped
104 104 sys.excepthook = ultratb.FormattedTB(color_scheme=self.colors,
105 105 mode=self.xmode,
106 106 call_pdb=self.pdb)
107 107
108 108 def init_sys_modules(self):
109 109 pass
110 110
111 111 def init_magics(self):
112 112 super(InteractiveShellEmbed, self).init_magics()
113 113 self.register_magics(EmbeddedMagics)
114 114
115 115 def __call__(self, header='', local_ns=None, module=None, dummy=None,
116 116 stack_depth=1, global_ns=None, compile_flags=None):
117 117 """Activate the interactive interpreter.
118 118
119 119 __call__(self,header='',local_ns=None,module=None,dummy=None) -> Start
120 120 the interpreter shell with the given local and global namespaces, and
121 121 optionally print a header string at startup.
122 122
123 123 The shell can be globally activated/deactivated using the
124 124 dummy_mode attribute. This allows you to turn off a shell used
125 125 for debugging globally.
126 126
127 127 However, *each* time you call the shell you can override the current
128 128 state of dummy_mode with the optional keyword parameter 'dummy'. For
129 129 example, if you set dummy mode on with IPShell.dummy_mode = True, you
130 130 can still have a specific call work by making it as IPShell(dummy=False).
131 131 """
132 132
133 133 # If the user has turned it off, go away
134 134 if not self.embedded_active:
135 135 return
136 136
137 137 # Normal exits from interactive mode set this flag, so the shell can't
138 138 # re-enter (it checks this variable at the start of interactive mode).
139 139 self.exit_now = False
140 140
141 141 # Allow the dummy parameter to override the global __dummy_mode
142 142 if dummy or (dummy != 0 and self.dummy_mode):
143 143 return
144 144
145 145 if self.has_readline:
146 146 self.set_readline_completer()
147 147
148 148 # self.banner is auto computed
149 149 if header:
150 150 self.old_banner2 = self.banner2
151 151 self.banner2 = self.banner2 + '\n' + header + '\n'
152 152 else:
153 153 self.old_banner2 = ''
154 154
155 155 # Call the embedding code with a stack depth of 1 so it can skip over
156 156 # our call and get the original caller's namespaces.
157 157 self.mainloop(local_ns, module, stack_depth=stack_depth,
158 158 global_ns=global_ns, compile_flags=compile_flags)
159 159
160 160 self.banner2 = self.old_banner2
161 161
162 162 if self.exit_msg is not None:
163 163 print self.exit_msg
164 164
165 165 def mainloop(self, local_ns=None, module=None, stack_depth=0,
166 166 display_banner=None, global_ns=None, compile_flags=None):
167 167 """Embeds IPython into a running python program.
168 168
169 169 Input:
170 170
171 171 - header: An optional header message can be specified.
172 172
173 173 - local_ns, module: working local namespace (a dict) and module (a
174 174 module or similar object). If given as None, they are automatically
175 175 taken from the scope where the shell was called, so that
176 176 program variables become visible.
177 177
178 178 - stack_depth: specifies how many levels in the stack to go to
179 179 looking for namespaces (when local_ns or module is None). This
180 180 allows an intermediate caller to make sure that this function gets
181 181 the namespace from the intended level in the stack. By default (0)
182 182 it will get its locals and globals from the immediate caller.
183 183
184 184 - compile_flags: A bit field identifying the __future__ features
185 185 that are enabled, as passed to the builtin `compile` function. If
186 186 given as None, they are automatically taken from the scope where the
187 187 shell was called.
188 188
189 189 Warning: it's possible to use this in a program which is being run by
190 190 IPython itself (via %run), but some funny things will happen (a few
191 191 globals get overwritten). In the future this will be cleaned up, as
192 192 there is no fundamental reason why it can't work perfectly."""
193 193
194 194 if (global_ns is not None) and (module is None):
195 195 class DummyMod(object):
196 196 """A dummy module object for embedded IPython."""
197 197 pass
198 198 warnings.warn("global_ns is deprecated, use module instead.", DeprecationWarning)
199 199 module = DummyMod()
200 200 module.__dict__ = global_ns
201 201
202 202 # Get locals and globals from caller
203 203 if ((local_ns is None or module is None or compile_flags is None)
204 204 and self.default_user_namespaces):
205 205 call_frame = sys._getframe(stack_depth).f_back
206 206
207 207 if local_ns is None:
208 208 local_ns = call_frame.f_locals
209 209 if module is None:
210 210 global_ns = call_frame.f_globals
211 211 module = sys.modules[global_ns['__name__']]
212 212 if compile_flags is None:
213 213 compile_flags = (call_frame.f_code.co_flags &
214 214 compilerop.PyCF_MASK)
215 215
216 216 # Save original namespace and module so we can restore them after
217 217 # embedding; otherwise the shell doesn't shut down correctly.
218 218 orig_user_module = self.user_module
219 219 orig_user_ns = self.user_ns
220 220 orig_compile_flags = self.compile.flags
221 221
222 222 # Update namespaces and fire up interpreter
223 223
224 224 # The global one is easy, we can just throw it in
225 225 if module is not None:
226 226 self.user_module = module
227 227
228 228 # But the user/local one is tricky: ipython needs it to store internal
229 229 # data, but we also need the locals. We'll throw our hidden variables
230 230 # like _ih and get_ipython() into the local namespace, but delete them
231 231 # later.
232 232 if local_ns is not None:
233 233 self.user_ns = local_ns
234 234 self.init_user_ns()
235 235
236 236 # Compiler flags
237 237 if compile_flags is not None:
238 238 self.compile.flags = compile_flags
239 239
240 240 # Patch for global embedding to make sure that things don't overwrite
241 241 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
242 242 # FIXME. Test this a bit more carefully (the if.. is new)
243 243 # N.B. This can't now ever be called. Not sure what it was for.
244 244 # And now, since it wasn't called in the previous version, I'm
245 245 # commenting out these lines so they can't be called with my new changes
246 246 # --TK, 2011-12-10
247 247 #if local_ns is None and module is None:
248 248 # self.user_global_ns.update(__main__.__dict__)
249 249
250 250 # make sure the tab-completer has the correct frame information, so it
251 251 # actually completes using the frame's locals/globals
252 252 self.set_completer_frame()
253 253
254 254 with nested(self.builtin_trap, self.display_trap):
255 255 self.interact(display_banner=display_banner)
256 256
257 257 # now, purge out the local namespace of IPython's hidden variables.
258 258 if local_ns is not None:
259 259 for name in self.user_ns_hidden:
260 260 local_ns.pop(name, None)
261 261
262 262 # Restore original namespace so shell can shut down when we exit.
263 263 self.user_module = orig_user_module
264 264 self.user_ns = orig_user_ns
265 265 self.compile.flags = orig_compile_flags
266 266
267 267
268 268 def embed(**kwargs):
269 269 """Call this to embed IPython at the current point in your program.
270 270
271 271 The first invocation of this will create an :class:`InteractiveShellEmbed`
272 272 instance and then call it. Consecutive calls just call the already
273 273 created instance.
274 274
275 275 Here is a simple example::
276 276
277 277 from IPython import embed
278 278 a = 10
279 279 b = 20
280 280 embed('First time')
281 281 c = 30
282 282 d = 40
283 283 embed
284 284
285 285 Full customization can be done by passing a :class:`Config` in as the
286 286 config argument.
287 287 """
288 288 config = kwargs.get('config')
289 289 header = kwargs.pop('header', u'')
290 290 compile_flags = kwargs.pop('compile_flags', None)
291 291 if config is None:
292 292 config = load_default_config()
293 293 config.InteractiveShellEmbed = config.TerminalInteractiveShell
294 294 kwargs['config'] = config
295 295 shell = InteractiveShellEmbed.instance(**kwargs)
296 296 shell(header=header, stack_depth=2, compile_flags=compile_flags)
@@ -1,395 +1,395 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 The :class:`~IPython.core.application.Application` object for the command
5 5 line :command:`ipython` program.
6 6
7 7 Authors
8 8 -------
9 9
10 10 * Brian Granger
11 11 * Fernando Perez
12 12 * Min Ragan-Kelley
13 13 """
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Copyright (C) 2008-2011 The IPython Development Team
17 17 #
18 18 # Distributed under the terms of the BSD License. The full license is in
19 19 # the file COPYING, distributed as part of this software.
20 20 #-----------------------------------------------------------------------------
21 21
22 22 #-----------------------------------------------------------------------------
23 23 # Imports
24 24 #-----------------------------------------------------------------------------
25 25
26 26 from __future__ import absolute_import
27 27
28 28 import logging
29 29 import os
30 30 import sys
31 31
32 32 from IPython.config.loader import (
33 33 Config, PyFileConfigLoader, ConfigFileNotFound
34 34 )
35 35 from IPython.config.application import boolean_flag, catch_config_error
36 36 from IPython.core import release
37 37 from IPython.core import usage
38 38 from IPython.core.completer import IPCompleter
39 39 from IPython.core.crashhandler import CrashHandler
40 40 from IPython.core.formatters import PlainTextFormatter
41 41 from IPython.core.history import HistoryManager
42 42 from IPython.core.prompts import PromptManager
43 43 from IPython.core.application import (
44 44 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
45 45 )
46 46 from IPython.core.magics import ScriptMagics
47 47 from IPython.core.shellapp import (
48 48 InteractiveShellApp, shell_flags, shell_aliases
49 49 )
50 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
50 from IPython.terminal.interactiveshell import TerminalInteractiveShell
51 51 from IPython.utils import warn
52 52 from IPython.utils.path import get_ipython_dir, check_for_old_config
53 53 from IPython.utils.traitlets import (
54 54 Bool, List, Dict, CaselessStrEnum
55 55 )
56 56
57 57 #-----------------------------------------------------------------------------
58 58 # Globals, utilities and helpers
59 59 #-----------------------------------------------------------------------------
60 60
61 61 #: The default config file name for this application.
62 62 default_config_file_name = u'ipython_config.py'
63 63
64 64 _examples = """
65 65 ipython --pylab # start in pylab mode
66 66 ipython --pylab=qt # start in pylab mode with the qt4 backend
67 67 ipython --log-level=DEBUG # set logging to DEBUG
68 68 ipython --profile=foo # start with profile foo
69 69
70 70 ipython qtconsole # start the qtconsole GUI application
71 71 ipython help qtconsole # show the help for the qtconsole subcmd
72 72
73 73 ipython console # start the terminal-based console application
74 74 ipython help console # show the help for the console subcmd
75 75
76 76 ipython notebook # start the IPython notebook
77 77 ipython help notebook # show the help for the notebook subcmd
78 78
79 79 ipython profile create foo # create profile foo w/ default config files
80 80 ipython help profile # show the help for the profile subcmd
81 81
82 82 ipython locate # print the path to the IPython directory
83 83 ipython locate profile foo # print the path to the directory for profile `foo`
84 84 """
85 85
86 86 #-----------------------------------------------------------------------------
87 87 # Crash handler for this application
88 88 #-----------------------------------------------------------------------------
89 89
90 90 class IPAppCrashHandler(CrashHandler):
91 91 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
92 92
93 93 def __init__(self, app):
94 94 contact_name = release.author
95 95 contact_email = release.author_email
96 96 bug_tracker = 'https://github.com/ipython/ipython/issues'
97 97 super(IPAppCrashHandler,self).__init__(
98 98 app, contact_name, contact_email, bug_tracker
99 99 )
100 100
101 101 def make_report(self,traceback):
102 102 """Return a string containing a crash report."""
103 103
104 104 sec_sep = self.section_sep
105 105 # Start with parent report
106 106 report = [super(IPAppCrashHandler, self).make_report(traceback)]
107 107 # Add interactive-specific info we may have
108 108 rpt_add = report.append
109 109 try:
110 110 rpt_add(sec_sep+"History of session input:")
111 111 for line in self.app.shell.user_ns['_ih']:
112 112 rpt_add(line)
113 113 rpt_add('\n*** Last line of input (may not be in above history):\n')
114 114 rpt_add(self.app.shell._last_input_line+'\n')
115 115 except:
116 116 pass
117 117
118 118 return ''.join(report)
119 119
120 120 #-----------------------------------------------------------------------------
121 121 # Aliases and Flags
122 122 #-----------------------------------------------------------------------------
123 123 flags = dict(base_flags)
124 124 flags.update(shell_flags)
125 125 frontend_flags = {}
126 126 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
127 127 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
128 128 'Turn on auto editing of files with syntax errors.',
129 129 'Turn off auto editing of files with syntax errors.'
130 130 )
131 131 addflag('banner', 'TerminalIPythonApp.display_banner',
132 132 "Display a banner upon starting IPython.",
133 133 "Don't display a banner upon starting IPython."
134 134 )
135 135 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
136 136 """Set to confirm when you try to exit IPython with an EOF (Control-D
137 137 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
138 138 you can force a direct exit without any confirmation.""",
139 139 "Don't prompt the user when exiting."
140 140 )
141 141 addflag('term-title', 'TerminalInteractiveShell.term_title',
142 142 "Enable auto setting the terminal title.",
143 143 "Disable auto setting the terminal title."
144 144 )
145 145 classic_config = Config()
146 146 classic_config.InteractiveShell.cache_size = 0
147 147 classic_config.PlainTextFormatter.pprint = False
148 148 classic_config.PromptManager.in_template = '>>> '
149 149 classic_config.PromptManager.in2_template = '... '
150 150 classic_config.PromptManager.out_template = ''
151 151 classic_config.InteractiveShell.separate_in = ''
152 152 classic_config.InteractiveShell.separate_out = ''
153 153 classic_config.InteractiveShell.separate_out2 = ''
154 154 classic_config.InteractiveShell.colors = 'NoColor'
155 155 classic_config.InteractiveShell.xmode = 'Plain'
156 156
157 157 frontend_flags['classic']=(
158 158 classic_config,
159 159 "Gives IPython a similar feel to the classic Python prompt."
160 160 )
161 161 # # log doesn't make so much sense this way anymore
162 162 # paa('--log','-l',
163 163 # action='store_true', dest='InteractiveShell.logstart',
164 164 # help="Start logging to the default log file (./ipython_log.py).")
165 165 #
166 166 # # quick is harder to implement
167 167 frontend_flags['quick']=(
168 168 {'TerminalIPythonApp' : {'quick' : True}},
169 169 "Enable quick startup with no config files."
170 170 )
171 171
172 172 frontend_flags['i'] = (
173 173 {'TerminalIPythonApp' : {'force_interact' : True}},
174 174 """If running code from the command line, become interactive afterwards.
175 175 Note: can also be given simply as '-i.'"""
176 176 )
177 177 flags.update(frontend_flags)
178 178
179 179 aliases = dict(base_aliases)
180 180 aliases.update(shell_aliases)
181 181
182 182 #-----------------------------------------------------------------------------
183 183 # Main classes and functions
184 184 #-----------------------------------------------------------------------------
185 185
186 186
187 187 class LocateIPythonApp(BaseIPythonApplication):
188 188 description = """print the path to the IPython dir"""
189 189 subcommands = Dict(dict(
190 190 profile=('IPython.core.profileapp.ProfileLocate',
191 191 "print the path to an IPython profile directory",
192 192 ),
193 193 ))
194 194 def start(self):
195 195 if self.subapp is not None:
196 196 return self.subapp.start()
197 197 else:
198 198 print self.ipython_dir
199 199
200 200
201 201 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
202 202 name = u'ipython'
203 203 description = usage.cl_usage
204 204 default_config_file_name = default_config_file_name
205 205 crash_handler_class = IPAppCrashHandler
206 206 examples = _examples
207 207
208 208 flags = Dict(flags)
209 209 aliases = Dict(aliases)
210 210 classes = List()
211 211 def _classes_default(self):
212 212 """This has to be in a method, for TerminalIPythonApp to be available."""
213 213 return [
214 214 InteractiveShellApp, # ShellApp comes before TerminalApp, because
215 215 self.__class__, # it will also affect subclasses (e.g. QtConsole)
216 216 TerminalInteractiveShell,
217 217 PromptManager,
218 218 HistoryManager,
219 219 ProfileDir,
220 220 PlainTextFormatter,
221 221 IPCompleter,
222 222 ScriptMagics,
223 223 ]
224 224
225 225 subcommands = Dict(dict(
226 qtconsole=('IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp',
226 qtconsole=('IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp',
227 227 """Launch the IPython Qt Console."""
228 228 ),
229 notebook=('IPython.frontend.html.notebook.notebookapp.NotebookApp',
229 notebook=('IPython.html.notebook.notebookapp.NotebookApp',
230 230 """Launch the IPython HTML Notebook Server."""
231 231 ),
232 232 profile = ("IPython.core.profileapp.ProfileApp",
233 233 "Create and manage IPython profiles."
234 234 ),
235 235 kernel = ("IPython.kernel.zmq.kernelapp.IPKernelApp",
236 236 "Start a kernel without an attached frontend."
237 237 ),
238 console=('IPython.frontend.terminal.console.app.ZMQTerminalIPythonApp',
238 console=('IPython.terminal.console.app.ZMQTerminalIPythonApp',
239 239 """Launch the IPython terminal-based Console."""
240 240 ),
241 locate=('IPython.frontend.terminal.ipapp.LocateIPythonApp',
241 locate=('IPython.terminal.ipapp.LocateIPythonApp',
242 242 LocateIPythonApp.description
243 243 ),
244 244 history=('IPython.core.historyapp.HistoryApp',
245 245 "Manage the IPython history database."
246 246 ),
247 247 ))
248 248
249 249 # *do* autocreate requested profile, but don't create the config file.
250 250 auto_create=Bool(True)
251 251 # configurables
252 252 ignore_old_config=Bool(False, config=True,
253 253 help="Suppress warning messages about legacy config files"
254 254 )
255 255 quick = Bool(False, config=True,
256 256 help="""Start IPython quickly by skipping the loading of config files."""
257 257 )
258 258 def _quick_changed(self, name, old, new):
259 259 if new:
260 260 self.load_config_file = lambda *a, **kw: None
261 261 self.ignore_old_config=True
262 262
263 263 display_banner = Bool(True, config=True,
264 264 help="Whether to display a banner upon starting IPython."
265 265 )
266 266
267 267 # if there is code of files to run from the cmd line, don't interact
268 268 # unless the --i flag (App.force_interact) is true.
269 269 force_interact = Bool(False, config=True,
270 270 help="""If a command or file is given via the command-line,
271 271 e.g. 'ipython foo.py"""
272 272 )
273 273 def _force_interact_changed(self, name, old, new):
274 274 if new:
275 275 self.interact = True
276 276
277 277 def _file_to_run_changed(self, name, old, new):
278 278 if new:
279 279 self.something_to_run = True
280 280 if new and not self.force_interact:
281 281 self.interact = False
282 282 _code_to_run_changed = _file_to_run_changed
283 283 _module_to_run_changed = _file_to_run_changed
284 284
285 285 # internal, not-configurable
286 286 interact=Bool(True)
287 287 something_to_run=Bool(False)
288 288
289 289 def parse_command_line(self, argv=None):
290 290 """override to allow old '-pylab' flag with deprecation warning"""
291 291
292 292 argv = sys.argv[1:] if argv is None else argv
293 293
294 294 if '-pylab' in argv:
295 295 # deprecated `-pylab` given,
296 296 # warn and transform into current syntax
297 297 argv = argv[:] # copy, don't clobber
298 298 idx = argv.index('-pylab')
299 299 warn.warn("`-pylab` flag has been deprecated.\n"
300 300 " Use `--pylab` instead, or `--pylab=foo` to specify a backend.")
301 301 sub = '--pylab'
302 302 if len(argv) > idx+1:
303 303 # check for gui arg, as in '-pylab qt'
304 304 gui = argv[idx+1]
305 305 if gui in ('wx', 'qt', 'qt4', 'gtk', 'auto'):
306 306 sub = '--pylab='+gui
307 307 argv.pop(idx+1)
308 308 argv[idx] = sub
309 309
310 310 return super(TerminalIPythonApp, self).parse_command_line(argv)
311 311
312 312 @catch_config_error
313 313 def initialize(self, argv=None):
314 314 """Do actions after construct, but before starting the app."""
315 315 super(TerminalIPythonApp, self).initialize(argv)
316 316 if self.subapp is not None:
317 317 # don't bother initializing further, starting subapp
318 318 return
319 319 if not self.ignore_old_config:
320 320 check_for_old_config(self.ipython_dir)
321 321 # print self.extra_args
322 322 if self.extra_args and not self.something_to_run:
323 323 self.file_to_run = self.extra_args[0]
324 324 self.init_path()
325 325 # create the shell
326 326 self.init_shell()
327 327 # and draw the banner
328 328 self.init_banner()
329 329 # Now a variety of things that happen after the banner is printed.
330 330 self.init_gui_pylab()
331 331 self.init_extensions()
332 332 self.init_code()
333 333
334 334 def init_shell(self):
335 335 """initialize the InteractiveShell instance"""
336 336 # Create an InteractiveShell instance.
337 337 # shell.display_banner should always be False for the terminal
338 338 # based app, because we call shell.show_banner() by hand below
339 339 # so the banner shows *before* all extension loading stuff.
340 340 self.shell = TerminalInteractiveShell.instance(config=self.config,
341 341 display_banner=False, profile_dir=self.profile_dir,
342 342 ipython_dir=self.ipython_dir)
343 343 self.shell.configurables.append(self)
344 344
345 345 def init_banner(self):
346 346 """optionally display the banner"""
347 347 if self.display_banner and self.interact:
348 348 self.shell.show_banner()
349 349 # Make sure there is a space below the banner.
350 350 if self.log_level <= logging.INFO: print
351 351
352 352 def _pylab_changed(self, name, old, new):
353 353 """Replace --pylab='inline' with --pylab='auto'"""
354 354 if new == 'inline':
355 355 warn.warn("'inline' not available as pylab backend, "
356 356 "using 'auto' instead.")
357 357 self.pylab = 'auto'
358 358
359 359 def start(self):
360 360 if self.subapp is not None:
361 361 return self.subapp.start()
362 362 # perform any prexec steps:
363 363 if self.interact:
364 364 self.log.debug("Starting IPython's mainloop...")
365 365 self.shell.mainloop()
366 366 else:
367 367 self.log.debug("IPython not interactive...")
368 368
369 369
370 370 def load_default_config(ipython_dir=None):
371 371 """Load the default config file from the default ipython_dir.
372 372
373 373 This is useful for embedded shells.
374 374 """
375 375 if ipython_dir is None:
376 376 ipython_dir = get_ipython_dir()
377 377 profile_dir = os.path.join(ipython_dir, 'profile_default')
378 378 cl = PyFileConfigLoader(default_config_file_name, profile_dir)
379 379 try:
380 380 config = cl.load_config()
381 381 except ConfigFileNotFound:
382 382 # no config found
383 383 config = Config()
384 384 return config
385 385
386 386
387 387 def launch_new_instance():
388 388 """Create and run a full blown IPython instance"""
389 389 app = TerminalIPythonApp.instance()
390 390 app.initialize()
391 391 app.start()
392 392
393 393
394 394 if __name__ == '__main__':
395 395 launch_new_instance()
General Comments 0
You need to be logged in to leave comments. Login now