使用IronPython在C#中运行特定的Python函数

到目前为止,我有一个简单的类包装python引擎(IronPython)供我使用。 虽然代码看起来很大,但它非常简单,所以我在这里复制它以便更清楚地解决我的问题。

这是代码:

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 } } 

所以,它工作得很好,但它只允许我一次执行所有python脚本…但我想做的是能够从pythos脚本中调用特定的函数。

所以,我的问题是 :如何在加载的脚本中调用特定函数?

我试图找到一些信息或教程,但遗憾的是找不到任何东西。

感谢评论中的建议,我能够弄清楚如何使用它。 这就是我现在拥有的:

 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); } } 

测试它:

  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));