2009-03-24 4 views
27

Tôi đang viết một ứng dụng C# có tích hợp IronPython (2.0.1) trong đó. Ý tưởng là để hiển thị các phần của ứng dụng cho các kịch bản IronPython, mà người dùng viết.Gỡ lỗi các script IronPython trong môi trường được lưu trữ (nhúng)

Tôi muốn cung cấp khả năng người dùng có thể gỡ lỗi các tập lệnh được viết bởi họ, bằng cách sử dụng Trình gỡ lỗi Visual Studio. Lưu ý rằng các tập lệnh được chạy trong môi trường được lưu trữ và không thông qua tệp thực thi IronPython (ipy.exe).

Sau một chút phép thuật Reflector trên hội đồng IronPython, tôi đã đưa ra một cái gì đó cho phép tôi làm điều đó, nhưng tôi không chắc chắn nếu đây là cách quy định. Về cơ bản những gì tôi làm là tạo ra một đối tượng "ScriptRuntime" với thuộc tính "DebugMode" được đặt thành true và sau đó tạo một python dựa trên "ScriptEngine" từ "ScriptRuntime", mà tôi sử dụng để lưu trữ. Mã dưới đây.

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

Bây giờ khi tôi thực hiện các script trong môi trường lưu trữ, sử dụng:

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

tôi có thể đặt breakpoint trong các tập tin kịch bản và họ nhận được hit, khi kịch bản được thực thi.

Vì vậy, có cách nào tốt hơn/dễ dàng hơn để thực hiện việc này không?

Cảm ơn

+2

Đây là một câu hỏi khá cũ/câu trả lời - là giải pháp này dự kiến ​​sẽ làm việc với Công cụ Python với Visual Studio (Không thực sự chắc chắn làm thế nào "visual studio debugger" làm việc với python trở lại trong năm 2009)? Tôi đã thử cả đoạn mã này và đoạn trích trong câu trả lời được chấp nhận, nhưng không thể nhấn bất kỳ điểm ngắt nào trong tập lệnh .pypython của tôi. Cố gắng VS 2013 và 2015 mà không có may mắn ... – Joe

+0

Bạn dường như đã tìm thấy câu trả lời của bạn, cảm ơn bạn đã chia sẻ câu hỏi đó trong câu hỏi của tôi. – Kaerber

Trả lời

38

OK, hiểu rồi. Có một từ điển tùy chọn mà "Python.CreateEngine" có thể lấy làm đối số. Người ta có thể chỉ định chế độ gỡ lỗi trong đó.

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

Tôi nghĩ rằng điều này là đơn giản, đủ.

+0

Chính xác những gì tôi đang tìm kiếm, cảm ơn! –

+0

Thông tin hữu ích, +1 –

+0

Hoàn hảo, +1 Như một nhận xét khác đã đề cập, không may là bạn không thể xem các biến toàn cầu mặc dù –