Passing a C struct to a Python function

左心房为你撑大大i 提交于 2019-12-10 17:35:47

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!