Передать огромное количество строк с Python на C#

Итак, у меня есть этот код на питоне, который преобразует изображение в base64. И у меня есть этот код в C# winforms, который собирает этот base64 и снова преобразует его в изображение.

Код Python:

import base64

imgtob64 = open('Resources/yudodis.jpg', 'rb')
imgtob64_read = imgtob64.read()
imgb64encode = base64.encodebytes(imgtob64_read)

print(imgb64encode)

Код С#:

string TestPath3 = @"C:\Users\chesk\Desktop\imagetobase64.py";
string b64stringPython;
string error;

            var startProcess = new ProcessStartInfo
            {
                FileName = pythonInterpreter, Arguments = string.Format($"\"{TestPath3}\""),
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardInput = true,
                RedirectStandardError = true,
                CreateNoWindow = true,
            };
         

            using (Process process = Process.Start(startProcess))
            {
                try
                {
                    error = process.StandardError.ReadToEnd();
                    b64stringPython = process.StandardOutput.ReadToEnd();

                    lblTestOutput.Text = b64stringPython;
                    lblError.Text = error;
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }

Коды с обеих сторон работают нормально, если я использую небольшое изображение, состоящее менее чем из 4000 base64. Система на С# внезапно перестает работать (или внезапно перестает принимать данные от python, насколько я понимаю), когда я отправляю данные base64, состоящие из более чем 5000 base64.

Как вы думаете, в чем может быть проблема с этим? Почему у C# возникают проблемы с приемом огромного количества стандартного вывода от python?

Что такое конец? Вы используете ReadTpEnd(), который будет читать до конца потока и не будет ждать, пока скрипт python не будет завершен. Что вам нужно сделать, так это завершить каждую передачу символом, которого нет в передаче, или поставить счетчик байтов в начале каждой передачи, чтобы С# знал, где завершается каждая передача.

jdweng 24.12.2020 14:56

Спасибо вам за разъяснение! Насколько я понимаю из вашего объяснения, процесс python не завершен, потому что С# не ждет его завершения. Это правильно?

Cheska Abarro 27.12.2020 11:08

Да. c# ReadToEnd() до того, как python запишет все данные в стандартный вывод.

jdweng 27.12.2020 11:36

Я понял. Большое спасибо!

Cheska Abarro 28.12.2020 16:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я отлаживаю свой существующий код и обнаружил, что конфликт возникает в части стандартной ошибки. Поэтому я удаляю его и заменяю свой `

Читать до конца ()

к

ЧитатьСтроку()

и он работал отлично. Вот мой обновленный код.

 using (Process process = Process.Start(startProcess))
            {
                try
                {
                    process.StandardInput.WriteLine(b64stringCSharp);
                    process.StandardInput.Close();

                    
                    //error = process.StandardError.ReadToEnd();
                    b64stringPython = process.StandardOutput.ReadLine();
                    
                    //lblTestOutput.Text = b64stringPython;
                    //lblError.Text = error;
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }

Исправление будет работать до тех пор, пока скрипт Python добавляет возврат в конце записи. Это своего рода кладж для добавления возврата в конце строки с кодировкой base 64.

jdweng 28.12.2020 17:33

Другие вопросы по теме