I've been testing the cffi binding but it's missing some features. I've already added one for handling double pointers.
For the record I've been fixing variadics here:

https://github.com/sphaero/zproject/tree/fix_cffi

Still needs testing and fixing destroying

Test file here:
https://gist.github.com/sphaero/f5b2c89a52a1cd3c55bccd61b0ae7ff8

erroring on:

Traceback (most recent call last):
  File "test.py", line 66, in <module>
    input.recv(input, b"m", copy._p)
AttributeError: cdata 'struct _zmsg_t *' points to an opaque type: cannot read fields
python3: src/zmsg.c:64: zmsg_destroy: Assertion `zmsg_is (self)' failed.

Rg,

Arnaud

On 5/7/19 4:51 PM, Arnaud Loonstra wrote:
This indeed seems to a problem with at least Python's ctypes binding. Perhaps we could mention this somewhere?

I'm now trying the cffi binding. However you'd need to be some wizard to get this working without prior knowledge.

I got the binding to build and install. Now trying a simple test to get started:

```
from czmq_cffi import *

Zactor.test(True)

output = Zsock(0) # 0 == PAIR
output.connect(b"@inproc://zmsg.test")
assert(output)

input = Zsock(0) # 0 == PAIR
input.bind(b">inproc://zmsg.test")
assert (input);

msg = Zmsg()
assert (msg);
frame = Zframe(b"Hello", 5)
assert (frame);
msg.prepend(frame)
assert (msg.size() == 1)
assert (msg.content_size () == 5);
rc = msg.send(output)
assert (rc == 0)

msg = input.recv(input);
assert (msg)
assert (msg.size() == 1)
assert (msg.content_size() == 5)
```

However it fails:
```
Traceback (most recent call last):
   File "test.py", line 20, in <module>
     msg.prepend(frame);
  File "/home/arnaud/src/libsphactor/bindings/py3test/lib/python3.7/site-packages/czmq_cffi-4.2.1-py3.7-linux-x86_64.egg/czmq_cffi/Zmsg.py", line 80, in prepend
     return utils.lib.zmsg_prepend(self._p, frame_p._p)
TypeError: initializer for ctype 'struct _zframe_t * *' must be a pointer to same type, not cdata 'struct _zframe_t *'
```
So how to do that? How to get the pointer from Zrame object?

@Kevin, you here? You wrote the cffi binding generator, not?
I think it would be helpful for others if we create a unittest.

Rg,

Arnaud




On 5/2/19 4:20 PM, Arnaud Loonstra wrote:
Hey all,

I'm using zproject to design and build a library to extend zactor a bit. However I'm now running into a design issue when using callbacks.

For example I have in my api:
https://github.com/sphaero/libsphactor/blob/master/api/sphactor.api

     <callback_type name = "handler_fn">
         Callback function for socket activity
         <argument name = "msg" type = "zmsg" />
         <argument name = "arg" type = "anything" />
         <return type = "zmsg" />
     </callback_type>

So a callback which accepts a zmsg and returns a zmsg.

Works perfectly in C. However when I bind to Python it doesn't work. It seems Python(ctypes) only handles returning simple types from callbacks:

https://bugs.python.org/issue5710

I can see this doesn't apply to any api's I've found so for in czmq or zyre.

My question is whether it is bad api design from my side? Or are there any workarounds or better approaches for this?

Rg,

Arnaud
_______________________________________________
zeromq-dev mailing list
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev
_______________________________________________
zeromq-dev mailing list
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev
_______________________________________________
zeromq-dev mailing list
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to