aboutsummaryrefslogtreecommitdiff
path: root/content/en/blog/20200507-python.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/en/blog/20200507-python.md')
-rw-r--r--content/en/blog/20200507-python.md74
1 files changed, 74 insertions, 0 deletions
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:
+
+{{<figure width="60%" src="/blog/20200507-python-lb.png">}}
+
+Can't wait to get the full API done!
+
+Cheers,
+
+Dimitri