win32.Dispatch против win32.gencache в Python. Каковы плюсы и минусы? - PullRequest
0 голосов
/ 02 мая 2018

Я недавно использовал win32com.client из python в качестве API для приложений Windows, но изо всех сил пытаюсь понять некоторые основные вещи.

Я использовал его с программой WEAP, следующим образом

import win32com.client
win32com.client.Dispatch("WEAP.WEAPApplication")

Теперь я хочу использовать его с Excel и нашел альтернативы предыдущим строкам, одна из которых выглядит следующим образом (взято из Python: открыть книгу Excel с помощью Win32 COM Api )

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')

Кто-нибудь знает разницу между использованием

win32.Dispatch 

и

win32.gencache.EnsureDispatch

и другие альтернативы? Кто-нибудь знает плюсы и минусы каждого? или какой-то совет относительно того, когда следует использовать тот или иной?

Я искал совета и нашел несколько полезных ответов, например:

Python: открыть книгу Excel с помощью Win32 COM Api

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 и, возможно, другими альтернативами, чего я и хочу.

Любой совет будет принят с благодарностью.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Расположение сгенерированного кэша может быть в USER_PROFILE \ AppData \ Local \ Temp \ gen_py \ PYTHON_VERSION \. Это может быть полезно, если вы хотите очистить кеш.

0 голосов
/ 03 мая 2018

Вам нужно прочитать одну вещь: эту ссылку .

Я постараюсь в ближайшее время ответить (наконец, не так коротко к концу ...) на ваш вопрос, но я не эксперт.

Когда вы создаете объект COM с python, как python знает, какие методы и параметры доступны для этого объекта? Это связано с понятием раннего и позднего связывания.

Если вы попытаетесь создать COM объект, который вы никогда не использовали ранее с Dispatch, вы не будете знать, что доступно с вашим объектом. Если я делаю в 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 () как обычно. всегда возвращает поддерживаемые MakePy оболочки для вашего COM-объекта.

Для принудительного запуска процесса MakePy используется модуль win32com.client.gencache. Этот модуль содержит код, который управляет каталогом сгенерированных MakePy исходных файлов: сгенерированный кеш или gencache. В этом модуле есть ряд полезных функций, и вам рекомендуется просмотреть исходный файл, если вам необходимо выполнить расширенное управление этими сгенерированными файлами. "

Краткое изложение этого.

Другой альтернативой является использование dynamic, например win32.dynamic.Dispatch("Excel.Application"), и вы всегда получите объект COM с поздним связыванием.

...