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