代码拉取完成,页面将自动刷新
/**
* Python.h
*
* Class that is exported to PHP space
*/
#pragma once
#include <pybind11/pybind11.h>
#include <pybind11/eval.h>
#include <iostream>
#include <sstream>
namespace py = pybind11;
/**
* Class definition
*/
class Master : public Php::Base
{
private:
py::module _main;
py::module _json;
py::module _sys;
py::dict *_scope;
py::dict *_local;
public:
/**
* Constructor
*/
Master()
{
//PyEval_AcquireLock();
//PyThreadState_Swap(tstate);
_main = py::module::import("__main__");
_json = py::module::import("json");
_scope = new py::dict(_main.attr("__dict__"));
_local = _scope;//new py::dict();
}
/**
* Destructor
*/
~Master() {
delete _scope;
//delete _local;
//PyEval_ReleaseLock();
}
/**
* php "constructor"
* @param params
*/
void __construct(Php::Parameters ¶ms)
{
if (!params.empty()) {
Php::Value argv = params[0];
auto dumps = _json.attr("dumps");
auto loads = _json.attr("loads");
std::string ret = Php::call("json_encode", argv);
_sys = py::module::import("sys");
_sys.attr("argv") = loads(py::str(ret));
}
}
void evalFile(Php::Parameters ¶ms) {
std::string filePath = params[0];
try {
py::eval_file(filePath, *_scope);
}
catch(py::error_already_set& ex) {
throw Php::Exception(ex.what());
}
}
void eval(Php::Parameters ¶ms) {
std::string state = params[0];
try {
py::eval<py::eval_statements>(state, *_scope);
}
catch (py::error_already_set& ex) {
throw Php::Exception(ex.what());
}
}
void assign(Php::Parameters ¶ms) {
std::string name = params[0];
std::string value = Php::call("json_encode", params[1]);
auto loads = _json.attr("loads");
(*_local)[py::str(name)] = loads(py::str(value));
}
Php::Value call(Php::Parameters ¶ms) {
std::string callFunc = params[0];
py::object ret = py::eval(callFunc, *_scope);
auto dumps = _json.attr("dumps");
std::string a = dumps(ret).cast<std::string>();
return Php::call("json_decode", a, true);
}
void def(Php::Parameters ¶ms) {
const char *name = params[0];
Php::Value func = params[1];
_main.def(name, [func, this](py::args args, py::kwargs kwargs) {
auto dumps = this->_json.attr("dumps");
auto loads = this->_json.attr("loads");
std::string a = dumps(args).cast<std::string>();
Php::Value b = Php::call("json_decode", a, true);
std::string ret = Php::call("json_encode", func(b));
return loads(py::str(ret));
});
}
Php::Value extract(Php::Parameters ¶ms) {
if (params.size() != 1) throw Php::Exception("Invalid number of parameters supplied");
std::string name = params[0];
auto dumps = _json.attr("dumps");
py::object val = (*_local)[py::str(name)];
std::string a = dumps(val).cast<std::string>();
return Php::call("json_decode", a, true);
//return (Php::Value) (*_local)[py::str(name)].attr("__str__")().cast<std::string>();
}
void print(Php::Parameters ¶ms) {
if (params.size() != 1) throw Php::Exception("Invalid number of parameters supplied");
std::string v = params[0];
py::print((*_local)[py::str(v)]);
}
/**
* Cast to a string
* @return const char *
*/
const char *__toString() const
{
return "this is the master";
}
};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。