Как создать типизированные константы для 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()
, Странный выбор в моем ответе подробно описан здесь.