欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#调用python核心代码,并将python中的输出信息实时显示在c#的界面中

程序员文章站 2022-06-10 21:05:46
...

最近写代码想用python写核心数据处理代码,然而在写界面的时候想用c#来写,现在想通过c#直接调用python的核心处理程序,这里就不讲如何的调用python脚本程序了,有多中方法,网上有很详细的介绍,自己搜。经过我自己的使用,有两种方法比较好用,1、直接调用python脚本,这种方法需要用Python环境,如果你把程序分享给别人,必须要把你的python环境一起打包。2、将python文件打包成exe的形式,这种方法可以用pyinstaller等打包库进行打包,这里也不详细介绍了,自己去搜吧,这种方法在运行的时候会把需要的环境直接打包进exe文件中,所以目标机器不需要安装python环境,但是开始运行时会相对较慢,因为要展开运行环境。

进入正题,之前我的做法都是将输出的消息直接打印到txt中,现在c#调用python文件时,想让python代码中的进度消息如何实时返回到c#的界面中,直接上代码

        public void runPythonScript(string pyFilePath,string filePath,string outPath,string pythonFileName)
        {

            Process p = new Process();
            p.StartInfo.FileName = pythonFileName + "\\python.exe";//设置启动的python.exe路径
            p.StartInfo.Arguments = pyFilePath + " " + filePath + " " + outPath;//设置传入参数
            p.StartInfo.CreateNoWindow = true;//不开启命令行窗口
            p.StartInfo.UseShellExecute = false;//不开启shell
            p.StartInfo.RedirectStandardOutput = true;//将输出文本写入输出流中
            p.StartInfo.RedirectStandardError = true;//将错误写出到输出流中                    
            p.Start();
            p.BeginOutputReadLine();//开始异步读取操作
            p.OutputDataReceived += new DataReceivedEventHandler(OutPutHandler);//这个一定要放在BeginOutputReadLine()后面才好用
            p.WaitForExit();
            p.Close();           
        }

        public void OutPutHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            textBox_view.Text = outLine.Data;
            Console.WriteLine(outLine.Data);
        }

pyFilePath是要运行的python文件。一定要注意 p.OutputDataReceived += new DataReceivedEventHandler(OutPutHandler)放在 p.BeginOutputReadLine();的后面。
如果用到线程间的操作,要么去用委托,要么直接关闭线程检查CheckForIllegalCrossThreadCalls = false;当然推荐用正规的委托方法,然而我不太会。哈哈哈。