##// END OF EJS Templates
add IPython.lib.kernel...
MinRK -
Show More
@@ -0,0 +1,99 b''
1 """Utilities for connecting to kernels
2
3 Authors:
4
5 * Min Ragan-Kelley
6
7 """
8
9 #-----------------------------------------------------------------------------
10 # Copyright (C) 2011 The IPython Development Team
11 #
12 # Distributed under the terms of the BSD License. The full license is in
13 # the file COPYING, distributed as part of this software.
14 #-----------------------------------------------------------------------------
15
16 #-----------------------------------------------------------------------------
17 # Imports
18 #-----------------------------------------------------------------------------
19
20 import json
21 import sys
22 from subprocess import Popen, PIPE
23
24 from IPython.utils.path import filefind
25 from IPython.utils.py3compat import str_to_bytes
26
27
28 #-----------------------------------------------------------------------------
29 # Functions
30 #-----------------------------------------------------------------------------
31
32 def get_connection_file(app=None):
33 """Return the path to the connection file of an app
34
35 Parameters
36 ----------
37 app : KernelApp instance [optional]
38 If unspecified, the currently running app will be used
39 """
40 if app is None:
41 from IPython.zmq.kernelapp import KernelApp
42 if not KernelApp.initialized():
43 raise RuntimeError("app not specified, and not in a running Kernel")
44
45 app = KernelApp.instance()
46 return filefind(app.connection_file, ['.', app.profile_dir.security_dir])
47
48 def get_connection_info(unpack=False):
49 """Return the connection information for the current Kernel.
50
51 Parameters
52 ----------
53 unpack : bool [default: False]
54 if True, return the unpacked dict, otherwise just the string contents
55 of the file.
56
57 Returns
58 -------
59 The connection dictionary of the current kernel, as string or dict,
60 depending on `unpack`.
61 """
62 cf = get_connection_file()
63 with open(cf) as f:
64 info = f.read()
65
66 if unpack:
67 info = json.loads(info)
68 # ensure key is bytes:
69 info['key'] = str_to_bytes(info.get('key', ''))
70 return info
71
72 def connect_qtconsole(argv=None):
73 """Connect a qtconsole to the current kernel.
74
75 This is useful for connecting a second qtconsole to a kernel, or to a
76 local notebook.
77
78 Parameters
79 ----------
80 argv : list [optional]
81 Any extra args to be passed to the console.
82
83 Returns
84 -------
85 subprocess.Popen instance running the qtconsole frontend
86 """
87 argv = [] if argv is None else argv
88
89 # get connection file from current kernel
90 cf = get_connection_file()
91
92 cmd = ';'.join([
93 "from IPython.frontend.qt.console import qtconsoleapp",
94 "qtconsoleapp.main()"
95 ])
96
97 return Popen([sys.executable, '-c', cmd, '--existing', cf] + argv, stdout=PIPE, stderr=PIPE)
98
99
@@ -31,9 +31,13 b' from IPython.core.displaypub import DisplayPublisher'
31 31 from IPython.core.macro import Macro
32 32 from IPython.core.magic import MacroToEdit
33 33 from IPython.core.payloadpage import install_payload_page
34 from IPython.lib.kernel import (
35 get_connection_file, get_connection_info, connect_qtconsole
36 )
34 37 from IPython.utils import io
35 38 from IPython.utils.jsonutil import json_clean
36 39 from IPython.utils.path import get_py_filename
40 from IPython.utils.process import arg_split
37 41 from IPython.utils.traitlets import Instance, Type, Dict, CBool
38 42 from IPython.utils.warn import warn, error
39 43 from IPython.zmq.displayhook import ZMQShellDisplayHook, _encode_binary
@@ -442,18 +446,14 b' class ZMQInteractiveShell(InteractiveShell):'
442 446 $> ipython <app> --existing
443 447
444 448 """
445 from IPython.zmq.kernelapp import KernelApp
446 if not KernelApp.initialized():
447 error("KernelApp is not initialized. I cannot find the connection info")
448 return
449 app = KernelApp.instance()
450 449 try:
451 with open(app.connection_file) as f:
452 s = f.read()
450 connection_file = get_connection_file()
451 info = get_connection_info(unpack=False)
453 452 except Exception as e:
454 error("Could not read connection file: %s" % e)
453 error("Could not get connection info: %r" % e)
455 454 return
456 print (s + '\n')
455
456 print (info + '\n')
457 457 print ("Paste the above JSON into a file, and connect with:\n"
458 458 " $> ipython <app> --existing <file>\n"
459 459 "or, if you are local, you can connect with just:\n"
@@ -461,7 +461,7 b' class ZMQInteractiveShell(InteractiveShell):'
461 461 "or even just:\n"
462 462 " $> ipython <app> --existing\n"
463 463 "if this is the most recent IPython session you have started."
464 % os.path.basename((app.connection_file))
464 % os.path.basename(connection_file)
465 465 )
466 466
467 467 def magic_qtconsole(self, arg_s):
@@ -470,20 +470,12 b' class ZMQInteractiveShell(InteractiveShell):'
470 470 Useful for connecting a qtconsole to running notebooks, for better
471 471 debugging.
472 472 """
473 from IPython.zmq.kernelapp import KernelApp
474
475 if not KernelApp.initialized():
476 error("KernelApp is not initialized. %qtconsole magic must be run from a Kernel")
473 try:
474 p = connect_qtconsole(arg_split(arg_s, os.name=='posix'))
475 except Exception as e:
476 error("Could not start qtconsole: %r" % e)
477 477 return
478 app = KernelApp.instance()
479
480 cmd = ';'.join([
481 "from IPython.frontend.qt.console import qtconsoleapp",
482 "qtconsoleapp.main()"
483 ])
484 478
485 return Popen([sys.executable, '-c', cmd, '--existing', app.connection_file],
486 stdout=PIPE,stderr=PIPE)
487 479
488 480 def set_next_input(self, text):
489 481 """Send the specified text to the frontend to be presented at the next
General Comments 0
You need to be logged in to leave comments. Login now