如何在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
相关产品推荐
相关产品推荐

