有没有办法将嵌入式python脚本作为python模块导入IronPython?

时间:2013-09-02 08:27:32

标签: c# python ironpython

我的dll中有一个嵌入式资源,它是一个python脚本。我想使该资源中的类和函数可用于python引擎,因此我可以执行外部.py文件(如__main__),这样可以执行类似

的操作
import embedded_lib # where embedded_lib is an embedded python script

有没有办法实现这个目标?我希望会有某种IronPython.ImportModule('module_name', source)因此我看过IronPython文档并找不到任何东西,但我希望我只是看起来不好......也许有一些方法可以拦截调用import并以这种方式加载我的脚本?

1 个答案:

答案 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