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

