如何正确设置IronPython的CodeContext直接从C#调用IO?

时间:2018-04-19 19:22:11

标签: c# ironpython

我试图直接从C#调用IronPython的内置模块。看起来我错过了一些重要的初始化,我在代码中的任何地方都找不到。

这就是我的所作所为:

namespace py.consoleio
{
    using IronPython.Runtime;
    using Microsoft.Scripting.Hosting;
    using Microsoft.Scripting.Hosting.Providers;
    using Microsoft.Scripting.Runtime;

    public static class consoleio
    {
        public static string name;

        static void Main()
        {
            var setup = new ScriptRuntimeSetup();
            setup.LanguageSetups.Add(
                IronPython.Hosting.Python.CreateLanguageSetup(null));
            var dlrRuntime = new ScriptRuntime(setup);
            var scriptDomainManager = HostingHelpers.GetDomainManager(dlrRuntime);
            var pythonContext = new PythonContext(scriptDomainManager, null);
            var context = new CodeContext(new PythonDictionary(), new ModuleContext(new PythonDictionary(), DefaultContext.DefaultPythonContext));
            name = IronPython.Modules.Builtin.input(context, "What is your name?\n");
            IronPython.Modules.Builtin.print(context, "Hi, %s.", consoleio.name);
            System.GC.KeepAlive(pythonContext);
        }
    }
}

正确输出“你的名字是什么?”,然后崩溃尝试解码输入:未知编码:cp437。

现在我已经发现,编码在Src / StdLib / Lib / encodings / init .py中初始化 我无法找到如何在正常的IronPython运行(例如控制台主机)中加载此模块,因此我无法在C#程序中重现它。

我的目标是在没有动态调度的情况下调用IronPython函数。

UPD。现在我也试着这样做:

var engine = Python.CreateEngine();
this.ScriptDomainManager = HostingHelpers.GetDomainManager(engine.Runtime);

得到相同的结果

1 个答案:

答案 0 :(得分:0)

想出一个:编码模块在IronPython中用Python实现(核心模块在C#中)。它始终与IronPythonConsole项目一起使用,因为它隐式地将标准库的IronPython源添加到Python path。我只需要像这样明确指定path

var options = new Dictionary<string, object> { ["SearchPaths"] = path };
var engine = Python.CreateEngine(options);