我的dll中有一个嵌入式资源,它是一个python脚本。我想使该资源中的类和函数可用于python引擎,因此我可以执行外部.py文件(如__main__
),这样可以执行类似
import embedded_lib # where embedded_lib is an embedded python script
有没有办法实现这个目标?我希望会有某种IronPython.ImportModule('module_name', source)
因此我看过IronPython文档并找不到任何东西,但我希望我只是看起来不好......也许有一些方法可以拦截调用import
并以这种方式加载我的脚本?
答案 0 :(得分:1)
有可能。您只需要向ScriptEngine对象添加搜索路径,如下所示:
var paths = engine.GetSearchPaths();
paths.Add(yourLibsPath); // add directory to search
或
engine.SetSearchPaths(paths);
然后你可以使用你添加的目录中的任何模块:
import pyFileName # without extension .py
<强>更新强> 好。如果要使用模块等嵌入式资源字符串,可以使用以下代码:
var scope = engine.CreateScope(); // Create ScriptScope to use it like a module
engine.Execute("import clr\n" +
"clr.AddReference(\"System.Windows.Forms\")\n" +
"import System.Windows.Forms\n" +
"def Hello():\n" +
"\tSystem.Windows.Forms.MessageBox.Show(\"Hello World!\")", scope); // Execute code from string in scope.
现在您有一个包含所有已执行函数的ScriptScope对象(代码中的范围)。您可以将它们插入另一个范围,如下所示:
foreach (var keyValuePair in scope.GetItems())
{
if(keyValuePair.Value != null)
anotherScope.SetVariable(keyValuePair.Key, keyValuePair.Value);
}
或者您可以在此ScriptScope中执行脚本:
dynamic executed = engine.ExecuteFile("Filename.py", scope);
executed.SomeFuncInFilename();
在此脚本中,您可以使用所有功能而无需导入:
def SomeFuncInFilename():
Hello() # uses function from your scope