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,这使得上述工作的例子正确.