C# Перехват вывода запущенного консольного приложения

В «реальном времени» пытаюсь получить вывод запущенного из моей программы консольного приложения.
Пробовал OutputDataReceived, безрезультатно — событие возникает только после закрытия консольного окна.
Как быть? о_О Перерыл пол гугла уже…

Код: http://pastie.org/1918574

поправка: на тестовой программе которая просто в консоль фигачит строки — все ок. на питоновском скрипте, скомпиленном в exe — пусто, только после закрытия консоли файрит событие… возможно в этом дело, хотя какая ему разница, не ясно.
  • Вопрос задан
  • 7024 просмотра
Решения вопроса 1
Dmitry_Zhariy
@Dmitry_Zhariy
Я очень отдаленно знаком с Питоном, но изходя из симптомов проблемы, я считаю, что Питон просто буферизирует вывод. И эту буферизацию можно попробовать отключить:

Вот обсуждение по теме на стековерфлоу:
Python output buffering

Присмотритесь также к дополнительным настройкам запуска консольного процесса из C#:
How to parse command line output from c# ??
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ColorCast
@ColorCast
Человек атомоход
Делается все через переадресацию потока вывода в String
public  class CommandHelpers
    {
        public CommandHelpers()
        {
            Invisible = true; // При переадресации утилита должна быть скрыта
        }

public bool Invisible { get; set; }

private Process CreateProcess(string commandName, IEnumerable<string> paramsList, bool output = false)
        {
            string paramString = paramsList.Aggregate<string, string>(null,
                (current, param) => current + " " + param);
            return new Process
            {
                StartInfo =
                {
                    FileName = commandName, // полный путь до инстансыруемого приложения
                    Arguments = paramString, // сюда передаются аргументы командной строки
                    UseShellExecute = output ? !output : !Invisible, // Параметр отвечает за фоновое выполнение
                    RedirectStandardOutput = output // Параметр отвечает за переадресацию
                }
            };
        }
		/// <summary>
        ///     Returns result of command execution
        /// </summary>
        /// <param name="commandName">Command name only</param>
        /// <param name="paramsList">Params and keys for command</param>
        /// <returns></returns>
        public string GetResult(string commandName, IEnumerable<string> paramsList)
        {
            var bufer = new StringBuilder();
            using (var proc = CreateProcess(commandName, paramsList, true))
            {
                proc.Start(); // инстансыруемся
                while (!proc.StandardOutput.EndOfStream)
                {
                    bufer.AppendLine(proc.StandardOutput.ReadLine()); // пишем в буфер
                }
            }
            return bufer.ToString();
        }
	}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы