You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在main.py执行时通过ops.py跟踪其退出状态?

可行解决方案

方案1:保持ops.py作为启动入口(最直接)

你之前在main.py里调用ops的方式会触发循环启动(main启动ops,ops又启动main),这是无效的。正确逻辑是始终通过ops.py启动main.py,让ops作为父进程自然捕获main的退出状态,这也是最简洁的监控方式。

如果要限制必须通过ops启动main,可以在main.py开头加简单校验:

# main.py 开头添加
import sys
import os

if __name__ == "__main__":
    # 校验父进程是否为ops.py(跨平台场景可忽略此校验)
    try:
        parent_cmd = open(f"/proc/{os.getppid()}/cmdline").read()
        if "ops.py" not in parent_cmd:
            print("请通过ops.py启动本程序", file=sys.stderr)
            sys.exit(1)
    except:
        pass

方案2:直接在main.py内记录退出状态

如果不需要单独的监控脚本,可直接在main.py内处理退出状态的记录,省去跨脚本调用的麻烦:

# main.py
import sys
import traceback

def main_logic():
    # 此处编写你的业务代码
    print("main.py运行中...")
    # 模拟失败场景:sys.exit(1)

if __name__ == "__main__":
    exit_code = 0
    try:
        main_logic()
    except Exception as e:
        print(f"程序出错:{e}", file=sys.stderr)
        traceback.print_exc()
        exit_code = 1
    finally:
        print(f"main.py退出状态:{exit_code}")
        # 也可写入日志文件持久化记录
        with open("main_exit.log", "a") as f:
            f.write(f"{exit_code}\n")
        sys.exit(exit_code)

方案3:使用退出钩子(atexit)

通过Python内置的atexit模块注册退出回调,不管程序是正常结束还是异常退出(强制杀死除外),都会自动执行状态记录:

# main.py
import sys
import atexit

exit_code = 0

def record_exit_status():
    print(f"main.py退出状态:{exit_code}")
    with open("exit_status.log", "a") as f:
        f.write(f"退出状态:{exit_code}\n")

# 注册退出回调
atexit.register(record_exit_status)

def main():
    global exit_code
    try:
        # 业务代码逻辑
        print("执行业务逻辑")
        # 模拟异常:raise ValueError("测试错误")
    except Exception as e:
        print(f"错误:{e}", file=sys.stderr)
        exit_code = 1
        sys.exit(exit_code)

if __name__ == "__main__":
    main()

方案4:启动独立监控进程(适合必须分离脚本的场景)

如果一定要保留ops.py作为独立监控脚本,可让main.py启动ops并传递自身PID,让ops专门监控该PID的退出状态:

首先修改ops.py:

# ops.py
import sys
import psutil  # 需先安装:pip install psutil

def monitor_process(pid):
    try:
        process = psutil.Process(pid)
        process.wait()  # 等待目标进程结束
        exit_status = process.returncode
        print(f"main.py(PID {pid})退出状态:{exit_status}")
        with open("monitor.log", "a") as f:
            f.write(f"PID {pid} 退出状态:{exit_status}\n")
    except psutil.NoSuchProcess:
        print(f"进程 {pid} 不存在", file=sys.stderr)
    except Exception as e:
        print(f"监控错误:{e}", file=sys.stderr)

def main():
    if len(sys.argv) != 2:
        print("请传入要监控的进程PID", file=sys.stderr)
        sys.exit(1)
    monitor_process(int(sys.argv[1]))

if __name__ == "__main__":
    main()

然后修改main.py,启动后台监控进程:

# main.py
import sys
import subprocess
import os

def main():
    # 启动ops.py并传递当前进程的PID
    subprocess.Popen(
        [sys.executable, "ops.py", str(os.getpid())],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    # 此处编写你的业务代码
    print("main.py运行中...")
    # 模拟退出:sys.exit(0) 或 sys.exit(1)

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者python_craze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:44:57