Отладка скриптов IronPython в размещенной (встроенной) среде

Я пишу приложение на C #, в которое встроен IronPython (2.0.1). Идея состоит в том, чтобы предоставить части приложения сценариям IronPython, которые пишут пользователи.

Я хочу предоставить пользователям возможность отлаживать написанные ими сценарии с помощью отладчика Visual Studio. Обратите внимание, что сценарии запускаются в размещенной среде, а не через исполняемый файл IronPython (ipy.exe).

После небольшой магии Reflector на сборках IronPython я придумал кое-что, что позволяет мне это делать, но я не уверен, что это предписанный способ. По сути, я создаю объект «ScriptRuntime» со свойством «DebugMode», установленным в значение true, а затем создаю «ScriptEngine» на основе Python из «ScriptRuntime», который я использую для хостинга. Код ниже.

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

Я могу размещать точки останова в файлах сценария, и они срабатывают при выполнении сценария.

Итак, есть ли лучший / более простой способ сделать это?

Спасибо


person Rohit    schedule 24.03.2009    source источник
comment
Это довольно старый вопрос / ответ - ожидается ли, что это решение будет работать с инструментами Python с Visual Studio (не совсем уверен, как отладчик Visual Studio работал с python в 2009 году)? Я пробовал как этот фрагмент, так и фрагмент из принятого ответа, но не смог достичь ни одной точки останова в моем скрипте ironpython .py. Пробовал VS 2013 и 2015 без удачи ...   -  person Joe    schedule 12.04.2016
comment
Кажется, вы нашли свой ответ, спасибо, что поделились им в моем вопросе.   -  person Kaerber    schedule 02.05.2016


Ответы (2)


Хорошо понял. Существует словарь параметров, который Python.CreateEngine может принимать в качестве аргумента. В нем можно указать режим отладки.

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

Я думаю, это достаточно просто.

person Rohit    schedule 24.03.2009
comment
Отлично, +1 Как уже упоминалось в другом комментарии, жаль, что вы не можете просматривать глобальные переменные, хотя - person Steve Greatrex; 18.03.2010
comment
Не забудьте отключить Только мой код в параметрах отладки, чтобы разрешить срабатывание точек останова в коде Python. - person Kaerber; 02.05.2016
comment
этот метод можно использовать только при запуске проекта в Visual Studio. если вы присоединитесь к процессу, это не сработает. - person Hikari; 25.02.2021

У Гарри Пирсона (DevHawk) есть запись в блоге на эту тему, которая поможет вам начать работу:

Microsoft.Scripting.Debugging

person W. Kevin Hazzard    schedule 01.08.2009