Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

450
Views
Node.JS que genera Python para procesar la imagen binaria da el error 'error de nodo genera ENAMETOOLONG'

Estoy tratando de guardar una imagen generando un proceso de python desde un script node.js. La imagen se pasa como un archivo de datos binarios desde un script de Node.JS a un proceso de Python.

El script index.js genera un script de python my_py.py y luego le pasa un archivo de datos de imagen binaria. El script de python my_py.py captura los datos de la imagen binaria y los guarda en el directorio assets/media .

El problema es que la imagen no se guarda en el directorio y aparece el error error spawn ENAMETOOLONG .

¿Podría ayudarme a detectar el problema y corregir el código?

¡Gracias por adelantado!

índice.js:

 const spawn = require("child_process").spawn; const fs = require('fs'); let params = { "image":readDataset() } // Launch python app const pythonProcess = spawn('py',['my_py.py', JSON.stringify(params)]); // Print result pythonProcess.stdout.on("data", (data) =>{ console.log(data.toString()); }); // Read errors pythonProcess.stderr.on("data", (data) =>{ console.log(data.toString()); }); function readDataset() { try { return fs.readFileSync('color.png', 'binary'); } catch (err) { return err; } }

mi_py.py:

 import sys, json params = json.loads(sys.argv[1]) # Load passed arguments import numpy as np import cv2 import os fileName = "image.png" # file name fileData = params['image'] # Capture file # Convert Image to Numpy as array img = np.array(fileData) # Save file to local directory cv2.imwrite(os.path.join('assets/media/', f'{fileName}'), img) cv2.waitKey(0) # Results must return valid JSON Object print("File saved!") sys.stdout.flush()
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

El error lo dice todo: el comando que está construyendo es demasiado largo.

Lo que debe tener en cuenta es que los sistemas operativos limitan la duración de un comando. Para Linux, esto es alrededor de 4096 bytes, aunque puede modificar este valor. Para Windows esto es 8191 bytes y para Mac OS esto es alrededor de 250k bytes.

Parte de la razón de esto es que estos sistemas operativos se escribieron en C/C++ y en código C/C++, no aplicar el límite de tamaño del búfer es una invitación a la saturación del búfer (¡el infame error de desbordamiento o subdesbordamiento de la pila !). Realmente hacer que el tamaño de entrada sea ilimitado da como resultado un código lento porque no utilizará matrices simples para el búfer de entrada en ese caso, sino estructuras de datos más complicadas.

Además, no tener ningún límite en la longitud de los comandos es un vector para los ataques de DOS. Si ejecuta un sistema operativo que no tiene límite de tamaño de comando y estoy seguro de que tiene 32 GB de RAM, ¡todo lo que necesito hacer para bloquear su sistema es construir un comando de 32 GB!

TLDR

La forma correcta de pasar datos de gran tamaño entre procesos es lo que ha estado haciendo a través de Internet: cargar/descargar los datos. La implementación más simple es simplemente pasar los datos a través de la entrada estándar del proceso de python al que está conectado:

 const spawn = require("child_process").spawn; const fs = require('fs'); let params = { "image":readDataset() } // Launch python app const pythonProcess = spawn('py',['my_py.py']); // Pass image data pythonProcess.stdin.write(JSON.stringify(params) + '\n'); // Print result pythonProcess.stdout.on("data", (data) =>{ console.log(data.toString()); }); // Read errors pythonProcess.stderr.on("data", (data) =>{ console.log(data.toString()); }); function readDataset() { try { return fs.readFileSync('color.png', 'base64'); } catch (err) { return err; } }

En el código anterior termino el "paquete" JSON con una nueva línea para que el código Python pueda leer hasta el final de la línea para un solo paquete. Puede utilizar cualquier convención que desee. Por ejemplo, a menudo también uso el carácter 0x00 nul para marcar el final del paquete y HTTP usa dos líneas nuevas ( '\n\n' ) para marcar el final del encabezado, etc.

En cualquier caso, leí el archivo de imagen como base64 porque los datos binarios no son válidos en JSON. En su código python puede hacer una decodificación base64 para recuperar la imagen. Además, base64 no incluye líneas nuevas ( '\n' ) en su conjunto de caracteres, por lo que convertir la imagen a base64 garantiza que no obtenga una línea nueva dentro de sus datos JSON.

Para obtener la imagen, simplemente lea desde stdin:

 import sys, json, base64 params = json.loads(sys.stdin.readline()) import numpy as np import cv2 import os fileName = "image.png" # file name fileData = base64.b64decode(params['image']) # Capture file # Convert Image to Numpy as array img = np.array(fileData) # Save file to local directory cv2.imwrite(os.path.join('assets/media/', f'{fileName}'), img) cv2.waitKey(0) # Results must return valid JSON Object print("File saved!") sys.stdout.flush()
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!