Question

I need a simple way to pass a C struct to a Python function. I have embedded Python into a game server, and I intend to write game logic in Python. I've scoured Google and mailing lists and found nothing useful. I have a complex structure in C (with pointers to other relatively complex structures) and have found no reasonable way of doing this.

I have this struct:

struct client {
    int state;
    int sockfd;
    struct sockaddr_in *addr;
    struct epoll_event *epollev;
    struct buffer *in_buffer;
    struct buffer *out_buffer;
    struct packet *packet;
    struct player *player;
};

And need to pass it to a Python function where I can easily access the members with common syntax (preferably not the use of things like dicts although that's alright too). It's almost like I need a PyObject_FromStruct function or something.

Is there any relatively simple way to do this?

Was it helpful?

Solution

i think that the most simple way may be to write get()/set() functions for every element in the structure (ex: get_addr() which gets the address value) and then:

Option 1 (i think it is the simplest) :compile your c code as dll file with get/set exported and load it into python to call "get" functions (check my post here for using dll in python and this Q&A may be useful for using .so files in linux

Option 2 :you may use SWIG to get the pyd file and import it into python to call "get/set" functions

using this way python is dealing only with pointee NOT pointers and do not involve any memory addresses usage.

OTHER TIPS

SWIG can do pointers, especially if you can treat them as opaque blobs in your Python code.

You might also get somewhere with Cython - it's a dialect of Python that allows you to intermix Python and C datatypes.

Your best bet would be something like swig, but I would think the pointers will give you problems.

I'd wrap the struct in something digestible by python with boost::python. And then access the functionality you want exported to python.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top