2011-01-31 3 views
2

В настоящее время я делаю следующее, чтобы создать и выполнить простой расчет питона, используя DLR:IronPython 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(), равно null. Есть ли другой способ получить полученные переменные из Execute()?

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

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

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); 

ответ

6

Вы можете оценить выражение в 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

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

К примеру, в моем dynamic graphing demo создать функцию, используя 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); 
} 

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

Смежные вопросы