python3中使用subprocess模块执行外部命令

深入理解python中的subprocess模块 在实际开发过程中,我们经常会遇到需要从Python脚本中调用外部程序或脚本的场景。这时候,Python的subprocess模块就显得尤为重要。它是Python用来生成子进程、连接到它们的输入/输出/错误管道,以及获取它们的返回码的一个模块。本文将带你深入了解subprocess模块,学会如何高效地使用它来扩展你的Python脚本功能。subprocess模块是Python标准库的一部分,它为创建和管理子进程提供了强大的接口。在Python 2.4中引入以取代旧的模块(如os.system和。 阅读详情

一. subprocess模块介绍

  1. subprocess模块可以替代os模块下的os.system和os.popen等操作方法

  2. subprocess模块在python2和python3上的使用上有一定的区别,本文主要介绍的是在python3.6上的使用

  3. subprocess模块的作用是执行外部命令(支持同步执行和异步执行),可以返回执行状态码,也可以返回执行内容

  4. subprocess模块的方法有很多,最核心的方法为subprocess.Popen方法,python3中如果只需要同步执行,优先使用subprocess.run方法

二. subprocess.run()方法的介绍

2.1 执行代码:在windows下执行一条cmd命令

# -*- coding:utf-8 -*-
# Author:chinablue

import subprocess

# 在windows下执行cmd命令:echo hello dj
p = subprocess.run("echo hello dj", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f'获取返回对象: {p}')
print(f'获取执行命令:{p.args}')
print(f'获取返回码:{p.returncode}')
print(f'获取返回数据:{p.stdout}')

2.2 执行结果:

获取返回对象: CompletedProcess(args='echo hello dj', returncode=0, stdout=b'hello dj\r\n', stderr=b'')
获取执行命令:echo hello dj
获取返回码:0
获取返回数据:b'hello dj\r\n'

2.3 分析小结:

1 ) subprocess.run()方法是一个同步方法,执行后会返回一个CompletedProcess对象

2 ) 通过管道可以捕获子进程的标准输出(stdout)和标准错误(stderr)

如果使用的是python3.7及以上版本,可以使用capture_output=True参数替换stdout=subprocess.PIPE和stderr=subprocess.PIPE参数

p = subprocess.run("echo hello dj", shell=True, capture_output=True)
print(f'获取返回数据:{p.stdout}')
# 执行结果:获取返回数据:b'hello dj\r\n'

将执行结果输出到一个文件中去

# 将命令的执行结果输出到output.txt文件中
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
with open("output.txt", "w") as f:
    p1 = subprocess.run("dir", shell=True, stdout=f, universal_newlines=True, encoding="utf-8")

3 ) 默认情况下,获取的返回数据(stdxxx)为字节类型。

通过universal_newlines=True参数可以让返回数据以文本字符串输出

