Почему вызов CompiledCode.Execute из C# для скрипта IronPython ведет себя не так, как ожидалось

Я пытаюсь вызвать скрипт IronPython (2.7.1) из С# (4.0)

Это связано с интеграцией IronPython в C#: конкретная проблема/вопрос

У меня есть скрипт python, как показано ниже, в файле script.py

import clr

def getStream(activity):
    if activity.ActivityType == 'XXX':
        if activity.Complexity == 'LOW':
            return 1
        else:
            return 2
    else:
        return 0

getStream(activity)

Я пытаюсь предварительно скомпилировать скрипт и использовать его позже

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("script.py");
CompiledCode compiledCode = source.Compile();
dynamic scope = engine.CreateScope();
// .. creating an activity object here
scope.SetVariable("activity", activity);

Теперь, чтобы получить streamId, если я это сделаю, это не сработает

int streamId = rule.Execute<int>(scope);

Исключение:
IronPython.Runtime.Exceptions.TypeErrorException не было обработано кодом пользователя Message=expected int, got NoneType

Но это сработает

rule.Execute(scope);
int streamId = scope.getWorkstream(activity);

Мой вопрос в том, как правильно использовать вызов метода Execute класса CompiledCode?


person softveda    schedule 29.11.2011    source источник
comment
"it doesn't work" — объясните, что происходит?   -  person sehe    schedule 29.11.2011
comment
связанные: stackoverflow.com/questions /4852386/   -  person sehe    schedule 29.11.2011
comment
@sehe rule.Execute‹int›(область действия); выдает исключение вроде ожидаемого int, но получил тип null или что-то подобное. Я могу позже обновить с точным исключением. Если я просто выполню rule.Execute(scope), возвращаемый объект будет нулевым.   -  person softveda    schedule 29.11.2011


Ответы (1)


Я считаю, что Execute будет возвращать значение только в том случае, если скомпилированный код представляет собой выражение, а не серию операторов. Ваше второе использование является правильным в этом случае.

Если бы код был просто «2 + 2», то Execute<int>, вероятно, сработало бы, но я не могу проверить это в данный момент.

person Jeff Hardy    schedule 29.11.2011