Привет всем!
Пишу приложение на Python+GTK. Наблюдаю очень странный баг, который не проявляется на одном компе и проявляется на другом. На втором он не сразу стал проявляться, а появился только недавно. При этом код моего приложения не менялся, обновлений систем не было. На обоих машинах одинаковая Ubuntu 18.04.
Из приложения надо открыть обычный диалог выбора файла:
dialog = Gtk.FileChooserDialog("Dialog", self._gui_main_window, action=Gtk.FileChooserAction.OPEN)
print("New dialog!")
response = dialog.run()
...
При этом выполнение программы наглухо вешается на первой строке, т.е. ещё до вызова response = dialog.run() и даже print не отрабатывает. Через секунд 30 в консоль выводится сообщение:
Error creating proxy: Error calling StartServiceByName for org.gtk.vfs.UDisks2VolumeMonitor: Timeout was reached (g-io-error-quark, 24)
И всё... Дальше глухо висит, диалог так и не показывается, основное окно перестаёт перерисовывать себя при изменении размеров. Если нажать Ctrl+C, то главное окно продолжает висеть, хотя консоль освобождается. Убивается через обычный kill.
Что интересно, если приложение запускать
без всякой сессии, просто xterm и Xorg, то всё работает как надо, диалог открывается. А в полноценной сессии (пробовал GNOME и XFCE) случается описанный выше зависон.
Я погуглил и нашёл отдалённо похожее поведение:
https://gitlab.gnome.org/GNOME/gtk/issues/1066 тут в консоль выводится аналогичное сообщение. Но, у меня этот баг срабатывает только в одном приложении (на Python, которое я пишу), в других приложениях всё нормально. /etc/fstab не содержит сетевых монтирований.
Куда копать?
=== UPD ===Запустил с отладкой сообщений D-Bus. Перед зависанием вот что выводится в консоль:
GDBus-debug:Call:
<<<< ASYNC COMPLETE org.freedesktop.DBus.StartServiceByName() (serial 0)
FAILED: Timeout was reached
Как бы вообще отключить любое общение по D-Bus для GTK в рамках моего приложения? Мне оно нафиг не надо, как и UDisks2. У меня задача выбрать локальный файл.
=== UPD 2 ===Заработало после того, как убрал из переменной GTK_MODULES запись «appmenu-gtk-module».
Вот такое содержимое данной переменной в стандартной сессии:
GTK_MODULES=appmenu-gtk-module:appmenu-gtk-module:gail:atk-bridge
, при этом не работает. А вот так:
GTK_MODULES=gail:atk-bridge
- работает.
Пока не отмечаю задачу решённой, т.к. связь одного с другим непонятная.