Source code for deeprm.inference.inference_preprocess
"""Wrapper that uses a C++ preprocessing binary when available."""
from __future__ import annotations
import argparse
import os
import subprocess
from pathlib import Path
from typing import List
from deeprm.inference import inference_preprocess_python as py_prep
from deeprm.utils.logging import get_logger
log = get_logger(__name__)
[docs]
def add_arguments(parser: argparse.ArgumentParser) -> None:
"""Add CLI arguments, mirroring the Python preprocessing module."""
py_prep.add_arguments(parser)
parser.add_argument(
"--preprocess-bin",
type=str,
default=None,
help="Path to accelerated preprocessing binary (optional)",
)
DEFAULT_BIN = os.path.join(Path(__file__).parent.resolve(), "deeprm_preprocess")
def _args_to_cmd(args: argparse.Namespace) -> List[str]:
cmd: List[str] = []
for key, value in vars(args).items():
if key == "preprocess_bin":
continue
opt = f"--{key.replace('_', '-')}"
if isinstance(value, bool):
if value:
cmd.append(opt)
else:
cmd.extend([opt, str(value)])
return cmd
[docs]
def main(args: argparse.Namespace) -> int:
bin_path = args.preprocess_bin or os.environ.get("DEEPRM_PREPROCESS_BIN") or DEFAULT_BIN
## Check executable permissions
if not os.path.isfile(bin_path):
log.warning("Preprocessing binary not found at %s", bin_path)
else:
if not os.access(bin_path, os.X_OK):
log.warning("Preprocessing binary at %s is not executable", bin_path)
try:
os.chmod(bin_path, os.stat(bin_path).st_mode | 0o111)
log.info("Setting executable permissions for %s", bin_path)
except Exception as exc:
log.warning("Failed to set executable permissions: %s", exc)
cmd = [str(bin_path)] + _args_to_cmd(args)
try:
log.info("Attempting to use accelerated preprocessing binary: %s", bin_path)
subprocess.run(cmd, check=True)
except (FileNotFoundError, subprocess.CalledProcessError) as exc:
log.warning("Falling back to Python preprocessing: %s", exc)
py_prep.main(args)
return 0