Python中os.system()、subprocess.run()、call()、check_output()的用法

Python调用系统命令:os.system与subprocess核心差异与实战避坑指南 在Python中执行系统命令是自动化、运维和集成开发的基础能力,其底层涉及进程创建、标准流管理、编码处理与安全控制等关键机制。`os.system()`作为早期兼容接口,仅返回退出码,无法捕获输出、缺乏超时控制且存在命令注入风险;而`subprocess`模块提供精细的进程生命周期管理、管道通信、跨平台编码支持(如`text=True`)及健壮错误处理(如`check=True`、`timeout`)。它支撑着CI/CD脚本、爬虫环境启动、FFmpeg音视频处理、Docker容器内命令调用等典型工程场景。本 阅读详情
AI摘要

文章详细对比了Python中os.system()和subprocess模块的使用,特别是subprocess.run()方法,强调了它们在执行命令、捕获输出和处理退出码上的区别。os.system()只返回退出码,无法直接获取输出,而subprocess.run()提供了更多灵活性,如捕获输出、设置超时和环境变量等。

1.os.system()

os.system() 是对 C 语言中 system() 系统函数的封装,允许执行一条命令,并返回退出码(exit code),命令输出的内容会直接打印到屏幕上,无法直接获取。

示例:

# test.py
import os
os.system("ls -l | grep test")    # 允许管道符

# 测试执行
$ ll                <======== 列出当前目录中的内容
drwxr-xr-x 2 foo foo 4096 Feb 13 09:09 __pycache__
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py
$ python test.py
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py    <======== 只有名字包含 test 的文件被列出

2.subprocess.run()

Python 3.5 开始推荐使用这个方法执行命令,其原型如下:

subprocess.run(
    args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, 
    shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, 
    text=None, env=None, universal_newlines=None
)

其中:

  • args: 可以是一个字符串(当 shell=True 时),也可以是一个列表(当 shell=False 时)

  • stdin, stdout, stderr: 用于指定标准IO文件句柄,可以是:

      subprocess.PIPE: 用作 stdout, stderr 参数的值时,可以从返回值对象中的 stdout 和 stderr 属性中读取输出内容
      subprocess.STDOUT: 用作 stderr 参数的值时,相当于把标准错误重定向到标准输入中)
      subprocess.DEVNULL: 用作 stdout, stderr 参数的值时,相当于把输出内容重定向到 /dev/null
      用户已经打开的文件对象或描述符(整型数字)
    
  • capture_output: 当设置为 True 时,相当于 stdout 和 stderr 参数都设置为 True 了,可以通过返回值对象访问标准输出和标准错误内容

  • shell: 当设置为 True 时,args 参数会当做一条命令字符串(支持管道、重定向操作);当它为 False 时,args 需是一个列表(并且不支持管道、重定向操作)

  • cwd: 指定执行命令的目录,默认为当前目录

  • timeout: 指定命令执行超时时间(按妙计),若执行超时了,会 kill 掉命令并抛出 TimeoutExpired 异常

  • check: 当设置为 True 时,会自动检测执行退出码,若不为0,则抛出 CalledProcessError 异常

  • text: 当设置为 True 时,stdin、stdout、stderr 会以“文本”模式打开(返回值对象中的 stdout、stderr 存储文本内容),否则返回值对象中 stdout、stderr 存储的是字节序列

  • env: 用于设置程序执行时继承的环境变量等,默认与当前进程相同

该方法返回一个 CompletedProcess 对象,其中包含以下属性:

  • returncode: 执行命令的退出码
  • stdout: 捕获的标准输出内容(当 stdout 参数为 PIPE 时)。其格式默认为字节序列,除非 text 参数为 True (此时为文本格式)。
  • stderr: 捕获的标准错误内容(当 stderr 参数为 PIPE 时)。其格式默认为字节序列,除非 text 参数为 True (此时为文本格式)。
  • args: 同参数 args 。

示例:

import subprocess
subprocess.run(["ls", "-l"])            # 默认时,args 参数需是一个列表
subprocess.run("ls -l", shell=True)     # 当 shell 为 True 时,args 是一个字符串
ret = subprocess.run("ls -l", shell=True, capture_output=True, text=True) # 以文本模式捕获输出内容
print("Return code:", ret.returncode)   # Return code: 0
print("STDOUT:", ret.stdout)            # STDOUT: ...当前目录内容...
print("STDERR:", ret.stderr)            # STDERR: <空>
ret = subprocess.run("abcdefg", shell=True, text=True,  # 注意:这里必须 shell=True 才能捕获到 /bin/sh 的输出错误
        # 当 shell=False 时,是要去捕获 "abcdefg" 命令自身输出的内容,但是它不存在,python 会报错
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT    # 标准错误重定向到标准输出
) 
print("STDOUT:", ret.stdout)            # STDOUT: /bin/sh: abcdefg: command not found

另一个用于测试 shell 参数区别的示例如下:

import sys, re, subprocess
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    
    ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args=['python', 'test.py', '--run-child'], returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,这里是捕获不到的,subprocess.run()自己就会报错
    
    ret = subprocess.run(" ".join(cmd), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args='python test.py --run-child', returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,这里也是可以捕获到的,内容可能是 xxx command not found
    
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")

3.subprocess.call()

Python 3.5 以前(包括 2.x 版本)没有 subprocess.run() 方法,可以使用 subprocess.call() 来执行命令,该方法原型如下:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

注意:这个方法的返回值是命令的退出码,而不是一个对象,所以无法像 subprocess.run() 一样捕获命令输出内容(不要设置 stdout=PIPE 或 stderr=PIPE,否则可能造成命令卡死)。

该方法的其它参数与 subprocess.run() 类似。

4.subprocess.check_output()

Python 3.5 以前的版本,要想捕获命令输出内容,可以使用 subprocess.check_output() 方法,它的原型如下:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)

注意:参数中没有 stdout ,因为这个函数的返回值默认就是标准输出内容,也可以将设置 stderr=subprocess.STDOUT 将标准错误重定向到标准输出,但是好像没有办法单独捕获标准错误内容呢!

示例:

import sys, re, subprocess
#Python小白学习交流群:711312441
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
    print("[" + ret + "]")  # 输出内容中包含标准输出和标准错误,输出顺序在 windows 下和 linux 下可能会有差异
    assert re.search("stdout output", ret)
    assert re.search("stderr output", ret)
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")
Python调用Shell脚本的三种方式:从os.system到subprocess实战指南 在自动化运维和系统管理中,进程间通信是关键技术概念,它允许不同程序协同工作。其原理是通过操作系统提供的接口创建子进程并交换数据。Python作为胶水语言,通过调用Shell脚本实现了系统工具与高级逻辑的整合,极大提升了开发效率。这种技术广泛应用于数据处理流水线、自动化部署和系统监控等场景。本文聚焦于Python调用Shell的三种核心方法,其中subprocess.run()因其安全性和易用性成为官方推荐方案,而subprocess.Popen()则适用于需要实时交互的复杂场景。通过对比分析,开发者可以避免 阅读详情

相关推荐

Python调用Shell脚本:从os.system到subprocess的实战指南

在自动化运维和数据处理中,进程间通信是关键技术之一,它允许不同程序或脚本协同工作。其核心原理是通过操作系统提供的接口创建子进程并管理其输入输出。Python作为胶水语言,通过调用Shell脚本,能够将自身强大的逻辑处理能力与Shell的系统级操作优势结合,显著提升自动化任务的效率和灵活性。这种技术广泛应用于数据处理流水线、系统管理、CI/CD等场景。本文聚焦于Python调用Shell的两种核心方法:简单易用的os.system和功能强大的subprocess模块,深入解析其进程通信机制、安全陷阱和性能考量

weixin_33713350的博客 372

Python中os.system的使用

在Unix上,返回值是进程的退出状态,在Windows上,返回值是系统 shell 程序在运行命令后返回的值。它是字符串类型,告诉执行哪个命令。“空格、()、\、”的转义都比较坑。

lsf1192354203的博客 3185

Python之子进程subprocess

Python手册中有这样一段话: This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.* subprocess被用来替换一些老的模块和函数,如:os.system、os.spawn*...

青柚的博客 630

os.system(), os.popen(), subprocess.Popen使用(转载)