p = subprocess.run("echo hello dj", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(f'获取返回数据:{p.stdout}')
# 运行结果:获取返回数据:hello dj

如果使用的是python3.7及以上版本, 可以使用text=True参数替换universal_newlines=True参数

p = subprocess.run("echo hello dj", shell=True, capture_output=True, text=True)
print(f'获取返回数据:{p.stdout}')
# 运行结果:获取返回数据:hello dj

如果不使用universal_newlines=True参数或text=True参数,我们也可以对p.stdout进行解码转换

p = subprocess.run("echo hello dj", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(f'获取返回数据:{p.stdout.decode("gbk")}')  # 注意:windows下需要使用gbk解码
# 运行结果:获取返回数据:hello dj

4 ) 关于返回状态码的说明

如果命令执行成功,returncode返回0; 如果命令执行失败,returncode返回负值

check=True参数会自动检查p.returncode是否返回0, 如果不是0就抛出subprocess.CalledProcessError异常

p = subprocess.run("echo1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
print(f'获取返回数据:{p.stdout}')

如果不使用 check=True参数,我们可以通过p.returncode来做判断条件, 进而打印出详细错误p.stderr

# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
p = subprocess.run("echo1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
if p.returncode !=0:
    print(f'命令执行失败:{p.stderr}')

三. subprocess.Popen()方法的介绍

subprocess.run()是通过subprocess.Popen()来实现的
subprocess.Popen()可以异步执行

3.1 执行代码:在windows下执行一条cmd命令

# -*- coding:utf-8 -*-
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

import subprocess

# 在windows下执行cmd命令:echo chinablue
p = subprocess.Popen("echo chinablue", shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(f"获取返回对象: {p}")
print(f"获取pid: {p.pid}")
print(f"获取返回数据: {p.stdout.read()}")
p.wait()
print(f"获取执行状态: {p.poll()}")

3.2 执行结果:

获取返回对象: <subprocess.Popen object at 0x0028C4B0>
获取pid: 5260
获取返回数据: chinablue
获取执行状态: 0

3.3 分析小结:

1 ) subprocess.Popen()方法是一个异步方法,执行后会返回一个Popen对象

2 ) 获取子进程的标准输出(stdout)和标准错误(stderr)

方式1:通过p.stdout和p.stderr获取,如上例所示

方式2:通过p.communicate()获取,它返回一个元祖,元祖的第1个元素为stdout内容,元祖的第2个元素为stderr内容

p = subprocess.Popen("echo chinablue", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(f"获取返回数据: {p.communicate()[0]}")
print(f"获取返回错误: {p.communicate()[1]}")

3 ) 获取命令的执行状态:p.poll()

如果执行完subprocess.Popen()方法后,立即获取命令的执行状态, 则返回结果为None,因为此时子进程扔在运行中

如果我们需要等待子进程运行完毕后,再去获取命令的执行状态。那么我们可以使用p.wait()方法,这相当于将默认的异步操作改为同步操作

p = subprocess.Popen("echo chinablue", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(p.poll())  # 运行结果: None
p.wait() 
print(p.poll())  # 运行结果: 0

四. 常见场景举例

场景1:在windows下,执行ipconfig命令并对结果进行过滤

# -*- coding:utf-8 -*-
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
import subprocess

# 步骤1:将ipconfig命令的执行结果写入output.txt文件
with open("output.txt", "w") as f:
    subprocess.run("ipconfig", shell=True, stdout=f, universal_newlines=True, encoding="utf-8")
# 步骤2:将p1的输出内容作为p2的输入内容
p1 = subprocess.run("type output.txt", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
p2 = subprocess.run("findstr IPv4", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, input=p1.stdout)
print(p2.stdout)

场景2:在windows下,模拟并发执行命令

# -*- coding:utf-8 -*-
# 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
# 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
import time
import subprocess

# 模拟一条耗时命令,此命令在windows下执行相当于sleep 2s
cmd = "ping -n 3 127.0.0.1 > nul"

start_time = time.time()
p1 = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
p2 = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
p1.wait()
p2.wait()
print(f"运行时间共计:{int(time.time() - start_time)}s")
# p1和p2命令执行各需耗时2s,通过并发执行后共计耗时也是2s

场景3:自动处理命令行交互

# -*- coding: utf-8 -*-
import subprocess

# 这是一条对视频文件进行处理的命令(改变视频分辨率,同时将视频设置为倍速播放)
cmd = f'ffmpeg -i "dj_xiaomi.mp4" -s vga -filter:v "setpts=0.5*PTS" output.mp4'
p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)

# 命令在执行过程中,如果本地已经存在有output.mp4文件, 那么命令行处会出现提示符: File 'output.mp4' already exists. Overwrite? [y/N]
buff = ''
while True:
    output = p.stdout.read(1)
    if output:
        buff += output
    else:
        break
    # 出现提示符([y/N])后,程序可以自行处理此交互行为
    if buff.endswith("[y/N]"):
        p.communicate(input="y")
        break

另外python中的pexpect模块更擅长解决命令行的自动交互问题

Python3+Subprocess实现cmd的交互式控制 主要介绍通过subprocess和线程实现Windows环境下的cmd交互式操作 阅读详情

相关推荐

解决Python中使用subprocess.Popen返回值乱码的问题

通过明确指定subprocess.Popen函数的字符编码,我们可以解决Python中使用该函数获取返回值时可能遇到的乱码问题。然而,有时候在使用subprocess.Popen函数获取外部命令的返回值时,可能会遇到乱码的问题。这可能是由于外部命令的输出包含非ASCII字符,而默认情况下,subprocess模块在获取返回值时使用的是系统默认的字符编码,导致乱码问题的出现。要解决返回值乱码的问题,我们需要明确指定subprocess.Popen函数在获取返回值时使用的字符编码。

TechRoar的博客 1549

Python: 深入理解 subprocess.run() 执行命令、检查状态与结果处理

是subprocess模块的一部分,它是替代旧版模块(如)的更强大且安全的方法。其主要目的是允许我们在 Python 中执行外部命令,并捕获输出、错误信息以及返回状态。在这个语法中,command是一个字符串或列表,用于表示要执行的系统命令。check=True表示如果命令执行失败(即返回非零退出码),函数将抛出一个异常。

十年运维开发经验的王义杰在此分享自己的知识和经验 1万+

什么是无人机电源管理模块?电源管理模块有什么用处?

我来描述一下我的问题情景,电源管理模块的定义是,这里给出这个PX4官方对于电源管理模块的一些介绍,补充一下锂电池的放电原理大家就可以更好理解为什么需要电源管理模块

HRWVY0725的博客 2275

【Python3 高级篇】5. subprocess 子进程管理,取代 os.popen()/os.system()

在多年的发展过程中,Python 演化出了许多种运行 shell 命令的方式,然而,对于当今 Python3.x (3.5 及之后的版本)来说,官方建议的,最好用且功能最全的调用 shell 命令方式,应该就是内置的subprocess模块。其他模块,如(只能获取返回码),os.popen()(只能获取返回值) 等方法均流行于 Python2.x 时代,已经不再发展,可以放弃了。......

Mr_Apple 的空间 4618

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1266

使用 C# 实现大华监控摄像头的控制与数据处理

本文介绍了使用C#调用大华SDK(DHNetSDK.dll)开发监控系统的方法。主要内容包括:开发准备、DLL引用设置、SDK初始化与设备登录、视频预览窗口嵌入、云台控制、抓图录像等核心功能实现。通过P/Invoke技术封装SDK接口,开发者可以快速构建具有视频监控、设备控制功能的C#应用程序。文中还提供了代码示例、常见问题解决方案,以及视频帧智能分析的扩展建议,为开发大华监控系统的二次应用提供了完整的技术指南。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1285

python3使用subprocess_python3中使用subprocess模块执行外部命令

一.subprocess模块介绍1.subprocess模块可以替代os模块下的os.system和os.popen等操作方法2.subprocess模块在python2和python3上的使用上有一定的区别,本文主要介绍的是在python3.6上的使用3.subprocess模块的作用是执行外部命令(支持同步执行和异步执行),可以返回执行状态码,也可以返回执行内容4.subproces...

weixin_39958137的博客 1447

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1098

python执行linux外部程序_Python2/3 中执行外部命令(Linux)和程序(exe) -- 子进程模块 subprocess...

subprocess 模块可以使 Python 执行外部命令(Linux)和程序(exe),并得到相应的输出结果,进一步处理。在 Python3.5 中,subprocess 模块取代了 os.system、os.spawn* 。该模块很好地体现了 Python 胶水语言的特性,丰富了 Python 的拓展能力,故本文接下来主要介绍 subprocess 模块的用法,并简单说明在 Python2/...

weixin_36480576的博客 348

LFI Scanner 本地文件包含漏洞扫描、文件路径遍历、敏感文件读取(etcpasswd)

✅ **敏感文件读取验证**:内置`/etc/passwd、/windows/system32/drivers/etc/hosts、phpinfo.php`等敏感文件字典,一键验证漏洞可利用性;🔴 **Windows**:`/windows/win.ini`(系统配置)、`/windows/system32/drivers/etc/hosts`;🔴 **Linux**:`/etc/passwd`(用户信息)、`/proc/version`(内核版本)、`/etc/hosts`(域名解析);

寒寒豆豆软件公司的博客 130

6、基因组数据可视化与甲基化分析:从基础操作到深入洞察

本文详细介绍了基因组数据可视化和全基因组DNA甲基化分析的方法和技术,包括基因组查看器(IGV)的基本操作、单核苷酸变异的可视化、DNA甲基化与CpG岛的关联分析、统计建模与显著甲基化区域识别,以及不同细胞系之间的甲基化模式差异分析。通过具体案例展示了如何利用MATLAB进行数据分析和可视化,为基因组研究、疾病机制探索及个性化医疗提供了技术支撑和实践参考。

qsc901234的博客 295

Python2/3 中执行外部命令(Linux)和程序(exe) -- 子进程模块 subprocess

subprocess 模块可以使 Python 执行外部命令(Linux)和程序(exe),并得到相应的输出结果,进一步处理。在 Python3.5 中,subprocess 模块取代了 os.system、os.spawn* 。该模块很好地体现了 Python 胶水语言的特性,丰富了 Python 的拓展能力,故本文接下来主要介绍 subprocess 模块的用法,并简单说明在 Python2/...

weixin_30706507的博客 273

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

【摸鱼笔记】subprocess,用子进程访问外部命令

subprocess是一个非常强大的模块,它能通过启动新进程的方式执行外部命令、访问系统Shell、管道等。同时也能捕获这些新进程的输出和错误信息;subprocess模块是Python的标准库中的一部分,支持 Python 3.5 及 3.5 以上版本;3.5 以下版本需要额外安装;

the_singing_towers的博客 686

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

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

Python 系统命令调用之 subprocess

Python 3不再推荐使用老的os.system()、os.popen()、commands.getstatusoutput()等方法来调用系统命令,而建议统一使用subprocess库所对应的方法如:Popen()、getstatusoutput()、call()。 推荐并记录一些常用的使用范例: Popen # 标准用法使用数据传参,可以用shlex库来正确切割命令字符串 >&...

P_Core_996的博客 494

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python3模块--subprocess

subprocess模块run函数Run函数是在python3.5之后新增,语法如下subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None)(具体解释参考...

tyrion的博客 1496

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python3模块和python2差异,工作积累

commands 模块: Deprecated since version 2.6:Thecommandsmodule has been removed in Python 3. Use thesubprocessmodule instead. python3 用subprocess取代了commands 转载于:https://www.cnblogs.com/tuijin/p/9...

weixin_30919235的博客 126

python3 os.system 异步执行_Python执行系统命令的方法 os.system(),os.popen(),commands

最近在做那个测试框架的时候发现 Python 的另一个获得系统执行命令的返回值和输出的类。1.最开始的时候用 Python 学会了 os.system() 。这个方法是拥塞的。os.system('ping www.baidu.com')2.通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。这个方法是后台执行,不影响后续脚本运行...

weixin_39888018的博客 4208

调用外部程序处理文件_Python使用内置方法、模块调用外部命令

导读Python内置调用外部命令:os.systemos.popenos.popen2os.popen3os.popen4commands模块subprocess模块在Python3中,将os.popen2、os.popen3、os.popen4、commands等模块方法移除所以不用花精力了解,可以绕过了os.system方法os.system("cmd") 调用外部命令,使用非常简单程序只能返...

weixin_35160923的博客 218

python执行shell

面试考过,实际中也经常用到: 首先要import commands或者subprocess python2和python3是有区别的:https://docs.python.org/2/library/commands.html python2:commands:command.getoutput,返回执行结果,不返回返回值,getstatus返回值但不返回结果。即返回结果又返回值,使用ge...

davidliuzkw的博客 198

python callback failed_Python在执行系统命令中的缺陷

Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库。在python/wxPython环境下,执行外部命令或者说在Python程序中启动另一个程序的方法。1、os.system(command)os.system()函数用来运行shell命令。此命令可以方便的调用或执行其他脚本和命令#打开指定的文件>>>os.system('notep...

weixin_39924573的博客 760

python3. subporcess 子进程管理模块

python3. subporcess 子进程管理模块 原文链接:https://blog.csdn.net/weixin_42547344/article/details/80894760 简要说明: 有需要用到python调用外部程序命令的同学们, 那么你们请一定选择subprocess库,它给我们工作带来极大的...

MichaelAn的博客 291

python 调用外部程序 终端异常_python调用外部命令

python调用外部命令os.system: 输出在终端上,捕捉不到os.popen: 只能捕捉到标准输出,捕捉不到标准错误输出os.popen2: 返回2个对象,一个是标准输入,一个是标准输出os.popen3: 返回3个对象,标准输入,标准输出,标准错误输出os.popen4: 返回2个对象,pip_in 和pip_out_erros.system: 输出在终端上,捕捉不到In [4]:...

weixin_39886205的博客 328

python有几个模块_python几个常模块

os操作系统相关os.path os.path.isdiros.nameos.popen 该方法不但执行命令还返回执行后的信息对象os.curdiros.pardiros.environos.chdir(dir) 切换目录os.getcwd() 得到当前目录os.getgid/os.getuid/os.getloginos.system(cmd) 运行cmd命令os.listdir() 列出...

weixin_39626131的博客 88
上一篇: Python教程:对 a = [lambda : x for x in range(3)] 的理解
下一篇: python中将函数赋值给变量时需要注意的一些问题
Python热爱者
博客等级 码龄7年 3059粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值