Spaces:
Sleeping
Sleeping
| set -euo pipefail | |
| # Some hardened environments (e.g., newer glibc / gVisor) refuse to dlopen() | |
| # shared objects that request an executable stack. Certain PyTorch builds can | |
| # ship with this flag set on libtorch_cpu.so. Clearing it fixes torch import. | |
| python - <<'PY' | |
| import os, site, glob | |
| paths = [] | |
| for fn in (getattr(site, "getsitepackages", None), getattr(site, "getusersitepackages", None)): | |
| if fn is None: | |
| continue | |
| try: | |
| p = fn() | |
| if isinstance(p, str): | |
| paths.append(p) | |
| else: | |
| paths.extend(list(p)) | |
| except Exception: | |
| pass | |
| targets = [] | |
| for p in paths: | |
| targets += glob.glob(os.path.join(p, "torch", "lib", "libtorch_cpu.so")) | |
| targets += glob.glob(os.path.join(p, "torch", "lib", "libtorch_python.so")) | |
| print("\n".join(sorted(set(targets)))) | |
| PY | |
| TARGETS="$(python - <<'PY' | |
| import os, site, glob | |
| paths = [] | |
| for fn in (getattr(site, "getsitepackages", None), getattr(site, "getusersitepackages", None)): | |
| if fn is None: | |
| continue | |
| try: | |
| p = fn() | |
| if isinstance(p, str): | |
| paths.append(p) | |
| else: | |
| paths.extend(list(p)) | |
| except Exception: | |
| pass | |
| targets = [] | |
| for p in paths: | |
| targets += glob.glob(os.path.join(p, "torch", "lib", "libtorch_cpu.so")) | |
| targets += glob.glob(os.path.join(p, "torch", "lib", "libtorch_python.so")) | |
| print(" ".join(sorted(set(targets)))) | |
| PY | |
| )" | |
| if [[ -z "${TARGETS}" ]]; then | |
| echo "postBuild: no torch .so targets found yet (torch may not be installed)." | |
| exit 0 | |
| fi | |
| for so in ${TARGETS}; do | |
| if [[ -f "${so}" ]]; then | |
| echo "postBuild: clearing execstack on ${so}" | |
| # If it fails (e.g. already clear), continue. | |
| patchelf --clear-execstack "${so}" || true | |
| fi | |
| done | |