将Python标准输入/输出重定向到C#表单应用程序

Chr*_*Vig 4 c# python redirect stdin stdout

我道歉,如果这是一个重复的问题,我搜索了一下,找不到任何类似的东西 - 我有一个Python库,通过套接字连接到我的C#应用​​程序,以允许简单的Python脚本(IronPython不是一个选项权利现在有几个原因).我想创建一个Windows Forms控件,它基本上是Python解释器的图形前端,这样用户就可以运行解释器而无需打开单独的控制台窗口.

我附上了一个简单的演示,说明了我到目前为止所尝试的内容,但是我无法让它工作.永远不会调用DataReceived事件处理程序,当我尝试写入标准输入时,解释器中没有任何操作.有没有人对我做错了什么有反馈,或者这是否可能?

public partial class Form1 : Form
{

    Process _pythonProc;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ProcessStartInfo psi = new ProcessStartInfo()
        {
            FileName = @"C:\Python26\Python.exe",
            CreateNoWindow = true,
            UseShellExecute = false,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };
        _pythonProc = new Process();
        _pythonProc.OutputDataReceived += OutputDataReceived;
        _pythonProc.ErrorDataReceived += ErrorDataReceived;
        _pythonProc.StartInfo = psi;
        _pythonProc.Start();
    }

    private void cmdExecute_Click(object sender, EventArgs e)
    {
        string cmd = textInput.Text;
        _pythonProc.StandardInput.WriteLine(cmd);
        _pythonProc.StandardInput.Flush();
        textInput.Text = string.Empty;
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (!_pythonProc.HasExited)
            _pythonProc.Kill();
    }

    private void OutputDataReceived(object sender, DataReceivedEventArgs args)
    {
        textOutput.Text += args.Data;
    }

    private void ErrorDataReceived(object sender, DataReceivedEventArgs args)
    {
        textOutput.Text += args.Data;
    }

}
Run Code Online (Sandbox Code Playgroud)

Chr*_*Vig 16

如果其他人偶然发现了这个问题,我想出了问题 - 默认情况下,Python解释器只有在检测到TTY设备连接到标准输入时才进入交互模式(如果程序是从控制台运行的话,通常情况下都是如此) ).为了重定向标准IO流,您必须将ProcessStartInfo中的UseShellExecute设置为false,这会导致解释器认为没有连接TTY,这意味着它会立即退出,因为它无关.

该解决方案是运行Python解释与"-i"的命令行参数,这迫使解释器交互模式,而不管是否存在连接到在标准一TTY,这使得上述工作的例子正确.