我有一个 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");但我得到了同样的错误。
答案 0 :(得分:1)
对于python成员方法,第一个参数是self
。
class pythonScriptClass:
def theMethod(self, text, number):
# and call self.swapText(...)
这就是参数数量出错的原因。