【问题标题】:Is there a way to import an embedded python script into IronPython as a python module?有没有办法将嵌入式 python 脚本作为 python 模块导入 IronPython?
【发布时间】:2013-09-02 08:27:31
【问题描述】:

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

import embedded_lib # where embedded_lib is an embedded python script

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

【问题讨论】:

    标签: c# python ironpython


    【解决方案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 对象(代码中的 scope)。你可以像这样将它们插入到另一个作用域中:

    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
    

    【讨论】:

    • 哦,抱歉,您想使用嵌入式资源中的模块...然后我想您可以尝试使用 engine.Execute(string, ScriptScope) 执行您的嵌入式资源模块,然后在另一个中使用它的 ScriptScope执行脚本或文件。或者你总是可以用你的资源文本创建一个临时文件并使用搜索路径:)
    • 如果您认为它正在回答问题,请相应地更新您的答案。如果需要,添加代码来解释它..
    • 到目前为止似乎工作正常,谢谢! (比我想象的要容易!)
    • 真的可以把它当作一个模块来使用吗(我的意思是with import 关键字?)
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2017-03-12
    • 2019-11-19
    • 2020-10-22
    • 1970-01-01
    • 2021-01-29
    • 2016-05-02
    相关资源
    最近更新 更多