Razbezhkin
@Razbezhkin
программист, преподаватель

Как на c# организовать взаимодействие с другим процессом через stdin и stdout?

Здравствуйте, если сталкивались с похожей проблемой, подскажите, пожалуйста.
Задача:
Необходимо из кода на c# запустить скрипт на питоне и взаимодействовать (т.е. отправлять в его стандартный вход строки текста и считывать из его стандартного вывода строки текста) продолжительное время.
Я пошел стандартным путем: создал процесс, запустил его и стал ждать, когда мой питонов скрипт выдаст первую строчку текста, чтобы я ее прочитал и отправил в ответ свою строчку. и тут возникла проблема - в поток моей программы на c# ничего не приходит от питонова скрипта до тех пор, пока он не завершиться. Т.е. у меня не получилось организовать "живое" взаимодействие, которое мне так нужно :(

Вот пример моего кода на c#

ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "\"C:\\Program Files\\Python35\\python\"";
start.Arguments = "test.py";
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.RedirectStandardInput = true;
Process p = Process.Start(start)
string line = p.StandardOutput.ReadLine();


В последней строке происходит следующее:
Если питонов скрипт ждет на свой стандартный вход строку, то вызывающий код на c# замирает на последней строке до тех пор, пока вручную не прибьешь процесс.
Если питонов скрипт на вход ничего не ждет, выводит сообщения на стандартный вывод и завершается, то вызывающий код успешно считывает строку, после чего питонов скрипт успешно завершается, но взаимодействия не получается.

Повторяю вопрос: как организовать обмен множеством сообщений в обе стороны между кодом на c# и питоновым скриптом.

Спасибо за внимание.
  • Вопрос задан
  • 597 просмотров
Решения вопроса 1
@rPman
Буферищация чтения или записи в питоне? для теста сделайте данных больше 64к
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Razbezhkin
@Razbezhkin Автор вопроса
программист, преподаватель
Спасибо rPman
!
заменил в питоновом скрипте print на
sys.stdout.write('mytextdata\n')
sys.stdout.flush()

и код на c# стал получать данные своевременно!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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