简体   繁体   中英

How to properly setup CodeContext of IronPython to directly invoke IO from C#?

I am trying to directly invoke IronPython's built-in modules from C#. It looks like I'm missing some important initialization, that I can't find anywhere in the code.

Here's what I do:

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

That properly outputs "What is your name?", but then crashes trying to decode input: unknown encoding: cp437.

Now I've already found, that encodings are initialized in Src/StdLib/Lib/encodings/ init .py I can't find how it gets to loading this module in a normal IronPython run (eg a console host), so I can't reproduce it in C# program.

My goal here is to invoke IronPython functions without dynamic dispatch.

UPD. Now I also tried to do this:

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

to the same result

Figured that one out: encodings module is implemented in Python in IronPython (core modules are in C#). It always worked with IronPythonConsole project, because it implicitly adds IronPython source for standard libraries to Python path . I just had to explicitly specify path like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM