使用subprocess启动程序后for循环需待程序关闭才执行的原因咨询
为什么用subprocess启动程序后,后续for循环要等程序关闭才执行?
嘿,这个问题其实是Python的subprocess模块默认行为导致的,和树莓派的armv7l架构、Raspbian系统没啥关系——这是跨平台的通用逻辑,我给你拆解清楚:
核心原因:subprocess默认是阻塞式调用
当你用subprocess.run()、subprocess.call()这类常用方法启动外部程序时,Python会暂停当前代码的执行流程,直到被启动的外部程序完全退出(不管是正常结束还是异常终止),才会继续往下跑后面的for循环。
举个常见的错误示例,大概是你写了类似这样的代码:
import subprocess # 这里启动程序后,Python会卡在这等它关闭 subprocess.run(["/home/pi/your_app"]) # 下面的循环必须等上面的程序退出才会执行 for count in range(3): print(f"循环执行中:{count}")
这种设计的初衷是方便你同步获取外部程序的运行结果——比如拿到它的退出码、标准输出/错误内容,所以默认采用阻塞模式。
怎么让for循环立刻执行?用非阻塞启动
如果你的需求是启动程序后立刻继续执行后续代码,就得用subprocess.Popen()这个底层接口。它启动外部程序后会立刻返回一个进程对象,不会阻塞主进程的执行:
import subprocess # 用Popen启动,立刻返回,不阻塞 proc = subprocess.Popen(["/home/pi/your_app"]) # 现在for循环会马上开始跑,不用等程序关闭 for count in range(3): print(f"循环执行中:{count}") # 要是之后需要等待这个程序结束,可以调用 # proc.wait()
这样调整后,外部程序会在后台运行,你的Python主进程就能继续执行for循环啦。
内容的提问来源于stack exchange,提问作者Lorcank11
相关产品推荐
相关产品推荐

