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;
}