IronPython引用和范围问题

时间:2014-01-02 16:26:34

标签: c# c#-4.0 visual-studio-2012 ironpython

我有一个IronPython应用程序,它处理排除规则的记录。基本上,我有一个目录结构:

  

LIB \

     

LIB \器DBC1 \ General.py

     

LIB \例外\ script.py

我的程序创建了一个IronPython运行时的实例:

Dictionary<String, Object> oDic = new Dictionary<String, Object>();
oDic.Add("Debug", true);
iEngine = Python.CreateEngine(oDic);
iScope = iEngine.CreateScope(new Dictionary<String, Object> { { "sql", iSql } });
iScriptSource = aScript;
iSource = iEngine.CreateScriptSourceFromFile(iScriptSource);

iSql是SQL交互的C#类(仅用于记录)。 在这种情况下,iScriptSource是python脚本:“Lib \ Exclusions \ script.py”

现在,在我的IronPython脚本中,我导入了DBCL文件夹和常规文件:

import DBCL
from DBCL import General

所以,我执行script.py:

iSource.Execute(iScope); // Edited 1/10/2014 to show I am passing the scope in.

在我的script.py文件中,我调用General.py在SQL中执行查找(记住,我已经通过iEngine.CreateScope()添加了一个名为“sql”的变量。)

然而,IronPython说这个全局变量不存在。但是如果我在script.py中调用它,它就作为全局变量存在。如何使我的变量全局可用于我导入的所有脚本?

如果有任何混淆或者如果这个问题形成不良,请告诉我,我会尽力解决。我觉得我有一些简单的东西,但是现在只需通过参数传递“sql”就可以暂时解决它。如果可能的话,我想避免这种情况,但如果我不能,那就没关系。

2 个答案:

答案 0 :(得分:1)

请检查Using global variables in a function other than the one that created them,第三个答案。简而言之,python中的全局变量是模块作用域,而不是解释器作用域。

我怀疑你需要在script.py中使用

import DBCL
from DBCL import General
General.sql = sql

答案 1 :(得分:0)

尝试传递执行脚本时创建的范围:

iSource.Execute(iScope);

这应该会自动将范围内的任何内容注入脚本的全局命名空间。