Ale*_*tke 6 python com excel vba excel-vba python-2.7
我正在使用COM集成从Python 2.7驱动MS Excel.我注意到一个奇怪的事情:当我运行以下代码时:
import win32com.client
excelApp = win32com.client.dynamic.Dispatch('Excel.Application')
Run Code Online (Sandbox Code Playgroud)
的EXCEL.EXE过程中出现的过程列表(视图中使用Windows任务管理器或上subprocess.Popen('tasklist'))按预期方式.然后我做了我需要做的所有事情没有问题.但是,当我关闭Excel时:
excelApp.Application.Quit()
Run Code Online (Sandbox Code Playgroud)
即使我关闭启动它的Python解释器,这个过程仍然存在(这种情况很有意义,因为Excel在不同的进程中运行但只是为了确定).我发现终止此过程的唯一方法是手动,使用任务管理器,或通过调用:
subprocess.Popen("taskkill /F /im EXCEL.EXE",shell=True)
Run Code Online (Sandbox Code Playgroud)
强制/F标志是必要的,否则进程不会终止.
这不是一个真正的问题(我希望),但我想问一下,当我第一次"正常"编辑文档时,这是否会导致问题,然后从python调用Excel然后再"正常"?可能连续多次(几十次)?我担心的是创建冲突版本的文档等.或者我应该EXCEL.EXE每次只是为了安全而终止该过程?
另外我注意到,subprocess.Popen("taskkill")不会返回任何我可以catch和任何异常的例外(或者我在这里做些什么?).我特别感兴趣的是区分"不存在的进程"杀死尝试和终止进程失败的尝试.
尝试关闭所有打开的书籍,告诉应用程序退出并删除对该应用程序的任何引用.我通常将我的com对象包装在一个类中.这就是我的退出方法的样子.
def quit(self):
self.xlBook.Close(SaveChanges=0)
self.xlApp.Quit()
del self.xlApp
Run Code Online (Sandbox Code Playgroud)
你是从主线程调用Dispatch吗?如果不一定要打电话
pythoncom.CoInitialize()
Run Code Online (Sandbox Code Playgroud)
在Dispatch之前,和
pythoncom.CoUninitialize()
Run Code Online (Sandbox Code Playgroud)
退出后