[IronPython] [python] IP 2.0 Alpha 7 embedding

Michael Foord fuzzyman at voidspace.org.uk
Sun Dec 23 22:15:58 CET 2007


Slide wrote:
> I don't mind at all, I just hope that is the way it is supposed to be done :)
>
>   

Cool - thanks. When I post it I'll give you any feedback I can come up 
with. :-)

Michael


> Thanks,
>
> slide
>
> On Dec 23, 2007 11:08 AM, Michael Foord <fuzzyman at voidspace.org.uk> wrote:
>   
>> Hello Slide,
>>
>> If you don't mind I will post this example to the IronPython Cookbook!
>>
>> Thanks
>>
>> Michael
>>
>>
>> Slide wrote:
>>     
>>> I have come up with an example (very simple) of embedding IP 2.0 into
>>> a C# app and doing back and forth handling of objects (objects
>>> declared in Python and object declared in C#). I am interested to know
>>> if I am doing some things the best way as I've just been going kind of
>>> hit and miss. Can someone do a little critiquing of this code and see
>>> if I am being dumb? The windows app has two RichTextBoxes on it (one
>>> for input, the other for output), a clear button and a "go" button.
>>> When the "go" button is pressed, it writes the source out to a temp
>>> file and then creates the object instance from the script. Thanks!
>>>
>>>
>>> Here is the code:
>>>
>>>
>>> test.py
>>> ============================================
>>> import TestLib, unittest
>>>
>>> def Print(message):
>>>       output.AppendText("%s\r\n" % message)
>>>
>>> class Test(TestLib.ITest):
>>>       def Print(self, message):
>>>               output.AppendText("%s\r\n" % message)
>>>
>>> Print("Hello, world!")
>>>
>>>
>>>
>>>
>>> ITestLib.cs located in TestLib.dll
>>> ==========================================
>>> using System;
>>> using System.Collections.Generic;
>>> using System.Text;
>>>
>>> namespace TestLib
>>> {
>>>     public interface ITest
>>>     {
>>>         void Print(string message);
>>>     }
>>> }
>>>
>>>
>>>
>>> MainForm.cs located in IPEmbed.exe which references TestLib.dll
>>> ============================================
>>> using System;
>>> using System.Collections.Generic;
>>> using System.ComponentModel;
>>> using System.Data;
>>> using System.Drawing;
>>> using System.Text;
>>> using System.IO;
>>> using System.Windows.Forms;
>>>
>>> using Microsoft.Scripting;
>>> using Microsoft.Scripting.Hosting;
>>>
>>> using IronPython.Runtime;
>>> using IronPython.Hosting;
>>>
>>> namespace IPEmbed
>>> {
>>>     public partial class Form1 : Form
>>>     {
>>>         private ScriptScope __main__;
>>>         private LanguageContext _context;
>>>
>>>         public Form1()
>>>         {
>>>             InitializeComponent();
>>>
>>>             _context = LanguageContext.FromEngine(PythonEngine.CurrentEngine);
>>>             _context.SetScriptSourceSearchPaths(new string[] {
>>> Environment.CurrentDirectory,
>>> Path.Combine(Environment.CurrentDirectory, "Lib") });
>>>         }
>>>
>>>         // sets up the script engine, etc
>>>         private void go_Click(object sender, EventArgs e)
>>>         {
>>>             ScriptDomainManager.CurrentManager.Host.DefaultModule.ClearVariables();
>>>
>>>             if (input.Text.Length == 0)
>>>                 return;
>>>
>>>             string filepath = Path.GetTempFileName();
>>>             File.WriteAllText(filepath, input.Text);
>>>
>>>             __main__ =
>>> ScriptDomainManager.CurrentManager.CompileModule("__main__",
>>> SourceUnit.CreateFileUnit(_context, filepath));
>>>             ScriptDomainManager.CurrentManager.PublishModule(__main__,
>>> "__main__");
>>>
>>>             Microsoft.Scripting.ClrModule.GetInstance().AddReference("TestLib");
>>>             __main__.SetVariable("output", output);
>>>             __main__.Execute();
>>>
>>>             TestLib.ITest test = CreateInstanceFromInterface<TestLib.ITest>();
>>>             if (test != null)
>>>                 test.Print("Hello, world!");
>>>         }
>>>
>>>         // this method will find a class in the python code that
>>> implements a given interface and create and instance
>>>         // of that class, returning it as the interface
>>>         private T CreateInstanceFromInterface<T>()
>>>         {
>>>             T result = default(T);
>>>
>>>             IAttributesCollection attrs =
>>> IronPython.Runtime.Types.PythonModuleOps.Get__dict__(__main__);
>>>             foreach (KeyValuePair<object, object> attr in attrs)
>>>             {
>>>                 IronPython.Runtime.Types.PythonType attr_type =
>>> attr.Value as IronPython.Runtime.Types.PythonType;
>>>
>>>                 if (attr_type != null)
>>>                 {
>>>                     foreach (IronPython.Runtime.Types.PythonType dt in
>>> attr_type.BaseTypes)
>>>                     {
>>>                         if (dt.UnderlyingSystemType != null &&
>>> dt.UnderlyingSystemType == typeof(T))
>>>                         {
>>>                             CodeContext context = new
>>> CodeContext(__main__.Scope, _context, new ModuleContext(__main__));
>>>                             result = (T)attr_type.CreateInstance(context);
>>>                             break;
>>>                         }
>>>                     }
>>>                 }
>>>             }
>>>             return result;
>>>         }
>>>
>>>         private void clear_Click(object sender, EventArgs e)
>>>         {
>>>             output.Clear();
>>>         }
>>>     }
>>> }
>>> _______________________________________________
>>> 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
>>
>>     
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>   




More information about the Ironpython-users mailing list