2016-03-15 2 views
0

У меня есть приложение 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 («ключ», «значение»); но у меня такая же ошибка.

+0

Знайте немного о IronPython, но как 'object [] parameters' с' new object [] {"Привет", 3} 'интерпретируется в Python? Он выглядит 2-х длинным, но рассматривается как 3 длины, возможно, «H», «i» и «3»? Что происходит с '{" foo ", 3}'? – dytori

+0

Извините за задержку @dytori. Чтобы ответить на ваш вопрос, он делает то же самое с «foo». – Marks

+0

Извините, я упустил из виду, что вы использовали подпись класса. См. Мой ответ. – dytori

ответ

1

Что касается метода элемента python, то первый аргумент self.

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

Вот почему число аргументов пошло не так.

+0

Он работал как шарм. Спасибо ! Мне нужно будет проверить больше об этих методах Member/Non-member ... – Marks

+0

Метод члена может не быть подходящим термином ... Пожалуйста, проверьте экземпляр/класс/статический метод в Python. – dytori