The Gaudi Framework  v32r2 (46d42edc)
PythonConfig.cpp
Go to the documentation of this file.
1 #include "PythonConfig.h"
2 
3 // boost includes
4 #include "boost/python.hpp"
5 using namespace boost::python;
6 
7 //-----------------------------------------------------------------------------
9  const std::string& postAction ) {
10  try {
11  // Prepare a Python environment
12  Py_Initialize();
13  object main_module( ( handle<>( borrowed( PyImport_AddModule( "__main__" ) ) ) ) );
14  object main_namespace = main_module.attr( "__dict__" );
15 
16  // make the translator class known to Python
17  main_namespace["PythonAdaptor"] = class_<PythonAdaptor>( "PythonAdaptor", boost::python::init<IJobOptionsSvc*>() )
18  .def( "addPropertyToJobOptions", &PythonAdaptor::addPropertyToJobOptions );
19 
20  // create an instance of it and pass it to Python
21  PythonAdaptor adaptor( m_IJobOptionsSvc );
22  main_namespace["adaptor"] = ptr( &adaptor );
23 
24  // some python helper
25  std::string command( preAction );
26  command += "\nfor name in '";
27  command += filename + "'.split(','):\n";
28  command += " with open(name) as f:\n";
29  command += " code = compile(f.read(), name, 'exec')\n";
30  command += " exec(code)\n";
31  command += "from GaudiKernel.Configurable import expandvars\nfrom GaudiKernel.Proxy.Configurable import "
32  "applyConfigurableUsers\napplyConfigurableUsers()\n";
33  command += postAction;
34  command += "\nfor n, c in Configurable.allConfigurables.items():\n for p, v in c.getValuedProperties().items() "
35  ":\n v = expandvars(v)\n if type(v) == str : v = '\"%s\"' % v # need double quotes\n elif "
36  "type(v) == long: v = '%d' % v # prevent pending 'L'\n adaptor.addPropertyToJobOptions(n,p,str(v))";
37 
38  // Now fire off the translation
39  handle<> ignored( ( PyRun_String( command.c_str(), Py_file_input, main_namespace.ptr(), main_namespace.ptr() ) ) );
40  } catch ( const error_already_set& ) {
41  std::cout << "Error in python script:" << std::endl;
42  PyErr_Print();
43  return StatusCode::FAILURE;
44  }
45 
46  return StatusCode::SUCCESS;
47 }
T endl(T... args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
StatusCode evaluateConfig(const std::string &filename, const std::string &preAction, const std::string &postAction)
Definition: PythonConfig.cpp:8
void addPropertyToJobOptions(const std::string &client, const std::string &name, const std::string &value)
Definition: PythonConfig.h:14
STL class.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
constexpr static const auto FAILURE
Definition: StatusCode.h:86