Почему перенаправленный стандартный вывод появляется после завершения процесса? - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю с Visual Studio 2015 и .NET Framework 4.7.2.Я установил простую тестовую программу, которая выполняет внешнюю программу на C #.Программа представляет собой скрипт Python, который просто печатает некоторую строку в стандартный вывод каждые 0,5 секунды.Я хочу прочитать стандартный вывод этого подпроцесса в моем приложении C #.

Программа в основном работает, но я получаю вывод скрипта Python только незадолго до выхода из подпроцесса.Что мне нужно изменить, чтобы получить более отзывчивое поведение, т.е. получать выходные данные каждые 0,5 секунды, как только скрипт Python записывает их в стандартный вывод?

Вот мой код C #:

public class Program {

    private Process process;

    public static void Main(string[] args) {
        new Program().init();
    }

    private void init() {
        startPythonProcess();
        process.WaitForExit();
        Console.ReadLine();
    }

    private void startPythonProcess() {
        if(process==null) {
            try {

                Console.WriteLine("Starting Python process ...");

                string filepath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase).Substring(6);
                process = new Process();

                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.CreateNoWindow = false;
                startInfo.UseShellExecute = false;
                startInfo.WorkingDirectory = filepath;
                startInfo.FileName = "python.exe";
                //startInfo.WindowStyle = ProcessWindowStyle.Normal;
                startInfo.RedirectStandardInput = false;
                startInfo.RedirectStandardOutput = true;
                startInfo.RedirectStandardError = true;
                startInfo.Arguments = string.Format("{0}", Path.Combine(filepath, "test.py"));

                process.StartInfo = startInfo;
                process.OutputDataReceived += OutputDataReceivedEventHandler;
                process.ErrorDataReceived += ErrorDataReceivedEventHandler;

                process.Start();

                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

            } catch(Exception ex) {
                Console.WriteLine("Could not start Python process: " + ex.Message);
            }
        }
    }

    public void OutputDataReceivedEventHandler(object sender, DataReceivedEventArgs args) {
        Console.WriteLine("[PYTHON] INFO: {0}", args.Data);
    }

    public void ErrorDataReceivedEventHandler(object sender, DataReceivedEventArgs args) {
        Console.WriteLine("[PYTHON] ERROR: {0}", args.Data);
    }

}

Вот мой скрипт на Python:

import time
import sys
import logging


logging.basicConfig(level=logging.ERROR)

if __name__ == '__main__':
    count = 0
    while True:
        print('PYTHON: {}'.format(count))
        time.sleep(0.5)
        count+=1
        if count>=25:
            break

ОБНОВЛЕНИЕ: Я загрузил мини-проект здесь .

1 Ответ

0 голосов
/ 22 февраля 2019

Функция print принимает аргумент flush , который определяет, сбрасывается ли буферизованный вывод.

Значение по умолчанию flush равно False означает, что очистка контролируется любым файлом, в который print записывает данные (например, sys.stdout).

Установите для flush значение True, чтобы принудительно начать немедленную печать.

print('PYTHON: {}'.format(count), flush=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...