Show More
@@ -0,0 +1,57 b'' | |||||
|
1 | """Simple function for embedding an IPython kernel | |||
|
2 | """ | |||
|
3 | #----------------------------------------------------------------------------- | |||
|
4 | # Imports | |||
|
5 | #----------------------------------------------------------------------------- | |||
|
6 | ||||
|
7 | import sys | |||
|
8 | ||||
|
9 | from IPython.utils.frame import extract_module_locals | |||
|
10 | ||||
|
11 | from kernelapp import IPKernelApp | |||
|
12 | ||||
|
13 | #----------------------------------------------------------------------------- | |||
|
14 | # Code | |||
|
15 | #----------------------------------------------------------------------------- | |||
|
16 | ||||
|
17 | def embed_kernel(module=None, local_ns=None, **kwargs): | |||
|
18 | """Embed and start an IPython kernel in a given scope. | |||
|
19 | ||||
|
20 | Parameters | |||
|
21 | ---------- | |||
|
22 | module : ModuleType, optional | |||
|
23 | The module to load into IPython globals (default: caller) | |||
|
24 | local_ns : dict, optional | |||
|
25 | The namespace to load into IPython user namespace (default: caller) | |||
|
26 | ||||
|
27 | kwargs : various, optional | |||
|
28 | Further keyword args are relayed to the KernelApp constructor, | |||
|
29 | allowing configuration of the Kernel. Will only have an effect | |||
|
30 | on the first embed_kernel call for a given process. | |||
|
31 | ||||
|
32 | """ | |||
|
33 | # get the app if it exists, or set it up if it doesn't | |||
|
34 | if IPKernelApp.initialized(): | |||
|
35 | app = IPKernelApp.instance() | |||
|
36 | else: | |||
|
37 | app = IPKernelApp.instance(**kwargs) | |||
|
38 | app.initialize([]) | |||
|
39 | # Undo unnecessary sys module mangling from init_sys_modules. | |||
|
40 | # This would not be necessary if we could prevent it | |||
|
41 | # in the first place by using a different InteractiveShell | |||
|
42 | # subclass, as in the regular embed case. | |||
|
43 | main = app.kernel.shell._orig_sys_modules_main_mod | |||
|
44 | if main is not None: | |||
|
45 | sys.modules[app.kernel.shell._orig_sys_modules_main_name] = main | |||
|
46 | ||||
|
47 | # load the calling scope if not given | |||
|
48 | (caller_module, caller_locals) = extract_module_locals(1) | |||
|
49 | if module is None: | |||
|
50 | module = caller_module | |||
|
51 | if local_ns is None: | |||
|
52 | local_ns = caller_locals | |||
|
53 | ||||
|
54 | app.kernel.user_module = module | |||
|
55 | app.kernel.user_ns = local_ns | |||
|
56 | app.shell.set_completer_frame() | |||
|
57 | app.start() |
@@ -81,5 +81,5 b' def embed_kernel(module=None, local_ns=None, **kwargs):' | |||||
81 | local_ns = caller_locals |
|
81 | local_ns = caller_locals | |
82 |
|
82 | |||
83 | # Only import .zmq when we really need it |
|
83 | # Only import .zmq when we really need it | |
84 |
from .zmq. |
|
84 | from .zmq.embed import embed_kernel as real_embed_kernel | |
85 | real_embed_kernel(module=module, local_ns=local_ns, **kwargs) |
|
85 | real_embed_kernel(module=module, local_ns=local_ns, **kwargs) |
@@ -42,9 +42,9 b' from IPython.utils.py3compat import str_to_bytes' | |||||
42 | from IPython.utils.traitlets import ( |
|
42 | from IPython.utils.traitlets import ( | |
43 | Dict, List, Unicode, CUnicode, Int, CBool, Any, CaselessStrEnum |
|
43 | Dict, List, Unicode, CUnicode, Int, CBool, Any, CaselessStrEnum | |
44 | ) |
|
44 | ) | |
45 |
from IPython.zmq. |
|
45 | from IPython.zmq.kernelapp import ( | |
46 |
|
|
46 | kernel_flags, | |
47 |
|
|
47 | kernel_aliases, | |
48 | IPKernelApp |
|
48 | IPKernelApp | |
49 | ) |
|
49 | ) | |
50 | from IPython.zmq.session import Session, default_secure |
|
50 | from IPython.zmq.session import Session, default_secure | |
@@ -65,7 +65,7 b' from IPython.utils.localinterfaces import LOCALHOST, LOCAL_IPS' | |||||
65 | # Aliases and Flags |
|
65 | # Aliases and Flags | |
66 | #----------------------------------------------------------------------------- |
|
66 | #----------------------------------------------------------------------------- | |
67 |
|
67 | |||
68 |
flags = dict( |
|
68 | flags = dict(kernel_flags) | |
69 |
|
69 | |||
70 | # the flags that are specific to the frontend |
|
70 | # the flags that are specific to the frontend | |
71 | # these must be scrubbed before being passed to the kernel, |
|
71 | # these must be scrubbed before being passed to the kernel, | |
@@ -85,7 +85,7 b' app_flags.update(boolean_flag(' | |||||
85 | )) |
|
85 | )) | |
86 | flags.update(app_flags) |
|
86 | flags.update(app_flags) | |
87 |
|
87 | |||
88 |
aliases = dict( |
|
88 | aliases = dict(kernel_aliases) | |
89 |
|
89 | |||
90 | # also scrub aliases from the frontend |
|
90 | # also scrub aliases from the frontend | |
91 | app_aliases = dict( |
|
91 | app_aliases = dict( |
@@ -63,9 +63,9 b' from IPython.core.profiledir import ProfileDir' | |||||
63 | from IPython.frontend.consoleapp import IPythonConsoleApp |
|
63 | from IPython.frontend.consoleapp import IPythonConsoleApp | |
64 | from IPython.zmq.session import Session, default_secure |
|
64 | from IPython.zmq.session import Session, default_secure | |
65 | from IPython.zmq.zmqshell import ZMQInteractiveShell |
|
65 | from IPython.zmq.zmqshell import ZMQInteractiveShell | |
66 |
from IPython.zmq. |
|
66 | from IPython.zmq.kernelapp import ( | |
67 |
|
|
67 | kernel_flags, | |
68 |
|
|
68 | kernel_aliases, | |
69 | IPKernelApp |
|
69 | IPKernelApp | |
70 | ) |
|
70 | ) | |
71 | from IPython.utils.importstring import import_item |
|
71 | from IPython.utils.importstring import import_item | |
@@ -195,7 +195,7 b' class NotebookWebApplication(web.Application):' | |||||
195 | # Aliases and Flags |
|
195 | # Aliases and Flags | |
196 | #----------------------------------------------------------------------------- |
|
196 | #----------------------------------------------------------------------------- | |
197 |
|
197 | |||
198 |
flags = dict( |
|
198 | flags = dict(kernel_flags) | |
199 | flags['no-browser']=( |
|
199 | flags['no-browser']=( | |
200 | {'NotebookApp' : {'open_browser' : False}}, |
|
200 | {'NotebookApp' : {'open_browser' : False}}, | |
201 | "Don't open the notebook in a browser after startup." |
|
201 | "Don't open the notebook in a browser after startup." | |
@@ -234,7 +234,7 b" flags.update(boolean_flag('script', 'FileNotebookManager.save_script'," | |||||
234 | # or it will raise an error on unrecognized flags |
|
234 | # or it will raise an error on unrecognized flags | |
235 | notebook_flags = ['no-browser', 'no-mathjax', 'read-only', 'script', 'no-script'] |
|
235 | notebook_flags = ['no-browser', 'no-mathjax', 'read-only', 'script', 'no-script'] | |
236 |
|
236 | |||
237 |
aliases = dict( |
|
237 | aliases = dict(kernel_aliases) | |
238 |
|
238 | |||
239 | aliases.update({ |
|
239 | aliases.update({ | |
240 | 'ip': 'NotebookApp.ip', |
|
240 | 'ip': 'NotebookApp.ip', |
@@ -71,7 +71,7 b' from IPython.utils.py3compat import str_to_bytes' | |||||
71 | from IPython.utils.traitlets import ( |
|
71 | from IPython.utils.traitlets import ( | |
72 | Dict, List, Unicode, Integer, CaselessStrEnum, CBool, Any |
|
72 | Dict, List, Unicode, Integer, CaselessStrEnum, CBool, Any | |
73 | ) |
|
73 | ) | |
74 |
from IPython.zmq. |
|
74 | from IPython.zmq.kernelapp import IPKernelApp | |
75 | from IPython.zmq.session import Session, default_secure |
|
75 | from IPython.zmq.session import Session, default_secure | |
76 | from IPython.zmq.zmqshell import ZMQInteractiveShell |
|
76 | from IPython.zmq.zmqshell import ZMQInteractiveShell | |
77 |
|
77 |
@@ -24,7 +24,7 b' from IPython.utils.traitlets import (' | |||||
24 | ) |
|
24 | ) | |
25 | from IPython.utils.warn import warn,error |
|
25 | from IPython.utils.warn import warn,error | |
26 |
|
26 | |||
27 |
from IPython.zmq. |
|
27 | from IPython.zmq.kernelapp import IPKernelApp | |
28 | from IPython.zmq.session import Session, default_secure |
|
28 | from IPython.zmq.session import Session, default_secure | |
29 | from IPython.zmq.zmqshell import ZMQInteractiveShell |
|
29 | from IPython.zmq.zmqshell import ZMQInteractiveShell | |
30 | from IPython.frontend.consoleapp import ( |
|
30 | from IPython.frontend.consoleapp import ( |
@@ -233,7 +233,7 b' class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):' | |||||
233 | profile = ("IPython.core.profileapp.ProfileApp", |
|
233 | profile = ("IPython.core.profileapp.ProfileApp", | |
234 | "Create and manage IPython profiles." |
|
234 | "Create and manage IPython profiles." | |
235 | ), |
|
235 | ), | |
236 |
kernel = ("IPython.zmq. |
|
236 | kernel = ("IPython.zmq.kernelapp.IPKernelApp", | |
237 | "Start a kernel without an attached frontend." |
|
237 | "Start a kernel without an attached frontend." | |
238 | ), |
|
238 | ), | |
239 | console=('IPython.frontend.terminal.console.app.ZMQTerminalIPythonApp', |
|
239 | console=('IPython.frontend.terminal.console.app.ZMQTerminalIPythonApp', |
@@ -127,7 +127,7 b' def get_connection_file(app=None):' | |||||
127 | If unspecified, the currently running app will be used |
|
127 | If unspecified, the currently running app will be used | |
128 | """ |
|
128 | """ | |
129 | if app is None: |
|
129 | if app is None: | |
130 |
from IPython.zmq. |
|
130 | from IPython.zmq.kernelapp import IPKernelApp | |
131 | if not IPKernelApp.initialized(): |
|
131 | if not IPKernelApp.initialized(): | |
132 | raise RuntimeError("app not specified, and not in a running Kernel") |
|
132 | raise RuntimeError("app not specified, and not in a running Kernel") | |
133 |
|
133 |
@@ -50,7 +50,7 b' def bind_kernel(**kwargs):' | |||||
50 |
|
50 | |||
51 | This function returns immediately. |
|
51 | This function returns immediately. | |
52 | """ |
|
52 | """ | |
53 |
from IPython.zmq. |
|
53 | from IPython.zmq.kernelapp import IPKernelApp | |
54 | from IPython.parallel.apps.ipengineapp import IPEngineApp |
|
54 | from IPython.parallel.apps.ipengineapp import IPEngineApp | |
55 |
|
55 | |||
56 | # first check for IPKernelApp, in which case this should be a no-op |
|
56 | # first check for IPKernelApp, in which case this should be a no-op |
@@ -37,7 +37,8 b' from IPython.parallel.apps.baseapp import (' | |||||
37 | catch_config_error, |
|
37 | catch_config_error, | |
38 | ) |
|
38 | ) | |
39 | from IPython.zmq.log import EnginePUBHandler |
|
39 | from IPython.zmq.log import EnginePUBHandler | |
40 |
from IPython.zmq.ipkernel import Kernel |
|
40 | from IPython.zmq.ipkernel import Kernel | |
|
41 | from IPython.zmq.kernelapp import IPKernelApp | |||
41 | from IPython.zmq.session import ( |
|
42 | from IPython.zmq.session import ( | |
42 | Session, session_aliases, session_flags |
|
43 | Session, session_aliases, session_flags | |
43 | ) |
|
44 | ) |
@@ -35,7 +35,8 b' from IPython.parallel.factory import RegistrationFactory' | |||||
35 | from IPython.parallel.util import disambiguate_url |
|
35 | from IPython.parallel.util import disambiguate_url | |
36 |
|
36 | |||
37 | from IPython.zmq.session import Message |
|
37 | from IPython.zmq.session import Message | |
38 |
from IPython.zmq.ipkernel import Kernel |
|
38 | from IPython.zmq.ipkernel import Kernel | |
|
39 | from IPython.zmq.kernelapp import IPKernelApp | |||
39 |
|
40 | |||
40 | class EngineFactory(RegistrationFactory): |
|
41 | class EngineFactory(RegistrationFactory): | |
41 | """IPython engine""" |
|
42 | """IPython engine""" |
@@ -17,7 +17,6 b' from __future__ import print_function' | |||||
17 |
|
17 | |||
18 | # Standard library imports |
|
18 | # Standard library imports | |
19 | import __builtin__ |
|
19 | import __builtin__ | |
20 | import atexit |
|
|||
21 | import sys |
|
20 | import sys | |
22 | import time |
|
21 | import time | |
23 | import traceback |
|
22 | import traceback | |
@@ -36,25 +35,18 b' from zmq.eventloop.zmqstream import ZMQStream' | |||||
36 |
|
35 | |||
37 | # Local imports |
|
36 | # Local imports | |
38 | from IPython.config.configurable import Configurable |
|
37 | from IPython.config.configurable import Configurable | |
39 | from IPython.config.application import boolean_flag, catch_config_error |
|
|||
40 | from IPython.core.application import ProfileDir |
|
|||
41 | from IPython.core.error import StdinNotImplementedError |
|
38 | from IPython.core.error import StdinNotImplementedError | |
42 | from IPython.core import release |
|
39 | from IPython.core import release | |
43 | from IPython.core.shellapp import ( |
|
|||
44 | InteractiveShellApp, shell_flags, shell_aliases |
|
|||
45 | ) |
|
|||
46 | from IPython.utils import io |
|
40 | from IPython.utils import io | |
47 | from IPython.utils import py3compat |
|
41 | from IPython.utils import py3compat | |
48 | from IPython.utils.frame import extract_module_locals |
|
|||
49 | from IPython.utils.jsonutil import json_clean |
|
42 | from IPython.utils.jsonutil import json_clean | |
50 | from IPython.utils.traitlets import ( |
|
43 | from IPython.utils.traitlets import ( | |
51 | Any, Instance, Float, Dict, CaselessStrEnum, List, Set, Integer, Unicode, |
|
44 | Any, Instance, Float, Dict, CaselessStrEnum, List, Set, Integer, Unicode, | |
52 | Type |
|
45 | Type | |
53 | ) |
|
46 | ) | |
54 |
|
47 | |||
55 | from kernelapp import KernelApp, kernel_flags, kernel_aliases |
|
|||
56 | from serialize import serialize_object, unpack_apply_message |
|
48 | from serialize import serialize_object, unpack_apply_message | |
57 |
from session import Session |
|
49 | from session import Session | |
58 | from zmqshell import ZMQInteractiveShell |
|
50 | from zmqshell import ZMQInteractiveShell | |
59 |
|
51 | |||
60 |
|
52 | |||
@@ -785,139 +777,3 b' class Kernel(Configurable):' | |||||
785 | self.log.debug("%s", self._shutdown_message) |
|
777 | self.log.debug("%s", self._shutdown_message) | |
786 | [ s.flush(zmq.POLLOUT) for s in self.shell_streams ] |
|
778 | [ s.flush(zmq.POLLOUT) for s in self.shell_streams ] | |
787 |
|
779 | |||
788 | #----------------------------------------------------------------------------- |
|
|||
789 | # Aliases and Flags for the IPKernelApp |
|
|||
790 | #----------------------------------------------------------------------------- |
|
|||
791 |
|
||||
792 | flags = dict(kernel_flags) |
|
|||
793 | flags.update(shell_flags) |
|
|||
794 |
|
||||
795 | addflag = lambda *args: flags.update(boolean_flag(*args)) |
|
|||
796 |
|
||||
797 | flags['pylab'] = ( |
|
|||
798 | {'IPKernelApp' : {'pylab' : 'auto'}}, |
|
|||
799 | """Pre-load matplotlib and numpy for interactive use with |
|
|||
800 | the default matplotlib backend.""" |
|
|||
801 | ) |
|
|||
802 |
|
||||
803 | aliases = dict(kernel_aliases) |
|
|||
804 | aliases.update(shell_aliases) |
|
|||
805 |
|
||||
806 | #----------------------------------------------------------------------------- |
|
|||
807 | # The IPKernelApp class |
|
|||
808 | #----------------------------------------------------------------------------- |
|
|||
809 |
|
||||
810 | class IPKernelApp(KernelApp, InteractiveShellApp): |
|
|||
811 | name = 'ipkernel' |
|
|||
812 |
|
||||
813 | aliases = Dict(aliases) |
|
|||
814 | flags = Dict(flags) |
|
|||
815 | classes = [Kernel, ZMQInteractiveShell, ProfileDir, Session] |
|
|||
816 |
|
||||
817 | @catch_config_error |
|
|||
818 | def initialize(self, argv=None): |
|
|||
819 | super(IPKernelApp, self).initialize(argv) |
|
|||
820 | self.init_path() |
|
|||
821 | self.init_shell() |
|
|||
822 | self.init_gui_pylab() |
|
|||
823 | self.init_extensions() |
|
|||
824 | self.init_code() |
|
|||
825 |
|
||||
826 | def init_kernel(self): |
|
|||
827 |
|
||||
828 | shell_stream = ZMQStream(self.shell_socket) |
|
|||
829 |
|
||||
830 | kernel = Kernel(config=self.config, session=self.session, |
|
|||
831 | shell_streams=[shell_stream], |
|
|||
832 | iopub_socket=self.iopub_socket, |
|
|||
833 | stdin_socket=self.stdin_socket, |
|
|||
834 | log=self.log, |
|
|||
835 | profile_dir=self.profile_dir, |
|
|||
836 | ) |
|
|||
837 | self.kernel = kernel |
|
|||
838 | kernel.record_ports(self.ports) |
|
|||
839 | shell = kernel.shell |
|
|||
840 |
|
||||
841 | def init_gui_pylab(self): |
|
|||
842 | """Enable GUI event loop integration, taking pylab into account.""" |
|
|||
843 |
|
||||
844 | # Provide a wrapper for :meth:`InteractiveShellApp.init_gui_pylab` |
|
|||
845 | # to ensure that any exception is printed straight to stderr. |
|
|||
846 | # Normally _showtraceback associates the reply with an execution, |
|
|||
847 | # which means frontends will never draw it, as this exception |
|
|||
848 | # is not associated with any execute request. |
|
|||
849 |
|
||||
850 | shell = self.shell |
|
|||
851 | _showtraceback = shell._showtraceback |
|
|||
852 | try: |
|
|||
853 | # replace pyerr-sending traceback with stderr |
|
|||
854 | def print_tb(etype, evalue, stb): |
|
|||
855 | print ("GUI event loop or pylab initialization failed", |
|
|||
856 | file=io.stderr) |
|
|||
857 | print (shell.InteractiveTB.stb2text(stb), file=io.stderr) |
|
|||
858 | shell._showtraceback = print_tb |
|
|||
859 | InteractiveShellApp.init_gui_pylab(self) |
|
|||
860 | finally: |
|
|||
861 | shell._showtraceback = _showtraceback |
|
|||
862 |
|
||||
863 | def init_shell(self): |
|
|||
864 | self.shell = self.kernel.shell |
|
|||
865 | self.shell.configurables.append(self) |
|
|||
866 |
|
||||
867 |
|
||||
868 | #----------------------------------------------------------------------------- |
|
|||
869 | # Kernel main and launch functions |
|
|||
870 | #----------------------------------------------------------------------------- |
|
|||
871 |
|
||||
872 |
|
||||
873 | def embed_kernel(module=None, local_ns=None, **kwargs): |
|
|||
874 | """Embed and start an IPython kernel in a given scope. |
|
|||
875 |
|
||||
876 | Parameters |
|
|||
877 | ---------- |
|
|||
878 | module : ModuleType, optional |
|
|||
879 | The module to load into IPython globals (default: caller) |
|
|||
880 | local_ns : dict, optional |
|
|||
881 | The namespace to load into IPython user namespace (default: caller) |
|
|||
882 |
|
||||
883 | kwargs : various, optional |
|
|||
884 | Further keyword args are relayed to the KernelApp constructor, |
|
|||
885 | allowing configuration of the Kernel. Will only have an effect |
|
|||
886 | on the first embed_kernel call for a given process. |
|
|||
887 |
|
||||
888 | """ |
|
|||
889 | # get the app if it exists, or set it up if it doesn't |
|
|||
890 | if IPKernelApp.initialized(): |
|
|||
891 | app = IPKernelApp.instance() |
|
|||
892 | else: |
|
|||
893 | app = IPKernelApp.instance(**kwargs) |
|
|||
894 | app.initialize([]) |
|
|||
895 | # Undo unnecessary sys module mangling from init_sys_modules. |
|
|||
896 | # This would not be necessary if we could prevent it |
|
|||
897 | # in the first place by using a different InteractiveShell |
|
|||
898 | # subclass, as in the regular embed case. |
|
|||
899 | main = app.kernel.shell._orig_sys_modules_main_mod |
|
|||
900 | if main is not None: |
|
|||
901 | sys.modules[app.kernel.shell._orig_sys_modules_main_name] = main |
|
|||
902 |
|
||||
903 | # load the calling scope if not given |
|
|||
904 | (caller_module, caller_locals) = extract_module_locals(1) |
|
|||
905 | if module is None: |
|
|||
906 | module = caller_module |
|
|||
907 | if local_ns is None: |
|
|||
908 | local_ns = caller_locals |
|
|||
909 |
|
||||
910 | app.kernel.user_module = module |
|
|||
911 | app.kernel.user_ns = local_ns |
|
|||
912 | app.shell.set_completer_frame() |
|
|||
913 | app.start() |
|
|||
914 |
|
||||
915 | def main(): |
|
|||
916 | """Run an IPKernel as an application""" |
|
|||
917 | app = IPKernelApp.instance() |
|
|||
918 | app.initialize() |
|
|||
919 | app.start() |
|
|||
920 |
|
||||
921 |
|
||||
922 | if __name__ == '__main__': |
|
|||
923 | main() |
|
@@ -15,6 +15,8 b' Authors' | |||||
15 | # Imports |
|
15 | # Imports | |
16 | #----------------------------------------------------------------------------- |
|
16 | #----------------------------------------------------------------------------- | |
17 |
|
17 | |||
|
18 | from __future__ import print_function | |||
|
19 | ||||
18 | # Standard library imports |
|
20 | # Standard library imports | |
19 | import atexit |
|
21 | import atexit | |
20 | import json |
|
22 | import json | |
@@ -25,12 +27,17 b' import signal' | |||||
25 | # System library imports |
|
27 | # System library imports | |
26 | import zmq |
|
28 | import zmq | |
27 | from zmq.eventloop import ioloop |
|
29 | from zmq.eventloop import ioloop | |
|
30 | from zmq.eventloop.zmqstream import ZMQStream | |||
28 |
|
31 | |||
29 | # IPython imports |
|
32 | # IPython imports | |
30 | from IPython.core.ultratb import FormattedTB |
|
33 | from IPython.core.ultratb import FormattedTB | |
31 | from IPython.core.application import ( |
|
34 | from IPython.core.application import ( | |
32 | BaseIPythonApplication, base_flags, base_aliases, catch_config_error |
|
35 | BaseIPythonApplication, base_flags, base_aliases, catch_config_error | |
33 | ) |
|
36 | ) | |
|
37 | from IPython.core.profiledir import ProfileDir | |||
|
38 | from IPython.core.shellapp import ( | |||
|
39 | InteractiveShellApp, shell_flags, shell_aliases | |||
|
40 | ) | |||
34 | from IPython.utils import io |
|
41 | from IPython.utils import io | |
35 | from IPython.utils.localinterfaces import LOCALHOST |
|
42 | from IPython.utils.localinterfaces import LOCALHOST | |
36 | from IPython.utils.path import filefind |
|
43 | from IPython.utils.path import filefind | |
@@ -41,13 +48,15 b' from IPython.utils.traitlets import (' | |||||
41 | ) |
|
48 | ) | |
42 | from IPython.utils.importstring import import_item |
|
49 | from IPython.utils.importstring import import_item | |
43 | from IPython.kernel import write_connection_file |
|
50 | from IPython.kernel import write_connection_file | |
|
51 | ||||
44 | # local imports |
|
52 | # local imports | |
45 |
from |
|
53 | from heartbeat import Heartbeat | |
46 | from IPython.zmq.parentpoller import ParentPollerUnix, ParentPollerWindows |
|
54 | from ipkernel import Kernel | |
47 | from IPython.zmq.session import ( |
|
55 | from parentpoller import ParentPollerUnix, ParentPollerWindows | |
|
56 | from session import ( | |||
48 | Session, session_flags, session_aliases, default_secure, |
|
57 | Session, session_flags, session_aliases, default_secure, | |
49 | ) |
|
58 | ) | |
50 |
|
59 | from zmqshell import ZMQInteractiveShell | ||
51 |
|
60 | |||
52 | #----------------------------------------------------------------------------- |
|
61 | #----------------------------------------------------------------------------- | |
53 | # Flags and Aliases |
|
62 | # Flags and Aliases | |
@@ -55,14 +64,14 b' from IPython.zmq.session import (' | |||||
55 |
|
64 | |||
56 | kernel_aliases = dict(base_aliases) |
|
65 | kernel_aliases = dict(base_aliases) | |
57 | kernel_aliases.update({ |
|
66 | kernel_aliases.update({ | |
58 | 'ip' : 'KernelApp.ip', |
|
67 | 'ip' : 'IPKernelApp.ip', | |
59 | 'hb' : 'KernelApp.hb_port', |
|
68 | 'hb' : 'IPKernelApp.hb_port', | |
60 | 'shell' : 'KernelApp.shell_port', |
|
69 | 'shell' : 'IPKernelApp.shell_port', | |
61 | 'iopub' : 'KernelApp.iopub_port', |
|
70 | 'iopub' : 'IPKernelApp.iopub_port', | |
62 | 'stdin' : 'KernelApp.stdin_port', |
|
71 | 'stdin' : 'IPKernelApp.stdin_port', | |
63 | 'f' : 'KernelApp.connection_file', |
|
72 | 'f' : 'IPKernelApp.connection_file', | |
64 | 'parent': 'KernelApp.parent', |
|
73 | 'parent': 'IPKernelApp.parent', | |
65 | 'transport': 'KernelApp.transport', |
|
74 | 'transport': 'IPKernelApp.transport', | |
66 | }) |
|
75 | }) | |
67 | if sys.platform.startswith('win'): |
|
76 | if sys.platform.startswith('win'): | |
68 | kernel_aliases['interrupt'] = 'KernelApp.interrupt' |
|
77 | kernel_aliases['interrupt'] = 'KernelApp.interrupt' | |
@@ -70,28 +79,34 b" if sys.platform.startswith('win'):" | |||||
70 | kernel_flags = dict(base_flags) |
|
79 | kernel_flags = dict(base_flags) | |
71 | kernel_flags.update({ |
|
80 | kernel_flags.update({ | |
72 | 'no-stdout' : ( |
|
81 | 'no-stdout' : ( | |
73 | {'KernelApp' : {'no_stdout' : True}}, |
|
82 | {'IPKernelApp' : {'no_stdout' : True}}, | |
74 | "redirect stdout to the null device"), |
|
83 | "redirect stdout to the null device"), | |
75 | 'no-stderr' : ( |
|
84 | 'no-stderr' : ( | |
76 | {'KernelApp' : {'no_stderr' : True}}, |
|
85 | {'IPKernelApp' : {'no_stderr' : True}}, | |
77 | "redirect stderr to the null device"), |
|
86 | "redirect stderr to the null device"), | |
|
87 | 'pylab' : ( | |||
|
88 | {'IPKernelApp' : {'pylab' : 'auto'}}, | |||
|
89 | """Pre-load matplotlib and numpy for interactive use with | |||
|
90 | the default matplotlib backend."""), | |||
78 | }) |
|
91 | }) | |
79 |
|
92 | |||
|
93 | # inherit flags&aliases for any IPython shell apps | |||
|
94 | kernel_aliases.update(shell_aliases) | |||
|
95 | kernel_flags.update(shell_flags) | |||
|
96 | ||||
80 | # inherit flags&aliases for Sessions |
|
97 | # inherit flags&aliases for Sessions | |
81 | kernel_aliases.update(session_aliases) |
|
98 | kernel_aliases.update(session_aliases) | |
82 | kernel_flags.update(session_flags) |
|
99 | kernel_flags.update(session_flags) | |
83 |
|
100 | |||
84 |
|
||||
85 |
|
||||
86 | #----------------------------------------------------------------------------- |
|
101 | #----------------------------------------------------------------------------- | |
87 | # Application class for starting a Kernel |
|
102 | # Application class for starting an IPython Kernel | |
88 | #----------------------------------------------------------------------------- |
|
103 | #----------------------------------------------------------------------------- | |
89 |
|
104 | |||
90 | class KernelApp(BaseIPythonApplication): |
|
105 | class IPKernelApp(BaseIPythonApplication, InteractiveShellApp): | |
91 | name='ipkernel' |
|
106 | name='ipkernel' | |
92 | aliases = Dict(kernel_aliases) |
|
107 | aliases = Dict(kernel_aliases) | |
93 | flags = Dict(kernel_flags) |
|
108 | flags = Dict(kernel_flags) | |
94 | classes = [Session] |
|
109 | classes = [Kernel, ZMQInteractiveShell, ProfileDir, Session] | |
95 | # the kernel class, as an importstring |
|
110 | # the kernel class, as an importstring | |
96 | kernel_class = DottedObjectName('IPython.zmq.ipkernel.Kernel') |
|
111 | kernel_class = DottedObjectName('IPython.zmq.ipkernel.Kernel') | |
97 | kernel = Any() |
|
112 | kernel = Any() | |
@@ -332,18 +347,47 b' class KernelApp(BaseIPythonApplication):' | |||||
332 |
|
347 | |||
333 | def init_kernel(self): |
|
348 | def init_kernel(self): | |
334 | """Create the Kernel object itself""" |
|
349 | """Create the Kernel object itself""" | |
335 | kernel_factory = import_item(str(self.kernel_class)) |
|
350 | shell_stream = ZMQStream(self.shell_socket) | |
336 | self.kernel = kernel_factory(config=self.config, session=self.session, |
|
351 | ||
337 | shell_socket=self.shell_socket, |
|
352 | kernel = Kernel(config=self.config, session=self.session, | |
|
353 | shell_streams=[shell_stream], | |||
338 | iopub_socket=self.iopub_socket, |
|
354 | iopub_socket=self.iopub_socket, | |
339 | stdin_socket=self.stdin_socket, |
|
355 | stdin_socket=self.stdin_socket, | |
340 | log=self.log |
|
356 | log=self.log, | |
|
357 | profile_dir=self.profile_dir, | |||
341 | ) |
|
358 | ) | |
342 |
|
|
359 | kernel.record_ports(self.ports) | |
|
360 | self.kernel = kernel | |||
|
361 | ||||
|
362 | def init_gui_pylab(self): | |||
|
363 | """Enable GUI event loop integration, taking pylab into account.""" | |||
|
364 | ||||
|
365 | # Provide a wrapper for :meth:`InteractiveShellApp.init_gui_pylab` | |||
|
366 | # to ensure that any exception is printed straight to stderr. | |||
|
367 | # Normally _showtraceback associates the reply with an execution, | |||
|
368 | # which means frontends will never draw it, as this exception | |||
|
369 | # is not associated with any execute request. | |||
|
370 | ||||
|
371 | shell = self.shell | |||
|
372 | _showtraceback = shell._showtraceback | |||
|
373 | try: | |||
|
374 | # replace pyerr-sending traceback with stderr | |||
|
375 | def print_tb(etype, evalue, stb): | |||
|
376 | print ("GUI event loop or pylab initialization failed", | |||
|
377 | file=io.stderr) | |||
|
378 | print (shell.InteractiveTB.stb2text(stb), file=io.stderr) | |||
|
379 | shell._showtraceback = print_tb | |||
|
380 | InteractiveShellApp.init_gui_pylab(self) | |||
|
381 | finally: | |||
|
382 | shell._showtraceback = _showtraceback | |||
|
383 | ||||
|
384 | def init_shell(self): | |||
|
385 | self.shell = self.kernel.shell | |||
|
386 | self.shell.configurables.append(self) | |||
343 |
|
387 | |||
344 | @catch_config_error |
|
388 | @catch_config_error | |
345 | def initialize(self, argv=None): |
|
389 | def initialize(self, argv=None): | |
346 | super(KernelApp, self).initialize(argv) |
|
390 | super(IPKernelApp, self).initialize(argv) | |
347 | self.init_blackhole() |
|
391 | self.init_blackhole() | |
348 | self.init_connection_file() |
|
392 | self.init_connection_file() | |
349 | self.init_session() |
|
393 | self.init_session() | |
@@ -356,6 +400,12 b' class KernelApp(BaseIPythonApplication):' | |||||
356 | self.init_io() |
|
400 | self.init_io() | |
357 | self.init_signal() |
|
401 | self.init_signal() | |
358 | self.init_kernel() |
|
402 | self.init_kernel() | |
|
403 | # shell init steps | |||
|
404 | self.init_path() | |||
|
405 | self.init_shell() | |||
|
406 | self.init_gui_pylab() | |||
|
407 | self.init_extensions() | |||
|
408 | self.init_code() | |||
359 | # flush stdout/stderr, so that anything written to these streams during |
|
409 | # flush stdout/stderr, so that anything written to these streams during | |
360 | # initialization do not get associated with the first execution request |
|
410 | # initialization do not get associated with the first execution request | |
361 | sys.stdout.flush() |
|
411 | sys.stdout.flush() | |
@@ -370,3 +420,13 b' class KernelApp(BaseIPythonApplication):' | |||||
370 | except KeyboardInterrupt: |
|
420 | except KeyboardInterrupt: | |
371 | pass |
|
421 | pass | |
372 |
|
422 | |||
|
423 | ||||
|
424 | def main(): | |||
|
425 | """Run an IPKernel as an application""" | |||
|
426 | app = IPKernelApp.instance() | |||
|
427 | app.initialize() | |||
|
428 | app.start() | |||
|
429 | ||||
|
430 | ||||
|
431 | if __name__ == '__main__': | |||
|
432 | main() |
@@ -903,7 +903,7 b' class KernelManager(Configurable):' | |||||
903 | cmd = self.kernel_cmd |
|
903 | cmd = self.kernel_cmd | |
904 | else: |
|
904 | else: | |
905 | cmd = make_ipkernel_cmd( |
|
905 | cmd = make_ipkernel_cmd( | |
906 |
'from IPython.zmq. |
|
906 | 'from IPython.zmq.kernelapp import main; main()', | |
907 | **kw |
|
907 | **kw | |
908 | ) |
|
908 | ) | |
909 | ns = dict(connection_file=self.connection_file) |
|
909 | ns = dict(connection_file=self.connection_file) |
General Comments 0
You need to be logged in to leave comments.
Login now