python中subprocess模块subprocess.run,subprocess.getoutput,subprocess.Popen、subprocess.call的使用-程序员宅基地

技术标签: python  运维  linux  基础学习  

subprocess可以帮我们执行命令,获取执行结果及返回内容。

1、subprocess.run()

此方法为python3.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: 要执行的命令。类型为str(如 “ls -l”)或包含str的list,tuple等(如 [“ls”, “-l”]), 推荐使用list形式,如果传入的args为str且包含参数,则 必须shell=True,默认为False。

**stdin、stdout、stderr: ** 子进程的标准输入、输出、错误,常用的为stdout,我们可以获取命令执行后的输出内容。

**shell:**如果该参数为 True,将通过操作系统的 shell 执行指定的命令,默认为False。

**timeout:**设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired 异常。

**check:**如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。

encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。

capture_output: 设置为True,将捕获stdout和stderr,从而获执行命令后取返回的内容。

例:

# 当前文件夹下有 a.py、b.py、c.py 三个文件,我们执行 “ls -l”来获取一下文件信息
import subprocess

# args传入str的方式 有参数传入需shell=True,encoding可以指定capture_output(stdin、stdout、stderr)的编码格式
ret = subprocess.run('ls -l', shell=True, capture_output=True, encoding='utf-8')

# ret.returncode 返回int类型,0 则执行成功
print('ret.returncode: ',ret.returncode)
# ret.stdout 返回str类型,命令执行后的输出内容,可以按实际需求处理str, 这里简单做个split
print('ret.stdout: ', ret.stdout)
print('ret.stdout.split:', ret.stdout.split())

# 输出结果
ret.returncode:  0

ret.stdout:  总用量 0
-rw-r--r--. 1 root root 0 929 11:24 a.py
-rw-r--r--. 1 root root 0 929 11:24 b.py
-rw-r--r--. 1 root root 0 929 11:24 c.py

ret.stdout.split: ['总用量', '0', '-rw-r--r--.', '1', 'root', 'root', '0', '9月', '29', '11:24', 'a.py', '-rw-r--r--.', '1', 'root', 'root', '0', '9月', '29', '11:24', 'b.py', '-rw-r--r--.', '1', 'root', 'root', '0', '9月', '29', '11:24', 'c.py']

# args传入list的方式, 输出结果是一样的
ret = subprocess.run(['ls', '-l'], capture_output=True, encoding='utf-8')
print('ret.stdout: ', ret.stdout)

# 输出结果
ret.stdout:  总用量 0
-rw-r--r--. 1 root root 0 929 11:24 a.py
-rw-r--r--. 1 root root 0 929 11:24 b.py
-rw-r--r--. 1 root root 0 929 11:24 c.py

2、subprocess.getoutput()

该方法可以直接获取命令执行后的输出内容,返回值为str

import subprocess
cmd = 'ls -l'  
ret = subprocess.getoutput(cmd)

print(type(ret))
print(ret)


# 输出结果为
<class 'str'>

总用量 0
-rw-r--r--. 1 root root 0 929 11:24 a.py
-rw-r--r--. 1 root root 0 929 11:24 b.py
-rw-r--r--. 1 root root 0 929 11:24 c.py

3、subprocess.Popen()

Popen 是 subprocess的核心,底层的创建和管理逻辑都是基于它的。
使用Popen可以实现一些更复杂的逻辑。

import subprocess
cmd = 'ls -l'
ret = subprocess.Popen(cmd, shell=True)
print(ret)
# 输出  在使用ret.wait()或ret.poll()之前是获取不到 returncode 的
<Popen: returncode: None args: 'ls -l'>

# poll() 检查进程是否终止,如果终止返回 returncode,否则返回 None。
ret.poll()
print(ret)
# 输出 此时可以获取到ret.returncode
<Popen: returncode: 0 args: 'ls -l'>

Popen对象的方法:
poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
wait(timeout): 等待子进程终止。
communicate(input,timeout): 和子进程交互,发送和读取数据。
send_signal(singnal): 发送信号到子进程 。
terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
kill(): 杀死子进程。发送 SIGKILL 信号到子进程。

4、subprocess.call() 及 check_call()
subprocess.call() 为python3.5以前版本使用,与 subprocess.run()用法基本一致,但call()返回的为命令结束码,无法获取更多信息,不推荐使用,现已被run()取代。
subprocess.check_call() 与call()的区别为,check_call()如果命令失败(即 returncode不为0)会主动抛出subprocess.CalledProcessError异常,使用subprocess.run(check=True)可取代subprocess.check_call()。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yy_heng/article/details/127105045

智能推荐

