El envío de JSON de Python a Node a través de child_process se trunca si es demasiado largo, ¿cómo solucionarlo?

El backend de mi Node y Python funciona bien, pero ahora me encontré con un problema en el que si un JSON que estoy enviando desde Python no es un Nodo demasiado largo, se divide en dos y mi JSON.parse en el lado del Nodo falla.

¿Cómo debo arreglar esto? Por ejemplo, los primeros clips de lote en

... [1137.6962355826706, -100.78015825640887], [773.3834338399517, -198 

y el segundo tiene las pocas entradas restantes.

 .201506231888], [-87276.575065248, -60597.8827676457], [793.1850250453127, -192.1674702207991], [1139.4465453979683, -100.56741252031816], [780.498416769341, -196.04064849430705]]} 

¿Tengo que crear algo de lógica en el lado del nodo para JSON largos o es un problema de búfer que tengo en mi lado de Python que puedo superar con la configuración adecuada? Aquí está todo lo que estoy haciendo en el lado de python:

 outPoints, _ = cv2.projectPoints(inPoints, np.asarray(rvec), np.asarray(tvec), np.asarray(camera_matrix), np.asarray(dist_coeffs)) # flatten the output to get rid of double brackets per result before JSONifying flattened = [val for sublist in outPoints for val in sublist] print(json.dumps({'testdata':np.asarray(flattened).tolist()})) sys.stdout.flush() 

Y en el lado del Nodo:

 // Handle python data from print() function pythonProcess.stdout.on('data', function (data){ try { // If JSON handle the data console.log(JSON.parse(data.toString())); } catch (e) { // Otherwise treat as a log entry console.log(data.toString()); } }); 

Los datos emitidos están fragmentados, por lo que si desea analizar un JSON , deberá unir todos los fragmentos y, al end realizar JSON.parse .

De forma predeterminada, las canalizaciones para stdin, stdout y stderr se establecen entre el proceso Node.js principal y el secundario generado. Estas tuberías tienen una capacidad limitada (y específica de la plataforma). Si el proceso hijo escribe en la salida estándar superior a ese límite sin que se capture la salida, el proceso hijo bloqueará la espera de que el búfer de tubería acepte más datos.

En Linux, cada fragmento está limitado a 65536 bytes.

En las versiones de Linux anteriores a 2.6.11, la capacidad de una tubería era la misma que el tamaño de página del sistema (por ejemplo, 4096 bytes en i386). Desde Linux 2.6.11, la capacidad de la tubería es de 65536 bytes.

 let result = ''; pythonProcess.stdout.on('data', data => { result += data.toString(); // Or Buffer.concat if you prefer. }); pythonProcess.stdout.on('end', () => { try { // If JSON handle the data console.log(JSON.parse(result)); } catch (e) { // Otherwise treat as a log entry console.log(result); } });