This action will force synchronization from EvanZhaoOwn/ffpython, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
#ifndef __FFPYTHON_H_#define __FFPYTHON_H_#include <Python.h>#include <structmember.h>#include <string>using namespace std;#include "pyops_base.h"#include "pyops_for_embed.h"#include "pyops_for_extend.h"class ffpython_t{struct reg_info_t{reg_info_t():args_num(0),option_args_num(0),func_addr(0){}int args_num;int option_args_num;long func_addr;PyCFunction func;string func_name;string func_impl_name;string doc;string doc_impl;};public:ffpython_t();~ffpython_t();static int init_py();static int final_py();static int add_path(const string& path_);static int run_string(const string& py_);static int reload(const string& py_name_);static int load(const string& py_name_);//! 将需要注册的函数、类型注册到python虚拟机int init(const string& mod_name_, string doc_ = "");//! 注册static function,template<typename T>ffpython_t& reg(T func_, const string& func_name_, string doc_ = ""){reg_info_t tmp;tmp.args_num = pyext_func_traits_t<T>::args_num();tmp.option_args_num = pyext_func_traits_t<T>::option_args_num();tmp.func = (PyCFunction)pyext_func_traits_t<T>::pyfunc;tmp.func_name= func_name_;tmp.func_impl_name = func_name_ + "_internal_";tmp.doc = doc_;tmp.doc_impl = string("internal use, please call ") + func_name_;tmp.func_addr= (long)func_;m_func_info.push_back(tmp);return *this;}//! 注册c++ classtemplate<typename T, typename CTOR>pyclass_regigster_tool_t& reg_class(const string& class_name_, string doc_ = "", string inherit_name_ = ""){if (pyclass_base_info_t<T>::pytype_info.class_name.empty() == false)throw runtime_error("this type has been registed");pyclass_base_info_t<T>::pytype_info.class_name = class_name_;//pyclass_base_info_t<T>::pytype_info.mod_name = m_mod_name;pyclass_base_info_t<T>::pytype_info.total_args_num = pyext_func_traits_t<CTOR>::args_num() +pyext_func_traits_t<CTOR>::option_args_num();pyclass_regigster_tool_t tmp;tmp.class_name = class_name_;tmp.class_real_name = class_name_ + "_internal_";tmp.inherit_name = inherit_name_;tmp.doc = doc_;tmp.dector = (destructor)pyclass_base_info_t<T>::free_obj;tmp.init = (initproc)pyclass_ctor_tool_t<T, CTOR>::init_obj;tmp.ctor = pyclass_base_info_t<T>::alloc_obj;tmp.type_size = sizeof(typename pyclass_base_info_t<T>::obj_data_t);tmp.args_num = pyext_func_traits_t<CTOR>::args_num();tmp.option_args_num = pyext_func_traits_t<CTOR>::option_args_num();tmp.static_pytype_info = &(pyclass_base_info_t<T>::pytype_info);//! 注册析构函数,python若不调用析构函数,当对象被gc时自动调用tmp.delete_func = (PyCFunction)pyclass_base_info_t<T>::release;m_all_pyclass.push_back(tmp);return m_all_pyclass.back();}//! 调用python函数,最多支持9个参数template<typename RET>RET_V call(const string& mod_name_, const string& func_){pycall_arg_t args(0);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1){pycall_arg_t args(1);args.add(a1);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2){pycall_arg_t args(2);args.add(a1).add(a2);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3){pycall_arg_t args(3);args.add(a1).add(a2).add(a3);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4){pycall_arg_t args(4);args.add(a1).add(a2).add(a3).add(a4);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5){pycall_arg_t args(5);args.add(a1).add(a2).add(a3).add(a4).add(a5);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6){pycall_arg_t args(6);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6,const ARG7& a7){pycall_arg_t args(7);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8){pycall_arg_t args(8);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8, typename ARG9>RET_V call(const string& mod_name_, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8, const ARG9& a9){pycall_arg_t args(9);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8).add(a9);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call<RET_V>(mod_name_, func_, args, pyret);}//!call python class method begin******************************************************************template<typename RET>RET_V obj_call(PyObject* pobj, const string& func_){pycall_arg_t args(0);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1){pycall_arg_t args(1);args.add(a1);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2){pycall_arg_t args(2);args.add(a1).add(a2);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3){pycall_arg_t args(3);args.add(a1).add(a2).add(a3);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4){pycall_arg_t args(4);args.add(a1).add(a2).add(a3).add(a4);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5){pycall_arg_t args(5);args.add(a1).add(a2).add(a3).add(a4).add(a5);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6){pycall_arg_t args(6);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6,const ARG7& a7){pycall_arg_t args(7);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8){pycall_arg_t args(8);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8, typename ARG9>RET_V obj_call(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8, const ARG9& a9){pycall_arg_t args(9);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8).add(a9);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_obj_method<RET_V>(pobj, func_, args, pyret);}//!call python class method end******************************************************************//!call python lambad function begin ############################################################template<typename RET>RET_V call_lambda(PyObject* pobj){pycall_arg_t args(0);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1>RET_V call_lambda(PyObject* pobj, const ARG1& a1){pycall_arg_t args(1);args.add(a1);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2){pycall_arg_t args(2);args.add(a1).add(a2);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3){pycall_arg_t args(3);args.add(a1).add(a2).add(a3);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4){pycall_arg_t args(4);args.add(a1).add(a2).add(a3).add(a4);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5){pycall_arg_t args(5);args.add(a1).add(a2).add(a3).add(a4).add(a5);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6){pycall_arg_t args(6);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5,const ARG6& a6,const ARG7& a7){pycall_arg_t args(7);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8>RET_V call_lambda(PyObject* pobj, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8){pycall_arg_t args(8);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}template<typename RET, typename ARG1, typename ARG2, typename ARG3, typename ARG4, typename ARG5, typename ARG6, typename ARG7,typename ARG8, typename ARG9>RET_V call_lambda(PyObject* pobj, const string& func_, const ARG1& a1, const ARG2& a2, const ARG3& a3, const ARG4& a4,const ARG5& a5, const ARG6& a6, const ARG7& a7, const ARG8& a8, const ARG9& a9){pycall_arg_t args(9);args.add(a1).add(a2).add(a3).add(a4).add(a5).add(a6).add(a7).add(a8).add(a9);pytype_tool_impl_t<RET_V> pyret;return pycall_t::call_lambda<RET_V>(pobj, args, pyret);}//!call python lambad function ennd ############################################################template<typename RET>RET_V get_global_var(const string& mod_name_, const string& var_name_){PyObject *pName = NULL, *pModule = NULL;string err_msg;pName = PyString_FromString(mod_name_.c_str());pModule = PyImport_Import(pName);Py_DECREF(pName);if (NULL == pModule){pyops_t::traceback(err_msg);throw runtime_error(err_msg.c_str());}pytype_tool_impl_t<RET_V> pyret;PyObject *pvalue = PyObject_GetAttrString(pModule, var_name_.c_str());Py_DECREF(pModule);if (!pvalue){pyops_t::traceback(err_msg);throw runtime_error(err_msg.c_str());}if (pyret.parse_value(pvalue)){Py_XDECREF(pvalue);throw runtime_error("type invalid");}Py_XDECREF(pvalue);return pyret.get_value();}template<typename T>int set_global_var(const string& mod_name_, const string& var_name_, T val_){PyObject *pName = NULL, *pModule = NULL;string err_msg;pName = PyString_FromString(mod_name_.c_str());pModule = PyImport_Import(pName);Py_DECREF(pName);if (NULL == pModule){pyops_t::traceback(err_msg);throw runtime_error(err_msg.c_str());}PyObject* pval = pytype_traits_t<T>::pyobj_from_cppobj(val_);int ret = PyObject_SetAttrString(pModule, var_name_.c_str(), pval);Py_DECREF(pModule);return ret != -1? 0: -1;}void cache_pyobject(PyObject* pobj){m_cache_pyobject.push_back(pobj);}void clear_cache_pyobject(){if (Py_IsInitialized()){for (size_t i = 0; i < m_cache_pyobject.size(); ++i){Py_XDECREF(m_cache_pyobject[i]);}m_cache_pyobject.clear();}}private:PyObject* init_method();int init_pyclass(PyObject* m);bool is_method_exist(const vector<pyclass_regigster_tool_t::method_info_t>& src_, const string& new_);bool is_property_exist(const vector<pyclass_regigster_tool_t::property_info_t>& src_, const string& new_);pyclass_regigster_tool_t* get_pyclass_info_by_name(const string& name_);private:string m_mod_name;string m_mod_doc;vector<PyMethodDef> m_pymethod_defs;vector<reg_info_t> m_func_info;//! reg classvector<pyclass_regigster_tool_t> m_all_pyclass;//! cache some pyobject for optimizevector<PyObject*> m_cache_pyobject;};#endif
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。