【Dubbo】Dubbo入门_hessian 2.0 serialization protocol-程序员宅基地

文章浏览阅读342次。一、Dubbo是什么 分布式服务框架 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 二、如何使用Dubbo本地服务 &lt;bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /&gt; &lt;bean id=“xxxAction” class=“com.xxx.XxxAction”&..._hessian 2.0 serialization protocol

LSTM 自动编码器进行时间序列数据异常检测_时间序列lstm识别充电桩异常-程序员宅基地

文章浏览阅读1.5k次,点赞31次,收藏16次。本文将介绍并代码演示使用LSTM对时间序列数据进行异常值检测。_时间序列lstm识别充电桩异常

编写一个简单Java程序,计算银行年存款的本息_编写一个java程序,计算存款的利息,用户将输入存款金额和年利率,然后程序计算一年-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏21次。编写一个简单Java程序,计算银行年存款的本息要求:程序运行后要求用户输入存款本金、年利率和存款年限,最后程序计算并输出相应年限后存款的金额。相应的计算公式为:存款总额=本金 * (1 + 利率)存款年限。提示:请检测用户输入的合法性。可以使用Math类来进行次方的运算:Math.pow(底数,指数)。代码块如下package interestCaculation;/** *@auth..._编写一个java程序,计算存款的利息,用户将输入存款金额和年利率,然后程序计算一年

ELK之 kibana 报错master_not_discovered_exception] null or kibana-Request Timeout after 30000ms_unable to connect to elasticsearch. error: request-程序员宅基地

文章浏览阅读6.4k次,点赞5次,收藏5次。ELK之 kibana 报错master_not_discovered_exception] null or kibana-Request Timeout after 30000ms{“type”:“log”,"@timestamp":“2020-05-18T13:34:53Z”,“tags”:[“warning”,“savedobjects-service”],“pid”:4674,“message”:“Unable to connect to Elasticsearch. Error: Reques_unable to connect to elasticsearch. error: request timeout after 30000ms

postman报415(Unsupported Media Type)不支持的类型异常_postmn 415 unsupported media type-程序员宅基地

文章浏览阅读412次。报(Unsupported Media Type)异常主要原因为,前端工具请求接口的类型和后端服务器定义的类型不一致造成,一般工具请求类型和后端保持一致后,即可正常请求。解决:在POSTMAIN工具添加headerkey:Content-Type value:application/json..._postmn 415 unsupported media type

WINBOND/华邦 W25Q64JVZPIQ 3V 64M-位串行闪存 双通道、四通道 SPI NOR FLASH 存储器_双通道 spi flash-程序员宅基地

文章浏览阅读386次,点赞3次,收藏4次。W25Q64JVZPIQ 3V 64M-位串行闪存 双通道、四通道 SPI NOR FLASH 存储器_双通道 spi flash

随便推点

基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)-程序员宅基地

文章浏览阅读633次。作者信息作者: 彭东林邮箱:[email protected]:405728433平台简介开发板:tiny4412ADK + S700 + 4GB Flash要移植的内核版本:Linux-4.4.0 (支持device tree)u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动)busyb..._memcpy(net_dev->dev_addr, dev_info.mac_addr, eth_alen);

springboot启动不打印日志信息_SpringBoot启动遇到的记录日志冲突问题-程序员宅基地

文章浏览阅读2k次。默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台(如下图所示)。但是,有时候启动项目springboot默认打印日志与jar的打印日志会产生冲突(如下)SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/D:/mavencangku/o..._spring启动过程logback不打日志

python中表示空类型的是_python中表示空-程序员宅基地

文章浏览阅读1.7k次。广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!nonetype表示该值是一个空对象,空值是python里一个特殊的值,用none表示。 none不能理解为0,因为0是有意义的,而none是一个特殊的空值。 可以将none赋值给任何变量,也可以给none值变量赋值in: type()out: str知识点扩展:在python中,n..._python中表示空的是

Google Protocol Buffers 概述-程序员宅基地

文章浏览阅读513次。1. 概述Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。本文概述介绍Protocol Buffers,以及开始如何开始Protoco_google protocol buffers

删除异常值方法总结_python删除异常值-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏49次。1.IQRpython基于IQR删除异常值:df = pd.read_excel('./7.xlsx')def fit_model(model, data, column='Area'): # fit the model and predict it df = data.copy() data_to_predict = data[column].to_numpy().reshape(-1, 1) predictions = model.fit_predict(dat_python删除异常值

buu题解-[ACTF新生赛2020]usualCrypt-程序员宅基地

文章浏览阅读380次。逆向_[actf新生赛2020]usualcrypt