首页 > 解决方案 > 错误:尝试将长字符串从 nodejs 发送到 python 脚本时产生 ENAMETOOLONG

问题描述

我正在尝试编写一些代码来获取用户上传的图像并调整其大小。下面的代码适用于非常小的图像,但是当我尝试更大的图像时,我收到错误 spawn ENAMETOOLONG。我相信这是因为 base64 字符串要大得多。无论长度如何,我能做些什么来将 base64 字符串发送到我的 python 脚本?

服务器.js

  const _arrayBufferToBase64 = (buffer)  => {
      return Buffer.from(buffer).toString('base64');
  };

  // spawn new child process to call the python script
  const python = spawn('python', ['./python/image_handler.py', _arrayBufferToBase64(imgData), filename]);

  // collect data from script
  python.stdout.on('data', function (pydata) {
    console.log('Pipe data from python script ...');
    });


  python.on('close', (code) => {
    console.log(`child process close all stdio with code ${code}`);
  });

image_handler.py

img_b64 = sys.argv[1]
img_bytes = base64.b64decode(img_b64)  # im_bytes is a binary image
img_file = io.BytesIO(img_bytes)  # convert image to file-like object
img = Image.open(img_file)   # img is now PIL Image object
img.thumbnail((300, 300))# resize image
img.save(sys.argv[2])  # Save Path

print('Finished')
sys.stdout.flush()

标签: node.jspython-3.xbase64child-processspawn

解决方案


您正在尝试将您的字符串作为参数传递给超出标准输入限制的 python。对于类似的问题,我发现的最佳方法是使用python-shell

您可以通过 stdin 以下列方式发送您的 base64 字符串(或任何大数据):(参考python-shell 的关于在 Node 和 Python 之间交换数据的文档)

import {PythonShell} from 'python-shell';
let pyshell = new PythonShell('my_script.py', { mode: 'text' });

// sends a message to the Python script via stdin
pyshell.send('hello');

pyshell.on('message', function (message) {
  // received a message sent from the Python script (a simple "print" statement)
  console.log(message);
});

// end the input stream and allow the process to exit
pyshell.end(function (err,code,signal) {
  if (err) throw err;
  console.log('The exit code was: ' + code);
  console.log('The exit signal was: ' + signal);
  console.log('finished');
});

在初始化 pyshell 时,您可以尝试使用以简单字符串形式发送和接收数据的文本模式或按原样发送和接收数据的二进制模式。

在 python 方面,在你的image_handler.py中,这样读:

~
img_b64 = input()
~

希望这可以帮助像我这样通过谷歌偶然发现这里的任何人。


推荐阅读