python3 执行 os 命令

一、模块对比

  1. os.system():简单执行,拿不到命令输出,只能获取返回码
  2. os.popen():可以读取命令输出,旧方案
  3. 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)直接抛出 CalledProcessError
try:
    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)

posted on 2026-08-03 09:55  阿陶学长  阅读(19)  评论(0)    收藏  举报