¿Cómo puedo llamar al código de Python (Iron) desde una aplicación C #?

¿Hay alguna manera de llamar al código Python, usando IronPython, supongo, desde C #? ¿Si es así, cómo?

El proceso es simple, especialmente en una aplicación C # / .NET 4 donde el soporte para lenguajes dynamics se ha mejorado mediante el uso del tipo dynamic . Pero, en última instancia, todo depende de la forma en que pretenda utilizar el código de Python (Iron) dentro de su aplicación. Siempre puede ejecutar ipy.exe como un proceso separado y pasar sus archivos de origen para que puedan ejecutarse. Pero es probable que desee alojarlos en su aplicación C #. Eso te deja con muchas opciones.

  1. Agregue una referencia a los ensamblados IronPython.dll y Microsoft.Scripting.dll . Generalmente los encontrará en su directorio raíz de instalación de IronPython.

  2. Agregar using IronPython.Hosting; a la parte superior de su fuente y cree una instancia del motor de scripting IronPython usando Python.CreateEngine() .

  3. Tienes un par de opciones desde aquí, pero básicamente ScriptScope un ScriptScope o ScriptSource y lo almacenarías como una variable dynamic . Esto le permite ejecutarlo o manipular los ámbitos desde C # si elige hacerlo.

Opción 1:

Usando CreateScope() para crear un ScriptScope vacío para usar directamente en el código C # pero utilizable en fonts Python. Puede pensar en estas como sus variables globales dentro de una instancia del intérprete.

 dynamic scope = engine.CreateScope(); scope.Add = new Func((x, y) => x + y); Console.WriteLine(scope.Add(2, 3)); // prints 5 

Opcion 2:

Usar Execute() para ejecutar cualquier código de IronPython en una cadena. Puede usar la sobrecarga donde puede pasar en un ScriptScope para almacenar o usar variables definidas en el código.

 var theScript = @"def PrintMessage(): print 'This is a message!' PrintMessage() "; // execute the script engine.Execute(theScript); // execute and store variables in scope engine.Execute(@"print Add(2, 3)", scope); // uses the `Add()` function as defined earlier in the scope 

Opción 3:

Usando ExecuteFile() para ejecutar un archivo fuente de IronPython. Puede usar la sobrecarga donde puede pasar en un ScriptScope para almacenar o usar variables definidas en el código.

 // execute the script engine.ExecuteFile(@"C:\path\to\script.py"); // execute and store variables in scope engine.ExecuteFile(@"C:\path\to\script.py", scope); // variables and functions defined in the scrip are added to the scope scope.SomeFunction(); 

Opción 4:

Usando GetBuiltinModule() o el método de extensión ImportModule() para crear un ámbito que contenga las variables definidas en dicho módulo. Los módulos importados de esta manera se deben establecer en las rutas de búsqueda.

 dynamic builtin = engine.GetBuiltinModule(); // you can store variables if you want dynamic list = builtin.list; dynamic itertools = engine.ImportModule("itertools"); var numbers = new[] { 1, 1, 2, 3, 6, 2, 2 }; Console.WriteLine(builtin.str(list(itertools.chain(numbers, "foobar")))); // prints `[1, 1, 2, 3, 6, 2, 2, 'f', 'o', 'o', 'b', 'a', 'r']` // to add to the search paths var searchPaths = engine.GetSearchPaths(); searchPaths.Add(@"C:\path\to\modules"); engine.SetSearchPaths(searchPaths); // import the module dynamic myModule = engine.ImportModule("mymodule"); 

Puedes hacer bastante para alojar código Python en tus proyectos .NET. C # ayuda a salvar esa brecha más fácil de tratar. Combinando todas las opciones mencionadas aquí, puede hacer casi cualquier cosa que desee. Por supuesto, hay más cosas que puedes hacer con las clases que se encuentran en el espacio de nombres de IronPython.Hosting , pero esto debería ser más que suficiente para comenzar.