一、os.system方法 优点:使用方法简单。 缺点:1)返回值只包含命令执行状态,不包含命令输出。2)阻塞 1)返回值 执行操作系统的命令,将结果输出到屏幕,只返回命令执行状态(0:成功,非 0 : 失败) >>> result = os.system('pwd') /root >>> result 0 2)阻塞 在执行os.system函数的时候通常会阻塞它的调用者,等待所启动的命令行程序退出。 在Linux平台上 只需要在命令末尾加上shell后台运算符&

白菜先森 6875

使用Python的os模块进行系统调用

在Python编程中,os模块是一个非常有用的模块,它提供了许多与操作系统交互的函数。其中之一是进行系统调用的能力,它允许我们执行操作系统的命令和程序。函数执行系统命令时会阻塞当前程序的执行,直到系统命令完成。函数可以执行系统命令和程序,并获取命令的输出。总结一下,通过使用Python的os模块,我们可以方便地进行系统调用。函数接受一个字符串参数,该参数包含要执行的命令或程序。函数时,它会在操作系统中执行该命令,并等待命令完成后返回。要使用os模块进行系统调用,我们可以使用os模块中的。

2301_79366435的博客 260

python的os模块详细解读

os是“operating system”的缩写,os模块提供各种 Python 程序与操作系统进行交互的接口,使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性

景天科技苑 1万+

Python模块学习:subprocess模块详解

args: 要执行的shell命令,默认应该是一个字符串序列,如[‘df’, ‘-Th’]或(‘df’, ‘-Th’),也可以是一个字符串,如’df -Th’,但是此时需要把shell参数的值置为True。shell: 如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道、文件名通配符、环境变量扩展功能,这将是非常有用的。

Python热爱者的博客 1万+

Python中os模块功能与用法详解

主要介绍了Python中os模块功能与用法,总结分析了Python os模块基本功能、内置函数、使用方法及相关操作注意事项,需要的朋友可以参考下

Python subprocess模块功能与常见用法实例详解

本文实例讲述了Python subprocess模块功能与常见用法。分享给大家供大家参考,具体如下: 一、简介 subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。 subprocess用来替换多个旧模块和函数: os.system os.spawn* os.popen* popen2.* commands.* 运行py...

Webben 1526

别再折腾虚拟机了!手把手教你用WSL2在Windows 11上安装Kali Linux(含汉化与图形界面)

本文详细介绍了如何在Windows 11上通过WSL2安装和配置Kali Linux,包括汉化与图形界面设置。通过WSL2,用户可以享受接近原生性能的Linux体验,同时保持与Windows系统的无缝集成,特别适合网络安全爱好者和开发者。文章还提供了常见问题解决和性能优化建议,帮助用户高效使用Kali工具集。

weixin_42525369的博客 322

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 156

subprocess.run函数介绍

subprocess.run 是 Python 3.5 引入的函数,也是目前官方最推荐的用于执行外部命令(如 Shell 命令、系统脚本、其他程序)的方法。官方文档明确建议:在大多数情况下,应该优先使用 subprocess.run(),而不是旧的 os.system、subprocess.Popen 或subprocess.check_output。它就像一个“全能瑞士军刀”,功能强大且用法灵活。

weixin_43597208的博客 220

浅谈声发射振动复合传感器

浅谈声发射振动复合传感器 随着全球经济和自动化工业的迅速发展,人们对设备故障特别是轴承类的故障诊断也日益重视起来了。 为满足客户对旋转仪器轴承异常的精准诊断,单一的依靠振动信号或声信号分析,是很难兼顾轴承的多种异常情况的。 为此,市面上开始着手研发出了可同时分析机械设备的振动信号和声信号的复合型传感器。 初期的复合型传感器主要有 2 种类型,下面以 A、B 来举例说明。 A 型是在被测物表面不同的 2 个位置分别放置声发射(AE)传感器和加速度(ACC)传感器,它虽能一定程度...

pxtech的博客 1152

Python的subprocess模块

目录 一、简介 二、旧有模块的使用 1.os.system() 2. os.popen() 三、subprocess模块 1、subprocess.run() 2、subprocess.call() 3、subprocess.check_call() 4、subprocess.getstatusoutput() 5、subprocess.getoutput() ...

