IIS托管的.NET Web API调用Python脚本异常问题
针对你遇到的本地调试正常但IIS部署后Python脚本无法运行的问题,补充以下针对性排查和解决步骤:
强制使用Python绝对路径调用
IIS应用池的运行环境可能未加载系统环境变量中的Python路径,直接用python命令会找不到执行文件。在.NET代码中调用脚本时,写死Python可执行文件的绝对路径,比如C:\Program Files\Python310\python.exe,避免依赖环境变量。确认脚本工作目录一致性
本地调试时工作目录是项目根目录,但IIS下应用池的默认工作目录可能是C:\inetpub\wwwroot\你的API项目或应用池自身的目录。如果Python脚本依赖相对路径读取文件,会出现找不到文件的情况。解决方法:- 在.NET调用脚本时,通过
ProcessStartInfo.WorkingDirectory显式设置为脚本所在的绝对路径 - 改造Python脚本,所有文件引用改为绝对路径
- 在.NET调用脚本时,通过
捕获Python标准错误流
之前的日志未捕获到有效信息,大概率是没读取Python的错误输出。在.NET调用Process时,开启错误流重定向,示例代码:var psi = new ProcessStartInfo { FileName = @"C:\Program Files\Python310\python.exe", Arguments = @"D:\YourProject\scripts\test.py", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, WorkingDirectory = @"D:\YourProject\scripts" }; using (var process = Process.Start(psi)) { string output = process.StandardOutput.ReadToEnd(); string errorMsg = process.StandardError.ReadToEnd(); process.WaitForExit(); // 将errorMsg写入日志,这会暴露脚本执行的具体报错 }排查应用池身份的依赖环境
命令行能正常运行脚本是因为使用了当前登录用户的Python环境,但IIS应用池的身份(比如ApplicationPoolIdentity)可能未安装脚本依赖的第三方包。可以用PsExec工具切换到应用池身份,执行python -m pip list查看已安装包,确认依赖是否齐全。测试应用池权限的极端情况
临时将应用池标识改为LocalSystem(仅用于测试,测试后改回最小权限身份),如果脚本能正常运行,说明之前的权限配置仍有遗漏,需要给应用池身份添加脚本所在目录、Python安装目录的读取和执行权限。
内容的提问来源于stack exchange,提问作者chamika

