Chinmay Kanchiの答えは素晴らしいですが、C ++コードに変数/配列を渡して返す関数の例が必要でした。他の人に役立つので、ここに含めておきます。
整数の受け渡し
整数を受け取り、戻り値に1を加える関数のC ++コード、
extern "C" int add_one(int i)
{
return i+1;
}
ファイルとして保存されtest.cpp
、必要な extern "C" に注意してください(これはCコードでは削除できます)。これはg ++を使用してコンパイルされており、Chinmay Kanchiの回答と同様の引数があります。
g++ -shared -o testlib.so -fPIC test.cpp
Pythonコードは、Pythonスクリプトと同じディレクトリにある共有ライブラリへのパスを想定して使用load_library
しnumpy.ctypeslib
ます。
import numpy.ctypeslib as ctl
import ctypes
libname = 'testlib.so'
libdir = './'
lib=ctl.load_library(libname, libdir)
py_add_one = lib.add_one
py_add_one.argtypes = [ctypes.c_int]
value = 5
results = py_add_one(value)
print(results)
これは期待どおり6を印刷します。
配列の受け渡しと印刷
Cコードで配列の要素を出力するには、次のように配列を渡すこともできます。
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
以前と同じようにコンパイルされ、同じ方法でインポートされます。この関数を使用するための追加のPythonコードは次のようになります。
import numpy as np
py_print_array = lib.print_array
py_print_array.argtypes = [ctl.ndpointer(np.float64,
flags='aligned, c_contiguous'),
ctypes.c_int]
A = np.array([1.4,2.6,3.0], dtype=np.float64)
py_print_array(A, 3)
ここで、配列を指定します。最初の引数はprint_array
、整列されたc_contiguous 64ビットfloatのNumpy配列へのポインターとして、2番目の引数は、Numpy配列の要素数をCコードに伝える整数として指定します。これは、Cコードによって次のように出力されます。
1.4
2.6
3.0
>>>
importtest.pyに?人々が>>>
各行にあるコードを投稿するとき、それはインタラクティブシェルで実行されていることを示しています。ファイルから実行するには、>>>
出現する場所(3>記号とスペース)を削除します。