我正在使用 Python 的win32com
库自动化 Minitab 17,虽然所有命令都正确执行,但当我的脚本结束时,我似乎无法让 Minitab 进程启动的进程退出。我的结构看起来像
from myapi import get_data
import pythoncom
from win32com.client import gencache
def process_data(data):
# In case of threading
pythoncom.CoInitialize()
app = gencache.EnsureDispatch('Mtb.Application')
try:
# do some processing
pass
finally:
# App-specific command that is supposed to close the software
app.Quit()
# Ensure the object is released
del mtb
# In case of threading
pythoncom.CoUninitialize()
def main():
data = get_data()
process_data(data)
if __name__ == '__main__':
main()
我没有收到任何异常引发或打印错误消息,该Mtb.exe
进程仍列在任务管理器中。更令人沮丧的是,如果我在 IPython 会话中运行以下命令:
>>> from win32com.client import gencache
>>> app = gencache.EnsureDispatch('Mtb.Application')
>>> ^D
Minitab 进程立即关闭。我在正常的python
交互式会话中观察到相同的行为。 为什么在交互式会话中而不是在独立脚本中运行时进程会正确关闭?我的脚本中没有执行哪些不同的操作?
我也试过process_data
在 athreading.Thread
和 a 中运行,multiprocessing.Process
但没有运气。
编辑:
如果我有一个脚本只包含
from win32com.client import gencache
app = gencache.EnsureDispatch('Mtb.Application')
然后当我运行它时,我会Mtb.exe
在任务管理器中看到该进程,但是一旦脚本退出,该进程就会被杀死。因此,我的问题是,如果这个 COM 对象是在顶层声明还是在函数内部声明,为什么这很重要?