Files
insar-management-system-v2/backend/app/services/envi_runner_cli.py
T

86 lines
2.8 KiB
Python

"""CLI runner for ENVI workflows in a subprocess.
Usage (called by job_handlers.py):
python -m backend.app.services.envi_runner_cli \
--workflow import \
--root-dir Z:/Test_data/Test_IDL_1 \
[--num-to-process 0] \
[--timeout-seconds 14400]
Outputs a single JSON line to stdout on success.
Errors go to stderr with non-zero exit code.
"""
from __future__ import annotations
import argparse
import json
import sys
from ..config import ensure_project_env_loaded
def _parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Run ENVI/SARscape workflow in isolated process."
)
parser.add_argument(
"--workflow",
required=True,
choices=["import", "dinsar", "dinsar_custom"],
)
parser.add_argument("--root-dir", required=False)
parser.add_argument("--task-dir", required=False)
parser.add_argument("--output-dir", required=False)
parser.add_argument("--source-root", required=False)
parser.add_argument("--num-to-process", type=int, default=0)
parser.add_argument("--timeout-seconds", type=int, default=None)
parser.add_argument("--job-id", type=str, default=None)
parser.add_argument("--run-key", type=str, default=None)
parser.add_argument("--profile-code", type=str, default=None)
return parser.parse_args()
def main() -> int:
ensure_project_env_loaded()
args = _parse_args()
try:
from .envi_service import run_single_task_workflow, run_workflow
if args.task_dir:
if not args.output_dir:
raise ValueError("--output-dir is required when --task-dir is used.")
record = run_single_task_workflow(
workflow=args.workflow,
task_dir=args.task_dir,
output_dir=args.output_dir,
source_root=args.source_root,
timeout=args.timeout_seconds or 14400,
job_id=args.job_id,
run_key=args.run_key,
profile_code=args.profile_code,
)
else:
if not args.root_dir:
raise ValueError("--root-dir is required when --task-dir is not used.")
record = run_workflow(
workflow=args.workflow,
root_dir=args.root_dir,
num_to_process=args.num_to_process,
timeout=args.timeout_seconds or 14400,
job_id=args.job_id,
)
print(json.dumps(record, ensure_ascii=False))
return 0
except Exception as exc:
err = {
"ok": False,
"error": str(exc),
"workflow": args.workflow,
}
print(json.dumps(err, ensure_ascii=False), file=sys.stderr)
return 1
if __name__ == "__main__":
raise SystemExit(main())