-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPythonConsoleHost.cs
134 lines (116 loc) · 3.79 KB
/
PythonConsoleHost.cs
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
// Copyright (c) 2010 Joe Moorhouse
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Threading;
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting;
using Microsoft.Scripting.Hosting.Providers;
using Microsoft.Scripting.Hosting.Shell;
namespace PythonConsoleControl
{
public delegate void ConsoleCreatedEventHandler(object sender, EventArgs e);
/// <summary>
/// Hosts the python console.
/// </summary>
public class PythonConsoleHost : ConsoleHost, IDisposable
{
Thread thread;
PythonTextEditor textEditor;
PythonConsole pythonConsole;
public event ConsoleCreatedEventHandler ConsoleCreated;
public PythonConsoleHost(PythonTextEditor textEditor)
{
this.textEditor = textEditor;
}
public PythonConsole Console
{
get { return pythonConsole; }
}
protected override Type Provider
{
get { return typeof(PythonContext); }
}
/// <summary>
/// Runs the console host in its own thread.
/// </summary>
public void Run()
{
thread = new Thread(RunConsole);
thread.IsBackground = true;
thread.Start();
}
public void Dispose()
{
if (pythonConsole != null)
{
pythonConsole.Dispose();
}
if (thread != null)
{
thread.Join();
}
}
protected override CommandLine CreateCommandLine()
{
return new PythonCommandLine();
}
protected override OptionsParser CreateOptionsParser()
{
return new PythonOptionsParser();
}
/// <remarks>
/// After the engine is created the standard output is replaced with our custom Stream class so we
/// can redirect the stdout to the text editor window.
/// This can be done in this method since the Runtime object will have been created before this method
/// is called.
/// </remarks>
protected override IConsole CreateConsole(ScriptEngine engine, CommandLine commandLine, ConsoleOptions options)
{
SetOutput(new PythonOutputStream(textEditor));
pythonConsole = new PythonConsole(textEditor, commandLine);
if (ConsoleCreated != null) ConsoleCreated(this, EventArgs.Empty);
return pythonConsole;
}
protected virtual void SetOutput(PythonOutputStream stream)
{
Runtime.IO.SetOutput(stream, Encoding.UTF8);
}
/// <summary>
/// Runs the console.
/// </summary>
void RunConsole()
{
this.Run(new string[] { "-X:FullFrames" });
}
protected override ScriptRuntimeSetup CreateRuntimeSetup()
{
ScriptRuntimeSetup srs = ScriptRuntimeSetup.ReadConfiguration();
foreach (var langSetup in srs.LanguageSetups)
{
if (langSetup.FileExtensions.Contains(".py"))
{
langSetup.Options["SearchPaths"] = new string[0];
}
}
return srs;
}
protected override void ParseHostOptions(string[] args)
{
// Python doesn't want any of the DLR base options.
foreach (string s in args)
{
Options.IgnoredArgs.Add(s);
}
}
protected override void ExecuteInternal()
{
var pc = HostingHelpers.GetLanguageContext(Engine) as PythonContext;
pc.SetModuleState(typeof(ScriptEngine), Engine);
base.ExecuteInternal();
}
}
}