Python a COM

link: http://www.boddie.org.uk/python/COM.html

Abstraktné

Som hral s Python a v COM v systéme Windows 2000. Zatiaľ čo vstavaný pomocník v PythonWin má ísť nejakým spôsobom k vysvetľovať bizarné podrobnosti o COM a rôzne spoločné rozhranie by sa dalo nájsť, je to skutočne nevyhnutné ísť hľadať konkrétne rozhranie informácie. Existuje niekoľko zdrojov týchto informácií, a cieľom tohto dokumentu je pomôcť čitateľom použitie takýchto zdrojov, alebo dokonca pomôcť im vyhnúť nutnosti použitia týchto zdrojov.

Predpoklady

Snáď najjednoduchší spôsob, ako získať Python pre platformy Windows, je ísť do ActiveState a stiahnuť ich ActivePython balíka. Môžete prípadne navštívte Python stavenisko, sťahovať Python (pozri Python podpora pre systém Windows stránka) a potom ísť hľadať win32all rozšírenia (pozri Marek Hammond Python pre Windows Rozšírenia stránka pre podrobnosti). Len som urobil to, čo bolo najjednoduchšie, samozrejme!

Pre činnosti uvedené nižšie, budete pravdepodobne potrebovať ďalší softvér, ako je napríklad Microsoft Outlook, hoci pravdepodobne nebudete mať záujem hrať s programom Outlook a Exchange ak nemáte nich.

Programom Outlook a Exchange

Jeden z údajne vecí, dráždi o Microsoft Exchange Server je cestou, ktorá skrýva veľa jeho častí a vyžaduje značné množstvo programovanie umožní dostať sa k veciam, ako sú kontaktné zoznamy a adresáre. Je zaujímavé, že veľa rád sa nachádza na import iné systémy ” adresáre do Výmenu, ale nie toľko na získanie adresy späť a do niečoho iného. Našťastie, Microsoft poskytujú dostatok API, aby sa stal svoj vlastný “skaza”, pretože to API poskytuje primeraný mechanizmus pre prístup k vnútornej a extrahovať zamknuté v informácie.

Každopádne, toto viedlo ma k napísaniu malý program na prístup k Výmene správ zoznamy, kontakty a plánované činnosti prostredníctvom programu Outlook. Ak vaša organizácia je spustený Exchange, ste pravdepodobne potrebné spustiť program Outlook ako dobre, a preto automatizáciu Outlook je platný stratégie v prístupe Exchange. Jednou alternatívou pre prístup na určité typy informácií pomocou Služby Active Directory API a/alebo LDAP, ale nebol som úspešný v tejto oblasti.

Príklad: programu Explorer Outlook

Poznámka: Pred začatím tejto aplikácie, stavať “Microsoft Outlook 9.0 Objektová Knižnica” pomocou “COM Makepy utility” (pozri “Spustenie Typ Knižnice”).

Outlook Explorer program (ktoré môžete stiahnuť) používa MAPI (Messaging API) do programu Outlook na prístup k pošte zdrojov. Môžete navigovať do objektu hierarchia cez jednoduché rozhranie príkazového riadka, a získavať informácie v existujúcich adresárov v súborovom systéme.

Aktivity

Inicializácia typových knižníc

Zatiaľ čo balík win32com poskytuje niekoľko spôsobov dotazovania a prístupu k rozhraniam COM s niekoľkými zrejmými rozdielmi medzi nimi (za predpokladu, že poznáte rozhranie), je zvyčajne výhodnejšie, keď experimentujete (najmä v PythonWin s funkciou dokončovania atribútov) vedieť, aké metódy a vlastnosti sú naozaj k dispozícii pre dané rozhranie. Toto je užitočné nástroj “COM Makepy”, ktorý je prístupný z ponuky “Nástroje” v programe PythonWin. Výberom konkrétnej knižnice typov a budovaním rozhraní Python pomocou tohto nástroja bude v PythonWin k dispozícii oveľa viac informácií a príležitostné zisťovanie objektových rozhraní sa stáva oveľa jednoduchšie.

Písanie klientov

Všetok prístup klienta COM začína nasledujúcim príkazom vo vašom programe Python:

import win32com.client

Obvykle sa váš program pokúsi nájsť objekt, ktorý sa má použiť. Napríklad:

object = win32com.client.Dispatch ("Outlook.Application")

Tento objekt sa potom bude vzťahovať na objekt COM, ktorý môže mať naň vyvolané metódy a jeho atribúty preskúmané ako akýkoľvek iný objekt Pythonu, aj keď môžeme robiť “automatizáciu” aplikácie systému Windows (napríklad programu Outlook).

Hľadanie koreňa hierarchie objektov

Akonáhle budeme mať odkaz na objekt, ktorý “automatizuje” aplikáciu, ďalšou vecou je nájsť koreň hierarchie objektov, kde sú uložené všetky zaujímavé informácie. S objektom automatizácie aplikácie Outlook najjednoduchší spôsob, ako to dosiahnuť, je vstúpiť do menného priestoru MAPI:

