Почему вызов 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>
вероятно, сработает, но я не могу проверить это в данный момент.