python3 执行 os 命令
一、模块对比
os.system():简单执行,拿不到命令输出,只能获取返回码os.popen():可以读取命令输出,旧方案subprocess:功能最全,推荐标准用法
1. os.system(简单执行,不获取输出)
import os
# 执行命令,返回退出码;控制台会直接打印命令输出
ret_code = os.system("ls -l") # linux/mac
# ret_code = os.system("dir") # windows
print("返回码:", ret_code)
# 返回码 0 = 执行成功;非0 = 命令出错
缺点:无法在代码中捕获命令 stdout 输出
2. os.popen () 捕获命令输出(老式)
import os
# 读取标准输出
res = os.popen("ls -l").read()
print(res)
# 带错误输出捕获
res_err = os.popen("ls xxx 2>&1").read()
print(res_err)
官方文档提示:优先使用 subprocess,os.popen 逐步被淘汰
方式 1:subprocess.run(Python3.5+ 推荐首选)
① 简单执行,捕获输出(文本模式)
import subprocess
# shell=True:字符串命令;shell=False 传入列表(安全,防止命令注入)
cmd = "echo hello world"
result = subprocess.run(
cmd,
shell=True,
stdout=subprocess.PIPE, # 捕获标准输出
stderr=subprocess.PIPE, # 捕获错误输出
text=True # python3.7+,等价 universal_newlines=True,返回字符串
)
print("标准输出:", result.stdout)
print("错误输出:", result.stderr)
print("返回码:", result.returncode)
# 判断是否执行成功
if result.returncode == 0:
print("命令执行成功")
else:
print("命令执行失败")
② 安全写法(shell=False,列表形式,杜绝命令注入)
处理变量时强烈用这种,不要拼接字符串!
import subprocess
# 命令拆分成列表,不要 shell=True
cmd = ["ls", "-l", "/tmp"]
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
方式 2:直接抛出异常(check=True)
命令失败(returncode≠0)直接抛出
CalledProcessErrortry:
res = subprocess.run(
["ls", "不存在的文件"],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
except subprocess.CalledProcessError as e:
print("命令异常:", e.stderr)
方式 3:subprocess.check_output(只获取 stdout,失败抛异常)
import subprocess
try:
out = subprocess.check_output(["pwd"], text=True)
print(out.strip())
except subprocess.CalledProcessError as e:
print("执行失败", e)
浙公网安备 33010602011771号