Python and COM

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

люди COM эмуляция
питон

Резюме

Я играл с Python и COM в Windows 2000. Хотя встроенная справка в PythonWin действительно способна объяснить необычные детали COM и различные общие интерфейсы, которые можно найти, действительно нужно искать конкретный интерфейс -"Информация". Существует несколько источников такой информации, и цель этого документа - помочь читателям использовать такие источники или даже помочь им избежать необходимости использовать таких источников.

Предпосылки

Возможно, самый простой способ получить Python для Windows - это перейти на ActiveState и загрузить пакет ActivePython. Вы также можете посетить сайт Python, загрузить Python (см. Страницу поддержки Python для Windows), а затем искать расширения win32all (подробнее см. На странице Python для Windows Extensions от Марка Хаммонда). Конечно, я просто сделал то, что было проще всего!

Для приведенных ниже действий вам может потребоваться дополнительное программное обеспечение, такое как Microsoft Outlook, хотя вам, вероятно, не будет интересно играть с Outlook и Exchange, если у вас их нет.

Outlook и Exchange

Одна из предположительно раздражающих вещей о Microsoft Exchange Server - это то, как она скрывает множество внутренних компонентов и требует достаточного количества программ, чтобы вы могли перейти к таким вещам, как списки контактов и адресные книги. Интересно отметить, что можно найти много советов по импорту адресных книг других систем в Exchange, но не так много, чтобы вернуть адреса и что-то еще. К счастью, Microsoft предоставляет достаточно API, чтобы стать его собственным «анулированием», поскольку этот API обеспечивает разумный механизм доступа к внутренним компонентам для извлечения заблокированной информации.

Во всяком случае, это привело к тому, что я написал небольшую программу для доступа к спискам сообщений, контактам и встречам Exchange через Outlook. Если ваша организация работает с Exchange, вам, вероятно, также потребуется запустить Outlook, и поэтому автоматизация Outlook является действенной стратегией при доступе к Exchange. Одной из альтернатив для доступа к определенным типам информации является использование API служб Active Directory и/или LDAP, но я не был успешным в этой области.

Пример: Outlook Explorer

Примечание. Перед запуском этого приложения создайте «Библиотеку объектов Microsoft Outlook 9.0» с помощью утилиты «COM Makepy» (см. «Инициализация типов библиотек» ).

Программа Outlook Explorer (которую вы можете загрузить ) использует MAPI (Messaging API) в Outlook для доступа к почтовым ресурсам. Вы можете перемещаться по иерархии объектов с помощью простого интерфейса командной строки и извлекать информацию в существующие каталоги в файловой системе.

мероприятия

Инициализация типов библиотек

Хотя пакет win32com предоставляет несколько способов запросов и доступа к COM-интерфейсам с небольшим количеством очевидных различий между ними (при условии, что вы знаете интерфейс), обычно это удобно при экспериментировании (особенно в PythonWin со своей функцией завершения атрибута), чтобы узнать, какие методы И свойства действительно доступны для данного интерфейса. Здесь полезно использовать утилиту COM Makepy, доступную из меню «Инструменты» в PythonWin. Выбирая конкретную библиотеку типов и создавая интерфейсы Python с помощью этого инструмента, в PythonWin появляется гораздо больше информации, и случайное исследование объектных интерфейсов становится намного проще.

Написание Клиентов

Весь клиентский доступ COM начинается со следующего оператора в вашей программе Python:

  Import win32com.client 

Как правило, ваша программа будет пытаться найти объект для использования. Например:

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

Затем этот объект будет ссылаться на «COM-объект», который может иметь методы, вызываемые на нем, и его атрибуты рассматриваются как любой другой объект Python, хотя мы можем «автоматизировать» приложение Windows (например, Outlook), когда мы это делаем.

Поиск корня иерархии объектов

Как только у нас есть ссылка на объект, который «автоматизирует» приложение, следующая задача - найти корень иерархии объектов, где хранится вся интересная информация. С помощью объекта автоматизации приложения Outlook самый простой способ добиться этого - ввести пространство имен MAPI:

  ns = object.GetNamespace("MAPI") 

Это позволяет нам получить доступ к иерархии «папка», доступной в Outlook. Вы можете сами увидеть эту иерархию, открыв Outlook вручную и создавая меню папок (обычно это «Входящие» или «Outlook сегодня» или что-то еще).

Теперь объект ns можно рассматривать как обычный объект Python со специальными атрибутами, ведущими к другим частям иерархии объектов.

Папки и элементы

Программа Outlook Explorer использует некоторые причудливые трюки Python для доступа к атрибутам «COM-объектов», которые она ссылается, но по существу она просматривает папки и элементы, доступные в каждом объекте:

# Обратитесь к папкам внутри данного объекта...
ns_list = ns.Folders
# Обратитесь к элементам внутри данного объекта...
ns_list = ns.Items

Запрос интерфейсов

Теперь, как можно исследовать детали каждого объекта? Например, как получить доступ к имени папки? Во-первых, это помогает узнать интерфейс, который предоставляет объект, и эту информацию можно найти в нескольких местах:

Надеемся, однако, что объект, к которому вы обращаетесь, достаточно хорошо известен PythonWin, чтобы разрешить на нем какой-то атрибут или метод. Вам нужно только прибегнуть к описанному выше, когда требуется более подробное знание метода или атрибута. Вы также можете попробовать что-то вроде этого:

dir(object.__class__)

Доступ к имени папки можно получить следующим образом:

object.Name # Where object refers to a folder.

Последовательности

Конечно, в папке может быть много папок или элементов. Как мы проходим эту коллекцию? Рекомендуемый способ - это, возможно, использовать нотацию индекса последовательности Python, но будьте осторожны: индекс первого элемента, по-видимому, не является стандартным и может быть 0 или 1. В объектной модели Outlook первый элемент в таких последовательностях действительно индексируется на 1, что приводит к Следующие наблюдения:

Для доступа к объектам, которые ведут себя как последовательности, могут использоваться следующие механизмы Python:

object[1]   # Первый элемент.
len(object) # Возвращает количество элементов.

Следующие механизмы, похоже, не работают:

object[-1]  # Должен быть последний элемент, но вместо этого мы получаем исключение.
object[1:4] # Должен срезать последовательность, но вместо этого мы получаем исключение.

Резюме

С приведенной выше информацией пример программы может обращаться к различным уровням папок, элементам запроса и извлекать информацию. Используя атрибут Parent в любой заданной папке, мы можем перемещаться вверх по иерархии, не требуя ссылки на те места, которые мы уже изучили.

Переводы этого документа