views:

824

answers:

4

Hello,

I'm writing a C# application which has IronPython (2.0.1) embedded in it. The idea is to expose portions of the application to the IronPython scripts, which the users write.

I want to provide the ability to the users to be able to debug the scripts written by them, using the Visual Studio Debugger. Note that the scripts are run in the hosted environment and not through the IronPython executable (ipy.exe).

After a bit of Reflector magic on the IronPython assemblies, I came up with something which lets me do that, but I'm not sure if this is the prescribed way. Basically what I do is create a "ScriptRuntime" object with the "DebugMode" property set to true and then create a python based "ScriptEngine" from the "ScriptRuntime", which I use for hosting. Code below.

        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);

Now when I execute the scripts in the hosted environment, using:

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

I can place breakpoints in the script files and they get hit, when the script is executed.

So, is there a better/easier way to do this?

Thanks,

Rohit

+12  A: 

OK, got it. There is an options dictionary which "Python.CreateEngine" can take as an argument. One can specify the debug mode in that.

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

I think this is straightforward enough.

Rohit
Exactly what I was looking for, thanks!
Tom E
Really useful info, +1
Chris Ballard
Perfect, +1As another commented mentioned, its unfortunate that you cannot view global variables though
Steve Greatrex
A: 

Hi, I am looking for a solution to the same problem. While your's works fine you can only step through the script but not watch variable values. Any ideeas? Thanks Florin

You can look at variables if they are within a function's scope. But if they are in the global namespace you will have to dig deeper inside some dictionaries to get at them.
Rohit
+2  A: 

Harry Pierson (DevHawk) has a blog post on this subject that will help you get started:

Microsoft.Scripting.Debugging

W. Kevin Hazzard
A: 

I try this solution and it works ok, but i can't debug a script generated dynamically in a textbox through visual studio 2005. In this case do you have any solution to suggest me?

Alexandre L silva