繁体   English   中英

从 c# 应用程序与 python 交互

[英]interacting with python from c# application

我想编写一个与 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以禁用版权和版本消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM