node.js - 错误:尝试将长字符串从 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()
解决方案
您正在尝试将您的字符串作为参数传递给超出标准输入限制的 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()
~
希望这可以帮助像我这样通过谷歌偶然发现这里的任何人。
推荐阅读
- python - 我可以在 python 中创建一个“全局”、完全连接的图,并在 Pool.map() 处理中从并发工作人员同时更新吗?
- email - Thunderbird:一直要求我添加安全例外
- r - 如何将列拆分为多列
- javascript - 同时滑动切换和动画(jQuery)
- python - Python Django End_of_file
- c++ - 在 C++ 中转换为另一个类
- javascript - Rails 6 和 Vue 组件
- powershell - 打开 PowerShell 的 CMD 命令不起作用
- ios - 无法使用 ResearchKit 归档项目,但可以在模拟器和设备上成功运行
- delphi - 如何在 Delphi 中即时更改 TOpenDialog 的 UI 语言?