GRAMPS on Windows
Сочинение на тему «как я провел лето» «как я запускал 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
Попытки совладать с этой проблемой заняли в общей сложности два дня, и я не буду пересказывать все испробованные варианты. Главное, что в итоге были обнаружены следующие магические приплясы с бубном, решившие проблему:
-
Скачать и установить модуль bsddb3 для Python — bsddb3-5.1.2.win32-py2.7.exe.
-
Перед запуском установки надо выставить файлу режим эмуляции Windows XP, иначе инсталляция падает с загадочной ошибкой.
-
Сам модуль для Python нам не понадобится, зато пригодятся идущие с ним утилиты для работы с файлами Berkeley DB. После установки утилиты лежат в %PYTHON_DIR%\bsddb3\utils.
-
-
Сделать 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" )
-
bsddb3 можно удалить.
После этого база наконец-то корректно открылась, и далее GRAMPS работал как часы.
В общем-то, happy end.
P.S. Танцев с бубном вокруг импорта базы можно избежать, если пользоваться стандартным импортом/экспортом базы в XML. Эх, если б я узнал о нем чуть раньше :)