我有一个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”就可以暂时解决它。如果可能的话,我想避免这种情况,但如果我不能,那就没关系。
答案 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);
这应该会自动将范围内的任何内容注入脚本的全局命名空间。