У меня есть приложение WPF. Для целей этого вопроса, скажем, это простое окно с кнопкой. Когда я нажимаю на эту кнопку, я хотел бы выполнить сценарий Python. Поэтому я пошел оглядываться и узнал, что могу запускать скрипты Python, используя IronPython. Part1 работает хорошо, он запускает скрипты python. Из того, что я собрал, просматривая Интернет, Part2 - это то, что я должен сделать, если хочу вызвать конкретный метод.Передача переменной с C# - IronPython на скрипт Python
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
Моя конечная цель на данный момент, чтобы получить эту работу и, следовательно, быть в состоянии назвать theMethod() от Python и получить возвращаемое значение с помощью C# - IronPython.
Я пробовал другие методы, такие как: scope.SetVariable («ключ», «значение»); но у меня такая же ошибка.
Знайте немного о IronPython, но как 'object [] parameters' с' new object [] {"Привет", 3} 'интерпретируется в Python? Он выглядит 2-х длинным, но рассматривается как 3 длины, возможно, «H», «i» и «3»? Что происходит с '{" foo ", 3}'? – dytori
Извините за задержку @dytori. Чтобы ответить на ваш вопрос, он делает то же самое с «foo». – Marks
Извините, я упустил из виду, что вы использовали подпись класса. См. Мой ответ. – dytori