web-dev-qa-db-fra.com

win32.Dispatch vs win32.gencache en Python. quels sont les avantages et les inconvénients?

J'ai récemment utilisé win32com.client de python comme API pour les applications Windows, mais j'ai du mal à comprendre certaines choses de base.

Je l'avais utilisé avec un programme appelé WEAP, de la manière suivante

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

Maintenant, je veux l'utiliser avec Excel et j'ai trouvé des alternatives aux lignes précédentes, l'une d'entre elles comme suit (tirée de Python: ouvrir le classeur Excel en utilisant Win32 COM Api )

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

Quelqu'un connaît-il la différence entre l'utilisation

win32.Dispatch 

et

win32.gencache.EnsureDispatch

et d'autres alternatives? Quelqu'un connaît-il les avantages et les inconvénients de chacun? ou quelques conseils pour savoir quand utiliser l'un ou l'autre?

J'ai cherché des conseils et j'ai trouvé des réponses utiles, par exemple:

Python: ouvrir le classeur Excel à l'aide de Win32 COM Api

win32com.client.Dispatch fonctionne mais pas win32com.client.gencache.EnsureDispatch

http://pythonexcels.com/python-Excel-mini-cookbook/

https://mail.python.org/pipermail/python-win32/2011-August/011738.html

Cependant, ils sont généralement axés sur la réponse à des problèmes spécifiques et ne décrivent pas l'image plus large des différences entre Dispatch, gencache.EnsureDispatch et peut-être d'autres alternatives, ce que je veux.

Tout avis serait grandement apprécié.

8
Juan Ossa

Une chose à ce sujet que vous devez lire est ce lien .

Je vais essayer de répondre sous peu (enfin pas si court d'ici la fin ...) à votre question, mais je ne suis pas un expert.

Lorsque vous créez un objet COM avec python, comment python sait quelles méthodes et paramètres sont disponibles pour cet objet? Ceci est lié à la notion de liaison anticipée et tardive .

Si vous essayez de créer un objet COM que vous n'avez jamais utilisé auparavant avec Dispatch, vous ne saurez pas ce qui est disponible avec votre objet. Si je le fais dans une Jupyter QtConsole:

import win32com.client as win32
xl_dis = win32.Dispatch("Excel.Application")
xl_dis
Out[3]: <COMObject Excel.Application>

Ensuite, essayez xl_dis. Pour voir ce que je peux faire après, je n'aurai pas le choix. Je suis dans le cas d'une liaison tardive , "python ne sait pas ce que l'objet peut faire".

Si je fais la même chose avec 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>

Tout d'abord, vous pouvez voir la différence sur la sortie, puis si je le fais xl_ens., J'obtiendrai quelques méthodes et paramètres disponibles. Je suis maintenant en liaison anticipée et "python sait ce que l'objet peut faire".

Ce qui se passe, c'est que EnsureDispatch oblige à exécuter makepy.py Au début (regardez dans votre dossier Lib\site-packages\win32com\client) Pour créer un dossier dans Lib\site-packages\win32com\gen_py Contenant python avec quelques méthodes et paramètres liés à cet objet COM.

Maintenant, si vous réessayez dans une nouvelle console en utilisant Dispatch, vous obtiendrez exactement le même résultat. En effet, après avoir utilisé EnsureDispatch, le dossier créé auparavant dans win32com\gen_py Existe toujours et "python sait toujours ce que l'objet peut faire". Pour l'expérimenter vous-même, allez dans votre dossier \win32com\gen_py Et supprimez le dossier avec les informations Excel (pour moi, le nom est 00020813-0000-0000-C000-000000000046x0x1x7, Pas sûr que ce soit le même pour vous).

Enfin, une différence entre les deux est principalement de forcer ou non la liaison anticipée la première fois que vous créez un objet COM, mais si le dossier lié à votre objet COM existe déjà dans \win32com\gen_py, alors pas beaucoup de différence.

Ces deux phrases du lien que j'ai donné:

"Pour forcer l'utilisation de la liaison anticipée pour accéder aux objets COM, vous devez forcer le processus MakePy dans votre code. Une fois que vous avez vérifié que la prise en charge MakePy existe, utilisez win32com.client.Dispatch () comme d'habitude. Il renvoie toujours les wrappers pris en charge par MakePy pour votre objet COM.

Pour forcer le processus MakePy, le module win32com.client.gencache est utilisé. Ce module contient le code qui gère le répertoire des fichiers sources générés par MakePy: le cache généré, ou gencache. Il existe un certain nombre de fonctions utiles dans ce module, et nous vous encourageons à parcourir le fichier source si vous devez effectuer une gestion avancée de ces fichiers générés. "

sorte de résumé cela.

L'autre alternative est d'utiliser dynamic tel que win32.dynamic.Dispatch("Excel.Application") et vous obtiendrez toujours un objet COM en liaison tardive.

14
Ben.T

L'emplacement du cache généré peut se trouver dans USER_PROFILE\AppData\Local\Temp\gen_py\PYTHON_VERSION \. Cela peut être utile si l'on veut vider le cache.

0
svkolev