我正在尝试转换一些IronPython 1代码:
var ptype = this.engine.DefaultModule.Globals[ironPythonClassName];
我有一个声明一个类的脚本。我使用Python引擎来执行脚本。
如何在IronPython 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没有使用众所周知的模式 “引擎执行从源代码编译的代码”?
所以模型可能是:
咆哮