4

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?

Abdurahman
  • 628
  • 8
  • 16
  • How exactly would I use Cython to pass a struct though? I'm looking through the documentation and can't find anything that's a working example of what I'm looking for. Thanks for your time. – blakeman8192 Dec 27 '11 at 06:29

4 Answers4

2

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.

dstromberg
  • 6,954
  • 1
  • 26
  • 27
0

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

harald
  • 5,976
  • 1
  • 24
  • 41
  • Thanks for the input. I looked into it (here: http://www.swig.org/Doc1.3/Python.html#Python_nn19) but it seems like I will be having problems with pointers and it just wont work. I'm debating whether or not I should write the game server in Java and use Jython which will require much less "glue code," but I'm really looking for the performance and lightweight nature of non-abstracted C. – blakeman8192 Dec 25 '11 at 23:48
0

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.

Community
  • 1
  • 1
Abdurahman
  • 628
  • 8
  • 16
  • Yeah that's actually a good idea I think - having get/set functions in C with some API and then using them with Python. Kind of clunky, but it's the only seamless way. Marking this as my accepted answer for now unless someone can find a magical solution. – blakeman8192 Dec 28 '11 at 03:15
0

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

piotr
  • 5,657
  • 1
  • 35
  • 60