我观察到一种奇怪的行为,即VSCode在调试时不释放COM对象引用。PyCharm运行良好。要看到这一点,请执行以下操作:
启动Excel(其他应用程序也会出现问题,我在这个例子中使用Excel只是因为大多数人都有它(。
从命令行运行脚本";excel_test.py";在下面它连接到正在运行的Excel应用程序,并尝试调用一个不存在的方法hi((。将引发异常,脚本将按预期退出。
import win32com.client as w32c
# Attach to a running Excel
app = w32c.GetActiveObject("Excel.Application")
# This will throw an exception
app.hi()
print("done")
通过用户界面关闭Excel,手动退出Excel。请注意,在任务管理器中,Excel.exe进程已关闭。这一切都如所料。
重复相同的步骤,但使用VSCode调试模式运行脚本。当抛出异常时,调试器将停止执行。按调试器工具栏上的"停止"按钮可终止脚本。退出Excel后,请注意UI已关闭,但Excel.exe进程仍在运行。你现在有一个僵尸进程。
在PyCharm调试模式中遵循相同的模式运行良好,进程会按预期进行。
在退出调试模式时,VSCode似乎没有正确释放COM对象引用。我是不是错过了什么奇怪的场景,还是它刚刚坏了?
我还在vscode调试下打开了一个问题。https://github.com/microsoft/debugpy/issues/1022
我运行的是Python 3.9.12,pywin32 302,VSCode 1.70.2。
好消息,看起来已经提交了修复程序,并且问题https://github.com/microsoft/debugpy/issues/1022已关闭。不过我还没有看到目标版本。我们知道后我会更新的。