2009-03-24 10 views
27

Estoy escribiendo una aplicación de C# que tiene IronPython (2.0.1) incrustado en ella. La idea es exponer porciones de la aplicación a los scripts de IronPython, que los usuarios escriben.Depuración de scripts de IronPython en entorno alojado (incrustado)

Quiero ofrecer a los usuarios la capacidad de poder depurar los scripts escritos por ellos, utilizando el Visual Studio Debugger. Tenga en cuenta que los scripts se ejecutan en el entorno alojado y no a través del ejecutable de IronPython (ipy.exe).

Después de un poco de magia Reflector en los ensamblajes de IronPython, se me ocurrió algo que me permite hacerlo, pero no estoy seguro de si esta es la manera prescrita. Básicamente lo que hago es crear un objeto "ScriptRuntime" con la propiedad "DebugMode" establecida en true y luego crear un "ScriptEngine" basado en python desde "ScriptRuntime", que utilizo para el alojamiento. Código a continuación.

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

Ahora, cuando ejecuta los guiones en el entorno alojado, usando:

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

puedo colocar puntos de interrupción en los archivos de comandos y recibe un golpe, cuando se ejecuta la secuencia de comandos.

Entonces, ¿hay una forma mejor/más fácil de hacer esto?

Gracias

+2

Esta es una pregunta bastante viejo/respuesta - es esta solución se espera trabajar con las herramientas de Python con Visual Studio (¿No está seguro de cómo el "depurador visual studio" funcionó con python en 2009)? Probé este fragmento y el que está en la respuesta aceptada, pero no puedo acceder a ningún punto de interrupción en mi script ironpython .py. Intentó VS 2013 y 2015 sin suerte ... – Joe

+0

Parece que ha encontrado su respuesta, gracias por compartirla en mi pregunta. – Kaerber

Respuesta

38

OK, lo conseguí. Hay un diccionario de opciones que "Python.CreateEngine" puede tomar como argumento. Uno puede especificar el modo de depuración en eso.

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

Creo que esto es bastante sencillo.

+0

Exactamente lo que estaba buscando, ¡gracias! –

+0

Información realmente útil, +1 –

+0

Perfecto, +1 Como se comentó anteriormente, es lamentable que no se puedan ver las variables globales a través de –

Cuestiones relacionadas