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

Я пытаюсь вызвать скрипт IronPython (2.7.1) из C# (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= ожидаемый int, получил NoneType.

Но это будет работать

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

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

1 ответ

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

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

Другие вопросы по тегам