Итак, у меня есть этот код на питоне, который преобразует изображение в 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?
Спасибо вам за разъяснение! Насколько я понимаю из вашего объяснения, процесс python не завершен, потому что С# не ждет его завершения. Это правильно?
Да. c# ReadToEnd() до того, как python запишет все данные в стандартный вывод.
Я понял. Большое спасибо!
Я отлаживаю свой существующий код и обнаружил, что конфликт возникает в части стандартной ошибки. Поэтому я удаляю его и заменяю свой `
Читать до конца ()
к
ЧитатьСтроку()
и он работал отлично. Вот мой обновленный код.
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.
Что такое конец? Вы используете ReadTpEnd(), который будет читать до конца потока и не будет ждать, пока скрипт python не будет завершен. Что вам нужно сделать, так это завершить каждую передачу символом, которого нет в передаче, или поставить счетчик байтов в начале каждой передачи, чтобы С# знал, где завершается каждая передача.