在C#中嵌入IronPython 2 - 什么是DefaultModule.Globals的替代品?

时间:2009-09-08 14:58:20

标签: c# ironpython

我正在尝试转换一些IronPython 1代码:

var ptype = this.engine.DefaultModule.Globals[ironPythonClassName];

我有一个声明一个类的脚本。我使用Python引擎来执行脚本。

如何在IronPython 2中获取变量的名称(包括类)?

2 个答案:

答案 0 :(得分:1)

您必须在范围中执行该文件:

ScriptScope scope = engine.CreateScope();
CompiledCode code = engine.CreateScriptSourceFromFile(fullPath).Compile();
code.Execute(scope);

在范围内,您可以调用GetVariable或GetVariable来获取变量值:

object c = scope.GetVariable(ironPythonClassName)
// or
int i = scope.GetVariable<int>(otherVar);

据我所知,DefaultModule在IronPython 2.x中完全消失了。

为简单起见,ScriptEngine上还有便捷方法:

ScriptScope scope = engine.ExecuteFile(fullPath);
names = scope.GetVariableNames()

这对于一次性脚本使用更容易,但如果您反复执行相同的脚本,则直接使用已编译的代码会更好(更快)。

答案 1 :(得分:1)

没有必要创建一个新的范围,因为CompiledCode实例似乎是用一个创建的。

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile(fileName);
CompiledCode code = source.Compile();
ScriptScope scope = code.DefaultScope;
code.Execute();
var names = scope.GetVariableNames();

咆哮

上面的脚本类是一个噩梦 - 太多的功能重复和实例之间的奇怪联系。

为什么MS没有使用众所周知的模式 “引擎执行从源代码编译的代码”?

所以模型可能是:

  • 编译源代码以生成代码(编译器类)
  • 提供或创建范围(范围类)
  • 绑定代码和范围并将它们提供给引擎以执行(引擎类)

咆哮