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

时间:2016-03-15 04:43:33

标签: c# python .net wpf ironpython

我有一个 WPF 应用程序。出于这个问题的目的,让我们说它是一个带按钮的简单窗口。当我点击该按钮时,我希望执行 Python 脚本。因此,我四处寻找并发现我可以使用 IronPython 运行Python脚本。 Part1 运行良好,它运行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.Dynamic.dll中发生' Microsoft.Scripting.ArgumentTypeException' :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# - IronPython获取返回的值。

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

1 个答案:

答案 0 :(得分:1)

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

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

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