问题
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?
回答1:
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.
回答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.
回答3:
Your best bet would be something like swig, but I would think the pointers will give you problems.
回答4:
I'd wrap the struct in something digestible by python with boost::python. And then access the functionality you want exported to python.
来源:https://stackoverflow.com/questions/8631741/passing-a-c-struct-to-a-python-function