2009-03-24 22 views
27

Sto scrivendo un'applicazione C# che contiene IronPython (2.0.1) incorporato. L'idea è di esporre porzioni dell'applicazione agli script IronPython, che gli utenti scrivono.Debug degli script IronPython nell'ambiente ospitato (incorporato)

Desidero fornire agli utenti la possibilità di eseguire il debug degli script scritti da loro, utilizzando Visual Studio Debugger. Si noti che gli script vengono eseguiti nell'ambiente ospitato e non tramite l'eseguibile IronPython (ipy.exe).

Dopo un po 'di magia Reflector sugli assiemi di IronPython, mi è venuto in mente qualcosa che mi consenta di farlo, ma non sono sicuro se questo è il modo prescritto. Fondamentalmente quello che faccio è creare un oggetto "ScriptRuntime" con la proprietà "DebugMode" impostata su true e quindi creare un "ScriptEngine" basato su Python da "ScriptRuntime", che utilizzo per l'hosting. Codice sotto.

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

Ora, quando eseguo gli script in ambiente hosted, utilizzando:

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

posso mettere i punti di interruzione nei file di script e vieni colpito, quando viene eseguito lo script.

Quindi, c'è un modo migliore/più semplice per farlo?

Grazie

+2

Questa è una bella vecchia domanda/risposta - è questa soluzione prevede di lavorare con strumenti di Python con Visual Studio (Non sei proprio sicuro di come "Visual Studio Debugger" abbia funzionato con Python nel 2009)? Ho provato sia questo frammento, sia quello nella risposta accettata, ma non posso raggiungere alcun punto di interruzione nel mio script .py ironpython. Ho provato VS 2013 e 2015 senza fortuna ... – Joe

+0

Sembra che tu abbia trovato la tua risposta, grazie per averlo condiviso nella mia domanda. – Kaerber

risposta

38

OK, capito. C'è un dizionario di opzioni che "Python.CreateEngine" può prendere come argomento. Si può specificare la modalità di debug in questo.

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

Penso che sia abbastanza semplice.

+0

Esattamente quello che stavo cercando, grazie! –

+0

Informazioni veramente utili, +1 –

+0

Perfetto, +1 Come un altro commento accennato, è spiacevole non poter visualizzare le variabili globali sebbene –

Problemi correlati