IIS部署Node.js应用调用Python脚本失败(错误码1)排查求助
兄弟,我之前也踩过IIS下Node.js调用Python的同款坑!错误码1其实是Python进程退出的通用异常码,结合你本地能跑、IIS上必挂的情况,基本可以排除脚本逻辑问题,大概率是IIS环境的权限、路径或者环境变量不匹配,给你列几个我当时排查的核心方向,你挨个试:
1. 先补个最关键的排查步骤:监听Python的错误输出
你现在的代码只监听了stdout和close事件,完全没处理stderr!这等于闭着眼睛排查啊!赶紧加上这段代码,能直接拿到Python的报错详情,比瞎猜有用100倍:
// 加在spawn之后、stdout监听之前就行 pythonProcess.stderr.on("data", (data) => { console.error("Python报错详情:", data.toString()); });
加完之后重启IIS应用池,再测一次,看日志里的报错信息,基本能直接定位问题。
2. 最常见的坑:IIS应用池的权限不足
IIS默认用IIS AppPool\你的应用池名称这个内置账户跑Node.js应用,这个账户权限非常有限:
- 可能没有
C:\\Python312目录的执行权限 - 可能没有你Node.js项目目录(尤其是上传的PDF文件所在目录)的读写权限
- 甚至连临时文件目录都访问不了
测试方法:临时把应用池的身份改成LocalSystem(别一直用,测试完改回去),如果能跑通,就实锤是权限问题,再给应用池账户单独加以下权限:
- Python安装目录的「读取和执行」权限
- Node.js项目根目录的「读取和写入」权限
- PDF文件所在目录的「读取」权限
3. Python路径或环境的问题
你硬编码了Python路径C:\\Python312\\python,但IIS的运行上下文和你本地用户的环境完全不一样:
- 如果你装的是64位Python,但IIS应用池开了「启用32位应用程序」,会直接找不到Python进程
- 或者Python没加到系统级的环境变量PATH里,IIS进程读不到用户级的环境变量
测试方法:
- 先去IIS应用池的高级设置里,把「启用32位应用程序」改成False(如果你的Python是64位)
- 或者把Python路径加到系统PATH里,然后重启整个IIS(不是只重启应用池),让环境变量生效
4. PDF文件路径的坑
你用req.file.path拿到的临时路径,在IIS环境下可能是一个只有当前请求临时权限的路径,或者路径里有空格/特殊字符导致Python识别失败。可以在代码里加一句日志打印路径:
console.log("要处理的PDF路径:", pdfFilePath);
确认路径是正确的绝对路径,而且应用池账户能访问这个文件。
5. Python依赖的问题
本地跑的时候你用的是自己用户的Python环境,而IIS用的是系统环境,说不定脚本依赖的第三方库(比如PyPDF2、pdfplumber这类)没装在系统级的Python里,或者你用了虚拟环境但IIS访问不到。
测试方法:在Python脚本开头加一句import sys; print(sys.path),然后看stdout的输出,确认依赖库所在的路径在sys.path里。
我当时是权限+环境变量的组合坑,改完应用池权限、把Python加到系统PATH里就搞定了,你先把stderr监听加上,拿到具体报错信息,基本就能秒定位问题!
备注:内容来源于stack exchange,提问作者Yi Hang Ooi

