Python中如何调用系统命令后无需等待即可继续执行代码
Python实现非阻塞执行系统命令的方案
os.system默认是同步阻塞接口,调用后会等待系统命令执行完成才会返回,要实现非阻塞执行可以使用以下几种方案:
方案1:使用subprocess模块(全平台通用,官方推荐)
subprocess是Python标准库中专门用于进程管理的模块,Popen接口创建子进程后会直接返回,不会阻塞主进程的后续执行:
- 基础用法示例:
import subprocess # 命令拆分为列表形式,不需要shell解析,安全性更高 subprocess.Popen(["ping", "baidu.com", "-c", "100"]) # 需要用到shell语法(管道、通配符、环境变量解析等)时可加shell=True参数 subprocess.Popen("ping baidu.com -c 100 > ping_log.txt", shell=True)
注意不要主动调用Popen返回对象的.wait()、.communicate()方法,否则会重新进入阻塞等待状态。
安全提示:如果命令内容包含外部用户可控的输入,不要使用
shell=True参数,避免出现命令注入漏洞。
方案2:类Unix系统下使用后台运行标记
如果是运行在Linux、macOS等类Unix系统环境下,也可以直接在命令末尾加&标记,让系统直接把命令放到后台运行,此时os.system也会直接返回不会阻塞:
import os os.system("ping baidu.com -c 100 > ping_log.txt &")
该方案仅适配类Unix环境,Windows系统原生命令行不支持&后台标记,兼容性较差。
方案3:多线程/多进程封装阻塞调用
如果需要对任务的运行状态做自定义管控,也可以把阻塞的os.system调用放到独立的线程/子进程中运行,避免阻塞主进程逻辑:
import os import threading def run_system_cmd(cmd): os.system(cmd) # 启动独立线程执行命令,daemon=True表示线程会随主进程退出自动终止 threading.Thread(target=run_system_cmd, args=("ping baidu.com -c 100",), daemon=True).start()
内容的提问来源于stack exchange,提问作者Karim Fadi
相关产品推荐
相关产品推荐

