通过IronPython在C#中求解三角函数的评估

3

我试图使用Iron-Python二进制文件中的Python引擎来评估一些与流体力学相关的表达式。我得到了以下代码:

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromString("import math", SourceCodeKind.AutoDetect);
source.Execute();
source = engine.CreateScriptSourceFromString("2*sin (2)", SourceCodeKind.AutoDetect);
button1.Text = source.Execute<float>().ToString();

每当我尝试运行时,都会出现以下错误:全局名称'sin'未定义。 我也尝试过Math.sin()但是没有成功。 有什么想法吗?

@nneonneo 抛出错误:全局名称 'math' 未定义。 - Ahmed Mohamed
2
这是因为您正在重新分配 ScriptSource,导致导入丢失。您可以尝试使用 ScriptSource source = engine.CreateScriptSourceFromString("import math\r\n2*math.sin(2)", SourceCodeKind.AutoDetect); 吗? - Paolo Moretti
@PaoloMoretti 非常感谢!!非常好用 :) 也许您可以发布一个答案来获得投票并更容易地发现解决方案? - Ahmed Mohamed
1
@Ahmed,请查看@nneonneo编辑过的答案。正确的方法是将全局状态存储在ScriptScope实例中。 - Paolo Moretti
1个回答

3

如果您想让所有数学函数都可以在全局范围内访问(这可能对您很有用,因为表达式是数学性质的),则可以使用from math import *代替import math

您还应该创建一个ScriptScope来存储全局状态,以便您可以执行多个语句:

ScriptScope scope = engine.CreateScope();

ScriptSource source = engine.CreateScriptSourceFromString("from math import *", SourceCodeKind.AutoDetect);
source.Execute(scope);

source = engine.CreateScriptSourceFromString("2*sin (2)", SourceCodeKind.AutoDetect);
button1.Text = source.Execute<float>(scope).ToString();

您甚至可以从C#将对象放入作用域中:

scope.SetVariable("x", 0.577);

1
我添加了一条关于使用作用域来保存状态的注释。 - nneonneo
一个旁问,如何以这种形式实现变量?例如sin(x),其中x是用户输入的? - Ahmed Mohamed
1
作用域.设置变量 - nneonneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接