IronPython ResourceMetaPathImporter 失败

IronPython ResourceMetaPathImporter failure

许多使用 ResourceMetaPathImporter 的解决方案如下所示:

ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(options);
var pyRuntime = new ScriptRuntime(setup);
var engineInstance = Python.GetEngine(pyRuntime);

var engine = Python.CreateEngine();
var sysScope = engine.GetSysModule();
List metaPath = sysScope.GetVariable("meta_path");
var importer = new ResourceMetaPathImporter(typeof(EmbeddedPythonEngine).Assembly, "python_27_lib.zip");
metaPath.Add(importer);
sysScope.SetVariable("meta_path", metaPath);

var source = "import csv";
var script = engineInstance.CreateScriptSourceFromString(source, SourceCodeKind.Statements);
script.Execute();

特别是,这段代码模仿了这个答案:。但是我使用的是 IronPython 2.7.5,上面的代码片段总是抱怨没有 csv 模块。

谁能告诉我这个问题? 2.7.5 以某种方式损坏了吗?我觉得我错过了一些明显的东西。

您的问题与 IronPython 2.7.5 无关,而是您的运行时设置或压缩库。您的代码片段没有显示提供了哪些选项,但该区域似乎出了问题。如果提供的选项为空或不足,import csv 将失败。

如果您删除脚本运行时设置(前三行)并仅使用在 Python.CreateEngine() 中创建的引擎而不是 engineInstance,事情应该会按预期工作。

完整的片段看起来像

var engine = Python.CreateEngine();
var sysScope = engine.GetSysModule();
List metaPath = sysScope.GetVariable("meta_path");
var importer = new ResourceMetaPathImporter(typeof(EmbeddedPythonEngine).Assembly, "python_27_lib.zip");
metaPath.Add(importer);
sysScope.SetVariable("meta_path", metaPath);

var source = "import csv";
var script = engine.CreateScriptSourceFromString(source, SourceCodeKind.Statements);
script.Execute();

如问题作者所述 - 压缩库存档中的错误文件夹结构也会导致导入错误。