33

C で記述した関数がたくさんあり、Python で記述したコードでこれらの関数にアクセスできるようにしたいと考えています。

ここで同様の問題に対処するいくつかの質問を読みました(たとえば、ここここ)が、どのアプローチを取る必要があるかについて混乱しています。

1 つの質問は ctypes を推奨し、別の質問は cython を推奨します。私は両方のドキュメントを少し読んだことがありますが、どちらが私にとってよりうまく機能するかについては完全に不明です.

基本的に、いくつかの 2 次元 FFT を実行するための Python コードを作成しました。C コードでその結果を確認し、作成したさまざまな C 関数で処理できるようにしたいと考えています。C から Python を呼び出す方が簡単なのか、その逆なのかはわかりません。

4

4 に答える 4

64

ctypesラッパーを作成して、Python から C を呼び出す必要があります。Cython は Python のようなコードをより高速に実行するためのもので、ctypes は C 関数を Python から呼び出せるようにするためのものです。あなたがする必要があるのは次のとおりです。

  1. 使用する C 関数を記述します。(おそらくすでにこれを行っているでしょう)
  2. これらの関数の共有オブジェクト (Linux、OS X などの場合は .so) または動的に読み込まれるライブラリ (Windows の場合は .dll) を作成します。(もしかしたら、あなたもすでにそうしているかもしれません)
  3. ctypes ラッパーを作成します (思ったより簡単です。そのためのハウツーを書きました) 。
  4. Python でそのラッパーから関数を呼び出します。(これは、他の Python 関数を呼び出すのと同じくらい簡単です)
于 2013-05-20T10:52:41.633 に答える
4

さて、ここでは、以下の 2 つのことについて言及しています。

  1. Python内でc関数を呼び出す方法(Pythonの拡張)
  2. CプログラムからPython関数/スクリプトを呼び出す方法(Embedding Python)

#2の「Pythonの埋め込み」

以下のコード セグメントを使用できます。

#include "python.h"

int main(int argc, char *argv[]) {   
Py_SetProgramName(argv[0]);  /* optional but recommended */   
Py_Initialize();   
PyRun_SimpleString("from time import time,ctime\n"
    "print 'Today is',ctime(time())\n");
/*Or if you want to run python file within from the C code*/       
//pyRun_SimpleFile("Filename");    
Py_Finalize();   
return 0; }

#1の「拡張Python」の 場合、Ctypesを使用するのが最善の策です(ところで、Pythonのすべてのバリアントで移植可能です)。

ctypesインポートから *

libc = cdll.msvcrt

libc.time を印刷する (なし)

1438069008

printf = libc.printf

printf("こんにちは、%s\n", "ワールド!")

こんにちは世界!14

printf("%d 本のビール\n", 42)

ビール42本 19本

詳細なガイドについては、私のブログ記事を参照してください。

于 2015-08-28T06:44:22.877 に答える
2

Python から C を呼び出す方が簡単です。あなたのシナリオは奇妙に聞こえます.Cで書かれたプロセッサ集約的な部分を除いて、通常、人々はPythonでほとんどのコードを書きます.2次元FFTはあなたのコードの計算集約的な部分ですか?

于 2013-05-20T10:44:23.253 に答える