Go to the documentation of this file.00001
00002
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/ISvcLocator.h"
00006 #include "GaudiKernel/SvcFactory.h"
00007 #include "GaudiKernel/SmartIF.h"
00008
00009 #include "PythonScriptingSvc.h"
00010 #ifdef _POSIX_C_SOURCE
00011 #undef _POSIX_C_SOURCE
00012 #endif
00013 #include "Python.h"
00014 #include <fstream>
00015 #include <sstream>
00016
00017
00018 #if defined(linux)
00019 #include "dlfcn.h"
00020 #endif
00021
00022
00023
00024 DECLARE_SERVICE_FACTORY(PythonScriptingSvc)
00025
00026
00027 PythonScriptingSvc::PythonScriptingSvc( const std::string& name, ISvcLocator* svc )
00028
00029 : base_class(name, svc) {
00030
00031 declareProperty( "StartupScript", m_startupScript = "" );
00032 }
00033
00034
00035 PythonScriptingSvc::~PythonScriptingSvc() { }
00036
00037
00038
00039 StatusCode PythonScriptingSvc::initialize()
00040
00041 {
00042
00043 StatusCode sc = Service::initialize();
00044 if ( sc.isFailure() ) return sc;
00045
00046 MsgStream log( msgSvc(), name() );
00047
00048
00049
00050
00051 if( m_startupScript == "" ) {
00052 SmartIF<IProperty> prpMgr(serviceLocator());
00053 if ( prpMgr.isValid() ) {
00054 StringProperty tmp;
00055 tmp.assign(prpMgr->getProperty("JobOptionsType"));
00056 if ( tmp.value( ) == "NONE" ) {
00057 tmp.assign(prpMgr->getProperty("JobOptionsPath"));
00058 m_startupScript = tmp;
00059 }
00060 }
00061 }
00062
00063 char* progName[] = { const_cast<char*>("GaudiPython") };
00064
00065
00066 Py_Initialize();
00067
00068 PySys_SetArgv( 1, progName );
00069
00070 std::string fullversion = Py_GetVersion();
00071 std::string version( fullversion, 0, fullversion.find_first_of(' '));
00072 std::string vers(version, 0, version.find_first_of('.',version.find_first_of('.')+1));
00073 log << MSG::INFO << "Python version: [" << vers << "]" << endmsg;
00074
00075 #if defined(linux)
00076
00077
00078
00079 std::string libname = "libpython" + vers + ".so";
00080 dlopen(libname.c_str(), RTLD_GLOBAL | RTLD_LAZY);
00081 #endif
00082
00083
00084
00085 PyRun_SimpleString( "from gaudimodule import *" );
00086 PyRun_SimpleString( "g = AppMgr()" );
00087
00088 PyRun_SimpleString( "theApp = g" );
00089 PyRun_SimpleString( "def Service(n): return g.service(n)" );
00090 PyRun_SimpleString( "def Algorithm(n): return g.algorithm(n)" );
00091 PyRun_SimpleString( "def Property(n): return g.service(n)" );
00092
00093 #if !defined( _WIN32 )
00094 PyRun_SimpleString( "import rlcompleter");
00095 PyRun_SimpleString( "rlcompleter.readline.parse_and_bind('tab: complete')");
00096 #endif
00097 return StatusCode::SUCCESS;
00098 }
00099
00100
00101 StatusCode PythonScriptingSvc::finalize()
00102
00103 {
00104
00105 StatusCode sc = Service::finalize();
00106 if ( sc.isFailure() ) {
00107 return sc;
00108 }
00109
00110
00111 Py_Finalize();
00112 return StatusCode::SUCCESS;
00113 }
00114
00115
00116 StatusCode PythonScriptingSvc::run()
00117
00118 {
00119 MsgStream log( msgSvc(), name() );
00120 if ( m_startupScript != "" ) {
00121 std::ifstream file(m_startupScript.c_str());
00122 std::stringstream stream;
00123 if( file ) {
00124 char ch;
00125 while( file.get(ch) ) stream.put(ch);
00126 PyRun_SimpleString( const_cast<char*>(stream.str().c_str()) );
00127 file.close();
00128 }
00129 else {
00130 log << MSG::WARNING << "Python startup file " << m_startupScript << " not found" << endmsg;
00131 }
00132 }
00133 PyRun_InteractiveLoop(stdin, "\0");
00134 return StatusCode::SUCCESS;
00135 }
00136