4

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関数に渡す必要があります。そこでは、一般的な構文でメンバーに簡単にアクセスできます(辞書のようなものを使用しないことが望ましいですが、それも問題ありません)。PyObject_FromStruct 関数か何かが必要なようです。

これを行う比較的簡単な方法はありますか?

4

4 に答える 4

2

SWIG は、特に Python コードで不透明なブロブとして扱うことができる場合、ポインターを実行できます。

Cython を使用することもできます。これは Python の方言であり、Python と C のデータ型を混在させることができます。

于 2011-12-25T23:50:11.017 に答える
0

あなたの最善の策はswigのようなものですが、ポインターが問題を引き起こすと思います。

于 2011-12-25T21:59:52.790 に答える
0

最も簡単な方法は、構造内のすべての要素に対して get()/set() 関数を記述することだと思います (例: アドレス値を取得する get_addr() )。

オプション1(私はそれが最も簡単だと思います):Cコードをエクスポートされたget / setでdllファイルとしてコンパイルし、それをpythonにロードして「get」関数を呼び出します(Pythonでdllを使用するための私の投稿をチェックしてください。このQ&Aは役に立つかもしれませんLinux で .so ファイルを使用する場合

オプション 2 : SWIG を使用して pyd ファイルを取得し、それを python にインポートして「get/set」関数を呼び出すことができます

この方法を使用すると、Python はポインタの NOT ポインタのみを処理し、メモリ アドレスの使用を一切伴いません。

于 2011-12-27T10:18:41.503 に答える
0

構造体を、boost::python を使用して Python で消化可能なものにラップします。次に、Python にエクスポートする機能にアクセスします。

于 2011-12-27T11:45:30.493 に答える