代码拉取完成,页面将自动刷新
同步操作将从 EvanZhaoOwn/ffpython 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#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++ class
template<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 class
vector<pyclass_regigster_tool_t> m_all_pyclass;
//! cache some pyobject for optimize
vector<PyObject*> m_cache_pyobject;
};
#endif
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。