Hosting IronPython 2
From IronPython Cookbook
The following C# code shows simple examples of using the IronPython 2 API to host IronPython in a .NET application. This code works with IronPython 2 beta 1.
using System;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace EmbeddedCalculator
{
public class Engine
{
private ScriptEngine engine;
public Engine()
{
engine = PythonEngine.CurrentEngine;
}
public string calculate(string input)
{
try
{
ScriptSource source = engine.CreateScriptSourceFromString(input, "py");
return source.Execute().ToString();
}
catch
{
return "Error";
}
}
}
}
An alternative equivalent is:
public class Engine
{
private ScriptEngine engine;
private ScriptScope scope;
public Engine()
{
engine = ScriptRuntime.Create().GetEngine("py");
scope = engine.CreateScope();
}
public string calculate(string input)
{
try
{
ScriptSource source = engine.CreateScriptSourceFromString(input, SourceCodeKind.Expression);
return source.Execute(scope).ToString();
}
catch
{
return "Error";
}
}
}
For returning a known type from Execute we could use int result = source.Execute<int>(scope);.
Here's an example that sets some variables in the scope, executes some code, and then attempts to pull the variable 'x' back out of the scope:
public class Engine
{
private object button;
private ScriptEngine engine;
private ScriptScope scope;
public Engine()
{
engine = ScriptRuntime.Create().GetEngine("py");
scope = engine.CreateScope();
}
public void set_button(object from_form)
{
button = from_form;
}
public string evaluate(string x, string code)
{
scope.SetVariable("x", x);
scope.SetVariable("button", button);
try
{
ScriptSource source = engine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
source.Execute(scope);
}
catch
{
return "Error executing code";
}
if (!scope.VariableExists("x"))
{
return "x was deleted";
}
string result = scope.GetVariable<object>("x").ToString();
return result;
}
}
Back to Contents.