ns = object.GetNamespace ("MAPI")

To nám umožňuje prístup k hierarchii priečinkov prístupnej v programe Outlook. Túto hierarchiu môžete vidieť sami otvorením aplikácie Outlook ručne a vyvolaním ponuky priečinkov (ktoré zvyčajne hovoria “Inbox” alebo “Outlook Today” alebo niečo také).

nsObjekt môže byť teraz zaobchádzané ako normálny Python objekt, s prívlastkom, ktoré vedú k iným častiam hierarchie objektov.

Zložky a položky

Program Outlook Explorer používa niektoré fiktívne triky Pythonu na prístup k atribútom objektov COM, ktoré odkazuje, ale v podstate vyhľadáva priečinky a položky dostupné v každom objekte:

# Pozrite sa na priečinky v danom objekte ... 
ns_list = ns.Folders 
# Pozrite sa na položky v danom objekte ... 
ns_list = ns.Items

Dotazovacie rozhrania

Teraz, ako skúmať podrobnosti o každom objekte? Napríklad, ako sa dá prístup k názvu priečinka? Po prvé, pomáha poznať rozhranie, ktoré objekt vystavuje, a tieto informácie možno nájsť na niekoľkých miestach:

  • Microsoft API dokumentácie .
  • Ďalšie užitočné zdroje, napríklad dokumentácia programu Outlook Exchange .
  • Súbor rozhrania vygenerovaný pomocou nástroja “COM Makepy”. Ak chcete zistiť, ktorý súbor je relevantný pre príslušné rozhranie, vykonajte vyhľadávanie “grep” pre názov rozhrania v win32com/gen_py adresári v rámci distribúcie Pythonu alebo použite nesprávnu metódu alebo prístup k neexistujúcemu atribútu na objekt s touto rozhranie, aby ste zistili, aký je názov súboru rozhrania.
  • “OLE / COM Object Viewer” v ponuke “Nástroje” v programe Microsoft Visual C ++ (prinajmenšom v Visual Studio 6.0).
    • Po otvorení sa môže preskúmať časť “Rozhrania” v informačnej hierarchii, aby sa odhalili niektoré položky “_Application”. V jednom z nich sa na paneli s informáciami uvedie napríklad “Microsoft Outlook 9.0 Object Library” pod “TypeLib”.
    • Dvojitým kliknutím na položku “_Application” sa zobrazí “ITypeInfo Viewer”, ktorý obsahuje sekciu “_Methods” popisujúcu dostupné metódy v automatizovanom objekte aplikácie.
    • V sekcii “Typové knižnice” v hierarchii informácií sa zobrazí napríklad “Knihovňa objektov Microsoft Outlook 9.0” a toto môže byť preskúmané dvojitým kliknutím na danú položku.

Dúfajme, že objekt, ku ktorému pristupujete, je PythonWin dostatočne známy, aby umožnil určitý druh atribútu alebo metódy dokončenia. Mali by ste sa len uchýliť k vyššie uvedenému, keď sa vyžadujú podrobnejšie znalosti o metóde alebo atribúte. Môžete tiež vyskúšať niečo takéto:

r (objekt .__ class__)

Názov priečinka je prístupný nasledovne:

object.Name # Kde objekt odkazuje na priečinok.

sekvencie

Samozrejme, že v zložke môže byť veľa priečinkov alebo položiek. Ako prechádzame touto kolekciou? Odporúčaným spôsobom je pravdepodobne použiť indexáciu reťazca Pythonu, ale pozor: index prvého prvku zrejme nie je štandardný a môže byť 0 alebo 1. V objekte modelu Outlook je prvý prvok v takých sekvenciách skutočne indexovaný 1, čo vedie k nasledujúce pripomienky:

  • Dĺžka sekvencie, aj keď je správna, nemôže byť “znížená”, aby poskytla index posledného prvku. Napríklad, ak len(object)dá 34potom posledný prvok sa nebude mať index 33 – má index 34. Veľmi un-Pythonic, mohli by sme tvrdiť, ale zrejme nie je niečo, čo možno skutočne robiť.
  • Prvý prvok Pythonic (prvok 0) neexistuje.

Na prístup k objektom, ktoré sa správajú ako sekvencie, je možné použiť nasledujúce mechanizmy Pythonu:

object [1] # Prvý prvok. 
len (objekt) # Vráťte počet prvkov.

Zdá sa, že tieto mechanizmy nefungujú:

object [-1] # Mal by byť posledný prvok, ale namiesto toho dostaneme výnimku. 
object [1: 4] # Mal by sa rozdeliť postupnosť, ale namiesto toho dostaneme výnimku.

zhrnutie

S vyššie uvedenými informáciami môže príkladový program získať prístup k rôznym úrovniam priečinkov, položkám dotazu a informáciám o výbere. Použitím Parentatribútu v danej zložke sa môžeme pohybovať hierarchicky nahor bez toho, aby sme museli mať odkazy na miesta, ktoré sme už preskúmali.