Thanks again... This really helps...
> -----Original Message----- > From: [EMAIL PROTECTED] [mailto:users- > [EMAIL PROTECTED] On Behalf Of Dino Viehland > Sent: Monday, January 15, 2007 2:01 PM > To: Discussion of IronPython > Subject: Re: [IronPython] Calling Python objects from C#? > > Sorry, I didn't realize we never made that public... > > Now that I'm looking at it a little closer I'm surprised how hard it is to > get an ICallerContext instance. I think the easiest way is: > module.GetModuleScope(null); (where module is the EngineModule instance in > your sample code). That will return an IModuleScope which implements > ICallerContext and that scope should stay in-sync with the module's own > scope. > > > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:users- > [EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] > Sent: Monday, January 15, 2007 1:25 PM > To: [email protected] > Subject: Re: [IronPython] Calling Python objects from C#? > > I think the DefaultContext class is private to the > IronPython.Runtime.Calls namespace. I was unable to access it from my > applications .dll. > > >From the file DefaultContext.cs: > > namespace IronPython.Runtime.Calls { > class DefaultContext : ICallerContext { > public static DefaultContext Default = new > DefaultContext(CallerContextAttributes.None); > public static DefaultContext DefaultCLS = new > DefaultContext(CallerContextAttributes.ShowCls); > > This is correct? Or, should the scope be "public class DefaultContext"? > > Mike > > > -----Original Message----- > > From: [EMAIL PROTECTED] [mailto:users- > > [EMAIL PROTECTED] On Behalf Of Dino Viehland > > Sent: Monday, January 15, 2007 1:08 PM > > To: Discussion of IronPython > > Subject: Re: [IronPython] Calling Python objects from C#? > > > > For the context you should be able to use DefaultContext.Default. If > you > > wanted members from .NET types to show up on types that are used > natively > > in Python (e.g. string, int, etc...) you could use > > DefaultContext.DefaultCLS. If you wanted the lookup to reflect what had > > happened in the module (e.g. whether the user has done import clr or > > import <some .NET namespace>) then you'd want to pass the module > instance > > as the context. > > > > > > > > -----Original Message----- > > From: [EMAIL PROTECTED] [mailto:users- > > [EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] > > Sent: Monday, January 15, 2007 12:55 PM > > To: [email protected] > > Subject: Re: [IronPython] Calling Python objects from C#? > > > > Thanks Dino, > > > > That is much simpler! Now for get/set of attributes values... > > > > I need an ICallerContext for the Ops.GetAttr() call. Is there a way to > get > > this without calling 'object pmodule = module.Import("MyExample");'? > > > > > > static void Main(string[] args) > > { > > PythonEngine engine = new PythonEngine(); > > EngineModule module = engine.CreateModule("MyExample", > true); > > > > try > > { > > engine.ExecuteFile("MyExample.py", module); > > } > > catch (Exception ex) > > { > > Console.WriteLine("Failed to execute Example.py file"); > > Console.WriteLine("Exception: {0}", ex.Message); > > return; > > } > > > > // Get the Python Class from the module's global list > > object ptype = module.Globals["MyClass"]; > > > > // Get Module Instance > > object pmodule = module.Import("MyExample"); > > > > // Create an instance of the object > > object pobj = Ops.Call(ptype); > > > > // Call the method - Using Ops.Invoke() > > object rtnValue = Ops.Invoke(pobj, > > SymbolTable.StringToId("DoWork")); > > Console.WriteLine("DoWork return value = {0}\n", rtnValue); > > > > // Perform a GetAttr on the object instance > > object attr = Ops.GetAttr((ICallerContext)pmodule, > > pobj, SymbolTable.StringToId("attr")); > > Console.WriteLine("attr = {0}, type = {}\n", attr); > > > > } > > > > Thanks in advance... > > > > Mike > > > > > -----Original Message----- > > > From: [EMAIL PROTECTED] [mailto:users- > > > [EMAIL PROTECTED] On Behalf Of Dino Viehland > > > Sent: Monday, January 15, 2007 11:46 AM > > > To: Discussion of IronPython > > > Subject: Re: [IronPython] Calling Python objects from C#? > > > > > > I think the problem is that AllocateObject is equivalent to calling > > > mytype.__new__ which is not quite what you want - you want the > > equivalent > > > of doing mytype () or mytype.__call__() > > > > > > I would change this to: > > > > > > // Get the Python Class from the module's global list > > > object ptype = module.Globals["MyClass"]; > > > > > > // Create an instance of the object > > > object myclass = Ops.Call(ptype); > > > > > > Not only is it more correct it gets rid of the direct dependency on > > > UserType (for example your code wouldn't have worked w/ an old-style > > class > > > or if a user had done MyClass = System.SomeTypeThatHasADoWorkMethod). > > > > > > >From there I think your Ops.Invoke calls should work (although I > > haven't > > > tried to make sure). > > > > > > > > > -----Original Message----- > > > From: [EMAIL PROTECTED] [mailto:users- > > > [EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] > > > Sent: Monday, January 15, 2007 9:58 AM > > > To: [email protected] > > > Subject: [IronPython] Calling Python objects from C#? > > > > > > Hi All, > > > > > > My apology if this has been asked before... I have searched for > several > > > examples and did not find what I was looking for. > > > > > > My question is what is the best way to interact with Python objects > from > > > within C#? I need to call functions, capture the return value and > > get/set > > > attributes from within C#. > > > > > > I have tried several ways and ended up with this example for calling > > > functions, but it generates an exception saying it does not know what > > > "attr" is. > > > > > > Here is my example: > > > > > > File MyExample.py: > > > > > > class MyClass(object): > > > def __init__(self): > > > self.attr = 500.0 > > > > > > def DoWork(self): > > > print "Attr = ", self.attr > > > return self.attr > > > > > > > > > File Program.cs: > > > > > > using System; > > > > > > using IronPython.Runtime; > > > using IronPython.Runtime.Types; > > > using IronPython.Runtime.Operations; > > > using IronPython.Hosting; > > > using IronPython.Modules; > > > > > > namespace IPyExample > > > { > > > class Program > > > { > > > static void Main(string[] args) > > > { > > > PythonEngine engine = new PythonEngine(); > > > EngineModule module = engine.CreateModule("MyExample", > > true); > > > > > > try > > > { > > > engine.ExecuteFile("MyExample.py", module); > > > } > > > catch (Exception ex) > > > { > > > Console.WriteLine("Failed to execute Example.py > file"); > > > Console.WriteLine("Exception: {0}", ex.Message); > > > return; > > > } > > > > > > // Get the Python Class from the module's global list > > > UserType ptype = module.Globals["MyClass"] as UserType; > > > > > > // Create an instance of the object > > > object myclass = ptype.AllocateObject(); > > > > > > // Call the method - Using Ops.Invoke() > > > Ops.Invoke(myclass, SymbolTable.StringToId("DoWork")); > > > > > > // Call the same method - Using UserType.Invoke() > > > object rtnValue = ptype.Invoke(myclass, > > > SymbolTable.StringToId("DoWork")); > > > > > > Console.WriteLine("DoWork return value = {0}\n", > rtnValue); > > > } > > > } > > > } > > > > > > > > > Exception: > > > > > > C:\Documents and Settings\sweeneym\My Documents\Visual Studio > > > 2005\Projects\ATF. > > > IP\IPyExample\bin\Debug>IPYExample > > > Attr = > > > Unhandled Exception: System.MissingMemberException: attr > > > at IronPython.Runtime.Types.UserType.GetAttr(ICallerContext > context, > > > Object self, SymbolId name) in C:\Development\Ir > > > onPython-1.1\Src\IronPython\Runtime\Types\UserType.cs:line 370 > > > at IronPython.Runtime.Operations.Ops.GetAttr(ICallerContext > context, > > > Object o, SymbolId name) in C:\Development\IronP > > > ython-1.1\Src\IronPython\Runtime\Operations\Ops.cs:line 1644 > > > at DoWork$f1##4(FunctionEnvironment4Dictionary , Object ) > > > at IronPython.Runtime.Calls.CallTarget1.Invoke(Object arg0) > > > at IronPython.Runtime.Calls.Function1.Call(ICallerContext context, > > > Object arg0) in C:\Development\IronPython-1.1\Src\ > > > IronPython\Runtime\Calls\Function.Generated.cs:line 127 > > > at IronPython.Runtime.Calls.Function1.Call(ICallerContext context, > > > Object[] args) in C:\Development\IronPython-1.1\Sr > > > c\IronPython\Runtime\Calls\Function.Generated.cs:line 138 > > > at > > IronPython.Runtime.Calls.PythonFunction.CallInstance(ICallerContext > > > context, Object instance, Object[] args) in C: > > > \Development\IronPython- > > 1.1\Src\IronPython\Runtime\Calls\Function.cs:line > > > 389 > > > at IronPython.Runtime.Calls.Method.Call(ICallerContext context, > > > Object[] args) in C:\Development\IronPython-1.1\Src\I > > > ronPython\Runtime\Calls\Function.cs:line 972 > > > at IronPython.Runtime.Operations.Ops.Call(Object func, Object[] > args) > > > in C:\Development\IronPython-1.1\Src\IronPython > > > \Runtime\Operations\Ops.cs:line 1414 > > > at IronPython.Runtime.Types.DynamicType.Invoke(Object target, > > SymbolId > > > name, Object[] args) in C:\Development\IronPyt > > > hon-1.1\Src\IronPython\Runtime\Types\DynamicType.cs:line 1010 > > > at IronPython.Runtime.Operations.Ops.Invoke(Object target, SymbolId > > > name, Object[] args) in C:\Development\IronPython > > > -1.1\Src\IronPython\Runtime\Operations\Ops.cs:line 1760 > > > at IPyExample.Program.Main(String[] args) in C:\Documents and > > > Settings\sweeneym\My Documents\Visual Studio 2005\Proje > > > cts\ATF.IP\IPyExample\Program.cs:line 35 > > > > > > > > > ------------------------------------------------------------ > > > Michael A. Sweeney email: [EMAIL PROTECTED] > > > Agilent Technologies phone: (509) 921-4395 > > > MS:3WU-222 fax: (509) 921-3991 > > > 24001 E. Mission Ave. > > > Liberty Lake, WA 99019 USA > > > ------------------------------------------------------------ > > > > > > _______________________________________________ > > > users mailing list > > > [email protected] > > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > > > _______________________________________________ > > > users mailing list > > > [email protected] > > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > > _______________________________________________ > > users mailing list > > [email protected] > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > > _______________________________________________ > > users mailing list > > [email protected] > > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ > users mailing list > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > _______________________________________________ > users mailing list > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com _______________________________________________ users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
