网络上对makepy有一些介绍,但是都很简略。比较容易让新接触的人一头雾水。当然通过阅读win32com和makepy的源码还是可以了解的。下边把我的理解说一下,希望可以帮助到一些人。其实这个东西和vs.net以及delphi等开发工具的引入com组件的过程一致,只是他把生成的东西“藏”起来了,并且没有显式在使用者代码中调用。这似乎不是一种好的方式。

不使用makepy对程序运行没有影响。使用makepy后会提升com组件访问程序的性能。

在win32com模块中定义了

win32com.__gen_path__,并且把这个值保存在注册表中。

一般位置是windows个人文档中的临时文件夹,如:C:\DOCUME~1\***username****\LOCALS~1\Temp\gen_py\2.6

makepy生成指定com组件的早期绑定信息并保存在这个目录中。

可以清空这个目录以便重置com缓存:# Generated file

- this directory may be deleted to reset the COM cache...

在这个目录中有缓存的com组件,再次使用就按照早期绑定的方式调用,因此提升了性能。这个过程不需要使用者显式处理,由win32com模块自动处理。

具体过程是:如果程序中import

win32com.client并且通过win32com.client.Dispatch创建对象实例,运行时一旦载入win32com模块,该模块从组册表中加载这个目录位置信息。并在创建对象时使用这个目录中的信息创建和处理com对象。

pythonwin中编辑代码时,方法和属性的自动完成需要在pythonwin中运行import

win32com.client,并且通过win32com.client.Dispatch创建了对象实例后才可以使用,在这之前不自动提示。

可以通过win32com.client.dynamic.Dispatch()强制使用Late-Bound。