如何在一个Python文件中运行另一Python文件并在设定时间后终止
可行实现方案
核心思路是通过subprocess模块创建独立子进程运行目标Python文件,利用子进程独立的生命周期实现超时终止,完全避免模块导入方式共享主进程上下文、无法单独终止的问题。
具体实现步骤
- 使用
subprocess.Popen非阻塞启动目标脚本,不要用默认阻塞的subprocess.run方法,方便后续控制子进程生命周期 - 调用
communicate(timeout=指定时长)等待子进程执行完成,捕获TimeoutExpired异常触发终止逻辑 - 超时后先调用
terminate()向子进程发送终止信号,再调用wait()回收进程资源,避免出现僵尸进程;Windows平台下可替换为kill()强制终止卡死的进程
示例代码
import subprocess import sys def run_target_script(script_path: str, timeout_seconds: int) -> tuple[int, str, str]: # 启动独立子进程,使用和主进程相同的Python解释器 proc = subprocess.Popen( [sys.executable, script_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) try: # 超时时间内等待脚本执行完成,读取输出 stdout, stderr = proc.communicate(timeout=timeout_seconds) return proc.returncode, stdout, stderr except subprocess.TimeoutExpired: # 超时后终止子进程并回收资源 proc.terminate() proc.wait() # 可选择读取超时前产生的输出 stdout, stderr = proc.communicate() raise TimeoutError(f"目标脚本运行超过{timeout_seconds}秒,已强制终止") from None # 调用示例:运行同目录下的target.py,最多等待3秒 if __name__ == "__main__": try: return_code, stdout_content, stderr_content = run_target_script("target.py", 3) print(f"脚本执行完成,返回码:{return_code}") print(f"标准输出:\n{stdout_content}") print(f"错误输出:\n{stderr_content}") except TimeoutError as e: print(e)
额外说明
- 子进程和主进程完全独立,不管目标脚本是在等待输入还是陷入死循环,都可以被正常终止,不会影响主进程运行
- 不需要对目标Python文件做任何修改,适配性更高
- 不需要捕获子进程输出时,可以将
stdout和stderr参数设置为subprocess.DEVNULL,减少不必要的资源占用
内容的提问来源于stack exchange,提问作者Jonathan-0101
相关产品推荐
相关产品推荐

