Traduction 1001-soldes.com ©2017 Tous droits réservés | Source :http://www.boddie.org.uk/python/COM.html

Python et COM

Résumé

J'ai joué avec Python et COM sur Windows 2000. Bien que l'aide intégrée dans PythonWin contribue à expliquer les détails bizarres de COM et les différentes interfaces communes que l'on pourrait trouver, il est vraiment nécessaire d'aller chercher une interface concrète information. Il existe quelques sources d'information, et le but de ce document est d'aider les lecteurs à utiliser ces sources, voire à les aider à éviter la nécessité d'utiliser ces sources.

Conditions préalables

Peut-être la façon la plus simple d'obtenir Python pour les plates-formes Windows est d'aller à ActiveState et de télécharger leur package ActivePython. Vous pouvez également visiter le site Python, télécharger Python (voir la page Python support pour Windows ), puis rechercher les extensions win32all (voir la page Python pour Windows Extensions de Mark Hammond pour plus de détails). Je viens de faire ce qui était le plus simple, bien sûr! Pour les activités ci-dessous, vous pourriez avoir besoin de logiciels supplémentaires tels que Microsoft Outlook, même si vous ne voudrez probablement pas jouer avec Outlook et Exchange si vous ne les avez pas.

Outlook et Exchange

L'une des choses prétendument irritantes de Microsoft Exchange Server est la façon dont il masque beaucoup de ses éléments internes et nécessite une bonne quantité de programmation pour vous permettre d'accéder à des listes de contacts et des carnets d'adresses. Il est intéressant de noter que l'on trouve beaucoup d'avis sur l'importation d'autres carnets d'adresses d'autres systèmes dans Exchange, mais pas autant sur la réinsertion des adresses et sur les autres. Heureusement, Microsoft fournit suffisamment d'API pour devenir son propre "défilement", car cette API fournit un mécanisme raisonnable pour accéder aux internautes et pour extraire les informations verrouillées. Quoi qu'il en soit, cela m'a amené à écrire un petit programme pour accéder aux listes de messages, aux contacts et aux rendez-vous de Exchange via Outlook. Si votre organisation exécute Exchange, vous êtes probablement obligé d'exécuter Outlook, et donc, l'automatisation d'Outlook est une stratégie valide pour accéder à Exchange. Une alternative pour accéder à certains types d'informations est d'utiliser l'API des services Active Directory et / ou LDAP, mais je n'ai pas réussi dans cette zone.

Exemple: Outlook Explorer

Remarque: Avant de lancer cette application, créez la "Bibliothèque d'objets Microsoft Outlook 9.0" à l'aide de l'utilitaire "Make Make-up" (voir "Initialisation des bibliothèques de types" ). Le programme Outlook Explorer (que vous pouvez télécharger ) utilise MAPI (Messaging API) dans Outlook pour accéder aux ressources de messagerie. Vous pouvez naviguer dans la hiérarchie des objets en utilisant une interface de ligne de commande simple et extraire des informations vers des répertoires existants dans le système de fichiers.

Activités

Initialisation des bibliothèques de types

Bien que le package win32com offre un certain nombre de façons d'interroger et d'accéder aux interfaces COM avec peu de différences évidentes entre elles (à condition de connaître l'interface), il est généralement plus pratique lors de l'expérimentation (en particulier dans PythonWin avec sa fonction d'achèvement des attributs) pour savoir quelles méthodes et les propriétés sont vraiment disponibles pour une interface donnée. C'est là que l'utilitaire "COM Makepy", accessible à partir du menu "Outils" de PythonWin, est utile. En sélectionnant une bibliothèque de types particuliers et en construisant les interfaces Python à l'aide de cet outil, beaucoup plus d'informations sont disponibles dans PythonWin et une recherche occasionnelle des interfaces objet devient beaucoup plus facile.

Rédaction de clients

Tout l'accès COM client commence par l'énoncé suivant dans votre programme Python:
  import win32com.client
Généralement, votre programme tentera alors de trouver un objet à utiliser. Par exemple:
  object = win32com.client.Dispatch("Outlook.Application")
Cet objet se référera alors à un "objet COM" qui peut avoir des méthodes invoquées et ses attributs examinés comme tout autre objet Python, bien que nous puissions "automatiser" une application Windows (comme Outlook) lorsque nous faisons cela.

Recherche de la racine de hiérarchie des objets

Une fois que nous avons une référence à un objet qui «automatisant» une application, la prochaine chose à faire est de trouver la racine de la hiérarchie des objets où toutes les informations intéressantes sont stockées. Avec l'objet d'automatisation de l'application Outlook, la manière la plus simple d'y parvenir est d'entrer dans l'espace de noms MAPI:
  ns = object.GetNamespace("MAPI")
Cela nous permet d'accéder à la hiérarchie "dossier" accessible dans Outlook. Vous pouvez voir cette hiérarchie vous-même en ouvrant Outlook manuellement et en affichant le menu du dossier (qui indique généralement «Boîte de réception» ou «Outlook aujourd'hui» ou quelque chose). L'objet ns peut maintenant être traité comme un objet Python normal, avec des attributs spéciaux conduisant à d'autres parties de la hiérarchie des objets.

Dossiers et articles

Le programme Outlook Explorer utilise des astuces de Python pour accéder aux attributs des «objets COM» qu'il fait référence, mais il recherche essentiellement les dossiers et les éléments disponibles dans chaque objet:
  # Refer to the folders within a given object...
ns_list = ns.Folders
# Refer to the items within a given object...
ns_list = ns.Items

Interroger les interférences

Maintenant, comment enquêter sur le détail de chaque objet? Par exemple, comment accéder au nom d'un dossier? Tout d'abord, il aide à connaître l'interface que l'objet expose, et cette information peut être trouvée en plusieurs endroits: Il est à espérer que l'objet auquel vous accédez est bien connu par PythonWin pour permettre un certain type d'attribut ou d'achèvement de la méthode. Vous devriez seulement recourir à ce qui précède lorsque des connaissances plus détaillées sur une méthode ou un attribut sont nécessaires. Vous pouvez également essayer quelque chose comme ceci:
  dir(object.__class__)
Vous pouvez accéder au nom d'un dossier comme suit:
  object.Name # Where object refers to a folder.

Séquences

Bien sûr, il peut y avoir beaucoup de dossiers ou d'éléments dans un dossier. Comment traversons-nous cette collection? La manière recommandée est sans doute d'utiliser la notation d'indice de séquence de Python, mais attention: l'indice du premier élément n'est apparemment pas standard et peut être 0 ou 1. Dans le modèle d'objet d'Outlook, le premier élément de ces séquences est en effet indexé par 1, ce qui entraîne la observations suivantes: Pour accéder à des objets qui se comportent comme des séquences, les mécanismes Python suivants peuvent être utilisés:
  object[1]   # The first element.
len(object) # Return the number of elements.
Les mécanismes suivants ne semblent pas fonctionner:
  object[-1]  # Should be the last element, but instead we get an exception.
object[1:4] # Should slice the sequence, but instead we get an exception.

Résumé

Avec les informations ci-dessus, le programme d'exemple peut accéder à différents niveaux de dossiers, d'éléments de requête et d'extraire des informations. En utilisant l'attribut Parent sur un dossier donné, nous pouvons naviguer vers le haut dans la hiérarchie sans avoir besoin de garder les références aux endroits que nous avons déjà explorés.