如何同时执行多个brew及pip包安装命令(替代逐行执行)
如何让多条安装命令同时运行
嘿,我来帮你搞定这个并行执行命令的需求~原来的os.system是阻塞式的,执行完一条才会走下一条,要让它们同时跑,我们可以用Python的subprocess模块或者线程池来实现,下面给你几种实用的方案:
方案1:用subprocess.Popen启动后台进程
这是最直接的方式,Popen会立即返回进程对象,不会等待命令执行完毕,所有命令会同时启动:
import subprocess cmds = ['brew install ghostscript', 'brew install imagemagick', 'brew install libmagic', 'pip install sphinx'] processes = [] # 逐个启动所有命令的后台进程 for cmd in cmds: proc = subprocess.Popen(cmd, shell=True) processes.append(proc) # 等待所有进程执行完成再继续后续代码 for proc in processes: proc.wait()
方案2:用线程池管理并行执行
如果需要更精细的控制(比如捕获输出、处理执行异常),可以用concurrent.futures.ThreadPoolExecutor:
import subprocess from concurrent.futures import ThreadPoolExecutor def run_single_command(cmd): # check=True会在命令执行失败时抛出异常,方便排查问题 # capture_output=True可以捕获命令的输出内容 subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True) cmds = ['brew install ghostscript', 'brew install imagemagick', 'brew install libmagic', 'pip install sphinx'] # 创建线程池,同时执行所有命令 with ThreadPoolExecutor(max_workers=len(cmds)) as executor: executor.map(run_single_command, cmds)
注意:避免brew命令的冲突问题
这里要提醒你:brew本身在执行安装操作时会加全局锁,同时运行多个brew命令大概率会互相阻塞(因为brew同一时间只能处理一个安装任务)。所以更高效的做法是把三个brew命令合并成一条,再和pip命令并行:
import subprocess # 合并brew命令,减少冲突概率 cmds = ['brew install ghostscript imagemagick libmagic', 'pip install sphinx'] processes = [subprocess.Popen(cmd, shell=True) for cmd in cmds] for proc in processes: proc.wait()
这样既实现了并行,又不会触发brew的锁冲突问题,效率更高~
内容的提问来源于stack exchange,提问作者user9062604
相关产品推荐
相关产品推荐

