![](/img/trans.png)
[英]What is stopping win32.Dispatch() from opening Microsoft Office programs?
[英]win32.Dispatch vs win32.gencache in Python. What are the pros and cons?
我最近一直在使用 python 中的 win32com.client 作為 Windows 應用程序的 API,但我很難理解一些基本的東西。
我一直將它與一個名為 WEAP 的程序一起使用,如下所示
import win32com.client
win32com.client.Dispatch("WEAP.WEAPApplication")
現在,我想將它與 Excel 一起使用,並找到了前幾行的替代方法,其中之一如下(取自Python:使用 Win32 COM Api 打開 Excel 工作簿)
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
有誰知道使用之間的區別
win32.Dispatch
和
win32.gencache.EnsureDispatch
和其他選擇? 有誰知道每一種的優缺點嗎? 或者關於何時應該使用一個或另一個的一些建議?
我尋求建議,並找到了一些有用的答案,例如:
Python:使用 Win32 COM Api 打開 Excel 工作簿
win32com.client.Dispatch 工作但不 win32com.client.gencache.EnsureDispatch
http://pythonexcels.com/python-excel-mini-cookbook/
https://mail.python.org/pipermail/python-win32/2011-August/011738.html
然而,他們通常專注於回答特定問題,而不是描述 Dispatch、gencache.EnsureDispatch 和其他替代方案之間差異的更大圖景,這正是我想要的。
任何建議將不勝感激。
你需要閱讀的一件事是這個鏈接。
我會盡快回答(最后不會那么短......)你的問題,但我不是專家。
用python創建COM
對象時,python怎么知道這個對象有哪些方法和參數? 這與早期和晚期綁定的概念有關。
如果您嘗試使用Dispatch
創建一個您以前從未使用過的COM
對象,您將不知道您的對象可以使用什么。 如果我在 Jupyter QtConsole 中這樣做:
import win32com.client as win32
xl_dis = win32.Dispatch("Excel.Application")
xl_dis
Out[3]: <COMObject Excel.Application>
然后嘗試xl_dis.
看看我以后能做什么,我別無選擇。 我在后期綁定的情況下,“python 不知道對象可以做什么”。
如果我對EnsureDispatch
做同樣的事情:
import win32com.client as win32
xl_ens = win32.gencache.EnsureDispatch("Excel.Application")
xl_ens
Out[3]: <win32com.gen_py.Microsoft Excel 14.0 Object Library._Application instance at 0x35671240>
首先,您可以看到輸出的差異,然后如果我執行xl_ens.
我會得到一些可用的方法和參數。 我現在處於早期綁定狀態,並且“python 知道對象可以做什么”。
發生的情況是, EnsureDispatch
強制運行makepy.py
(查看您的文件夾Lib\\site-packages\\win32com\\client
)以在Lib\\site-packages\\win32com\\gen_py
中創建一個文件夾,其中包含帶有一些方法和參數的 python 腳本與此COM
對象相關。
現在,如果您使用Dispatch
在新控制台中再次嘗試,您將獲得完全相同的結果。 確實,在使用了EnsureDispatch
,之前在win32com\\gen_py
創建的文件夾仍然存在,並且“python 仍然知道該對象可以做什么”。 要自己進行實驗,請轉到您的文件夾\\win32com\\gen_py
並刪除包含 excel 信息的文件夾(對我而言,名稱是00020813-0000-0000-C000-000000000046x0x1x7
,不確定它是否與您相同)。
最后,兩者之間的一個區別主要是在您第一次創建COM
對象時是否強制進行早期綁定,但如果與您的COM
對象相關的文件夾已經存在於\\win32com\\gen_py
,則沒有太大區別。
我給的鏈接的這兩句話:
要強制使用早期綁定來訪問 COM 對象,您必須在代碼中強制使用 MakePy 過程。 確保存在 MakePy 支持后,照常使用 win32com.client.Dispatch()。 它始終為您的 COM 對象返回 MakePy 支持的包裝器。
為了強制 MakePy 進程,使用了 win32com.client.gencache 模塊。 該模塊包含管理 MakePy 生成的源文件目錄的代碼:生成的緩存或 gencache。 該模塊中有許多有用的功能,如果您需要對這些生成的文件進行高級管理,建議您瀏覽源文件。
有點總結這個。
另一種選擇是使用dynamic
例如win32.dynamic.Dispatch("Excel.Application")
並且您將始終在后期綁定中獲得COM
對象。
生成的緩存的位置可能在 USER_PROFILE\\AppData\\Local\\Temp\\gen_py\\PYTHON_VERSION\\ 中。 如果想要清除緩存,這會很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.