2011-12-25 15 views
4

C構造体をPython関数に渡す簡単な方法が必要です。私はPythonをゲームサーバーに組み込みました。私はPythonでゲームロジックを書くつもりです。私はGoogleとメーリングリストを精査して何も役に立たなかった。私はCで複雑な構造をしています(他の比較的複雑な構造へのポインタを持っています)、これを行う合理的な方法が見つけられていません。C構造体をPython関数に渡す

私はこの構造体があります。

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

をと(それはあまりにも大丈夫だが、好ましくないdictsのようなものを使用)、私は簡単に一般的な構文を使用してメンバーにアクセスすることができますPythonの関数に渡す必要があります。 PyObject_FromStruct関数などが必要です。

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

+0

http://cython.org/ –

+0

Cythonを使って構造体をどのくらい正確に渡すことができますか?私はドキュメンテーションを見ていて、私が探しているものの実際の例であるものを見つけることはできません。御時間ありがとうございます。 – blakeman8192

答えて

0

私は最も簡単な方法は、構造内のすべての要素のための取得()/セット()関数を記述することであってもよいと思い

オプション1 (私はそれが最も単純だと思います):あなたのCコードをget/setでdllファイルとしてコンパイルし、 "get"関数を呼び出すためにPythonにロードしてください。 (hereのpythonでdllを使用しています。 Linuxでの.soファイルの使用

オプション2:SWIGを使用してpydファイルを取得し、Pythonにインポートして「取得/設定」機能を呼び出すことができます

このようにPythonはpointee NOTポインタだけを扱っており、メモリアドレスの使用は含まれていません。

+0

私が考える良いアイデア - CでいくつかのAPIを使って関数を取得/設定し、Pythonでそれらを使用すること。 clunkyの種類、それは唯一のシームレスな方法です。誰かが魔法の解決策を見つけることができない限り、これを私の受け入れられた答えとしてください。 – blakeman8192

0

あなたの最善の賭けはswigのようになりますが、私はポインタがあなたに問題を与えると思います。

+0

ありがとうございました。私はそれを見て(ここでは:http://www.swig.org/Doc1.3/Python.html#Python_nn19)、私はポインタの問題を抱えているように思えます。私はJavaでゲームサーバーを作成し、Jythonを使うべきかどうか議論していますが、これははるかに少ない「接着コード」を必要としますが、実際には非抽象化されたCのパフォーマンスと軽量性が求められます。 – blakeman8192

2

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

Cythonのどこかにいるかもしれません。Pythonの方言で、PythonとCのデータ型を混在させることができます。そして:(get_addr()アドレスの値を取得している例)と:

0

私はstructを何か消化して、pythonでboost :: pythonでラップします。そして、Pythonにエクスポートしたい機能にアクセスしてください。

関連する問題