From 1d2c3186484c51f4aebbff5807c8e78bfec0436d Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Thu, 7 May 2020 20:49:16 +0200 Subject: blog: Add a short post on Python API --- content/en/blog/news/20200507-python.md | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 content/en/blog/news/20200507-python.md diff --git a/content/en/blog/news/20200507-python.md b/content/en/blog/news/20200507-python.md new file mode 100644 index 0000000..752ded1 --- /dev/null +++ b/content/en/blog/news/20200507-python.md @@ -0,0 +1,67 @@ +--- +date: 2020-05-07 +title: "A python API for Ouroboros" +linkTitle: "Python" +description: "Python" +author: Dimitri Staessens +--- + +Support for other programming languages than C/C++ has been on my todo +list for quite some time. The initial approach was using +[SWIG](http://www.swig.org), but we found the conversion always +clunky, it didn't completely work as we wanted to, and a while back we +just decided to deprecate it. Apart from C/C++ we only had a [rust +wrapper](https://github.com/chritchens/ouroboros-rs). + +Until now! I finally took the time to sink my teeth into the bindings +for Python. I had some brief looks at the +[ctypes](https://docs.python.org/3/library/ctypes.html) library a +while back, but this time I looked into +[cffi](https://cffi.readthedocs.io/en/latest/) and I was amazed at how +simple it was to wrap the more difficult functions that manipulate +blocks of memory (flow\_read, but definitely the async fevent() call). +And now there is path towards a 'nice' Python API. + +Here is a taste of what the +[eocho](https://ouroboros.rocks/cgit/ouroboros/tree/src/tools/oecho/oecho.c) +tool looks like in Python: + +```Python +from ouroboros import * +import argparse + + +def client(): + f = flow_alloc("oecho") + f.writeline("Hello, PyOuroboros!") + print(f.readline()) + f.dealloc() + + +def server(): + print("Starting the server.") + while True: + f = flow_accept() + print("New flow.") + line = f.readline() + print("Message from client is " + line) + f.writeline(line) + f.dealloc() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='A simple echo client/server') + parser.add_argument('-l', '--listen', help='run as a server', action='store_true') + args = parser.parse_args() + if args.listen is True: + server() + else: + client() +``` + +I have more time in the next couple of days, so I expect this to be +released after the weekend. Can't wait to get the full API done! + +Cheers, + +Dimitri -- cgit v1.2.3