Skip to content

Commit 5f6ea36

Browse files
author
z.murodov
committed
cv(runtime): attempt absolute dlopen of libGL.so.1 from standard paths before soname; add glob scanning with RTLD_GLOBAL
1 parent db03dff commit 5f6ea36

2 files changed

Lines changed: 29 additions & 4 deletions

File tree

nixpacks.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Ensure Python is present for Nixpacks Python phase, plus native deps for OpenCV/MediaPipe
33
nixPkgs = ['python311', 'libGL', 'libglvnd', 'pkg-config', 'glib', 'zlib', 'mesa', 'xorg.libX11', 'xorg.libXext', 'xorg.libXrender']
44
cmds = [
5-
'apt-get update -y && DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1 libglvnd0 libglx-mesa0 libgl1-mesa-dri libglib2.0-0 libxext6 libxrender1 libxfixes3 libsm6 libxcb1 libxau6 libxdmcp6 libglx0'
5+
'apt-get update -y && DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1 libglvnd0 libglx-mesa0 libgl1-mesa-dri libglib2.0-0 libxext6 libxrender1 libxfixes3 libsm6 libxcb1 libxau6 libxdmcp6 libglx0 libx11-6 libx11-xcb1 libxrandr2 libxxf86vm1 libxdamage1 libxshmfence1 libdrm2 libexpat1'
66
]
77

88
[start]

src/cv/video_processor.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import asyncio
44
import os
55
import ctypes
6+
import glob
67

78
# Force CPU path for MediaPipe in headless servers (Railway)
89
os.environ.setdefault("MEDIAPIPE_DISABLE_GPU", "1")
@@ -21,13 +22,37 @@
2122
os.environ["LD_LIBRARY_PATH"] = _existing_ld
2223

2324
# Try to preload libGL to avoid 'libGL.so.1: cannot open shared object file'
24-
for _lib in ("libGL.so.1", "libGL.so"):
25+
# 1) Absolute candidates in common locations
26+
_gl_candidates = [
27+
"/usr/lib/x86_64-linux-gnu/libGL.so.1",
28+
"/lib/x86_64-linux-gnu/libGL.so.1",
29+
]
30+
for pattern in (
31+
"/usr/lib/x86_64-linux-gnu/libGL.so*",
32+
"/lib/x86_64-linux-gnu/libGL.so*",
33+
):
34+
_gl_candidates.extend(glob.glob(pattern))
35+
36+
_loaded_gl = False
37+
for path in _gl_candidates:
2538
try:
26-
ctypes.CDLL(_lib)
27-
break
39+
if os.path.exists(path):
40+
ctypes.CDLL(path, mode=getattr(ctypes, "RTLD_GLOBAL", 0))
41+
_loaded_gl = True
42+
break
2843
except OSError:
2944
continue
3045

46+
# 2) Fallback to sonames if absolute paths failed
47+
if not _loaded_gl:
48+
for _lib in ("libGL.so.1", "libGL.so"):
49+
try:
50+
ctypes.CDLL(_lib, mode=getattr(ctypes, "RTLD_GLOBAL", 0))
51+
_loaded_gl = True
52+
break
53+
except OSError:
54+
continue
55+
3156
# Try to import computer vision libraries
3257
try:
3358
import cv2

0 commit comments

Comments
 (0)