Короче сам нашел.
На самом деле главный цикл обеспечивается GLib- ом. Собственно с ним я уже работал когда использовал таймеры.
Оказалось - таймер это не единственный источник, который может инициировать колбеки из главного цикла.
Есть еще такая штука как вотчеры потока, а конкретнее
lazka.github.io/pgi-docs/GLib-2.0/functions.html#G...
Т.е. задаем какой поток и на какое условие мониторить (мне нужно было на событие доступности данных для чтения - это GLib.IOCondition.IN), а также указывается коллбек функция и данные которые ей передать в параметрах.
Приоритет по умолчанию это - 0.
Нюансы:
1. В колбек передается первым параметром канал, вторым условие, которое было поймано, и только третьим данные (ес даннли они были указаны при создании вотчера).
2. Колбек функция должна возвращать True если нужно продолжать мониторить, если вернуть False/None то вотчер удаляется из источников событий для главного цикла.
Вот что у меня получилось:
...
def stderr_reader(pipe, _):
data = pipe.readline()
if data != "":
logger.debug(data[:-1])
return True
proc = Popen([external_prog, cfgFile],
bufsize=1,
universal_newlines=True,
stdin=PIPE, stderr=PIPE)
io_add_watch(proc.stderr, 0, IOCondition.IN, stderr_reader)