1

そのため、i2c デバイスとやり取りするための C プログラムがあります。Python からそのデバイスに接続する必要があります。プログラムを python モジュールに移植する価値があるかどうか、または移植に伴う労力がサブプロセスを使用してプログラムを実行するだけの価値がないかどうか疑問に思っています。アプリケーションごとに異なることはわかっていますが、python C 拡張機能を学習してこのプログラムを移植するのに時間をかける価値があるかどうかを知りたいです。

更新: C と python の両方のソースに完全にアクセスできます。しかし、Python 側ではすでにかなりの作業が行われており、それが重要な場合は、可能な限り最小限の変更を維持したいと考えています。また、C に加えなければならない変更を最小限に抑えたいと考えています。それは実行可能ですが、私はそれを書いていません。

4

5 に答える 5

3

あなたが進めることができる多くの方法があります - あなたが検討しているように見える Python C API だけでなく、SWIGCythonctypes ... 既存の C コードをライブラリにすることができる限り( 「外部から」呼び出し可能な関数)、豊富なオプションがあります。個人的には、お勧めしたいCythonのですが、Python の広範なサブセットのように見えてきており、機械語コードへの効果的なコンパイルと C ライブラリからの関数の直接呼び出しができるように拡張されています。

于 2010-08-18T21:56:00.923 に答える
2

私が最初に書いた Python プログラムの 1 つは、C ライブラリから関数を呼び出すスクリプトでした。私は ctypes を使用しましたが、その簡単さに感銘を受けました。数行の Python を記述するだけで、Python から各ライブラリ関数にアクセスできました (C はまったくありません!)。以前に Python C API を試したことがありますが、それにはさらに多くのボイラープレートが必要でした。SWIG や Cython は試していません。

于 2010-08-18T22:18:23.120 に答える
1

Python C APIは使用しないでください。はるかに簡単な代替手段、特にcythonがあります。

cythonはPythonに似た言語であり、PythoncライブラリのCコードにコンパイルされます。基本的には、Pythonの構文と機能を備えたCです(たとえば、forループ、例外など)。cythonは、Python用のC拡張機能を作成するための最も推奨される方法であることは明らかです。

また、Cライブラリを動的にロードし、そこから関数を呼び出すモジュールであるctypesも確認することをお勧めします。i2cコードが共有ライブラリとして利用できる場合は、ネイティブバインディングをまったく使用せずに済ませることができるため、開発と配布が容易になります。

于 2010-08-18T22:10:58.623 に答える
0

私はctypesを使って幸運に恵まれました。ただし、どちらを選択しても、今回は何も得られない可能性がありますが、次回はCですべてを実行するよりもはるかに高速になります。

于 2010-08-18T22:12:58.043 に答える
0

共有ライブラリを使用する ctypes をお勧めします。ただし、C API の構造体などの複雑な型に依存しないことをお勧めします。疑似 OOP アプローチを使用するのが、Python にマップする最も簡単な方法です。

例えば

foo_t* foo_new(void);
int foo_bar(foo_t*, int);
int foo_baz(foo_t*, int);
void foo_free(foo_t*);

ここでは、ctypes ネイティブのものを使用できます。たとえば、オブジェクト ハンドルの c_void_p と c_int です。c スタイルの文字列も create_string_buffer (またはそのようなもの) でサポートされています。

于 2010-08-18T22:17:43.087 に答える