Python循环中启动子进程时如何不等待其执行完成继续循环?
解决方法
你的问题出在subprocess.Popen之后调用了communicate()方法——这个方法会阻塞当前循环,直到子进程完全执行完毕才会继续。而你的test.py是无限循环运行的,所以第一个进程永远不会结束,循环也就卡在了第一次迭代。
修改后的主程序代码
import subprocess if __name__ == '__main__': someList = ['a', 'b', 'c'] # 可选:保存进程实例,方便后续管理(比如终止进程) running_processes = [] for index in someList: # 推荐用列表形式传命令,避免shell=True的安全风险 cmd_args = ['python', 'test.py', index] print(' '.join(cmd_args)) # 启动子进程,不阻塞当前循环 proc = subprocess.Popen(cmd_args) running_processes.append(proc) # 如果你后续需要主动终止所有子进程,可以用这段代码 # for proc in running_processes: # proc.terminate()
关键修改点
- 移除
stdout, stderr = pipe.communicate():删掉这个阻塞调用,循环就能立即启动下一个子进程,无需等待前一个结束。 - 替换字符串命令为列表参数:用
['python', 'test.py', index]代替'python test.py ' + index,同时去掉shell=True,既避免了shell注入的安全问题,也能更可靠地处理参数中的特殊字符。 - (可选)保存进程实例:把每个
Popen对象存入列表,方便后续对这些后台进程进行管理,比如批量终止。
test.py的代码不需要修改,它会保持无限运行的状态。
内容的提问来源于stack exchange,提问作者Priyansh
相关产品推荐
相关产品推荐

