IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 关于C#使用Process调用Python脚本不能实时输出(异步)的问题 -> 正文阅读

[Python知识库]关于C#使用Process调用Python脚本不能实时输出(异步)的问题

项目场景:

?????????今天写程序的时候遇到了一个问题,C#使用Process调用Python脚本时怎么弄都不能异步输出,都是等程序执行完了才输出结果,头疼了一晚上,试了好多人的c#代码都不行,所幸发现了这个老哥的帖子(C# 通过控制台调用 python 不能异步获取控制台信息_博问_博客园 (cnblogs.com)),最后解决了,这里我自己记录一下这个问题,也为后来人提供一下帮助。


问题描述:

C#使用Process调用Python脚本时不能异步输出


原因分析:

参考了这个老哥C# 通过控制台调用 python 不能异步获取控制台信息_博问_博客园 (cnblogs.com)


解决方案:

其实是python的问题,python默认缓冲区满了才会输出, 运行时加 -u 参数就可以立即输出了。

这里放上我的源码作为参考:

c#:

using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Threading;

namespace MonkeyWinForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Process p = new Process();
            string path = "-u aa.py";//待处理python文件的路径,本例中放在debug文件夹下
            string sArguments = path;
            ArrayList arrayList = new ArrayList();
            arrayList.Add("1");
            arrayList.Add("2");
            foreach (var param in arrayList)//添加参数
            {
                sArguments += " " + param;
            }

            p.StartInfo.FileName = @"D:\anaconda\python.exe"; //python的安装路径
            p.StartInfo.Arguments = sArguments;//python命令的参数
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.EnableRaisingEvents = true;// 启用Exited事件  
            p.Exited += new EventHandler(CmdProcess_Exited);
            p.Start();//启动进程
            p.BeginOutputReadLine();
            //p.WaitForExit();
            p.Close();
            Console.WriteLine("执行完毕!");
        }
        public void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            string line;
            try
            {
                if (outLine.Data != null)
                {
                    line = (outLine.Data.ToString());
                    //在外部函数给Form赋值必须这样
                    Invoke(new Action(() =>
                    {
                        labelResult.Text += line;
                        labelResult.Text += "\r\n";

                    }));
                    Console.WriteLine(line);
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }

        }
        private void CmdProcess_Exited(object sender, EventArgs e)
        {
            // 执行结束后触发  
        }
    }
}

用于测试的python:


import numpy as np
import sys
import time

def resetIPC(arg1, arg2):
    a = int(arg1)
    b = int(arg2)
    result = a+b
    return result

print(resetIPC(sys.argv[1], sys.argv[2]))
#time.sleep(1)
print(resetIPC("4", sys.argv[2]))
time.sleep(1)
print(resetIPC(sys.argv[1], sys.argv[2]))
time.sleep(3)
print(resetIPC(sys.argv[1], sys.argv[2]))

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:02:17  更:2021-10-03 17:03:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:06:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码