Librería que se importa bien en consola, pero dentro de OBS tira error

Buen día, gente. Estoy tratando de ejecutar un código para enviar y recibir mensajes OSC (OpenSoundControl) desde y hacia OBS (OpenBoradcasterSoftware). La librería que quiero usar es python-osc. Es simple y funciona bien… desde la consola. Desde OBS, se puede importar la parte de cliente, para enviar mensajes… pero para recibir, cuando hago from pythonosc import osc_server, salta este error:

3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0]
Traceback (most recent call last):
File “/home/mario/videoconfestejo/obs-scripts/OSCOBS_videoconfestejo.py”, line 18, in
from pythonosc import osc_server
File “/home/mario/.local/lib/python3.7/site-packages/pythonosc/osc_server.py”, line 4, in
import asyncio
File “/usr/lib/python3.7/asyncio/init.py”, line 8, in
from .base_events import *
File “/usr/lib/python3.7/asyncio/base_events.py”, line 39, in
from . import events
File “/usr/lib/python3.7/asyncio/events.py”, line 14, in
import contextvars
File “/usr/lib/python3.7/contextvars.py”, line 1, in
from _contextvars import Context, ContextVar, Token, copy_context
ImportError: /usr/lib/python3.7/lib-dynload/_contextvars.cpython-37m-x86_64-linux-gnu.so: undefined symbol: PyContext_Type

Como se ve al principio, le hice un sys.version para saber la versión de Python. Es la misma que tengo en mi sistema (Debian 10 Buster). Pero desde la consola funciona perfecto y desde OBS salta el error.

Cabe aclarar que OBS lo compilé acá mismo.

Lo reporté en el github de python-osc y en obs-studio. En este útlimo alguien me dijo:

Regardless of the version of python installed on your system OBS documentation clearly states that version 3.6 is the only one supported
Python/Lua Scripting — OBS Studio 30.0.0 documentation
The version match is defined at compile time as swig is used for interop between C code and python

Pero sigue siendo confuso para mí. Lo compilé acá, ni siquiera tengo la versión 3.6 de Python instalada.

¿Qué se puede hacer?

  1. Justamente hace unas semanas atrás, leyendo la documentación de OBS Studio sobre cómo hacer plugins en Python para OBS y cómo hacer testing de los mismos, me topé con que (por el momento, supongo) soporta sólo Python 3.6.

Como respondieron del proyecto, parece que la gente de OBS hace una versión especial del intérprete de Python. Por ejemplo, lo que llegué a determinar en su momento fue: en mi S.O. tengo a nivel global activado Python 3.8.2, por otro lado el intérprete que utiliza OBS se encuentra en el directorio /usr/lib/obs-scripting:

obs-scripting
├── obslua.so
├── obspython.py
└── _obspython.so

Ejecutando lo siguiente:

$ strings _obspython.so | rg '3\.\d+'`
libpython3.6m.so.1.0
GCC_3.0
GLIBCXX_3.4.18
GLIBCXX_3.4
CXXABI_1.3.5
GLIBC_2.3.4
libpython3.6m
  1. Por otro lado, el soporte para Context Variables fue agregado en Python 3.7. Podrías probar utilizando un backport de contextvars para Python 3.6

Tal vez alguien con más experiencia con OBS + Python pueda aportar más al respecto. Éxitos y saludos.

Qué bueno que entendés qué está sucediendo… porque a mí se me hace imposible.

Está buena la idea de probar con ese backport, pero necesito un poco más de info. ¿Tengo que instalar Python 3.6 para instalar ese backport? ¿Tengo que compilar OBS de nuevo cambiando algo en el CMake?

Gracias mil.

Bueno, el problema se puede resolver según lo que me dijeron en el Pull Request #3335 (no pongo link porque soy nuevo y me van a bloquear el mensaje) en el Github de OBS. El PR me genera un Segment Fault, pero me dijeron que cargue D_PRELOAD=/path/libpython3.7.so antes de ejecutar OBS. La discución que tienen en el hilo del Pull Request no entiendo ni goma… pero lo que me dijo, lo hice y funciona.