C # Стандартный вывод в реальном времени / захват ошибок процесса - PullRequest
0 голосов
/ 12 сентября 2018

Я занимаюсь разработкой приложения на C #, и мне нужно запустить процесс внешней консоли (например, сценарий python) и получить выходные данные сценария в режиме реального времени. Сценарий Python выглядит примерно так:

import time
while 1:
    print("Hi Foo!")
    time.sleep(.3)

Следующий код C # выводит вывод скрипта python на консоль C # в режиме реального времени:

static void Main(string[] args)
{
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "python.exe";
        process.StartInfo.Arguments = "test.py";
        process.StartInfo.UseShellExecute = false;
        process.Start();
        process.WaitForExit();
    }
}

Однако, когда я пытаюсь записать выходные данные и вручную записать их в консоль, у меня не получается. Рекомендуемое решение по другим постам примерно такое, но оно не работает:

static void Main(string[] args)
{
    using (Process process = new Process())
    {
        process.StartInfo.FileName = "python.exe";
        process.StartInfo.Arguments = "test.py";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.EnableRaisingEvents = true;
        process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
    }
}

process.StandardOutput.ReadToEnd() работает в режиме блокировки, ожидая завершения процесса, и возвращает весь вывод одновременно. Что именно является проблемой с захватом вывода в реальном времени и как я могу это исправить?

1 Ответ

0 голосов
/ 12 сентября 2018
        using (var process = new Process())
        {
            process.StartInfo.FileName = @"python.exe";
            process.StartInfo.Arguments = "-u test.py";
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.UseShellExecute = false;
            process.Start();

            while (!process.StandardOutput.EndOfStream)
            {
                string line = process.StandardOutput.ReadLine();
                Console.WriteLine(line);
                // do something with line
            }
            process.WaitForExit();
            Console.Read();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...