Python.NETを使用して、C#Windows Formsアプリケーションに対話的なPythonシェルを埋め込もうとしています。.NETアプリケーションに埋め込まれたPythonからstdout/stderrをテキストボックスにリダイレクト
私はC#アプリケーションにインタプリタを埋め込み、.NETのPythonモジュールにアクセスできました。私は現在、出力とエラーをPythonインタプリタから.NETテキストボックスにリダイレクトしようとしています。標準出力をファイルにリダイレクトできますが、出力をテキストボックスにルーティングする際に問題があります。 アイデアは、Pythonのストリーム(write()、writelines()...)と同じインタフェースを実装する.NETオブジェクトにPythonのsys.stdoutを割り当てることでした。 Pythonの流れを模倣する
.NETクラス:Form1.csで
public class TextBoxStream : PyObject // To assign to sys.stdout. Is this correct?
{
private TextBox _output = null;
public TextBoxStream() {}
public TextBoxStream(TextBox output)
{
_output = output;
}
void write(object value)
{
_output.AppendText(value.ToString());
}
void writelines(object value)
{
}
}
:
private void button1_Click(object sender, EventArgs e)
{
using (Py.GIL())
{
// Redirect stdout to text box
dynamic sys = PythonEngine.ImportModule("sys");
TextBoxStream textBoxStream = new TextBoxStream(textBox1);
sys.stdout = textBoxStream;
//sys.SetAttr("stdout", textBoxStream); // This did not work either
string code =
"import sys\n" +
"print 'Message 1'\n" +
"sys.stdout.write('Message 2')\n" +
"sys.stdout.flush()";
PyObject redirectPyObj = PythonEngine.RunString(code); // NULL
sys.stdout.write("Message 3");
// Exception thrown: 'Python.Runtime.PyObject' does not contain a definition for 'stdout'
}
}
これは動作しません。redirectPyObjはNULLです。私は古いものと新しいPython.NET API(動的なもの)を使ってみました。 sys.stdout.writeステートメントとprintステートメントのどちらもテキストボックスに書き込まれません。
これにアプローチする方法については、非常に参考になります。
この方法を試しましたか? http://stackoverflow.com/a/4307737/2230844本質的に、python stdoutをpython変数にリダイレクトし、.NETからこの変数をクエリします。 – denfromufa
私は同様のアプローチで標準出力リダイレクションを得ることができましたが、stderrリダイレクションに問題がありました。あなたのリンクされた答えは、私がPyErr_Print()を使ってPythonEngineにエラーを書き出させなければならないことに気付きました。ありがとう! – Spry
@denfromufa、私はあなたが質問を閉じるために答えを投稿したことに気をつけていないと思います。それは、他の誰かがC#ソリューションを探しているのを助けるかもしれません。 – Spry