簡體   English   中英

Python 中的 win32.Dispatch 與 win32.gencache。 優缺點都有什么?

[英]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.

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