Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "FWCore/Python/src/PythonService.h"
00017
00018 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00020
00021
00022
00023
00024 PythonService::PythonService(edm::ParameterSet const& iConfig, edm::ActivityRegistry& iRegistry):
00025 handle_(PythonManager::handle()) {
00026
00027 std::cout << "Start preparing PythonService" << std::endl;
00028 std::string const fileName = iConfig.getParameter<std::string>("fileName");
00029
00030 using namespace boost::python;
00031
00032 command_ = "from " + fileName + " import *\n";
00033 object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char*>("__main__"))))));
00034 object main_namespace = main_module.attr("__dict__");
00035 try {
00036 object result((boost::python::handle<>(PyRun_String(command_.c_str(),
00037 Py_file_input,
00038 main_namespace.ptr(),
00039 main_namespace.ptr()))));
00040 service_ = main_namespace["service"];
00041 } catch(...) {
00042 throw cms::Exception("Configuration") << "No 'service' python variable defined in given fileName parameter.\n Please create an instance of the python class you want to use and pass that instance to the variable named 'service'.";
00043 }
00044
00045
00046
00047
00048
00049 iRegistry.watchPostBeginJob(this,&PythonService::postBeginJob);
00050 iRegistry.watchPostEndJob(this,&PythonService::postEndJob);
00051 iRegistry.watchPostProcessEvent(this,&PythonService::postProcessEvent);
00052 }
00053
00054
00055
00056
00057 PythonService::~PythonService() {
00058 }
00059
00060
00061
00062
00063 void PythonService::postBeginJob() {
00064 using namespace boost::python;
00065 object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
00066 object main_namespace = main_module.attr("__dict__");
00067 main_namespace["tempService"] = service_;
00068
00069 try {
00070 object result((boost::python::handle<>(PyRun_String("tempService.postBeginJob()",
00071 Py_eval_input,
00072 main_namespace.ptr(),
00073 main_namespace.ptr()))));
00074 } catch(error_already_set) {
00075 pythonToCppException("RuntimeError");
00076 }
00077 }
00078
00079 void PythonService::postEndJob() {
00080 using namespace boost::python;
00081 object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
00082 object main_namespace = main_module.attr("__dict__");
00083 main_namespace["tempService"] = service_;
00084
00085 try {
00086 object result((boost::python::handle<>(PyRun_String("tempService.postEndJob()",
00087 Py_eval_input,
00088 main_namespace.ptr(),
00089 main_namespace.ptr()))));
00090 } catch(error_already_set) {
00091 pythonToCppException("RuntimeError");
00092 }
00093 }
00094
00095 void PythonService::preProcessEvent(edm::EventID const&, edm::Timestamp const&) {
00096 }
00097
00098 void PythonService::postProcessEvent(edm::Event const&, edm::EventSetup const&) {
00099 using namespace boost::python;
00100 object main_module((boost::python::handle<>(borrowed(PyImport_AddModule(const_cast<char *>("__main__"))))));
00101 object main_namespace = main_module.attr("__dict__");
00102 main_namespace["tempService"] = service_;
00103
00104 try {
00105 object result((boost::python::handle<>(PyRun_String("tempService.postProcessEvent()",
00106 Py_eval_input,
00107 main_namespace.ptr(),
00108 main_namespace.ptr()))));
00109 } catch(error_already_set) {
00110 pythonToCppException("RuntimeError");
00111 }
00112
00113 }
00114
00115 void PythonService::fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
00116 edm::ParameterSetDescription desc;
00117 desc.add<std::string>("fileName");
00118 descriptions.addDefault(desc);
00119 }