Почему вызов CompiledCode.Execute из C # для сценария IronPython не работает должным образом - PullRequest
3 голосов
/ 29 ноября 2011

Я пытаюсь вызвать скрипт 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);

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

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

Исключение составляет
IronPython.Runtime.Exceptions.TypeErrorException не был обработан кодом пользователя Сообщение = ожидается int, получил NoneType

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

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

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

1 Ответ

2 голосов
/ 29 ноября 2011

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

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

...