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

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

本文详细介绍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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。