IronPython无法导入os模块: ImportException: “not a Zipfile”

4

我正在尝试从.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

2个回答

4

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

与其完全分离调试器,不如仅启用我的代码或排除在导入异常时中断。

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

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

更多信息可以在Github上对应的工单中找到。


谢谢!你如何禁用 zip 导入支持? - Yann
我已经编辑了我的答案,并添加了一个代码片段示例,说明如何删除 zip 处理程序。 - Simon Opelt
谢谢,非常感激! - Yann

0

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

我的修复方法是,使导入模块成为有状态的:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接