Mercurial > hg > Members > aka > jupyter_CbC_kernel
changeset 20:696cc0775abb
Change package name
author | Brendan Rius <brendan@omixy.com> |
---|---|
date | Fri, 29 Apr 2016 09:58:55 +0100 |
parents | 92e342d23ebc |
children | 994d4258dc08 |
files | c_kernel/__init__.py c_kernel/__main__.py c_kernel/kernel.py jupyter_c_kernel/__init__.py jupyter_c_kernel/__main__.py jupyter_c_kernel/kernel.py setup.py |
diffstat | 5 files changed, 89 insertions(+), 89 deletions(-) [+] |
line wrap: on
line diff
--- a/c_kernel/__main__.py Fri Apr 29 09:52:03 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -from ipykernel.kernelapp import IPKernelApp -from .kernel import CKernel -IPKernelApp.launch_instance(kernel_class=CKernel)
--- a/c_kernel/kernel.py Fri Apr 29 09:52:03 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -from ipykernel.kernelbase import Kernel -import subprocess -import tempfile -import os - - -class CKernel(Kernel): - implementation = 'c_kernel' - implementation_version = '1.0' - language = 'c' - language_version = 'C11' - language_info = {'name': 'c', - 'mimetype': 'text/plain', - 'file_extension': 'c'} - banner = "C kernel.\n" \ - "Uses gcc, compiles in C11, and creates source code files and executables in temporary folder.\n" - - def __init__(self, *args, **kwargs): - super(CKernel, self).__init__(*args, **kwargs) - self.files = [] - - def cleanup_files(self): - """Remove all the temporary files created by the kernel""" - for file in self.files: - os.remove(file) - - def new_temp_file(self, **kwargs): - """Create a new temp file to be deleted when the kernel shuts down""" - # We don't want the file to be deleted when closed, but only when the kernel stops - kwargs['delete'] = False - kwargs['mode'] = 'w' - file = tempfile.NamedTemporaryFile(**kwargs) - self.files.append(file.name) - return file - - @staticmethod - def execute_command(cmd): - """Execute a command and returns the return code, stdout and stderr""" - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = p.communicate() - return p.returncode, stdout.decode('utf-8'), stderr.decode('utf-8') - - @staticmethod - def compile_with_gcc(source_filename, binary_filename): - args = ['gcc', source_filename, '-std=c11', '-o', binary_filename] - return CKernel.execute_command(args) - - def do_execute(self, code, silent, store_history=True, - user_expressions=None, allow_stdin=False): - - retcode, stdout, stderr = None, '', '' - with self.new_temp_file(suffix='.c') as source_file: - source_file.write(code) - source_file.flush() - with self.new_temp_file(suffix='.out') as binary_file: - retcode, stdout, stderr = self.compile_with_gcc(source_file.name, binary_file.name) - if retcode != 0: - stderr += "[C kernel] GCC exited with code {}, the executable will not be executed".format(retcode) - self.log.info("GCC return code: {}".format(retcode)) - self.log.info("GCC stdout: {}".format(stdout)) - self.log.info("GCC stderr: {}".format(stderr)) - - if retcode == 0: # If the compilation succeeded - retcode, out, err = CKernel.execute_command([binary_file.name]) - if retcode != 0: - stderr += "[C kernel] Executable exited with code {}".format(retcode) - self.log.info("Executable retcode: {}".format(retcode)) - self.log.info("Executable stdout: {}".format(out)) - self.log.info("Executable stderr: {}".format(err)) - stdout += out - stderr += err - else: - self.log.info('Compilation failed, the program will not be executed') - - if not silent: - stream_content = {'name': 'stderr', 'text': stderr} - self.send_response(self.iopub_socket, 'stream', stream_content) - stream_content = {'name': 'stdout', 'text': stdout} - self.send_response(self.iopub_socket, 'stream', stream_content) - return {'status': 'ok', 'execution_count': self.execution_count, 'payload': [], 'user_expressions': {}} - - def do_shutdown(self, restart): - """Cleanup the created source code files and executables when shutting down the kernel""" - self.cleanup_files()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jupyter_c_kernel/__main__.py Fri Apr 29 09:58:55 2016 +0100 @@ -0,0 +1,3 @@ +from ipykernel.kernelapp import IPKernelApp +from .kernel import CKernel +IPKernelApp.launch_instance(kernel_class=CKernel)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jupyter_c_kernel/kernel.py Fri Apr 29 09:58:55 2016 +0100 @@ -0,0 +1,84 @@ +from ipykernel.kernelbase import Kernel +import subprocess +import tempfile +import os + + +class CKernel(Kernel): + implementation = 'jupyter_c_kernel' + implementation_version = '1.0' + language = 'c' + language_version = 'C11' + language_info = {'name': 'c', + 'mimetype': 'text/plain', + 'file_extension': 'c'} + banner = "C kernel.\n" \ + "Uses gcc, compiles in C11, and creates source code files and executables in temporary folder.\n" + + def __init__(self, *args, **kwargs): + super(CKernel, self).__init__(*args, **kwargs) + self.files = [] + + def cleanup_files(self): + """Remove all the temporary files created by the kernel""" + for file in self.files: + os.remove(file) + + def new_temp_file(self, **kwargs): + """Create a new temp file to be deleted when the kernel shuts down""" + # We don't want the file to be deleted when closed, but only when the kernel stops + kwargs['delete'] = False + kwargs['mode'] = 'w' + file = tempfile.NamedTemporaryFile(**kwargs) + self.files.append(file.name) + return file + + @staticmethod + def execute_command(cmd): + """Execute a command and returns the return code, stdout and stderr""" + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + return p.returncode, stdout.decode('utf-8'), stderr.decode('utf-8') + + @staticmethod + def compile_with_gcc(source_filename, binary_filename): + args = ['gcc', source_filename, '-std=c11', '-o', binary_filename] + return CKernel.execute_command(args) + + def do_execute(self, code, silent, store_history=True, + user_expressions=None, allow_stdin=False): + + retcode, stdout, stderr = None, '', '' + with self.new_temp_file(suffix='.c') as source_file: + source_file.write(code) + source_file.flush() + with self.new_temp_file(suffix='.out') as binary_file: + retcode, stdout, stderr = self.compile_with_gcc(source_file.name, binary_file.name) + if retcode != 0: + stderr += "[C kernel] GCC exited with code {}, the executable will not be executed".format(retcode) + self.log.info("GCC return code: {}".format(retcode)) + self.log.info("GCC stdout: {}".format(stdout)) + self.log.info("GCC stderr: {}".format(stderr)) + + if retcode == 0: # If the compilation succeeded + retcode, out, err = CKernel.execute_command([binary_file.name]) + if retcode != 0: + stderr += "[C kernel] Executable exited with code {}".format(retcode) + self.log.info("Executable retcode: {}".format(retcode)) + self.log.info("Executable stdout: {}".format(out)) + self.log.info("Executable stderr: {}".format(err)) + stdout += out + stderr += err + else: + self.log.info('Compilation failed, the program will not be executed') + + if not silent: + stream_content = {'name': 'stderr', 'text': stderr} + self.send_response(self.iopub_socket, 'stream', stream_content) + stream_content = {'name': 'stdout', 'text': stdout} + self.send_response(self.iopub_socket, 'stream', stream_content) + return {'status': 'ok', 'execution_count': self.execution_count, 'payload': [], 'user_expressions': {}} + + def do_shutdown(self, restart): + """Cleanup the created source code files and executables when shutting down the kernel""" + self.cleanup_files()