1

我的 dll 中有一个嵌入式资源,它是一个 python 脚本。我想让该资源中的类和函数可用于 python 引擎,所以我可以执行外部 .py 文件(as __main__),它能够执行类似的操作

import embedded_lib # where embedded_lib is an embedded python script

有没有办法做到这一点?我希望会有某种,IronPython.ImportModule('module_name', source)所以我查看了 IronPython 文档并找不到任何东西,但我希望我只是不擅长看.. 也许有一些方法可以拦截调用import和加载我的脚本是这样吗?

4

1 回答 1

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();

在这个脚本中,你可以使用所有没有import的函数:

def SomeFuncInFilename():
    Hello() # uses function from your scope
于 2013-09-02T08:43:29.460 回答