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

Python循环调用subprocess.run()的执行机制及验证方法问询

subprocess.run循环执行命令的机制说明与验证方法

执行机制说明

在你提供的代码中,subprocess.run()默认是阻塞式串行执行:程序会等待当前命令对应的子进程完全执行完毕(退出)后,才会启动循环中的下一个命令,不会同时运行多个命令。

这是因为subprocess.run()的wait参数默认值为True,该参数控制是否等待子进程完成。当wait=True时,父进程会暂停执行,直到子进程结束并返回退出状态码。

验证机制的最佳方法

方法1:带延迟的时间戳输出测试

通过给命令添加延迟和时间戳,直观观察执行顺序和间隔:

import subprocess

lst = [
    'echo "命令1启动: $(date +%H:%M:%S)"; sleep 2; echo "命令1结束: $(date +%H:%M:%S)"',
    'echo "命令2启动: $(date +%H:%M:%S)"; sleep 2; echo "命令2结束: $(date +%H:%M:%S)"',
    'echo "命令3启动: $(date +%H:%M:%S)"'
]

for command in lst:
    subprocess.run(command, shell=True)

运行后会看到:命令1启动→等待2秒→命令1结束→命令2启动→等待2秒→命令2结束→命令3启动,完全按顺序串行执行。

方法2:进程ID与系统进程查看验证

在命令中输出进程ID,同时结合系统工具查看进程存活状态:

import subprocess

lst = [
    'echo "命令1 PID: $$"; sleep 3',
    'echo "命令2 PID: $$"; sleep 3'
]

for command in lst:
    subprocess.run(command, shell=True)

运行时,用系统工具(如Linux的ps aux | grep <PID>、Windows任务管理器)查看会发现:同一时间只有一个子进程在运行,前一个进程结束后,后一个才会启动。

方法3:修改wait参数对比并行效果

将wait设为False,可以看到并行执行的差异,以此反向验证默认的串行机制:

import subprocess

lst = [
    'echo "命令1启动: $(date +%H:%M:%S)"; sleep 2; echo "命令1结束: $(date +%H:%M:%S)"',
    'echo "命令2启动: $(date +%H:%M:%S)"; sleep 2; echo "命令2结束: $(date +%H:%M:%S)"'
]

# 启动所有进程不等待
processes = []
for command in lst:
    proc = subprocess.run(command, shell=True, wait=False)
    processes.append(proc)

# 统一等待所有进程结束
for proc in processes:
    proc.wait()

此时两个命令会几乎同时启动,2秒后同时结束,和默认的串行效果形成明显对比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:35:20