【问题标题】:Debugging IronPython scripts in hosted (embedded) environment在托管(嵌入式)环境中调试 IronPython 脚本
【发布时间】:2009-03-24 04:52:53
【问题描述】:

我正在编写一个嵌入了 IronPython (2.0.1) 的 C# 应用程序。这个想法是将应用程序的一部分暴露给用户编写的 IronPython 脚本。

我希望让用户能够使用 Visual Studio 调试器调试他们编写的脚本。请注意,脚本在托管环境中运行,而不是通过 IronPython 可执行文件 (ipy.exe)。

在 IronPython 程序集上使用了一点 Reflector 魔法后,我想出了一些可以让我做到这一点的方法,但我不确定这是否是规定的方式。基本上我所做的是创建一个“DebugMode”属性设置为true的“ScriptRuntime”对象,然后从“ScriptRuntime”创建一个基于python的“ScriptEngine”,用于托管。代码如下。

        ScriptRuntimeSetup setup = new ScriptRuntimeSetup();
        setup.DebugMode = true;
        setup.LanguageSetups.Add(Python.CreateLanguageSetup(null));

        ScriptRuntime runtime = new ScriptRuntime(setup);
        ScriptEngine engine = runtime.GetEngineByTypeName(typeof(PythonContext).AssemblyQualifiedName);

现在,当我在托管环境中执行脚本时,使用:

            ScriptSource script = engine.CreateScriptSourceFromFile(path);
            CompiledCode code = script.Compile();
            ScriptScope scope = engine.CreateScope();
            script.Execute(scope);

我可以在脚本文件中放置断点,当脚本执行时它们会被命中。

那么,有没有更好/更简单的方法来做到这一点?

谢谢

【问题讨论】:

  • 这是一个非常古老的问题/答案 - 这个解决方案是否有望与带有 Visual Studio 的 Python 工具一起使用(不太确定“Visual Studio 调试器”在 2009 年是如何与 python 一起工作的)?我尝试了这个 sn-p 和接受的答案中的那个,但在我的 ironpython .py 脚本中无法命中任何断点。尝试 VS 2013 和 2015 没有运气...
  • 您似乎找到了答案,感谢您在我的问题中分享。

标签: .net debugging ironpython


【解决方案1】:

好的,知道了。有一个“Python.CreateEngine”可以作为参数的选项字典。可以在其中指定调试模式。

        Dictionary<string, object> options = new Dictionary<string, object>();
        options["Debug"] = true;
        engine = Python.CreateEngine(options);

我认为这很简单。

【讨论】:

  • 完美,+1 正如另一位评论提到的,很遗憾您无法查看全局变量
  • 不要忘记在“调试”选项中禁用“仅我的代码”以允许命中 Python 代码中的断点。
  • 此方法只能用于在visual studio中启动项目。如果你附加到一个进程,它将不起作用。
【解决方案2】:

Harry Pierson (DevHawk) 有一篇关于此主题的博文可以帮助您入门:

Microsoft.Scripting.Debugging

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2011-02-06
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多