是否有办法在Visual Studio和PTVS中调试嵌入C#的Python代码?

3

我已经创建了将IronPython代码嵌入C#的代码。

    public ScriptEngine GetEngine() {
        if( _engine != null )
            return _engine;

        _engine = Python.CreateEngine();
        var paths = _engine.GetSearchPaths();
        paths.Add( _pythonPath );
        _engine.SetSearchPaths( paths );

        var runtime = _engine.Runtime;
        runtime.LoadAssembly( typeof( CharacterCore ).Assembly );
        return _engine;
    }

    public IAbility Movement() {
        var engine = GetEngine();
        var script = engine.CreateScriptSourceFromFile( Path.Combine( _pythonPath, "movement.py" ) );
        var code = script.Compile();
        var scope = engine.CreateScope();
        code.Execute( scope );

        return scope.GetVariable( "result" );
    }

在同一解决方案中的单独Python项目中使用适当的Python代码。代码本身可以工作,但是如果我在Python代码中设置断点,则永远不会触发。有没有办法让调试器进入Python代码?

我正在使用Visual Studio 2015 RC(也是Visual Studio 2013),Python Tools for Visual Studio(使用IronPython Launcher进行Python代码)。我尝试过从字符串和文件创建脚本源,但调试从未正常工作。


如果你从已加载的Python模块内部打印出__file__,它会显示什么? - Pavel Minaev
Python文件的实际路径为E:***\Python\abilities\movement.py。 - Kaerber
3
如果你想同时调试.NET和Python代码,并在它们之间跳转,你需要在命令行上指定-X:Debug(或者在托管时指定options["Debug"] = true,然后创建引擎CreateEngine(options))。这将向托管调试器提供基本的调试信息,让你能够处理Python代码。与PTVS调试相比,它有限制,例如你会在堆栈中看到混淆的名称等,但如果你一定要同时调试这两种类型的代码,这是唯一的选择。 - Pavel Minaev
另一个选项是尝试在Pythonnet中运行你的IronPython代码,可能需要做一些小更改。 - denfromufa
1
你(@Kaerber)确定在VS调试设置中取消了“仅我的代码”吗? - Joe
显示剩余2条评论
1个回答

5

向CreateEngine添加选项,就像这样

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

禁用“仅限我的代码”调试选项,可以调试嵌入式Python,包括断点和逐步执行。值得赞扬的是,感谢问题评论中的Pavel Minaev和Joe。

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