@EgorSvinarev

Почему BufferedReader не видит EOF?

Здравствуйте. Мне необходимо прочитать данные из stdout для процесса, в котором выполняется следующий
python-код

from jupyter_client import MultiKernelManager

mngr = MultiKernelManager()
remote_id = mngr.start_kernel("python3")

print(remote_id)


В Java я обрабатываю этот процесс следующим образом:

Метод запускающий процесс

private Process startProcess(String command) throws Exception {
	Process process = Runtime.getRuntime().exec(command);
		
	return process;
}


Метод читающий данные из потоков

/** Reads the output stream from the process */
private String readStream(InputStream stream) throws Exception {
	InputStreamReader inputStreamReader = new InputStreamReader(stream, "utf-8");
		
	BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
		
	StringBuilder stringBuilder = new StringBuilder();
	StringBuilder response = new StringBuilder();
		
	String[] splitArray;
	String msg;
		
	while ((msg = bufferedReader.readLine()) != null) {
		logger.debug(msg);
		stringBuilder.append(msg).append("\n");
	}
		
	logger.debug("Stream was read");
	
	String control = stringBuilder.toString();
	splitArray = control.split("\n");
		
	for (String s : splitArray) {
		response.append(s).append("\n");
	}
		
	bufferedReader.close();
	inputStreamReader.close();
		
	String output = response.toString();
	output = (output == null || output.length() == 0) ? "" : (output.substring(0, output.length() - 1));
				
	return output;

}



Из процесса извлекаются объекты потоков и передаются в метод для чтения
spoiler

Process process = startProcess(command);	
String output = readStream(process.getInputStream());



Однако я обнаружил, что в этом
месте
while ((msg = bufferedReader.readLine()) != null) {
	logger.debug(msg);
	stringBuilder.append(msg).append("\n");
}
выполнение прерывается

При этом, по идее, выполнение самого процесса заканчивается, и все данные из python-программы возвращаются.
В чем может быть проблема? Как мне до конца дочитать данные?
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
vip_delete
@vip_delete
Java
Питон процесс завершается раньше, чем он запишет все в stdout так как использует буферизированный вывод по умолчанию. Что бы это отключить надо запустить процесс с флагом -u

Runtime.getRuntime().exec(new String[] { "python", "-u", "script.py" })
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы