Python如何检测被调用脚本内部启动的子进程是否已运行结束
实现方案
下面是三种不需要强制导入脚本B即可实现需求的思路,可根据实际场景选择:
方案1:PID轮询检测
- 脚本B启动耗时subprocess后,直接将子进程的
pid属性打印到标准输出 - 脚本A调用脚本B时捕获标准输出内容,拿到子进程的PID值
- 借助
psutil库调用psutil.Process(目标PID).is_running()轮询进程存活状态,轮询间隔建议设置为0.5~1s降低资源占用 - 轮询过程中GUI标签保持显示
processing...,检测到进程退出后更新标签内容即可
注意:如果担心PID被系统复用导致误判,可以额外校验进程的启动命令、名称字段是否匹配目标子进程
方案2:标记文件同步状态(实现最简单)
- 脚本B启动子进程后,在双方都能访问的公共目录下创建一个临时标记文件(比如
running_flag.tmp),子进程执行结束后立即删除该文件 - 脚本A只需轮询该标记文件是否存在,文件存在时保持
processing...显示,文件消失即代表子进程运行完成
该方案无额外依赖,也不需要调整两个脚本的导入关系,适合快速落地需求
方案3:修复导入问题直接获取进程对象
你之前导入脚本B失败大概率是因为脚本B的存储目录不在Python的默认模块搜索路径中,可以在导入前手动添加路径:
# 脚本A开头添加以下代码 import sys import os # 替换为脚本B实际所在的文件夹路径 sys.path.append(os.path.abspath("/path/to/directory/of/B")) # 之后即可正常导入B中的变量或函数 from B import long_process_p # 直接用poll()检测状态即可 while long_process_p.poll() is None: # 保持processing显示的逻辑 pass
内容的提问来源于stack exchange,提问作者dj dj
相关产品推荐
相关产品推荐

