From 20df52a54fc03ef067cb4bce3e176e19129b4a84 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Sun, 14 Feb 2021 17:42:22 +0100 Subject: content: Move releases to docs and add 0.18 notes --- content/en/blog/20200507-python.md | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 content/en/blog/20200507-python.md (limited to 'content/en/blog/20200507-python.md') diff --git a/content/en/blog/20200507-python.md b/content/en/blog/20200507-python.md new file mode 100644 index 0000000..2b05c91 --- /dev/null +++ b/content/en/blog/20200507-python.md @@ -0,0 +1,74 @@ +--- +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 +[oecho](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. + +Oh, and here is a picture of Ouroboros load-balancing between the C (top right) +and Python (top left) implementations using the C and Python clients: + +{{
}} + +Can't wait to get the full API done! + +Cheers, + +Dimitri -- cgit v1.2.3