您的位置:

Python Close COM

一、什么是COM(Component Object Model)

Component Object Model(组件对象模型)简称COM,是由Microsoft公司在Windows操作系统中提供的一种软件组件技术。其最主要的特点是组件的二进制兼容性,也就是说一个组件可以通过二进制接口与其他组件进行通讯,而不需要了解其他组件的实现方式。这个特性使得COM在Windows操作系统中得到了广泛的应用。

COM通过提供标准的二进制接口,为Heterogeneous Computing(异构计算)的软件架构提供了可能。COM使不同的应用程序、编程语言、编写者以及CPU架构都能共同工作。在COM中,每一个软件组件可以被看做是一个对象。

在Python中使用COM技术,可以很方便的调用Windows系统中的各种组件实例(比如:Word、Excel、Powerpoint等Microsoft Office应用或者操作系统WMI等),以便完成各种操作。

二、Python中的win32com

在Python中,使用windows的COM技术需要用到一个第三方库——win32com。这个库提供了Python和Windows之间的COM对象互操作。一般情况下win32com可以实现Python的所有COM功能,包括创建COM对象实例、创建ActiveX控件实例,以及自定义COM对象等。

使用win32com时,需要首先使用makepy.py文件生成指定组件的类型库,这个操作将会自动生成Python模块,这些Python模块定义了COM对象实例的属性和方法,并提供了易于使用的Python接口。

import os
import win32com.client
excel = win32com.client.gencache.EnsureDispatch('Excel.Application')

以上代码将会启动Microsoft Excel,如果Excel没有启动,则该代码会自动地启动Excel。当Excel启动之后,win32com会自动生成一个可用的Dispatch接口,该接口可以用于调用Excel的所有方法和属性。而且,这个接口跟Python的代码一样易于使用,win32com还能够自动地将实例回收。

三、Python中关闭COM对象

虽然Python使用win32com进行COM对象操作非常的简洁和方便,但是对于COM对象的关闭却有不少开发者困扰。在Python中,一旦打开了一个COM对象,每一次引用都会创建一个新的实例,如果不妥善的关闭COM对象,很容易造成内存泄漏。Python中有几种方法可以关闭COM对象:

1、手动关闭

import win32com.client
excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
excel.Quit()
del excel

以上代码中,我们打开了Excel的COM对象实例,使用Quit()方法关闭Excel并del掉了对象实例。虽然使用上述方法并不会影响win32com的自动回收实例的机制,但是以一种显式的方式关闭COM对象可以显著地减少内存泄漏的机会。

2、自动关闭

除了手动关闭COM对象外,Python还提供了一种自动关闭COM对象的方式,即使用contextlib和with语句结合使用:

import win32com.client
import contextlib

@contextlib.contextmanager
def quit_on_exception(app):
    try:
        yield app
    finally:
        app.Quit()

with quit_on_exception(win32com.client.Dispatch('Excel.Application')) as excel:
    ws = excel.Workbooks.Add()
    # do something

以上代码中,我们使用Python的with语句结合quit_on_exception装饰器实现了自动关闭COM对象的功能。

四、总结

Python中通过自带的win32com包,可以很方便地调用Windows系统中各种组件,完成各种操作。但是一旦打开了COM对象,如果不妥善关闭它们,会造成内存泄漏的问题。本文从介绍COM、Python中的win32com以及Python中如何关闭COM对象等几个方面展开,让用户了解Python中使用COM对象时需要注意的问题,从而提高程序的稳定性和效率。