So far I have a simple class that wraps a python engine (IronPython) for my use. Although code looks big it's really simple so I copy it here to be more clear with my issue.
Here's the code:
public class PythonInstance
{
ScriptEngine engine;
ScriptScope scope;
ScriptSource source;
public PythonInstance()
{
engine = Python.CreateEngine();
scope = engine.CreateScope();
}
public void LoadCode(string code)
{
source = engine.CreateScriptSourceFromString(code, Microsoft.Scripting.SourceCodeKind.Statements);
source.Compile();
}
public void SetVariable(string key, dynamic variable)
{
scope.SetVariable(key, variable);
}
public void RunCode()
{
source.Execute(scope);
}
public void CallFunction(string function)
{
//?????? no idea what to call here
}
}
So, it works great but it only allows me to execute all python script at once... but what I would like to do is to be able to call particular functions from within a pythos script.
So, my question: How do I call particular function in the loaded script?
I was trying to find some information or tutorials but unfortunately couldn't find anything.
解决方案
Thanks to suggestion in comments I was able to figure out how to use it. Here's what I have now:
public class PythonInstance
{
private ScriptEngine engine;
private ScriptScope scope;
private ScriptSource source;
private CompiledCode compiled;
private object pythonClass;
public PythonInstance(string code, string className = "PyClass")
{
//creating engine and stuff
engine = Python.CreateEngine();
scope = engine.CreateScope();
//loading and compiling code
source = engine.CreateScriptSourceFromString(code, Microsoft.Scripting.SourceCodeKind.Statements);
compiled = source.Compile();
//now executing this code (the code should contain a class)
compiled.Execute(scope);
//now creating an object that could be used to access the stuff inside a python script
pythonClass = engine.Operations.Invoke(scope.GetVariable(className));
}
public void SetVariable(string variable, dynamic value)
{
scope.SetVariable(variable, value);
}
public dynamic GetVariable(string variable)
{
return scope.GetVariable(variable);
}
public void CallMethod(string method, params dynamic[] arguments)
{
engine.Operations.InvokeMember(pythonClass, method, arguments);
}
public dynamic CallFunction(string method, params dynamic[] arguments)
{
return engine.Operations.InvokeMember(pythonClass, method, arguments);
}
}
To test it:
PythonInstance py = new PythonInstance(@"
class PyClass:
def __init__(self):
pass
def somemethod(self):
print 'in some method'
def isodd(self, n):
return 1 == n % 2
");
py.CallMethod("somemethod");
Console.WriteLine(py.CallFunction("isodd", 6));