Python与C/C++的最好交互应该是:C++为Python编写扩展模块,Python为C++提供脚本接口。
如果想要在C++的项目中调用Python来丰富功能,也是可以的。本文先来介绍第一种用法。
本来感觉Python与C/C++的相互调用会非常简单【事实也是如此】。但是昨天写的C++调用Python的例子中,出现了让我难以明白的Bug,折腾了很久才明白,Python文件的文件名不能随便起,最好不要用test.py之类的。python自带test模组且优先级高于用户的。
这样就没有问题了。【这里解决了调用问题,后面再讲如何调用数据结构】
/* // py文件: myTest.py def Hello(): print('Hello, world!') */ /* 函数查找的时候不成功。 据说需要是32位的Python3.6, 不知道是不是因为这个原因。待查。 查明白了,不是因为这个原因。是Python文件不能起test这样的名字。 */ extern "C" { #include "Python.h" } int main() { Py_Initialize(); int ret = Py_IsInitialized(); if (ret == 0) { printf("Py_IsInitialized = false \r\n"); return -1; } PyObject* pModule = PyImport_ImportModule("myTest"); //加载py文件 if (pModule == NULL) printf("pModel = NULL \r\n"); else { /* // 方法一:直接获取函数 PyObject* pFunc = PyObject_GetAttrString(pModule, "Hello"); */ // 方法二:获取所有的字典表,然后从字典表中获取函数 PyObject* pDict = PyModule_GetDict(pModule); PyObject* pFunc = PyDict_GetItemString(pDict, "Hello"); // 执行函数 if (pFunc) { PyEval_CallObject(pFunc, NULL); } else { printf("pFunc = NULL \r\n"); } } // 善后工作 Py_DECREF(pModule); Py_Finalize(); return 0; }