txwsmsm7023_的博客 865

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 518

图形学基础知识:着色(三)Rendering Pipeline与Shader

管线(Pipeline) 什么是管线? 管线我们可以理解为流水线,流水线大家都懂,就是工厂里面生产东西的一整套流程。例如饮料厂要生产饮料,需要洗瓶子,倒饮料,加盖,包装等等,这一整套过程就是流水线。那么我们要把一个三维场景渲染成一幅二维的图像,同样需要一个先干嘛再干嘛然后干嘛最后干嘛的过程,这个过程或流水线,我们就称之为管线。 实时渲染管线(Real-time Rendering Pipeline) 通过前面几篇的学习,我们知道了要把一个三维场景渲染成一幅二维的图像大致分为以下几个步骤: M.

王王王渣渣的博客 2532

python调用os的语句_从Python调用Shell命令:OS.system vs Subprocess

如果您是Python程序员,您很可能有shell脚本编写经验。使用shell命令解决看似微不足道的任务并不少见。因此,熟悉如何从Python代码中高效地调用这些命令并了解它们的局限性很有必要。在这篇短文中,我将讨论如何使用较旧的(尽管仍然相对常见)os.system和更新的subprocess。我将展示它们的一些潜在风险、局限性,并提供完整的使用示例。如果您熟悉外部命令,那么对于小型任务来说,外部...

weixin_39595310的博客 530

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 199

Python编程:subprocess执行命令行命令

函数 说明 os.system(command) 返回状态码,执行结果输出到屏幕 os.popen(command).read() 返回执行结果,没有状态码 - - subprocess.run() Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例 subprocess.call() ...

彭世瑜的博客 2万+

灰质-白质组织对比(Gray-white matter tissue contrast,GWC)计算以及可视化

GWC是深层灰质与浅表白质(superficial white matter,SWM)之间T1加权信号强度的比值,已知髓鞘中的胆固醇是T1加权信号强度的主要影响因素,因此GWC大致反映了大脑皮层和浅表白质之间的髓鞘化差异。GWC代表灰白质交界处的模糊程度,较低的GWC表明灰质和白质交界处更相似和更模糊;较高的GWC表明灰白质分界更加清楚。据之前的研究报道,局灶性皮质发育不良、颞叶癫痫、帕金森病、强迫症、精神分裂症和自闭症谱系障碍中存在灰白质交界区GWC异常增高或降低。 灰质信号强度和白质信号强度采集的示意图

xxx 733

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 861

python调用系统本地程序

1. os.system(cmdtext) system 函数可以将字符串转化成命令在服务器上运行;返回执行程序的退出状态码。其原理是每一条 system 函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。 import os os.system('cd /usr/local && mkdir aaa.txt') # or os.system(...

118路司机的博客 2788

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Python系列】执行 Shell 命令的六种方法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python os.system()函数详解:从系统调用原理到subprocess进阶实践

在Python自动化脚本开发中,系统调用是实现跨平台操作和外部程序集成的核心技术。其基本原理是通过Python解释器与操作系统Shell交互,创建子进程执行命令行指令,从而实现从Python内部调用系统命令、启动外部应用或执行脚本。这一机制的技术价值在于扩展了Python的边界,使其从单纯的数据处理工具升级为能够调度和管理整个操作系统资源的自动化平台。在实际应用场景中,系统调用常用于自动化部署、环境配置、外部工具集成等任务,例如通过pip安装依赖库、调用ffmpeg处理多媒体文件或启动IDE编辑器。本文以P

weixin_34187862的博客 355

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pythonsubprocess执行多条shell命令_python中subprocess批量执行linux命令

可以执行shell命令的相关模块和函数有:os.systemos.spawnos.popen --废弃popen --废弃commands --废弃,3.x中被移除以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。subprocesscall执行命令,返回状态码>>> import subprocess>>&g...

weixin_39653078的博客 3783
上一篇: python计算某字符出现次数
下一篇: Python中标准输入(stdin)、标准输出(stdout)、标准错误(stdout)的用法
Python热爱者
博客等级 码龄7年 3053粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值