- 首先創(chuàng)建工程,添加源文件
-
配置環(huán)境
編寫python調(diào)用C++的API:
// python api
#include <Python.h>
// add函數(shù)原型
int Add(int x, int y)
{
return x + y;
}
/*
Python調(diào)用Add函數(shù)時(shí)的接口演侯。
該函數(shù)輸入?yún)?shù)為python變量類型,
*/
static PyObject* add_interface(PyObject* self, PyObject* args)
{
int x, y;
// 檢查輸入的參數(shù)類型并轉(zhuǎn)換為C變量類型咬清,i即表示integer整型
if (!PyArg_ParseTuple(args, "ii", &x, &y))
{
return NULL;
}
// 將C變量類型轉(zhuǎn)換為python類型鱼蝉。
return Py_BuildValue("i", Add(x, y));
}
/*
為使得函數(shù)能夠被python調(diào)用,需要先定義一個(gè)方法表粗俱。
第三個(gè)參數(shù)(METH_VARARGS),這個(gè)標(biāo)志指定會(huì)使用C的調(diào)用慣例虚吟。
可選值有METH_VARARGS寸认、METH_VARARGS|METH_KEYWORDS。值0代表使用PyArg_ParseTuple()的變量串慰。
如果單獨(dú)使用METH_VARARGS偏塞,函數(shù)會(huì)等待Python傳來tuple格式的參數(shù),并最終使用PyArg_ParseTuple()進(jìn)行解析邦鲫。
METH_KEYWORDS值表示接受關(guān)鍵字參數(shù)灸叼。這種情況下C函數(shù)需要接受第三個(gè)PyObject*對象,表示字典參數(shù)庆捺,使用 PyArg_ParseTupleAndKeywords()來解析出參數(shù)古今。
*/
static PyMethodDef test_methods[] = {
{ "Add", add_interface, METH_VARARGS, "something" },
{ NULL, NULL , 0, NULL }
};
/*
上一個(gè)方法表必須被模塊定義結(jié)構(gòu)所引用。
這個(gè)結(jié)構(gòu)體必須傳遞給解釋器的模塊初始化函數(shù)滔以。
*/
static struct PyModuleDef pyadd = {
PyModuleDef_HEAD_INIT,
"Py2Cpp",
NULL,
-1,
test_methods
};
/*
初始化函數(shù)必須命名為PyInit_name()捉腥,其中name是module的名字
*/
PyMODINIT_FUNC
PyInit_python_add(void)
{
return PyModule_Create(&pyadd);
}
模塊的初始化函數(shù)必須以PyInit_name明明,其中name是模塊的名字你画,以此調(diào)用Py_InitModule()函數(shù)抵碟,使解釋器能正確的調(diào)用模塊中的函數(shù) 桃漾。
最后,右鍵項(xiàng)目生成拟逮,會(huì)生成一個(gè)dll文件撬统,將其后綴重命名為pyd,并放入python庫中敦迄,即可import并調(diào)用相關(guān)函數(shù)
參考:
Windows下Python3調(diào)用C++函數(shù)