[IronPython] can't execute method in globals

Ernesto Cullen ecullen at fibertel.com.ar
Tue Jan 5 11:24:51 PST 2010


hi all
     I have problems trying to update (from Ipy 1.1) code which uses 
IronPython scripts from an app in C#. If someone can shed a light on why 
this does not work, please...

Ernesto Cullen


I have this code in Ipy 1.1:

EngineOptions engineOptions = new EngineOptions();
engineOptions.ExceptionDetail = true;
engineOptions.ClrDebuggingEnabled = true;
engineOptions.ShowClrExceptions = true;
_pythonEngine = new PythonEngine(engineOptions);

_pythonEngine.Globals["DbUtils"] = new DbUtils(); //class with db 
methods like ExecuteQuery
...

Then I execute a script like this

MSSqlServerUtils.py
def InitDbUtils():
   gl = globals()
   dbu = gs["DbUtils"]
   gl["ExecuteQuery"] = lambda q: dbu.ExecuteQuery(q)
...
InitDbUtils()

dbInfo = ExecuteQuery("SELECT ISNULL(SERVERPROPERTY('InstanceName'),'') 
instanceName")  # (*)
...

This works in Ipy 1.1, the query is executed, and returns a DataTable 
from the ExecuteQuery method of DbUtils class.

In Ipy 2.6 I changed the initialization:
_scriptEngine = Python.CreateEngine(options); //options is a 
Dictionary<String,Object>
_scriptScope = _scriptEngine.CreateScope();
_scriptScope.SetVariable("DbUtils", new DbUtils());
...
and when the (*) line is reached, an exception is thrown:

'MSSqlServerUtils' object has no attribute 'ExecuteQuery'
    at 
IronPython.Runtime.Binding.PythonGetMemberBinder.FastErrorGet`1.GetError(CallSite 
site, TSelfType target, CodeContext context)
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite 
site, T0 arg0, T1 arg1)
    at <unnamed>$3.<lambda$1204>$1204(PythonFunction $function, Object 
q) in DbUtils.py:line 11
    at IronPython.Runtime.PythonFunction.FunctionCaller`1.Call1(CallSite 
site, CodeContext context, Object func, T0 arg0)
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite 
site, T0 arg0, T1 arg1, T2 arg2)
    at <unnamed>$4.__init__$1243(PythonFunction $function, Object self) 
in MSSQLServer.py:line 157
    at IronPython.Runtime.PythonFunction.FunctionCaller`1.Call1(CallSite 
site, CodeContext context, Object func, T0 arg0)
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite 
site, T0 arg0, T1 arg1, T2 arg2)
    at CallSite.Target(Closure , CallSite , CodeContext , Object )
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite 
site, T0 arg0, T1 arg1)
    at CallSite.Target(Closure , CallSite , CodeContext , Object )
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite 
site, T0 arg0, T1 arg1)
    at <unnamed>$4.Start$1244(PythonFunction $function) in 
MSSQLServer.py:line 162
    at IronPython.Runtime.PythonFunction.FunctionCaller.Call0(CallSite 
site, CodeContext context, Object func)
    at 
System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite 
site, T0 arg0, T1 arg1)
    at 
Microsoft.Scripting.Interpreter.DynamicInstruction`3.Run(InterpretedFrameframe)
    at 
Microsoft.Scripting.Interpreter.Interpreter.RunInstructions(InterpretedFrame 
frame)
    at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame 
frame)
    at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 
arg0, T1 arg1)
    at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
    at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
    at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
    at IronPython.Compiler.RuntimeScriptCode.Run(Scope scope)
    at Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink 
errorSink)
    at Microsoft.Scripting.SourceUnit.Execute(Scope scope)
    at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
    at Microsoft.Scripting.Hosting.ScriptEngine.Execute(String 
expression, ScriptScope scope)

-- 
Tell me and I forget. Teach me and I remember. Involve me and I learn.
Benjamin Franklin



More information about the Users mailing list