Pygobject seems to malfunction when used from a Kodi addon
Kodi is an entertainment center program which allows "addons" written in Python. I have written an addon which makes use of pygobject, but it seems importing the gi module from the context of Kodi causes gi to malfunction. After a short discussion on the Grilo mailing list (URL below) (my addon uses Grilo), Bastien Nocera suggested I report a bug.
In short, the gi module does not seem to import properly on the second and subsequent imports. Each invocation of a Kodi addon causes a fresh run.
I wrote a simplified addon containing the following:
import gi
xbmc.log('1', level=xbmc.LOGERROR)
gi.require_version('Soup', '2.4')
xbmc.log('2', level=xbmc.LOGERROR)
gi.require_version('GLib', '2.0')
xbmc.log('3', level=xbmc.LOGERROR)
gi.require_version('Grl', '0.3')
xbmc.log('4', level=xbmc.LOGERROR)
from gi.repository import Soup
xbmc.log('5', level=xbmc.LOGERROR)
from gi.repository import GLib
xbmc.log('6', level=xbmc.LOGERROR)
from gi.repository import Grl
xbmc.log('7', level=xbmc.LOGERROR)
Kodi logged the following as I executed the addon twice. Notice that the addon prints 1--7 as expected on its first run, but the second run fails while executing the "from gi.repository import Soup" statement. I am not very familiar with libpython, but I wonder if something in pygobject relies on a full exit to clear state (e.g., library loads) whereas perhaps Kodi builds its Python interpreters in threads.
21:59:21.909 T:140704759109376 ERROR: 1
21:59:21.909 T:140704759109376 ERROR: 2
21:59:21.910 T:140704759109376 ERROR: 3
21:59:21.910 T:140704759109376 ERROR: 4
21:59:21.926 T:140704759109376 ERROR: 5
21:59:21.926 T:140704759109376 ERROR: 6
21:59:21.926 T:140704759109376 ERROR: 7
21:59:21.935 T:140706892663296 ERROR: GetDirectory - Error getting plugin://plugin.audio.grilo/
21:59:21.935 T:140706892663296 ERROR: CGUIMediaWindow::GetDirectory(plugin://plugin.audio.grilo/) failed
21:59:39.331 T:140706892663296 ERROR: Control 55 in window 10502 has been asked to focus, but it can't
21:59:39.363 T:140705272092416 ERROR: 1
21:59:39.363 T:140705272092416 ERROR: 2
21:59:39.363 T:140705272092416 ERROR: 3
21:59:39.363 T:140705272092416 ERROR: 4
21:59:39.372 T:140705272092416 ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
- NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS!
Error Type: <type 'exceptions.TypeError'>
Error Contents: Error when calling the metaclass bases
'NoneType' object is not callable
Traceback (most recent call last):
File "/home/mike/.kodi/addons/plugin.audio.grilo/addon.py", line 17, in <module>
from gi.repository import Soup
File "/usr/lib64/python2.7/site-packages/gi/importer.py", line 145, in load_module
importlib.import_module('gi.repository.' + dep.split("-")[0])
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/lib64/python2.7/site-packages/gi/importer.py", line 145, in load_module
importlib.import_module('gi.repository.' + dep.split("-")[0])
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/lib64/python2.7/site-packages/gi/importer.py", line 145, in load_module
importlib.import_module('gi.repository.' + dep.split("-")[0])
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/lib64/python2.7/site-packages/gi/importer.py", line 146, in load_module
dynamic_module = load_overrides(introspection_module)
File "/usr/lib64/python2.7/site-packages/gi/overrides/__init__.py", line 125, in load_overrides
override_mod = importlib.import_module(override_package_name)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/lib64/python2.7/site-packages/gi/overrides/GLib.py", line 228, in <module>
class Variant(GLib.Variant):
File "/usr/lib64/python2.7/site-packages/gi/types.py", line 324, in __init__
super(StructMeta, cls).__init__(name, bases, dict_)
TypeError: Error when calling the metaclass bases
'NoneType' object is not callable
-->End of Python script error report<--
Mailing list discussion: https://mail.gnome.org/archives/grilo-list/2018-April/msg00000.html