PyWin32在Win11默认终端(PowerShell)运行打包EXE时抛出"pywintypes com_error call was rejected"错误,但CMD运行正常
PyWin32在Win11默认终端(PowerShell)运行打包EXE时抛出"pywintypes com_error call was rejected"错误,但CMD运行正常
系统环境
- 开发机:Win10,Python 3.7.7,PyInstaller 5.3.12
- 部署机:Win11,未安装Python
脚本功能与初始运行情况
我写了一个Windows CMD下运行的CLI Python脚本,逻辑很简单:
- 启动时用
filedialog.askopenfilename()弹出TKinter的“选择文件”GUI对话框 - 选中.xlsx文件后,用
win32com.client.Dispatch('Excel.Application')打开MS Excel - 后台进入
while(1)循环,等待用户按空格键 - 用户按空格键时,用
ExcelApp.ActiveCell.Value = <某个数字>往Excel活动单元格写入数字 - 用
ExcelApp.ActiveCell.GetOffset(1,0).Select()把活动单元格光标下移一行
直接用python myScript.py跑.py脚本时完全正常,甚至能往OneDrive同步文件夹里的.xlsx文件写内容,毫无问题。
因为部署机无法安装Python(无管理员权限),我用PyInstaller将脚本打包成独立EXE,命令如下:
python -m PyInstaller --noconfirm --onedir --console "myScript.py"
2024年1月部署到Win11机后,整整一年都运行完美,没任何问题。结果到2024年12月27号,它突然毫无征兆地抛出了以下异常:
File "win32com\client\dynamic.py line 627, in _getattr__ pywintypes com_error: (-2147418111, 'Call was rejected by callee, none, none)
排查测试过程
我立刻做了几个测试,试图定位问题:
- 把部署机上的
myScript.exe拷回开发机运行:成功 - 在开发机重新打包脚本,将新生成的EXE拷到部署机运行:失败!抛出同样异常
- 在开发机重新打包脚本,拷到部署机后用CMD运行:成功
一开始以为是随机偶发问题,直到注意到部署机上EXE是在“终端”里运行的。我平时没怎么用过Win11,查了下才发现:
- Win11的“终端”是个“壳中壳”,替代Win7/10里的CMD来运行各类命令行程序
- Win11终端默认启动PowerShell
- 正是PowerShell导致了这个异常——用CMD运行就完全没问题
我临时写了个.bat文件让EXE在CMD里运行,但这显然不是根本解决办法。
疑问点
我想搞明白两个核心问题:
- Win11终端为啥默认用PowerShell运行CLI程序?毕竟PowerShell和CMD本质差异很大,兼容性没保障啊...
- PowerShell为啥会导致win32com抛出“被调用方拒绝调用”的异常?是安全策略或者执行权限的问题吗?我见过类似问题,但大多只给了临时 workaround,没讲清楚底层原因。
备注:内容来源于stack exchange,提问作者Noideas
相关产品推荐
相关产品推荐

