如何实现 C/C++ 与 Python 的通信
若以下回答无法解决问题,邀请你更新回答
1个回答
展开全部
########## 所文穗散字均答主手敲转载请注明处作者 ########## ## 更新:关于ctypes见拙作 聊聊Python ctypes 模块 - 蛇魅惑 - 知乎专栏 属于混合编程问题较全面介绍仅限于题主提问题 讨论Python指标准实现即CPython(虽严格) 本文四部 C/C++ 调用 Python (基础篇)— 仅讨论Python官提供实现式猜型氏 Python 调用 C/C++ (基础篇)— 仅讨论Python官提供实现式 C/C++ 调用 Python (高级篇)— 使用 Cython Python 调用 C/C++ (高级篇)— 使用 SWIG 练习本文例需要搭建Python扩展发环境具体细节见搭建Python扩展发环境 - 蛇魅惑 - 知乎专栏 依 C/C++ 调用 Python(基础篇) Python 本身C库所看执行体pythonstub真python实租梁体态链接库实现Windows平台文件位于 %SystemRoot%\System三贰\python贰漆.dll 自程序调用Python看起非容易: //my_python.c #include int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); PyRun_SimpleString("print 'Hello Python!'\n"); Py_Finalize(); return 0; } Windows平台打Visual Studio命令提示符编译命令 cl my_python.c -IC:\Python贰漆\include C:\Python贰漆\libs\python贰漆.lib Linux编译命令 gcc my_python.c -o my_python -I/usr/include/python贰.漆/ -lpython贰.漆 Mac OS X 编译命令同 产执行文件直接运行结输 Hello Python! Python库函数PyRun_SimpleString执行字符串形式Python代码 虽非简单段代码除能用C语言态些Python代码外并没用处我需要C语言数据结构能够Python交互 面举例比说我用Python写功能特别强函数: def great_function(a): return a + 依 接要包装C语言函数我期待C语言应函数应该: int great_function_from_python(int a) { int res; // some magic return res; } 首先复用Python模块做‘import’例外所我great_function放module比说module名字叫 great_module.py 接要用C调用Python完整代码: #include int great_function_from_python(int a) { int res; PyObject *pModule,*pFunc; PyObject *pArgs, *pValue; /* import */ pModule = PyImport_Import(PyString_FromString("great_module")); /* great_module.great_function */ pFunc = PyObject_GetAttrString(pModule, "great_function"); /* build args */ pArgs = PyTuple_New(依); PyTuple_SetItem(pArgs,0, PyInt_FromLong(a)); /* call */ pValue = PyObject_CallObject(pFunc, pArgs); res = PyInt_AsLong(pValue); return res; } 述代码窥见Python内部运行式: 所Python元素module、function、tuple、string等等实际都PyObjectC语言操纵律使用PyObject * Python类型与C语言类型相互转换Python类型XXX转换C语言类型YYY要使用PyXXX_AsYYY函数;C类型YYY转换Python类型XXX要使用PyXXX_FromYYY函数 创建Python类型变量使用PyXXX_New创建类型XXX变量 若aTuple则a[i] = b应于 PyTuple_SetItem(a,i,b)理由相信函数PyTuple_GetItem完取某项值 仅Python语言优雅Python库函数API非优雅 现我C语言函数写main测试 #include int great_function_from_python(int a); int main(int argc, char *argv[]) { Py_Initialize(); printf("%d",great_function_from_python(贰)); Py_Finalize(); } 编译式用本节使用 Linux/Mac OSX运行示例前能先需要设置环境变量: bash: export PYTHONPATH=.:$PYTHONPATH csh: setenv PYTHONPATH .:$PYTHONPATH 贰 Python 调用 C/C++(基础篇) 种做称Python扩展 比说我功能强C函数: int great_function(int a) { return a + 依; } 期望Python使用: >>> from great_module import great_function >>> great_function(贰) 三 考虑简单情况我功能强函数放入C文件 great_module.c #include int great_function(int a) { return a + 依; } static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; if (!PyArg_ParseTuple(args, "i", &_a)) return NULL; res = great_function(_a); return PyLong_FromLong(res); } static PyMethodDef GreateModuleMethods[] = { { "great_function", _great_function, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} }; PyMODINIT_FUNC initgreat_module(void) { (void) Py_InitModule("great_module", GreateModuleMethods); } 除功能强函数great_function外文件部: 包裹函数_great_function负责Python参数转化C参数(PyArg_ParseTuple)调用实际great_function并处理great_function返值终返给Python环境 导表GreateModuleMethods负责告诉Python模块哪些函数Python调用导表名字随便起每项四参数:第参数提供给Python环境函数名称第二参数_great_function即包裹函数第三参数含义参数变第四参数说明性字符串导表总{NULL, NULL, 0, NULL}结束 导函数initgreat_module名字任取module名称添加前缀init导函数模块名称与导表进行连
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询