将变量从 C# - IronPython 传递到 Python 脚本

Pass variable from C# - IronPython to a Python script

我有一个 WPF 应用程序。出于这个问题的目的,假设它是一个带有按钮的简单 Window。当我单击该按钮时,我希望执行 Python 脚本。因此,我环顾四周,发现我可以使用 IronPython 运行 Python 脚本。 第 1 部分 运行良好,它 运行 是 python 脚本。根据我在网上搜集到的信息,Part2 是我想调用特定方法时应该做的事情。

private void btnWhatever_Click(object sender, RoutedEventArgs e)
{ 
    //Basic engine to run python script. - Part1
    ScriptEngine engine = Python.CreateEngine();
    string pythonScriptPath = System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()));        
    ScriptSource source = engine.CreateScriptSourceFromFile(pythonScriptPath + "/python.py");
    ScriptScope scope = engine.CreateScope();
    source.Execute(scope); 

    //Part2
    Object myclass = engine.Operations.Invoke(scope.GetVariable("pythonScriptClass"));
    object[] parameters = new object[] { "Hi",3 };
    engine.Operations.InvokeMember(myclass, "theMethod", parameters);
}

问题是,我不断得到 'Microsoft.Scripting.ArgumentTypeException' 发生在 Microsoft.Dynamic.dll 中:theMethod() 正好需要 2 个参数(给定 3 个).

我从那个错误中了解到,我给出了 3 个参数而不是 2 个,但我无法从我发现的其他方式调用特定方法。一般来说,我对 IronPython 和 Python 还很陌生,但这里有一个脚本示例:

class pythonScriptClass:

def swapText(text, number):
    return text[number:] + text[:number]

def getLetterIndex(letter, text):
    for k in range(len(text)):
        if (letter== text[k]):
            return k
    return -1

def theMethod(text , number):
    result= swapText("textToBeSwaped", number)
    toBeReturned  = ""
    for letter in text:
        if letter in "abcdefghijklmnopqrstuvwxyz":
            toBeReturned  = toBeReturned  + result[getLetterIndex(letter, result)]           
    return toBeReturned  

我目前的最终目标是让它工作,因此能够从 Python 脚本调用 theMethod() 并使用C# - 铁Python。

我尝试过其他方法,例如:scope.SetVariable("key","value");但我得到了同样的错误。

至于python成员方法,第一个参数是self

class pythonScriptClass:
  def theMethod(self, text, number):
    # and call self.swapText(...)

这就是参数个数出错的原因。