捕获控制台python实时打印在C#中

时间:2018-03-19 21:00:01

标签: c# python

我正在尝试从C#创建一个python进程并从python脚本中获取打印。

这就是我在C#代码中所拥有的:

namespace ConsoleApp1
{

    public class CreateProcess
    {
        public String PythonPath { get; set; }
        public String FilePath { get; set; }
        public String Arguments { get; set; }
        public Process process;

        public void run_cmd()
        {

            this.process = new Process();
            ProcessStartInfo start = new ProcessStartInfo
            {
                FileName = this.PythonPath,
                Arguments = string.Format("{0} {1}", this.FilePath, this.Arguments),
                UseShellExecute = false,
                RedirectStandardOutput = true,
            };

            this.process.StartInfo = start;
            this.process.OutputDataReceived += p_OutputDataReceived;
            this.process.Start();
            this.process.BeginOutputReadLine();
            //this.process.WaitForExit();
        }

        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.Write(e.Data);
        }
    }

    class Program
    {

        static void Main(string[] args)
        {

            CreateProcess test = new CreateProcess();
            test.PythonPath = "mypathtopython.exe";
            test.FilePath = "pythonfilename";
            test.Arguments = "arg1 arg2 arg3";
            test.run_cmd();
        }
    }
}

当我删除WaitForExit()方法时,我收到此错误:

Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1252'>
OSError: [Errno 22] Invalid argument

当我保留它时,它可以工作,但是当python进程停止运行时,输出会打印到我的控制台(这是预期的)。我希望它能够实时发生。任何想法,我做错了吗?

这可能是python中的问题而不是C#中的问题,但我不确定如何修复它。这是我的python测试脚本:

import time
import os
import sys

print("First example")
time.sleep(10)
print("Arguments given:",sys.argv)

我也尝试过使用sys.stdout.flush()但没有成功。

1 个答案:

答案 0 :(得分:1)

问题在于缓冲IO, 在每次打印后的python中,你应该刷新缓冲区 sys.stdout.flush()