Unity capture IronPython script error

Disclaimer: This article is a blogger original article. Shall not be reproduced without the consent of bloggers. https://blog.csdn.net/akof1314/article/details/36048747

The method of capture is taken from " IronPython in Action ", a book of code such as the following:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;

using IronPython.Hosting;
using IronPython.Runtime;
using IronPython.Runtime.Exceptions;
using Microsoft.Scripting;
using Microsoft.Scripting.Runtime;
using Microsoft.Scripting.Hosting;

using Plugins;


namespace EmbeddingPlugin
{
     internal  class PythonStream: MemoryStream
    {
        TextBox _output;
         public PythonStream(TextBox textbox)
        {
            _output = textbox;
        }

         public  override  void Write( byte[] buffer,  int offset,  int count)
        {
            _output.AppendText(Encoding.UTF8.GetString(buffer, offset, count));
        }
    }

     internal  class Engine
    {
        ScriptEngine _engine;
        ScriptRuntime _runtime;
        TextBox _box;

         public List<PluginBase> Plugins
        {
            get {  return PluginStore.Plugins; }
        }


         public Engine(TextBox textbox)
        {
            _engine = Python.CreateEngine();
            _runtime = _engine.Runtime;
            _box = textbox;

            SetStreams();
             string rootDir = AddAssemblies();
            LoadPlugins(rootDir);
        }

         public  void SetStreams()
        {
            PythonStream stream =  new PythonStream(_box);
            _runtime.IO.SetOutput(stream, Encoding.UTF8);
            _runtime.IO.SetErrorOutput(stream, Encoding.UTF8);
        }

         public  string AddAssemblies()
        {
            Assembly mainAssembly = Assembly.GetExecutingAssembly();

             string rootDir = Directory.GetParent(mainAssembly.Location).FullName;
             string pluginsPath = Path.Combine(rootDir,  "Plugins.dll");

            Assembly pluginsAssembly = Assembly.LoadFile(pluginsPath);

            _runtime.LoadAssembly(mainAssembly);
            _runtime.LoadAssembly(pluginsAssembly);
            _runtime.LoadAssembly( typeof(String).Assembly);
            _runtime.LoadAssembly( typeof(Uri).Assembly);

             return rootDir;
        }

         public  void LoadPlugins( string rootDir)
        {
             string pluginsDir = Path.Combine(rootDir,  "plugins");
             foreach ( string path  in Directory.GetFiles(pluginsDir))
            {
                 if (path.ToLower().EndsWith( ".py"))
                {
                    CreatePlugin(path);
                }
            }
        }

         public  void CreatePlugin( string path)
        {
             try
            {
                ScriptSource script = _engine.CreateScriptSourceFromFile(path);
                CompiledCode code = script.Compile();
                ScriptScope scope = _engine.CreateScope();
                script.Execute(scope);
            }
             catch (SyntaxErrorException e)
            {
                 string msg =  "Syntax error in \"{0}\"";
                ShowError(msg, Path.GetFileName(path), e);
            }
             catch (SystemExitException e)
            {
                 string msg =  "SystemExit in \"{0}\"";
                ShowError(msg, Path.GetFileName(path), e);
            }

             catch (Exception e)
            {
                 string msg =  "Error loading plugin \"{0}\"";
                ShowError(msg, Path.GetFileName(path), e);
            }
        }

         public  void ShowError( string title,  string name, Exception e)
        {
             string caption = String.Format(title, name);
            ExceptionOperations eo = _engine.GetService<ExceptionOperations>();
             string error = eo.FormatException(e);
            MessageBox.Show(error, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);

        }

         public  void ExecutePluginAtIndex( int index)
        {
            PluginBase plugin = Plugins[index];

             try
            {
                plugin.Execute(_box);
            }
             catch (Exception e)
            {
                 string msg =  "Error executing plugin \"{0}\"";
                ShowError(msg, plugin.Name, e);
            }
        }
    }
}

The results are:

Ported to Unity in. Just take the key code can be.

Guess you like

Origin www.cnblogs.com/mqxnongmin/p/10960862.html