gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:45:23 24 4
gpt4 key购买 nike

如果这是一个重复的问题,我深表歉意,我搜索了一下但找不到任何类似的东西 - 我有一个 Python 库通过套接字连接到我的 C# 应用程序以允许简单的 Python 脚本(IronPython 不是出于几个原因,现在是一个选择)。我想创建一个 Windows 窗体控件,它基本上是 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;
}

}

最佳答案

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

解决方案是使用“-i”命令行参数运行 Python 解释器,这会强制解释器进入交互模式,而不管是否有连接到标准输入的 TTY。这使得上面的示例可以正常工作。

关于c# - 将 Python 标准输入/输出重定向到 C# 表单应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2380649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com