IronPython无法导入os:ImportException:";而不是Zipfile”;

本文关键字:Zipfile quot 导入 os ImportException IronPython | 更新日期: 2023-09-27 18:24:03

我正试图从控制台.NET 4.5应用程序执行此脚本

脚本:test1.py

import sys
sys.path.append(r'C:'Program Files (x86)'IronPython 2.7'Lib')
import os
print os.getcwd()

C#:Program.cs

 static void Main(string[] args)
 {
     ExecuteScript();
     Console.Read();
 }
 private static void ExecuteScript()
 {
     var engine = Python.CreateEngine();
     var scope = engine.CreateScope();
     var source = engine.CreateScriptSourceFromFile(@"D:'Scripts'test1.py");
     engine.Runtime.IO.RedirectToConsole();
     source.Execute(scope);
 }

如果我运行这个,我会得到一个IronPython.Runtime.Exceptions.ImportException。如果我忽略这个异常(分离VS调试器),它会工作,但我想知道如何正确处理它,或者我应该忽略它?

谢谢,Yann

IronPython无法导入os:ImportException:";而不是Zipfile”;

到目前为止,您只能忽略此非致命的内部异常或禁用zip导入支持。

您可以只启用我的代码或排除导入异常时的中断,而不是完全分离调试器。

要禁用zip导入支持,您可以清除(或者如果有多个处理程序,则检查并删除特定的处理程序)path_hooks:

var pc = HostingHelpers.GetLanguageContext(engine) as PythonContext;
var hooks = pc.SystemState.Get__dict__()["path_hooks"] as List;
hooks.Clear();

更多信息可以在github上的相应票证中找到。

我也遇到了同样的问题,我创建了一个pull请求,它会解决这个问题。也许它会被接受:)

我的解决方案是,使导入模块有状态:

foreach (object hook in (IEnumerable)pathHooks) {
    try {
        object handler = PythonCalls.Call(context, hook, dirname);
        if (handler != null)
        {
            if (handler is IImporterModule)
            {
                if ((handler as IImporterModule).State == ImporterModuleState.Ready)
                {
                    return handler;
                }
            }
            else
            {
                return handler;
            }
        }
    } catch (ImportException) {
        // we can't handle the path
    }
}

git-hub上的拉取请求:https://github.com/IronLanguages/main/pull/1247