当前位置: 首页 > article >正文

subprocess执行系统命令简明用法

1. 基础用法(同步执行)

subprocess.run()
import subprocess

# 基本执行(输出直接打印到终端)
result = subprocess.run(["ls", "-l"]) 

# 捕获输出(推荐:安全+完整控制)
result = subprocess.run(
    ["ls", "-l"],
    capture_output=True,  # 捕获stdout和stderr
    text=True             # 输出转为字符串(默认字节流)
)
print(result.stdout)     # 标准输出内容
print(result.returncode)  # 命令返回码(0为成功)
快捷方法
# 直接获取输出字符串
output = subprocess.getoutput("ls -l") 

# 获取字节流输出(非0返回码会抛异常)
output_bytes = subprocess.check_output(["ls", "-l"])

2. 错误处理

try:
    # 若返回码非0,自动抛CalledProcessError
    result = subprocess.run(
        ["invalid_cmd"],
        check=True,
        capture_output=True,
        text=True
    )
except subprocess.CalledProcessError as e:
    print(f"错误输出: {e.stderr}") 
    print(f"返回码: {e.returncode}")

3. 超时控制

try:
    result = subprocess.run(
        ["sleep", "10"],
        timeout=5,  # 5秒后终止命令
        capture_output=True
    )
except subprocess.TimeoutExpired:
    print("命令执行超时!")

4. 管道操作(链式命令)

# 执行 ls | grep log
p1 = subprocess.Popen(["ls", "/var/log"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "syslog"], stdin=p1.stdout, stdout=subprocess.PIPE)
output = p2.communicate()[0]  # 获取最终输出
print(output.decode())

5. 实用技巧

  • 参数安全:优先用列表传参(如 ["ls", "-l"]),避免 shell=True 注入风险

  • 隐藏窗口(Windows):

    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    subprocess.run("notepad", startupinfo=startupinfo)
    
  • 实时输出

    process = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE)
    while True:
      line = process.stdout.readline()
      if not line: break
      print(line.decode().strip())
    

    总结

    • 首选 run():90%场景适用,同步+安全+易用
    • 复杂需求用 Popen():异步、管道、实时交互
    • 避免 shell=True:除非必须执行Shell特性(如通配符*

    http://www.kler.cn/a/593756.html

    相关文章:

  • 「低延迟+快速集成:Amazon IVS如何重塑实时互动视频体验?」
  • Linux与HTTP中的Cookie和Session
  • 头歌实训--数据预处理Pandas--共三关
  • 黄金屋 #2 我应该将产品开源吗?
  • 雅可比行列式
  • fontTools工具的使用介绍
  • [DeepRetrieval] 用DeepSeek-R1-Zero的思路教会模型怎么用搜索引擎找文本
  • Python数据可视化实战:从基础图表到高级分析
  • 在使用mybatis时遇到枚举的相关问题和解决
  • The method precision() is undefined for the type BigInteger
  • 二分查找------查找区间
  • AI全天候智能助手,为您构建私人数据库
  • 达芬奇预设:创意现代抽象动态海报活力动态文字标题排版设计视觉预设 MotionVFX – mTitle Hype DVR
  • VLLM专题(三十九)—自动前缀缓存(二)
  • linux性能监控的分布式集群 prometheus + grafana 监控体系搭建
  • 让vscode远程开发也可以图形显示
  • nuxt项目 详情页有阅读次数需要更新,有热门推荐列表需要更新适合做SSG吗
  • 【C++指南】string(三):basic_string底层原理与模拟实现详解
  • 【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览
  • 江小南的题目讲解