[PYTHON] Try to make a kernel of Jupyter

What are you doing?

Jupyter supports over 50 languages (IPython kernels for other languages -for-other-languages)). It's easy to adapt to new languages. (Reference: Making kernels for Jupyter) Here, as an example, let's create a new Jupyter kernel called KeyValue.

What to make

Create something that simply manages key / value pairs.

Command Description
? Display key list
Key Shows the value corresponding to the key
Key value Set the value corresponding to the key

Implementation

Just put the two files in place.

JSON file

Create the following JSON file. See Kernel specs for the location. (If you don't have "python3" in "argv", change it to "python".)

keyvalue/kernel.json


  "argv": [
    "python", "-m", "keyvaluekernel", "-f", "{connection_file}"
  ],
 "display_name": "KeyValue"
}

Python file

Create the following python file under the python installation destination.

keyvaluekernel.py


from ipykernel.kernelbase import Kernel

class KeyValue(Kernel):
    implementation = 'KeyValue'
    implementation_version = '0.1'
    language = 'no-op'
    language_version = '0.1'
    language_info = {'name': 'KeyValue', 'mimetype': 'text/plain'}
    banner = 'Dictionry of Key, Value'
    _d = {}
    def do_execute(self, code, silent, store_history=True,
             user_expressions=None, allow_stdin=False):
        s = code.strip()
        if not silent:
            if s.startswith('?'):
                c = {'name': 'stdout', 'text': ' '.join(KeyValue._d.keys())}
            else:
                ss = s.split(maxsplit=1)
                if len(ss) == 1:
                    if s in KeyValue._d:
                        c = {'name': 'stdout', 'text': KeyValue._d[s]}
                    else:
                        c = {'name': 'stderr', 'text': 'Not found'}
                else:
                    KeyValue._d[ss[0]] = ss[1]
                    c = {'name': 'stdout', 'text': ss[1]}
            self.send_response(self.iopub_socket, 'stream', c)
        return {'status': 'ok',
                'execution_count': self.execution_count,
                'payload': [],
                'user_expressions': {},
               }
    def do_complete(self, code, cursor_pos):
        s = code[:cursor_pos]
        return {'status': 'ok', 'matches': [k for k in KeyValue._d if k.startswith(s)],
                'cursor_start': cursor_pos, 'cursor_end': -1, 'metadata': {}}

if __name__ == '__main__':
    from ipykernel.kernelapp import IPKernelApp
    IPKernelApp.launch_instance(kernel_class=KeyValue)

Alternatively, place it in any location and specify the location in PYTHONPATH of the ʻenv` key of the JSON file.

keyvalue/kernel.json


{
  "argv": [
    "python", "-m", "keyvaluekernel", "-f", "{connection_file}"
  ],
  "display_name": "KeyValue",
  "env": {
    "PYTHONPATH": "/path/to/your/modules"
  }
}

Calculates and returns the result of executing with do_execute. do_complete returns what to complete when the tab is pressed.

OS Example of creation location
Windows C:\Anaconda3\Lib\site-packages
Ubuntu /usr/local/lib/python3.4/dist-packages

give it a try

--Start with "jupyter notebook" and select [Key Value] from [New]. -Enter "key1 value1" and execute (Shift + Enter). --If you enter "key1" and execute it, "value1" will be displayed. -Enter "key2 value2" and execute. -If you execute "?", A list of keys will appear. -Enter up to "k" and press [Tab] to get candidates.

image

Docker image

I have prepared a docker image (tsutomu7 / keyvalue) for easy confirmation. You can check as follows.

ubuntu


docker run -it --rm tsutomu7/keyvalue

After executing the above, open "http: // host IP address: 8888" (for example, "http://172.17.0.2:8888").

Recommended Posts