从c#应用程序与python交互



我想写一个与python进程交互的c#应用程序。请参阅下面的示例代码。在启动python进程并写入其StdIn之后,在StdIn流关闭之前不会发生任何事情。当关闭时,通过StdIn提交的代码被执行,然后python进程关闭。我怎样才能让python执行通过StdIn提交的代码,而不必首先关闭StdIn?

StringBuilder strOut =  new StringBuilder();
ProcessStartInfo processStartInfo =  new ProcessStartInfo();
Process process = new Process();
processStartInfo.CreateNoWindow = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;
processStartInfo.Arguments = "";
processStartInfo.FileName = "c:\Python39\python.exe";
process.StartInfo = processStartInfo;
process.EnableRaisingEvents = true;
process.OutputDataReceived += new DataReceivedEventHandler
(
delegate (object sndr, DataReceivedEventArgs ee)
{
Console.WriteLine("received=" + ee.Data);
strOut.Append(ee.Data);
}
);
process.ErrorDataReceived += new DataReceivedEventHandler
(
delegate (object sndr, DataReceivedEventArgs ee)
{
Console.WriteLine("error=" + ee.Data);
strOut.Append("Error:" + ee.Data);
}
);
process.Start();
StreamWriter wrtr = process.StandardInput;
process.BeginOutputReadLine();
process.BeginErrorReadLine();
wrtr.WriteLine("import sys");
wrtr.WriteLine("print('Line 1')");
Thread.Sleep(1000);
wrtr.WriteLine("prxint('Line 2')");
wrtr.WriteLine("sys.exit('Test Exit')");
wrtr.Close();
Thread.Sleep(1000);
process.WaitForExit();
process.CancelOutputRead();
string output = strOut.ToString();

Python尝试检测它在什么环境下运行。它切换到非交互模式,因为它不是运行在终端窗口由于UseShellExecute = false。您可以通过传递-i参数来强制交互模式:processStartInfo.Arguments = "-i";

您也可以添加-q以禁用版权和版本消息

最新更新