我试图直接从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);
得到相同的结果
答案 0 :(得分:0)
想出一个:编码模块在IronPython中用Python实现(核心模块在C#中)。它始终与IronPythonConsole项目一起使用,因为它隐式地将标准库的IronPython源添加到Python path
。我只需要像这样明确指定path
:
var options = new Dictionary<string, object> { ["SearchPaths"] = path };
var engine = Python.CreateEngine(options);