如何解决错误:尝试将长字符串从 nodejs 发送到 python 脚本时产生 ENAMETOOLONG
我正在尝试编写一些代码来获取用户上传的图像并调整其大小。 下面的代码适用于非常小的图像,但是当我尝试更大的图像时,我收到错误 spawn ENAMETOOLONG。我相信这是因为 base64 字符串要大得多。无论长度如何,我能做些什么来将 base64 字符串发送到我的 python 脚本?
server.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's 关于在 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()
~
希望这对像我一样通过 Google 偶然发现这里的人有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。