Python执行Shell命令的四种方式对比

陈默
陈默
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍Python中执行Shell命令的四种常用方法:os.system、commands模块、os.popen以及官方推荐的subprocess模块。重点分析各方法的返回值差异、适用场景及局限性,并对比subprocess在进程控制、超时处理及错误捕获方面的优势,帮助开发者根据实际需求选择最合适的调用方式。

os.system方法

os.system

system方法通过创建子进程来运行外部程序,其返回值仅为该外部程序的退出状态码(运行结果)。此方法适用于那些不需要获取程序具体输出内容、仅需知道执行是否成功的场景。


import os
os.system('ls')

commands模块用法

commands.getstatusoutput

使用commands模块的getoutput方法,这种方式与os.popen的主要区别在于:popen返回的是一个文件句柄对象,而getoutput直接将外部程序的输出结果作为字符串返回,在许多需要处理输出内容的场景下更为便捷。 该模块主要包含以下方法:

  • commands.getstatusoutput(cmd) 返回一个元组,包含退出状态码(status)和标准输出(output)
  • commands.getoutput(cmd) 仅返回外部程序的输出字符串
  • commands.getstatus(file) 返回类似ls -ld file命令的执行结果字符串,内部调用了getoutput,官方不建议使用此方法

当需要获取外部程序的完整输出结果时,上述方法较为实用。例如在使用urllib调用Web API后,可能需要对返回数据进行进一步处理。若使用os.popen(cmd)获取命令输出,只需调用read()或readlines()等方法即可,例如:a=os.popen(cmd).read()。


import os
ls = os.popen('ls')
print ls.read()

commands.getstatusoutput

使用commands模块的getoutput方法,这种方式与os.popen的主要区别在于:popen返回的是一个文件句柄对象,而getoutput直接将外部程序的输出结果作为字符串返回,在许多需要处理输出内容的场景下更为便捷。 该模块主要包含以下方法:

  • commands.getstatusoutput(cmd) 返回一个元组,包含退出状态码(status)和标准输出(output)
  • commands.getoutput(cmd) 仅返回外部程序的输出字符串
  • commands.getstatus(file) 返回类似ls -ld file命令的执行结果字符串,内部调用了getoutput,官方不建议使用此方法

import commands
commands.getstatusoutput('ls -lt')   # 返回(status, output)

subprocess模块推荐

subprocess.call

根据Python官方文档说明,subprocess模块旨在取代上述旧有模块。有一个使用Python实现的并行SSH工具mssh,其代码简洁但颇具趣味,它在线程中调用subprocess启动子进程来执行任务。


from subprocess import call
call(["ls", "-l"])

import shlex, subprocess
def shell_command(cmd, timeout) :
  data = {"rc":False, "timeout":False, "stdout":"", "stderr":""}
  try :
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    try:
      outs, errs = process.communicate(timeout=timeout)
      data["stdout"] = outs.decode("utf-8") 
      data["stderr"] = errs.decode("utf-8") 
      data["rc"] = True

    except subprocess.TimeoutExpired :
      process.kill()
      outs, errs = process.communicate()
      data["rc"] = False 
      data["stdout"] = outs.decode("utf-8") 
      data["stderr"] = "timeout"
      data["timeout"] = True 

  except Exception as e :
    data["rc"] = False 
    data["stderr"] = e 

  finally : 
    return data 

到此这篇关于python中shell执行知识点的文章就介绍到这了,更多相关python shell 执行内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表