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

如何在一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:51:03