Хобрук: Ваш путь к мастерству в программировании

Встраивание исполняемого файла в консоль С#?

Я хочу встроить исполняемый файл (в частности, «python.exe», интерпретатор Python 2.7) в свое консольное приложение C#, то есть я хочу, чтобы пользователь вводил команды, получал вывод интерпретатора в строковую переменную и использовал Console.WriteLine для распечатать этот вывод. Мой код до сих пор:

ProcessStartInfo processStartInfo = new ProcessStartInfo("C:/Python27/python.exe");
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;

Process process = Process.Start(processStartInfo);

if (process != null)
{
    while (true)
    {
        process.StandardInput.WriteLine(Console.ReadLine());
        process.StandardInput.Close();

        string output = process.StandardOutput.ReadToEnd();
        Console.WriteLine(output);
    }
}

Я могу написать «напечатать 5» и получить правильный вывод, но при повторной записи получаю следующую ошибку:

Невозможно записать в закрытый TextWriter.

Я считаю, что эта ошибка связана с тем, что я закрываю StandardInput, но без этой строки кода я вообще не получаю никакого вывода. Что я могу использовать для отправки нескольких команд в exe?

Заранее спасибо!


  • Можете ли вы вызвать process.StandardInput.Flush() вместо Close()? 24.07.2012
  • Рассматривали ли вы возможность использования IronPython? 24.07.2012
  • Вызывать это вложение очень неортодоксально. :) 24.07.2012
  • Я определенно поддерживаю предложение IronPython. Я не думаю, что вы можете справиться с exe, как это. Я играл с внедрением IronPython в приложение С# 4.0. Это не плохо сделать. Требуется на удивление мало кода - не намного больше, чем в приведенном выше примере. 24.07.2012
  • Я пытался использовать IronPython, проблема в том, что я использую несколько библиотек, которые поставляются в виде файлов .PYD и поэтому могут использоваться только с CPython. 26.07.2012

Ответы:


1

Вместо этого позвоните process.StandardInput.Flush(). Flush заставляет любой буферизованный TextWriter записывать все свои входные данные в место назначения, что и происходит здесь - вы вызываете Close(), который имеет побочный эффект очистки буферов, а также закрытия потока.

Дополнительные сведения см. в документации MSDN.

23.07.2012
  • Эй, спасибо за ответ, я тот, кто разместил вопрос (был в доме моего друга). Замена Close() на Flush() не работает, даже не запускается первая введенная мной команда... 24.07.2012
  • Нашел этот комментарий к StreamReader.ReadToEnd() - ReadToEnd предполагает, что поток знает, когда он достиг конца. Для интерактивных протоколов, в которых сервер отправляет данные только тогда, когда вы запрашиваете их, и не закрывает соединение, ReadToEnd может блокироваться на неопределенный срок, поскольку он не достигает конца, и его следует избегать. Похоже, что использование свойства .EndOfStream в StreamReader также вызывает бесконечный блок. Тогда вопрос, зачем ты это делаешь? Возможно, вам придется пересмотреть свой подход. У Марка Байерса было хорошее предложение относительно Iron Python. 24.07.2012
  • Как я уже упоминал в комментарии к вопросу, я пытался использовать IronPython. Проблема в том, что я использую несколько библиотек, которые поставляются в виде файлов .PYD и поэтому могут использоваться только с CPython. 26.07.2012
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..