Application scripting - Embedding/Extending Python. solution
I got it working. Here's my sample code: using System; using Python.Runtime; namespace PyTest { /// <summary> /// Summary description for Class1. /// </summary> class PyTestClass { PyObject module = null; PyObject func = null; PyTestClass() { PythonEngine.Initialize(); } ~PyTestClass() { PythonEngine.Finalize(); } void Scratch() { } /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { try { // initiliaze the engine PyTestClass pyTest = new PyTestClass(); if(!PythonEngine.IsInitialized) throw new Exception("PythonEngine not initialized."); // load the module and the dictionary pyTest.module = PythonEngine.ImportModule("PyTest"); // get a reference to the function named "test" from the Python script pyTest.func = pyTest.module.GetAttr((string) "test"); // if the reference we got in the above call in callable, call it. if(pyTest.func.IsCallable()) { PyObject[] obj = new PyObject[1]; // an array of objects representing the function arguments PyTuple tup; // we'll pass the arguments to the funciton in a tuple // convert our string into a PyObject and place it in the array obj[0] = PyObject.FromManagedObject((string) "Embedding and Extending."); // convert the array of PyObjects into a single PyTuple tup = new PyTuple(obj); // call the Ivoke method of the funciton reference with the tuple containing // the function arguements. pyTest.func.Invoke(tup); } } catch(Exception e) { Console.WriteLine(e.Message); Console.Write(e.StackTrace); } } } public class PyTestInterface { public PyTestInterface() { // do nothing, just making a public constructor } public void PyTestMsg(string testname) { Console.WriteLine("Test Pass! " + testname); } } } And here's the sample Python script: import CLR # gives this Python script access to managed namespaces from CLR.System.Reflection import Assembly # for importing managed assemblies asm = Assembly.LoadWithPartialName("PyTest.exe") from CLR.PyTest import PyTestInterface # mports the interface for this applicaiton iface = PyTestInterface() def test(str): print "testing:" iface.PyTestMsg(str) print "test finished."; test("Extending") I hope this helps someone out there. There are certainly a number of ways this can be done. But this specific approach leads me in the direction I need to go in order to solve the problems I want to solve. SI
participants (1)
-
Sam Iredale