diff options
author | Brian Burns <brian.p.burns@gmail.com> | 2017-01-08 17:21:20 -0500 |
---|---|---|
committer | Brian Burns <brian.p.burns@gmail.com> | 2017-01-08 17:21:20 -0500 |
commit | 8f90b78820a2c07e4ed79ba1973d93706aff70cb (patch) | |
tree | 82f3fbc0fc9189a716ef6076c5cdeec18b135318 | |
parent | 22099a4b1c7c5f1f225b5cc1b257855d558d1905 (diff) | |
download | toree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.tar.gz toree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.tar.bz2 toree-gateway-8f90b78820a2c07e4ed79ba1973d93706aff70cb.zip |
python kernel
-rw-r--r-- | kernel.json | 13 | ||||
-rw-r--r-- | pom.xml | 5 | ||||
-rw-r--r-- | python/build/lib/toree_kernel.py | 135 | ||||
-rw-r--r-- | python/dist/toree_kernel-0.1-py3.5.egg | bin | 0 -> 4747 bytes | |||
-rw-r--r-- | python/setup.py | 17 | ||||
-rw-r--r-- | python/toree_kernel.egg-info/PKG-INFO | 15 | ||||
-rw-r--r-- | python/toree_kernel.egg-info/SOURCES.txt | 7 | ||||
-rw-r--r-- | python/toree_kernel.egg-info/dependency_links.txt | 1 | ||||
-rw-r--r-- | python/toree_kernel.egg-info/requires.txt | 2 | ||||
-rw-r--r-- | python/toree_kernel.egg-info/top_level.txt | 1 | ||||
-rw-r--r-- | python/toree_kernel.py | 125 | ||||
-rw-r--r-- | src/main/scala/com/ibm/ToreeClient.scala | 10 |
12 files changed, 329 insertions, 2 deletions
diff --git a/kernel.json b/kernel.json new file mode 100644 index 0000000..3294399 --- /dev/null +++ b/kernel.json @@ -0,0 +1,13 @@ +{ + "language_info": { + "name": "scala" + }, + "display_name": "Toree Client Kernel", + "argv": [ + "python", + "/Users/bburns/toree_client/python/toree_kernel.py", + "-f", + "{connection_file}" + ], + "codemirror_mode": "scala" +} @@ -62,6 +62,11 @@ </excludes> </filter> </filters> + <transformers> + <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> + <resource>reference.conf</resource> + </transformer> + </transformers> </configuration> </execution> </executions> diff --git a/python/build/lib/toree_kernel.py b/python/build/lib/toree_kernel.py new file mode 100644 index 0000000..f7269fa --- /dev/null +++ b/python/build/lib/toree_kernel.py @@ -0,0 +1,135 @@ +import os +import signal +import sys +import time +import io + +from os import O_NONBLOCK, read +from fcntl import fcntl, F_GETFL, F_SETFL +from subprocess import Popen, PIPE +from metakernel import MetaKernel +from py4j.java_gateway import JavaGateway, CallbackServerParameters, java_import +from py4j.protocol import Py4JError + +class TextOutput(object): + """Wrapper for text output whose repr is the text itself. + This avoids `repr(output)` adding quotation marks around already-rendered text. + """ + def __init__(self, output): + self.output = output + + def __repr__(self): + return self.output + +class ToreeKernel(MetaKernel): + implementation = 'toree_kernel' + implementation_version = '0.1' + langauge = 'scala' + language_version = '2.11' + banner = "toree_kernel" + language_info = {'name': 'scala', + 'mimetype': 'application/scala', + 'file_extension': '.scala'} + + kernel_json = { + 'argv': [ + 'python', '-m', 'toree_kernel', '-f', '{connection_file}'], + 'display_name': 'Toree Client', + 'language': 'scala', + 'name': 'toree_kernel' + } + + def __init__(self, **kwargs): + super(ToreeKernel, self).__init__(**kwargs) + #self._start_toree_client() + + #def sig_handler(signum, frame): + #self.gateway_proc.terminate() + + def do_shutdown(self, restart): + super(ToreeKernel, self).do_shutdown(restart) + #self.gateway_proc.terminate() + + def _start_toree_client(self): + args = [ + "java", + "-classpath", + "../target/toree_client-0.1-jar-with-dependencies.jar", + "com.ibm.ToreeClient" + ] + + self.gateway_proc = Popen(args, stderr=PIPE, stdout=PIPE) + time.sleep(1.5) + self.gateway = JavaGateway( + start_callback_server=True, + callback_server_parameters=CallbackServerParameters()) + + flags = fcntl(self.gateway_proc.stdout, F_GETFL) # get current p.stdout flags + fcntl(self.gateway_proc.stdout, F_SETFL, flags | O_NONBLOCK) + + flags = fcntl(self.gateway_proc.stderr, F_GETFL) # get current p.stdout flags + fcntl(self.gateway_proc.stderr, F_SETFL, flags | O_NONBLOCK) + + signal.signal(signal.SIGTERM, self.sig_handler) + signal.signal(signal.SIGINT, self.sig_handler) + signal.signal(signal.SIGHUP, self.sig_handler) + + + def Error(self, output): + if not output: + return + + super(ToreeKernel, self).Error(output) + + def handle_output(self, fd, fn): + stringIO = io.StringIO() + while True: + try: + b = read(fd.fileno(), 1024) + if b: + stringIO.write(b.decode('utf-8')) + except OSError: + break + + s = stringIO.getvalue() + if s: + fn(s.strip()) + + stringIO.close() + + def do_execute_direct(self, code, silent=False): + """ + :param code: + The code to be executed. + :param silent: + Whether to display output. + :return: + Return value, or None + + MetaKernel code handler. + """ + + """ + if not code.strip(): + return None + + retval = None + try: + retval = self.gateway.entry_point.eval(code.rstrip()) + self.handle_output(self.gateway_proc.stdout, self.Print) + self.handle_output(self.gateway_proc.stderr, self.Error) + except Py4JError as e: + if not silent: + self.Error(e.cause) + + if retval is None: + return + elif isinstance(retval, str): + return TextOutput(retval) + else: + return retval + """ + return "happy" + +if __name__ == '__main__': + ToreeKernel.run_as_main() diff --git a/python/dist/toree_kernel-0.1-py3.5.egg b/python/dist/toree_kernel-0.1-py3.5.egg Binary files differnew file mode 100644 index 0000000..b71502a --- /dev/null +++ b/python/dist/toree_kernel-0.1-py3.5.egg diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 0000000..307fcd4 --- /dev/null +++ b/python/setup.py @@ -0,0 +1,17 @@ +from setuptools import setup + + +setup(name='toree_kernel', + version='0.1', + description='Toree Client Kernel', + long_description='A simple echo kernel for Jupyter/IPython, based on MetaKernel', + py_modules=['toree_kernel'], + install_requires=['metakernel', 'py4j'], + classifiers = [ + 'Framework :: IPython', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 2', + 'Topic :: System :: Shells', + ] +) diff --git a/python/toree_kernel.egg-info/PKG-INFO b/python/toree_kernel.egg-info/PKG-INFO new file mode 100644 index 0000000..38f7f19 --- /dev/null +++ b/python/toree_kernel.egg-info/PKG-INFO @@ -0,0 +1,15 @@ +Metadata-Version: 1.1 +Name: toree-kernel +Version: 0.1 +Summary: Toree Client Kernel +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: A simple echo kernel for Jupyter/IPython, based on MetaKernel +Platform: UNKNOWN +Classifier: Framework :: IPython +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 2 +Classifier: Topic :: System :: Shells diff --git a/python/toree_kernel.egg-info/SOURCES.txt b/python/toree_kernel.egg-info/SOURCES.txt new file mode 100644 index 0000000..336cf83 --- /dev/null +++ b/python/toree_kernel.egg-info/SOURCES.txt @@ -0,0 +1,7 @@ +setup.py +toree_kernel.py +toree_kernel.egg-info/PKG-INFO +toree_kernel.egg-info/SOURCES.txt +toree_kernel.egg-info/dependency_links.txt +toree_kernel.egg-info/requires.txt +toree_kernel.egg-info/top_level.txt
\ No newline at end of file diff --git a/python/toree_kernel.egg-info/dependency_links.txt b/python/toree_kernel.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/python/toree_kernel.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/python/toree_kernel.egg-info/requires.txt b/python/toree_kernel.egg-info/requires.txt new file mode 100644 index 0000000..4ee13b4 --- /dev/null +++ b/python/toree_kernel.egg-info/requires.txt @@ -0,0 +1,2 @@ +metakernel +py4j diff --git a/python/toree_kernel.egg-info/top_level.txt b/python/toree_kernel.egg-info/top_level.txt new file mode 100644 index 0000000..a315772 --- /dev/null +++ b/python/toree_kernel.egg-info/top_level.txt @@ -0,0 +1 @@ +toree_kernel diff --git a/python/toree_kernel.py b/python/toree_kernel.py new file mode 100644 index 0000000..9734ffa --- /dev/null +++ b/python/toree_kernel.py @@ -0,0 +1,125 @@ +import os +import signal +import sys +import time +import io + +from os import O_NONBLOCK, read +from fcntl import fcntl, F_GETFL, F_SETFL +from subprocess import Popen, PIPE +from metakernel import MetaKernel +from py4j.java_gateway import JavaGateway, CallbackServerParameters, java_import +from py4j.protocol import Py4JError + +class TextOutput(object): + """Wrapper for text output whose repr is the text itself. + This avoids `repr(output)` adding quotation marks around already-rendered text. + """ + def __init__(self, output): + self.output = output + + def __repr__(self): + return self.output + +class ToreeKernel(MetaKernel): + implementation = 'toree_kernel' + implementation_version = '0.1' + langauge = 'scala' + language_version = '2.11' + banner = "toree_kernel" + language_info = {'name': 'scala', + 'mimetype': 'application/scala', + 'file_extension': '.scala'} + + + def __init__(self, **kwargs): + super(ToreeKernel, self).__init__(**kwargs) + self._start_toree_client() + + def sig_handler(signum, frame): + self.gateway_proc.terminate() + + def do_shutdown(self, restart): + super(ToreeKernel, self).do_shutdown(restart) + self.gateway_proc.terminate() + + def _start_toree_client(self): + args = [ + "java", + "-classpath", + "/Users/bburns/toree_client/target/toree-client-0.1-jar-with-dependencies.jar", + "com.ibm.ToreeClient" + ] + + self.gateway_proc = Popen(args, stderr=PIPE, stdout=PIPE) + time.sleep(1.5) + self.gateway = JavaGateway( + start_callback_server=True, + callback_server_parameters=CallbackServerParameters()) + + flags = fcntl(self.gateway_proc.stdout, F_GETFL) # get current p.stdout flags + fcntl(self.gateway_proc.stdout, F_SETFL, flags | O_NONBLOCK) + + flags = fcntl(self.gateway_proc.stderr, F_GETFL) # get current p.stdout flags + fcntl(self.gateway_proc.stderr, F_SETFL, flags | O_NONBLOCK) + + signal.signal(signal.SIGTERM, self.sig_handler) + signal.signal(signal.SIGINT, self.sig_handler) + signal.signal(signal.SIGHUP, self.sig_handler) + + + def Error(self, output): + if not output: + return + + super(ToreeKernel, self).Error(output) + + def handle_output(self, fd, fn): + stringIO = io.StringIO() + while True: + try: + b = read(fd.fileno(), 1024) + if b: + stringIO.write(b.decode('utf-8')) + except OSError: + break + + s = stringIO.getvalue() + if s: + fn(s.strip()) + + stringIO.close() + + def do_execute_direct(self, code, silent=False): + """ + :param code: + The code to be executed. + :param silent: + Whether to display output. + :return: + Return value, or None + + MetaKernel code handler. + """ + + if not code.strip(): + return None + + retval = None + try: + retval = self.gateway.entry_point.eval(code.rstrip()) + self.handle_output(self.gateway_proc.stdout, self.Print) + self.handle_output(self.gateway_proc.stderr, self.Error) + except Py4JError as e: + if not silent: + self.Error(e.cause) + + if retval is None: + return + elif isinstance(retval, str): + return TextOutput(retval) + else: + return retval + +if __name__ == '__main__': + ToreeKernel.run_as_main() diff --git a/src/main/scala/com/ibm/ToreeClient.scala b/src/main/scala/com/ibm/ToreeClient.scala index a075f77..b644b02 100644 --- a/src/main/scala/com/ibm/ToreeClient.scala +++ b/src/main/scala/com/ibm/ToreeClient.scala @@ -38,7 +38,7 @@ object ToreeClient extends App { "hb_port": 49691, "shell_port": 40544, "iopub_port": 43462, - "ip": "127.0.0.1", + "ip": "9.125.72.72", "transport": "tcp", "signature_scheme": "hmac-sha256", "key": "" @@ -53,7 +53,13 @@ object ToreeClient extends App { with StandardHandlerInitialization).createClient() val toreeGateway = new ToreeGateway(client) - print(toreeGateway.eval("sc")) + /* + val code: String = + """ + |sc.parallelize(List(1,2,3,4,5)).reduce((a, b) => a + b) + """.stripMargin + print(toreeGateway.eval(args(0))) + */ val gatewayServer: GatewayServer = new GatewayServer(toreeGateway) gatewayServer.start() |