您的位置:首页 > 编程语言 > C语言/C++

文章标题

2016-04-27 10:09 330 查看

C++调用Python脚本

#include <Python.h>

class CPyCall
{
public:
CPyCall()
{
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized())
{
MD_COMM_LOG_ERR(-1, "Py_Initialize Failed.");
exit(0);
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

MD_COMM_LOG_DEBUG("Py_Initialize Success.");
}
~CPyCall()
{
std::map<std::string, PyObject*>::iterator iteModule = m_mapPyModule.begin();
while (iteModule != m_mapPyModule.end())
{
m_mapPyModule.erase(iteModule++);
}
Py_Finalize();
MD_COMM_LOG_DEBUG("Py_Finalize Success.");
}

/*
module:    Python脚步的模块名
function:  要调用的函数名
format:    传递给Py_VaBuildValue函数的可变参数模板
返回值:    返回值需要使用原生的PyArg_Parse等函数解析支持
eg: PyCall( "pytest", "fun",  "()" );
PyCall( "pytest", "fun1", "(i)",  12 );
PyCall( "pytest", "fun2", "(is)", 12, "12" );
*/
PyObject* PyCall(const std::string& strModule, const std::string& strFunc, const char *format, ...)
{
PyObject* pFunc = NULL;
PyObject* pParm = NULL;
PyObject* pRetVal = NULL;

if (ImportModule(strModule))
{
MD_COMM_LOG_ERR(-1, "Add Python Module Failed.");
return NULL;
}

std::map<std::string, PyObject*>::iterator iteModule = m_mapPyModule.end();
iteModule = m_mapPyModule.find(strModule);

//查找函数
if (!(pFunc = PyObject_GetAttrString(iteModule->second, strFunc.c_str())))
{
MD_COMM_LOG_ERR(-1, "Can't find function[%s] in module[%s]", strFunc.c_str(), strModule.c_str());
return NULL;
}

//创建参数
va_list vargs;
va_start(vargs, format);
pParm = Py_VaBuildValue(format, vargs);
va_end(vargs);

//函数调用
pRetVal = PyEval_CallObject(pFunc, pParm);

Decref(pParm);
Decref(pFunc);

return pRetVal;
}

// 销毁对象
void Decref(PyObject* pObj)
{
if (pObj)
{
Py_DECREF(pObj);
pObj = NULL;
}
}

private:
// 添加导入模块
int ImportModule(const std::string& strModule)
{
std::map<std::string, PyObject*>::iterator iteModule = m_mapPyModule.end();
iteModule = m_mapPyModule.find(strModule);
if (iteModule == m_mapPyModule.end())
{
PyObject* pMod = NULL;
//导入模块
if (!(pMod = PyImport_ImportModule(strModule.c_str())))
{
MD_COMM_LOG_ERR(-1, "Load module[%s] failed.", strModule.c_str());
return -1;
}
m_mapPyModule[strModule] = pMod;
MD_COMM_LOG_DEBUG("Import new module[%s]", strModule.c_str());
}

return 0;
}

private:
std::map<std::string, PyObject*>        m_mapPyModule;
};

int main()
{
CPyCall oPy;

// python文件名是当前目录下的文件,或者绝对路径(没测试)
PyObject* pReto = Py.PyCall("python文件名", "函数名", "参数格式",(参数列表...));
// PyArg_Parse解析
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python c语言 c++