解释为什么删除 gen_py 中的文件夹解决了 win32com 错误没有属性 'CLSIDToPackageMap'

explaining why deleting folder in gen_py solves wincom32 error no attribute 'CLSIDToPackageMap'

删除gen py解决no属性是什么原因'CLSIDToPackageMap'?在几个地方有解决方案(都涉及删除 temp/gen_py 中的文件夹,但我找到的唯一解释是答案 ,它解释了这是因为从后期绑定切换到早期绑定。我的问题然后是:

(1) 为什么会发生这种转变?

(2)为什么删除gen_py中的文件夹可以解决这个问题?

另请参阅:

python 3.x - 为什么我突然收到 win32com.client 的无属性 'CLSIDToPackageMap' 错误? - 堆栈溢出

修复模块 win32com.gen_py 没有属性 'CLSIDToPackageMap' (github.com)

python-win32com excel com 模型开始生成错误 - 堆栈溢出

我可以(大部分)回答这个问题。

有两种启动 COM 对象的方法:win32com.client.Dispatch 用于后期绑定,win32com.gencache.EnsureDispatch 用于早期绑定。

(您无需真正了解早晚的区别即可了解您的问题发生的原因。)

当您使用后期绑定时,Python 不关心 COM 属性的 upper/lower 大小写。使用早期绑定时,必须正确处理大小写。所以“CLSIDToPackageMap”可能在代码中的某处以不同的大小写命名。

好的。那么,如果它曾经奏效,怎么会“出错”呢?假设您使用了进行后期绑定的代码。它之所以有效,是因为它不需要大小写匹配。然后,在某些时候,您在同一个对象 上使用了早期绑定。 (也许你 运行 其他人的代码使用了早期绑定)。

一旦使用了早期绑定,就再也回不去了!即使您为某个对象编写后期绑定代码,如果该对象稍后获得早期绑定,您的 late-binding 代码也将使用早期绑定。

如果早期绑定不存在,当有人使用早期绑定时会生成早期绑定代码。它生成到 gen_py,因此从 gen_py 中删除该文件夹将使您的 late-binding 代码实际上再次 执行 后期绑定。