<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Star Trek jokes, yeah, heard those…<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> PythonDotNet [mailto:pythondotnet-bounces+btribble=ea.com@python.org] <b>On Behalf Of </b>Mark Tigges<br><b>Sent:</b> Friday, July 05, 2013 7:49 AM<br><b>To:</b> Patrick Stewart<br><b>Cc:</b> pythondotnet@python.org<br><b>Subject:</b> Re: [Python.NET] C# dynamic object support / Easy calling from C#<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>Nice work captain! (sorry, couldn't resist.)<o:p></o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p><div><p class=MsoNormal>On Tue, Jul 2, 2013 at 2:35 AM, Patrick Stewart <<a href="mailto:patstew@gmail.com" target="_blank">patstew@gmail.com</a>> wrote:<o:p></o:p></p><div><p class=MsoNormal>Hi,<o:p></o:p></p><div><p class=MsoNormal>Just thought I'd send a heads up to say I've made some modifications to <a href="http://python.net" target="_blank">python.net</a> to make it much more convenient to call python code from C#, which can be found here: <a href="http://github.com/patstew/pythonnet" target="_blank">http://github.com/patstew/pythonnet</a><o:p></o:p></p></div><div><p class=MsoNormal>I've inherited PyObject from DynamicObject, wired up the appropriate bits and added a few convenience functions, so now you can write C# code like this:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal>static void Main(string[] args)<o:p></o:p></p><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>using (Py.GIL()) {<o:p></o:p></p><div><p class=MsoNormal>dynamic np = Py.Import("numpy");<o:p></o:p></p></div><div><p class=MsoNormal>dynamic sin = np.sin;<o:p></o:p></p></div><div><p class=MsoNormal>Console.WriteLine(np.cos(np.pi*2));<o:p></o:p></p></div><div><p class=MsoNormal> Console.WriteLine(sin(5));<o:p></o:p></p></div><div><p class=MsoNormal>Console.WriteLine(np.cos(5) + sin(5));<o:p></o:p></p></div><div><p class=MsoNormal>dynamic a = np.array(new List<float> { 1, 2, 3 };<o:p></o:p></p></div><div><p class=MsoNormal>dynamic b = np.array(new List<float> { 6, 5, 4 }, Py.kw("dtype", np.int32));                     Console.WriteLine(a.dtype);<o:p></o:p></p></div><div><p class=MsoNormal>Console.WriteLine(b.dtype);<o:p></o:p></p></div><div><p class=MsoNormal>Console.WriteLine(a * b);<o:p></o:p></p></div><div><p class=MsoNormal>Console.ReadKey();<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>which outputs:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><div><p class=MsoNormal>1.0<o:p></o:p></p></div><div><p class=MsoNormal>-0.958924274663<o:p></o:p></p></div><div><p class=MsoNormal>-0.6752620892<o:p></o:p></p></div><div><p class=MsoNormal>float64<o:p></o:p></p></div><div><p class=MsoNormal>int32<o:p></o:p></p></div><div><p class=MsoNormal>[  6.  10.  12.]<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>as you might expect. You can call, access members and perform mathematical operations all as normal. Managed arguments are automatically converted to python types when used with a python function, and mathematical operations like multiplying numpy arrays happen entirely within python. You can specify keyword arguments using Py.kw("key1", value1, "key2", value2, ....) as an extra argument to the function. One slight annoyance is that np.pi*2 works while 2*np.pi doesn't, due to limitations of DynamicObject.<o:p></o:p></p></div><div><p class=MsoNormal>This is just a first shot, and I haven't actually used it much yet, so there are almost certainly bugs, leaked references, etc lurking. I'll probably keep adding to it in the near future. Hope it's useful to someone.<o:p></o:p></p></div><div><p class=MsoNormal>Cheers,<o:p></o:p></p></div><div><p class=MsoNormal>Patrick<o:p></o:p></p></div></div></div><p class=MsoNormal><br>_________________________________________________<br>Python.NET mailing list - <a href="mailto:PythonDotNet@python.org">PythonDotNet@python.org</a><br><a href="http://mail.python.org/mailman/listinfo/pythondotnet" target="_blank">http://mail.python.org/mailman/listinfo/pythondotnet</a><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>