[IronPython] can't execute method in globals
Ernesto Cullen
ecullen at fibertel.com.ar
Wed Jan 6 14:26:51 CET 2010
Thanks for the prompt answer! I finally found that the MSSqlServerUtils
class is internal... changed to public and all worked ok!
Now I am trying to make the internals visible to the scripts. I tried with
[assembly:
InternalsVisibleToAttribute("MyDemoProject,PublicKey=blahblahblah")]
and
[assembly:
InternalsVisibleToAttribute("IronPython,PublicKey=blahblahblah")]
but it did not succeed... is there a way to make the internals visible
to the scripts?
Ernesto
El 05/01/2010 17:29, Dino Viehland escribió:
> Is there anything different from the code below vs. what you're trying to do? Because
> this works for me in 2.6. It would seem like the only possible difference (based upon
> the error) is that there's some access ExecuteQuery on an MSSqlServerUtils object
> which I'm not seeing. If that's the case it may be that the type is internal or
> ExecuteQuery is not a public method on it. I seem to recall that we've tightened up
> some member access rules between 1.1 and 2.6.
>
> using System;
> using IronPython.Hosting;
> using IronPython.Runtime;
> using IronPython.Runtime.Operations;
> using Microsoft.Scripting;
> using Microsoft.Scripting.Hosting;
> using IronPython.Runtime.Exceptions;
> using System.Runtime.CompilerServices;
> using Microsoft.Scripting.Runtime;
>
> public class Foo {
> public static void Main(string[] args){
>
> var pe = Python.CreateEngine();
>
> var scope = pe.CreateScope();
> scope.SetVariable("test", new Foo());
> pe.Execute(@"
> def f():
> x = globals()
> x[""foo""] = lambda : x[""test""].X()
>
> f()
> foo()
> ", scope);
>
> }
>
> public void X() {
> Console.WriteLine("Called");
> }
> }
>
>
>
>> -----Original Message-----
>> From: users-bounces at lists.ironpython.com [mailto:users-
>> bounces at lists.ironpython.com] On Behalf Of Ernesto Cullen
>> Sent: Tuesday, January 05, 2010 11:58 AM
>> To: Discussion of IronPython
>> Subject: Re: [IronPython] can't execute method in globals
>>
>> > What is "gs" in InitDbUtils, should that be gl?
>>
>> yes, sorry
>>
>>
>>> Also can you include the line of code where you're actually executing
>>> the code from your host?
>>>
>> The main code (the lambda definitions etc) is executed like this:
>>
>> ScriptSource source =
>> _scriptEngine.CreateScriptSourceFromString(script_string, file_path,
>> SourceCodeKind.Statements);
>> source.Execute(_scriptScope);
>>
>> then, the main entry point is executed separately:
>>
>> _scriptEngine.Execute("Start()", _scriptScope)
>>
>> where Start() is a function in MSSqlServerUtils.py.
>>
>>
>>> Are you setting ScriptRuntime.Globals to
>>> _scriptScope?
>>>
>> I've tested with and without it, same result
>>
>>
>>> Because I think Globals may have changed meaning between
>>> 1.1 and 2.0/2.6. In 2.x Globals is made available via imports but I don't
>>> remember how it was exposed in 1.1. I think what you want to do is call the
>>> Execute overload that takes a ScriptScope and pass in _scriptScope.
>>> Alternately you want to create a ScriptSource, Compile it, and then Execute
>>> it against the _scriptScope. But it's hard to tell w/o the full context.
>>>
>>>
>> Hope it is clear now. The actual code is pretty big, and it is part of a
>> company project so I can't send it fully.
>> In essence, what I am trying to do is execute some c# methods from
>> python scripts -but don't want to expose the whole class to the scripts,
>> only the methods as functions.
>>
>> Ernesto
>>
>>
>>
>>>> -----Original Message-----
>>>> From: users-bounces at lists.ironpython.com [mailto:users-
>>>> bounces at lists.ironpython.com] On Behalf Of Ernesto Cullen
>>>> Sent: Tuesday, January 05, 2010 11:25 AM
>>>> To: users at lists.ironpython.com
>>>> Subject: [IronPython] can't execute method in globals
>>>>
>>>> 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(CallS
>>
>>>> ite
>>>> 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
>>>>
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at lists.ironpython.com
>>>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>>>
>>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.ironpython.com
>>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>>
>>>
>>>
>> --
>> Tell me and I forget. Teach me and I remember. Involve me and I learn.
>> Benjamin Franklin
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
--
Tell me and I forget. Teach me and I remember. Involve me and I learn.
Benjamin Franklin
More information about the Ironpython-users
mailing list