Алексей Владыкин


GRAMPS on Windows

28 августа 2011

Сочинение на тему «как я провел лето» «как я запускал GRAMPS на Windows 7».

В посте описаны подводные камни, с которыми пришлось столкнуться при установке и запуске GRAMPS на Windows 7, а также при открытии в нём базы, скопированной из GRAMPS под Linux.

Установка

Установка GRAMPS прошла относительно гладко. Поскольку я выбрал минимальный инсталлятор GRAMPS, то все зависимости надо было ставить отдельно. Проблем с этим не возникло. Разве что я сначала поставил 64-битный Python 3.2.1, а потом обнаружил в документации GRAMPS, что, во-первых, Python 3.x не поддерживается, а во-вторых, Python должен быть обязательно 32-битный. Пришлось снести 3.2.1 и поставить 2.7.2.

Вот полный список установленного софта в порядке инсталляции:

Первый запуск, или «Как это сказать по-русски?»

Радостно потирая руки, я выбрал в меню появившийся пункт GRAMPS 3.3.0-1 и…​ ничего не произошло. GRAMPS не запустился, и даже никак не ругнулся. Вообще ничего. С GRAMPS (locale) 3.3.0-1 то же самое: никаких признаков жизни.

Вскрытие этих ярлыков показало, что они оба в конечном итоге запускают команду

"C:\Program Files (x86)\Python 2.7.2\pythonw.exe" ^
    "C:\Program Files (x86)\Gramps 3.3.0\gramps.py"

Этот pythonw.exe известен тем, что, в отличие от python.exe, не открывает окно терминала, а следовательно все ошибки, выводимые программой в stderr, не отображаются. Замена pythonw.exe на python.exe в вызываемой команде позволила увидеть ошибку, из-за которой ничего не запускалось:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Gramps 3.3.0\gramps.py", line 49, in <module>
    from gen.mime import mime_type_is_defined
  File "C:\Program Files (x86)\Gramps 3.3.0\gen\mime\__init__.py", line 27, in <module>
    from _pythonmime import get_description, get_type, mime_type_is_defined
  File "C:\Program Files (x86)\Gramps 3.3.0\gen\mime\_pythonmime.py", line 34, in <module>
    mimetypes.add_type('application/x-gramps','.grdb')
  File "C:\Program Files (x86)\Python 2.7.2\lib\mimetypes.py", line 344, in add_type
    init()
  File "C:\Program Files (x86)\Python 2.7.2\lib\mimetypes.py", line 355, in init
    db.read_windows_registry()
  File "C:\Program Files (x86)\Python 2.7.2\lib\mimetypes.py", line 259, in read_windows_registry
    for ctype in enum_types(mimedb):
  File "C:\Program Files (x86)\Python 2.7.2\lib\mimetypes.py", line 249, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 0: invalid continuation byte

Здесь GRAMPS пытается зарегистрировать в реестре свои типы файлов при помощи стандартной библиотеки mimetypes. А она в свою очередь пытается зачитать из реестра все содержимое ветки HKEY_CLASSES_ROOT/MIME/Database/Content Type и падает на перекодировке полученного из реестра значения.

Я открыл regedit и с удивлением обнаружил в указанной ветке реестра с десяток русскоязычных ключей вида аудио/x-mp3 и видео/3gpp. Происходение их остается загадкой, но предполагаю, что переводчики какой-то из установленных в системе программ немного перестарались и перевели программные ресурсы вроде названий MIME-типов. Кто знает, что они там еще напереводили…​

После удаления некорректных ключей из реестра GRAMPS радостно запустился.

Импорт базы, или пляски с бубном

GRAMPS под Windows хранит базы в директории %USERPROFILE%\AppData\Roaming\gramps\grampsdb. И я предполагал, что, скопировав туда свою базу, я сразу смогу ей воспользоваться. Но все оказалось не так просто.

Залив туда свою базу и перезапустив GRAMPS, я действительно увидел ее в диалоге выбора баз. Но при попытке ее открыть получил сообщение об ошибке:

15282: ERROR: dbloader.py: line 316: dbloader: read_file: DbEnvironmentError detected

Против этой напасти помогло удаление из моей базы файлов log.*. Подозрение пало на эти файлы из-за того, что в них содержались абсолютные пути, имевшие место на исходной линуксовой машине, но совершенно некорректные в новом окружении. Не удивительно, что от этого у bsddb сразу срывало крышу.

После удаления файлов загрузка базы стала падать с новой ошибкой:

12417: ERROR: dbloader.py: line 93: Invalid argument --
    C:\Users\AV\AppData\Roaming\gramps\grampsdb\48ed2de1\meta_data.db: unexpected file type or format

Попытки совладать с этой проблемой заняли в общей сложности два дня, и я не буду пересказывать все испробованные варианты. Главное, что в итоге были обнаружены следующие магические приплясы с бубном, решившие проблему:

  1. Скачать и установить модуль bsddb3 для Pythonbsddb3-5.1.2.win32-py2.7.exe.

    • Перед запуском установки надо выставить файлу режим эмуляции Windows XP, иначе инсталляция падает с загадочной ошибкой.

    • Сам модуль для Python нам не понадобится, зато пригодятся идущие с ним утилиты для работы с файлами Berkeley DB. После установки утилиты лежат в %PYTHON_DIR%\bsddb3\utils.

  2. Сделать dump & load всех файлов базы следующим батником:

    @echo off
    for %%f in (*.db) do (
        "C:\Program Files (x86)\Python 2.7.2\bsddb3\utils\db_dump.exe" "%%f" >"%%f.dump"
        del "%%f"
        "C:\Program Files (x86)\Python 2.7.2\bsddb3\utils\db_load.exe" -f "%%f.dump" "%%f"
    )
  3. bsddb3 можно удалить.

После этого база наконец-то корректно открылась, и далее GRAMPS работал как часы.

В общем-то, happy end.

P.S. Танцев с бубном вокруг импорта базы можно избежать, если пользоваться стандартным импортом/экспортом базы в XML. Эх, если б я узнал о нем чуть раньше :)

К оглавлению блога