Express调用Child Process执行Python图片脚本遇Buffer错误求助
解决MERN栈中child_process调用Python脚本的PIL报错问题
我在开发MERN栈应用,用户上传证件后,服务端通过child_process执行Python脚本判断用户是否年满18岁。但使用PIL库打开图片时触发了stderr,执行报错。
Node.js调用child_process代码
const {spawn}=require('child_process'); const ls=spawn('python',['scripts/dobChecker.py','/idProof/testadhar.jpg']) ls.stdout.on('data',(data)=>{ console.log(`stdoutput ${data}`); }); ls.stderr.on('data',(data)=>{ console.log(`stderror`,data); }); ls.on('close',(code)=>{ console.log(`child process exited with code ${code}`); });
Python脚本代码
import pytesseract from PIL import Image import re import sys from datetime import datetime from dateutil.relativedelta import relativedelta total_path=sys.argv[1] img = Image.open(total_path) img = img.convert('L') text = pytesseract.image_to_string(img) match=re.search(r'(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|[1][0-2])/[0-9]+',text) dob=datetime.strptime(match.group(),'%d/%m/%Y').date() todaydate=datetime.now() processedTodayDate=todaydate.date() diffInAge=relativedelta(processedTodayDate,dob) if(diffInAge.years >= 18): print(True) else: print(False)
报错信息
stderror <Buffer 54 72 61 63 65 62 61 63 6b 20 28 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 6c 61 73 74 29 3a 0d 0a 20 20 46 69 6c 65 20 22 73 63 72 69 70 74 ... 282 more bytes>
child process exited with code 1
解决步骤
1. 先把Buffer错误转成可读文本
当前stderr输出的是二进制Buffer,无法直接查看错误详情。修改Node.js的stderr处理逻辑,将Buffer转为字符串:
ls.stderr.on('data',(data)=>{ console.log(`stderror: ${data.toString()}`); });
运行后就能看到具体错误(比如文件不存在、依赖缺失、权限问题等)。
2. 排查并修复常见问题
路径问题
- 确认
/idProof/testadhar.jpg是服务器上的真实绝对路径,且Node进程有读取权限;若用相对路径,要基于Node启动的工作目录编写,或用path.resolve生成绝对路径:const path = require('path'); const imgPath = path.resolve(__dirname, '../idProof/testadhar.jpg'); const ls=spawn('python',['scripts/dobChecker.py', imgPath])
依赖缺失
- 确保Python环境已安装所有依赖包:
pip install pillow pytesseract python-dateutil - pytesseract依赖Tesseract OCR引擎,服务器需额外安装:
- Ubuntu/Debian:
apt install tesseract-ocr - Windows:下载安装包并配置环境变量
- Ubuntu/Debian:
Python版本问题
部分系统中python指向Python2,而脚本用的是Python3语法,需改用python3调用:
const ls=spawn('python3',['scripts/dobChecker.py', imgPath])
脚本异常处理
原脚本无错误捕获,一旦图片无法打开、OCR识别失败就会崩溃。添加异常处理,输出明确错误信息:
import pytesseract from PIL import Image, UnidentifiedImageError import re import sys from datetime import datetime from dateutil.relativedelta import relativedelta try: total_path = sys.argv[1] img = Image.open(total_path) img = img.convert('L') text = pytesseract.image_to_string(img) match = re.search(r'(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|[1][0-2])/[0-9]+', text) if not match: raise ValueError("未识别到符合格式的出生日期") dob = datetime.strptime(match.group(), '%d/%m/%Y').date() todaydate = datetime.now().date() diffInAge = relativedelta(todaydate, dob) print(diffInAge.years >= 18) except UnidentifiedImageError: print("错误:无法打开图片文件,请检查路径或文件格式") sys.exit(1) except IndexError: print("错误:未传入图片路径参数") sys.exit(1) except ValueError as e: print(f"错误:{str(e)}") sys.exit(1) except Exception as e: print(f"未知错误:{str(e)}") sys.exit(1)
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

