Как создать типизированные константы для API OneNote COM в python?

Я хочу использовать UpdatePageContent Документация по методу COM через питон win32com модуль. На данный момент я могу получить иерархию, содержимое страницы и т. Д. Я даже могу корректно манипулировать XML для подготовки изменений (протестировано с использованием интерфейса MATLAB COM).

Это минимальный пример того, что я пытаюсь сделать:

    import win32com
    from bs4 import BeautifulSoup
    oneNoteApp = win32com.client.Dispatch('OneNote.Application')
    pageID = '{603BD3F0-4DAB-4E5B-8E28-28CA0F2B0C83}{1}{B0}' # from GetHierarchy
    content = oneNoteApp.GetPageContent(pageID)
    soup = BeautifulSoup(content, 'xml')
    # ... modify xml (changes are valid and tested using MATLAB)
    oneNoteApp.UpdatePageContent(soup) # problem is here

Теперь эта последняя строка хитрая. Согласно документации COM все остальные аргументы UpdatePageContent являются необязательными. Однако, похоже, что ошибка в привязках win32com автоматически генерирует. Вызывается как в примере, я получаю ошибку, как

    C:\...\Temp\gen_py\3.4\0EA692EE-BB50-4E3C-AEF0-356D91732725x0x1x0.py in UpdatePageContent(self, bstrPageChangesXmlIn, dateExpectedLastModified, xsSchema, force)
        240     _prop_map_get_ = {
        241                 "COMAddIns": (104, 2, (9, 0), (), "COMAddIns", None),
    --> 242                 "Dummy1": (102, 2, (11, 0), (), "Dummy1", None),
        243                 "LanguageSettings": (105, 2, (9, 0), (), "LanguageSettings", None),
        244                 # Method 'Windows' returns object of type 'Windows'

    ValueError: astimezone() cannot be applied to a naive datetime

Итак ExpectedDateLastModified Аргумент по умолчанию, кажется, не работает. Передача явного нуля, как oneNoteApp.UpdatePageContent(content, 0) дает еще одну ошибку.

Другие вещи, которые я пробовал до сих пор, это создание pywintypes.TimeType я с тем же значением, что и DateTime.minValue постоянная от времени выполнения.net, но отсутствует информация о часовом поясе (astimezone() ошибка).

Я пробовал несколько способов добавить информацию о часовом поясе, в том числе передать ее в pywintypes.TimeType конструктор и использование datetime (кажется, что он не может быть автоматически преобразован сгенерированными привязками COM).

Другой способ - использовать явные метки времени, анализируя их из xml, но те используют миллисекунды, которые datetime модуль имеет проблемы с.

Как я могу создать допустимый тип времени ноль для передачи в интерфейс COM? В MATLAB я мог просто передать буквальный 0.

РЕДАКТИРОВАТЬ: я знаю об этом git-репо с соответствующим кодом и несколько сообщений в блоге в Интернете. Код также вызывает onenote COM с литералом 0, но я не смог заставить пакет даже загрузить интерфейс COM.

РЕДАКТИРОВАТЬ 2: у меня работает onepy, и у него та же проблема.

1 ответ

Тем временем этот вопрос старый, но тем не менее я хочу показать рабочее решение, которое я нашел, пытаясь достичь чего-то подобного. Проблема в том, что вам нужна дата с учетом часового пояса, чтобы позвонить astimezone() это то, что API делает по какой-то причине. Чтобы сделать дату с учетом часового пояса, вы должны сначала локализовать ее. Например, вы можете изменить свой код следующим образом:

import datetime
import pytz

...
date = pytz.utc.localize(datetime.datetime(year = 1899, month = 12, day = 30))
oneNoteApp.UpdatePageContent(soup, date)

Актуальной проблемой является подходящая дата для перехода на UpdatePageContent(), Странный выбор в моем ответе подробно описан здесь.

Другие вопросы по тегам