文章标题
来源:互联网 发布:机顶盒刷linux 编辑:程序博客网 时间:2024/06/05 03:46
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;}
1 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- hdu2594Simpsons’ Hidden Talents(kmp)
- alarm 信号
- Android快捷方式
- java异常体系
- Android Spinner
- 文章标题
- 蜜罐发展史
- hdu3068 Manacher模板
- Java Integer 判等误区
- iOS tableViewCell 代理
- 安卓Selector失效、无用的解决方案
- 漫谈程序员系列:咦,你也在混日子啊
- ELF格式详解
- MFC中按钮的图片的变化,静态/hover/press,利用GDI