簡體   English   中英

解釋為什么刪除 gen_py 中的文件夾解決了 wincom32 錯誤沒有屬性 '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 model 開始生成錯誤 - 堆棧內存溢出

我可以(大部分)回答這個問題。

啟動 COM object 有兩種方法:用於后期綁定的 win32com.client.Dispatch 和用於早期綁定的 win32com.gencache.EnsureDispatch。

(您實際上不需要了解早期與晚期來了解您的問題發生的原因。)

當您使用后期綁定時, Python 不關心 COM 屬性的大寫/小寫。 使用早期綁定時,必須正確處理大小寫。 因此,“CLSIDToPackageMap”可能在代碼中的某處以不同的大小寫命名。

好的。 那么,如果它曾經奏效,怎么會“出錯”呢? 假設您使用了進行后期綁定的代碼。 它之所以有效,是因為它不需要大小寫匹配。 然后,在某個時候,您在同一個 object 上使用了早期綁定。 (也許您運行了其他人使用了早期綁定的代碼)。

一旦你使用了早期綁定,你就永遠無法返回 go,即使你為 object 編寫了后期綁定代碼,如果 object 稍后獲得早期綁定。 您的后期綁定代碼將使用早期綁定。

如果早期綁定不存在,則當有人使用早期綁定時會生成早期綁定的代碼。 它生成到 gen_py 中,因此從 gen_py 中刪除該文件夾將使您的后期綁定代碼實際上再次進行后期綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM