25 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
26 #include <numpy/arrayobject.h>
36 PyGILState_STATE m_GILState;
39 PyGILRAII() : m_GILState(PyGILState_Ensure()) {}
40 ~PyGILRAII() { PyGILState_Release(m_GILState); }
45 ClassImp(PyMethodBase);
49 PyObject *PyMethodBase::fModuleBuiltin = NULL;
50 PyObject *PyMethodBase::fEval = NULL;
51 PyObject *PyMethodBase::fOpen = NULL;
53 PyObject *PyMethodBase::fModulePickle = NULL;
54 PyObject *PyMethodBase::fPickleDumps = NULL;
55 PyObject *PyMethodBase::fPickleLoads = NULL;
57 PyObject *PyMethodBase::fMain = NULL;
58 PyObject *PyMethodBase::fGlobalNS = NULL;
62 PyMethodBase::PyMethodBase(
const TString &jobName, Types::EMVA methodType,
const TString &methodTitle, DataSetInfo &dsi,
63 const TString &theOption)
64 : MethodBase(jobName, methodType, methodTitle, dsi, theOption),
67 if (!PyIsInitialized()) {
72 fLocalNS = PyDict_New();
74 Log() << kFATAL <<
"Can't init local namespace" << Endl;
80 PyMethodBase::PyMethodBase(Types::EMVA methodType,
82 const TString &weightFile): MethodBase(methodType, dsi, weightFile),
85 if (!PyIsInitialized()) {
90 fLocalNS = PyDict_New();
92 Log() << kFATAL <<
"Can't init local namespace" << Endl;
98 PyMethodBase::~PyMethodBase()
111 PyObject *PyMethodBase::Eval(TString code)
113 if(!PyIsInitialized()) PyInitialize();
114 PyObject *pycode = Py_BuildValue(
"(sOO)", code.Data(), fGlobalNS, fLocalNS);
115 PyObject *result = PyObject_CallObject(fEval, pycode);
128 void PyMethodBase::PyInitialize()
132 bool pyIsInitialized = PyIsInitialized();
133 if (!pyIsInitialized) {
137 TMVA::Internal::PyGILRAII raii;
138 if (!pyIsInitialized) {
142 fMain = PyImport_AddModule(
"__main__");
144 Log << kFATAL <<
"Can't import __main__" << Endl;
148 fGlobalNS = PyModule_GetDict(fMain);
150 Log << kFATAL <<
"Can't init global namespace" << Endl;
154 #if PY_MAJOR_VERSION < 3
156 PyObject *bName = PyUnicode_FromString(
"__builtin__");
158 fModuleBuiltin = PyImport_Import(bName);
159 if (!fModuleBuiltin) {
160 Log << kFATAL <<
"Can't import __builtin__" << Endl;
165 PyObject *bName = PyUnicode_FromString(
"builtins");
167 fModuleBuiltin = PyImport_Import(bName);
168 if (!fModuleBuiltin) {
169 Log << kFATAL <<
"Can't import builtins" << Endl;
174 PyObject *mDict = PyModule_GetDict(fModuleBuiltin);
175 fEval = PyDict_GetItemString(mDict,
"eval");
176 fOpen = PyDict_GetItemString(mDict,
"open");
181 PyObject *pName = PyUnicode_FromString(
"pickle");
183 fModulePickle = PyImport_Import(pName);
184 if (!fModulePickle) {
185 Log << kFATAL <<
"Can't import pickle" << Endl;
188 PyObject *pDict = PyModule_GetDict(fModulePickle);
189 fPickleDumps = PyDict_GetItemString(pDict,
"dump");
190 fPickleLoads = PyDict_GetItemString(pDict,
"load");
199 void PyMethodBase::PyFinalize()
202 if (fEval) Py_DECREF(fEval);
203 if (fModuleBuiltin) Py_DECREF(fModuleBuiltin);
204 if (fPickleDumps) Py_DECREF(fPickleDumps);
205 if (fPickleLoads) Py_DECREF(fPickleLoads);
206 if(fMain) Py_DECREF(fMain);
214 void PyMethodBase::PySetProgramName(TString name)
216 #if PY_MAJOR_VERSION < 3
217 Py_SetProgramName(const_cast<char*>(name.Data()));
219 Py_SetProgramName((
wchar_t *)name.Data());
226 size_t mystrlen(
const char* s) {
return strlen(s); }
230 size_t mystrlen(
const wchar_t* s) {
return wcslen(s); }
237 TString PyMethodBase::Py_GetProgramName()
239 auto progName = ::Py_GetProgramName();
240 return std::string(progName, progName + mystrlen(progName));
248 int PyMethodBase::PyIsInitialized()
250 if (!Py_IsInitialized())
return kFALSE;
251 if (!fEval)
return kFALSE;
252 if (!fModuleBuiltin)
return kFALSE;
253 if (!fPickleDumps)
return kFALSE;
254 if (!fPickleLoads)
return kFALSE;
267 void PyMethodBase::Serialize(TString path, PyObject *obj)
269 if(!PyIsInitialized()) PyInitialize();
271 PyObject *file_arg = Py_BuildValue(
"(ss)", path.Data(),
"wb");
272 PyObject *file = PyObject_CallObject(fOpen,file_arg);
273 PyObject *model_arg = Py_BuildValue(
"(OO)", obj,file);
274 PyObject *model_data = PyObject_CallObject(fPickleDumps , model_arg);
278 Py_DECREF(model_arg);
279 Py_DECREF(model_data);
289 Int_t PyMethodBase::UnSerialize(TString path, PyObject **obj)
292 PyObject *file_arg = Py_BuildValue(
"(ss)", path.Data(),
"rb");
293 PyObject *file = PyObject_CallObject(fOpen,file_arg);
297 PyObject *model_arg = Py_BuildValue(
"(O)", file);
298 *obj = PyObject_CallObject(fPickleLoads , model_arg);
303 Py_DECREF(model_arg);
320 void PyMethodBase::PyRunString(TString code, TString errorMessage,
int start) {
321 fPyReturn = PyRun_String(code, start, fGlobalNS, fLocalNS);
323 Log() << kWARNING <<
"Failed to run python code: " << code << Endl;
324 Log() << kWARNING <<
"Python error message:" << Endl;
326 Log() << kFATAL << errorMessage << Endl;