-
Notifications
You must be signed in to change notification settings - Fork 0
/
protium.py
134 lines (107 loc) · 4.12 KB
/
protium.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3
# encoding: utf-8
import pprint
import jupyter_client # Install local dependency (and restart ST) when developing
import sublime
import sublime_plugin
import sys
from queue import Empty
class Application(object):
"""docstring for Application"""
def __init__(self):
super(Application, self).__init__()
global application
application = Application()
# this is a helper method for turning a fraction of a connection-file name
# into a full path. If you already know the full path, you can just use that
# cf = find_connection_file('54677')
# kc = BlockingKernelClient(connection_file=cf)
# kc.load_connection_file()
# kc.start_channels()
# kc.get_shell_msg() # pop start message
def start_kernel():
global application
kernel_name = 'python3' # ipython3 kernel install # ipython kernel install
#ksm = jupyter_client.kernelspec.KernelSpecManager()
#print(ksm.get_all_specs())
#sys.exit()
if not hasattr(application, 'kernel'):
kernel_manager = jupyter_client.KernelManager()
kernel_manager.kernel_name = kernel_name
kernel_manager.start_kernel()
application.kernel_manager = kernel_manager
application.kernel = kernel_manager.client()
application.kernel.start_channels()
kernel = application.kernel
else:
kernel_manager.start_kernel()
kernel.start_channels()
kernel.get_shell_msg() # pop start message
# Once you have shutdown a kernel, if you need a kernel again, you should create a new one (i.e. new instances of KernelManager() and KernelClient()). They are not designed to be reused to start multiple kernels.
def plugin_loaded():
"""The ST3 entry point for plugins."""
start_kernel()
def plugin_unloaded():
"""Called directly from sublime on plugin unload."""
global application
if hasattr(application, 'kernel'):
application.kernel_manager.shutdown_kernel()
try:
del application.kernel_manager
except Exception as e:
pass
try:
del application.kernel
except Exception as e:
pass
class ProtiumEvaluateCommand(sublime_plugin.WindowCommand):
"""Eval selection."""
def run(self):
"""Main function, runs on activation."""
self.window.run_command(
'protium_communicate', {}
)
class ProtiumCommunicateCommand(sublime_plugin.TextCommand):
"""Eval"""
def run_cell(self, view, code):
# now we can run code. This is done on the shell channel
#print ("running: " + code)
msg_id = application.kernel.execute(code)
state='busy'
data={}
while state!='idle' and application.kernel.is_alive():
try:
msg=application.kernel.get_iopub_msg(timeout=1)
if not 'content' in msg: continue
content = msg['content']
if 'data' in content:
data=content['data']
if 'execution_state' in content:
state=content['execution_state']
except Empty:
pass
repl = application.kernel.get_shell_msg()
status = repl['content']['status']
if status == 'ok':
reply = '√'
elif status == 'error':
reply = repl['content']['traceback']
self.view.erase_phantoms("demo")
try:
return_value = data['text/plain']
except Exception as e:
try:
return_value = reply
except Exception as e:
return_value = None
if return_value:
global pSet
pSet = sublime.PhantomSet(self.view, 'demo')
phantoms = [sublime.Phantom(self.view.sel()[0], str(return_value), sublime.LAYOUT_BLOCK)]
pSet.update(phantoms)
#view.add_phantom("test", view.sel()[0], "Hello, World!", sublime.LAYOUT_BLOCK)
#view.erase_phantoms("test")
def run(self, args):
global application
# Current selection: self.view.sel()[0].begin(), self.view.sel()[0].end())
self.run_cell(self, self.view.substr(self.view.line(self.view.sel()[0]))) # view...