簡體   English   中英

將C結構傳遞給Python函數

[英]Passing a C struct to a Python function

我需要一種簡單的方法來將C結構傳遞給Python函數。 我已經將Python嵌入到游戲服務器中,並且打算用Python編寫游戲邏輯。 我搜尋了Google和郵件列表,發現沒有任何用處。 我在C語言中有一個復雜的結構(帶有指向其他相對復雜結構的指針),並且沒有找到實現此目的的合理方法。

我有這個結構:

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;
};

並且需要將其傳遞給Python函數,在這里我可以使用通用語法輕松訪問成員(最好不要使用dict等東西,盡管也可以)。 幾乎就像我需要一個PyObject_FromStruct函數之類的。

有沒有相對簡單的方法可以做到這一點?

SWIG可以執行指針,特別是如果您可以在Python代碼中將它們視為不透明的Blob。

Cython可能還會使您有所作為-這是Python的方言,可讓您混合使用Python和C數據類型。

最好的選擇是swig ,但我認為指針會給您帶來麻煩。

我認為最簡單的方法可能是為結構中的每個元素編寫get()/ set()函數(例如:get_addr()獲取地址值),然后:

選項1(我認為這是最簡單的):將您的c代碼編譯為dll文件,並導出get / set並將其加載到python中,以調用“ get”函數(請在此處查看我的文章以在python中使用dll,此問與答可能會有用在Linux中使用.so文件

選項2:您可以使用SWIG獲取pyd文件並將其導入python以調用“獲取/設置”功能

使用這種方式,python只處理pointee NOT指針,並且不涉及任何內存地址的使用。

我會用boost :: python將結構體包裝在python可消化的東西中。 然后訪問要導出到python的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM