将变量从 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(...)
这就是参数个数出错的原因。
我有一个 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(...)
这就是参数个数出错的原因。