Chinmay Kanchi의 대답은 훌륭하지만 C ++ 코드에 변수 / 배열을 전달하고 반환하는 함수의 예를 원했습니다. 다른 사람에게 유용 할 경우를 대비하여 여기에 포함하겠습니다.
정수 전달 및 반환
정수를 취하고 반환 된 값에 1을 더하는 함수에 대한 C ++ 코드,
extern "C" int add_one(int i)
{
return i+1;
}
파일로 저장 test.cpp
하고 필요한 extern "C"를 기록합니다 (C 코드의 경우 제거 할 수 있음). 이것은 Chinmay Kanchi 답변과 유사한 인수로 g ++를 사용하여 컴파일됩니다.
g++ -shared -o testlib.so -fPIC test.cpp
파이썬 코드를 사용 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
는 정렬 된 Numpy 배열에 대한 포인터로 c_contiguous 64 비트 부동 소수점 및 두 번째 인수는 C 코드에 Numpy 배열의 요소 수를 알려주는 정수로 지정합니다. 이것은 다음과 같이 C 코드로 인쇄됩니다.
1.4
2.6
3.0
>>>
importtest.py에? 사람들이>>>
각 줄에있는 코드를 게시 하면 대화 형 쉘에서 실행되고 있음을 나타냅니다. 파일에서 실행하려면 파일>>>
이 나타날 때마다 (3> 기호 및 공백) 제거하십시오 .