IronPython DLR; передача параметров в скомпилированный код? - PullRequest
2 голосов
/ 31 января 2011

В настоящее время я делаю следующее, чтобы создать и выполнить простое вычисление на Python, используя DLR:

ScriptRuntime runtime = Python.CreateRuntime();
ScriptEngine engine = runtime.GetEngine("py");

MemoryStream ms = new MemoryStream();
runtime.IO.SetOutput(ms, new StreamWriter(ms));

ScriptSource ss = engine.CreateScriptSourceFromString("print 1+1", SourceCodeKind.InteractiveCode);

CompiledCode cc = ss.Compile();
cc.Execute();

int length = (int)ms.Length;
Byte[] bytes = new Byte[length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(bytes, 0, (int)ms.Length);
string result = Encoding.GetEncoding("utf-8").GetString(bytes, 0, (int)ms.Length);

Console.WriteLine(result);

Который выводит на консоль «2», но;чтобы получить результат 1 + 1 без его распечатки (так как это кажется дорогостоящей операцией).Все, что я присваиваю результат cc.Execute (), является нулевым.Есть ли какой-нибудь другой способ получить результирующие переменные из Execute ()?

Я также пытаюсь найти способ передачи параметров, т. Е. В результате получается arg1 + arg2 и не знаю, как это сделать.тот;единственная другая перегрузка для Execute принимает ScriptScope в качестве параметра, и я никогда раньше не использовал python.Может ли кто-нибудь помочь?

[Редактировать] Ответ на оба вопроса: (Деско принимает, как указал мне в правильном направлении)

ScriptEngine py = Python.CreateEngine();
ScriptScope pys = py.CreateScope();

ScriptSource src = py.CreateScriptSourceFromString("a+b");
CompiledCode compiled = src.Compile();

pys.SetVariable("a", 1);
pys.SetVariable("b", 1);
var result = compiled.Execute(pys);

Console.WriteLine(result);

Ответы [ 2 ]

6 голосов
/ 31 января 2011

Вы можете либо оценить выражение в Python и вернуть его результат (1), либо присвоить значение некоторой переменной в области видимости, а затем выбрать его (2):

    var py = Python.CreateEngine();

    // 1
    var value = py.Execute("1+1");
    Console.WriteLine(value);

    // 2
    var scriptScope = py.CreateScope();
    py.Execute("a = 1 + 1", scriptScope);
    var value2 = scriptScope.GetVariable("a");
    Console.WriteLine(value2);
3 голосов
/ 31 января 2011

Вам определенно не обязательно печатать это. Я бы ожидал , что есть способ просто оценить выражение, но если нет, то есть альтернативы.

Например, в моем динамическом графическом демо я создаю функцию, используя python:

def f(x):
    return x * x

и затем выведите f из области видимости скрипта следующим образом:

Func<double, double> function;
if (!scope.TryGetVariable<Func<double, double>>("f", out function))
{
    // Error handling here
}
double step = (maxInputX - minInputX) / 100;
for (int i = 0; i < 101; i++)
{
    values[i] = function(minInputX + step * i);
}

Вы могли бы сделать что-то подобное, если хотите вычислить выражение несколько раз, или просто присвоить результат переменной, если вам нужно только один раз оценить его.

...