Chinmay Kanchi的回答非常好,但我想要一个将变量/数组传递并返回给C++代码的函数示例。我认为如果对他人有用,我会在这里包含它。
传递和返回整数
以下是一个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代码使用numpy.ctypeslib
中的load_library
,假设共享库与Python脚本在同一目录中。
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数组的指针,该数组由64位浮点数组成,并且是按照C语言的顺序存储的。第二个参数是一个整数值,告诉C代码Numpy数组中元素的数量。然后,C代码会按如下方式打印出这些内容:
1.4
2.6
3.0
>>>
符号? 如果人们发布的代码每行都有>>>
,那就代表这些代码是在交互式Shell中运行的。 如果要从文件中运行它,请删除任何出现>>>
(三个大于号和一个空格)的地方。 - Chinmay Kanchi>>>
符号。这些符号是交互式 Shell 打印的,应该在源代码文件中省略。 - nmichaels