subprocess可以帮我们执行命令,获取执行结果及返回内容。
此方法为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 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
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 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
该方法可以直接获取命令执行后的输出内容,返回值为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 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
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()。
文章浏览阅读342次。一、Dubbo是什么 分布式服务框架 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 二、如何使用Dubbo本地服务 <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <bean id=“xxxAction” class=“com.xxx.XxxAction”&..._hessian 2.0 serialization protocol
文章浏览阅读1.5k次,点赞31次,收藏16次。本文将介绍并代码演示使用LSTM对时间序列数据进行异常值检测。_时间序列lstm识别充电桩异常
文章浏览阅读1w次,点赞5次,收藏21次。编写一个简单Java程序,计算银行年存款的本息要求:程序运行后要求用户输入存款本金、年利率和存款年限,最后程序计算并输出相应年限后存款的金额。相应的计算公式为:存款总额=本金 * (1 + 利率)存款年限。提示:请检测用户输入的合法性。可以使用Math类来进行次方的运算:Math.pow(底数,指数)。代码块如下package interestCaculation;/** *@auth..._编写一个java程序,计算存款的利息,用户将输入存款金额和年利率,然后程序计算一年
文章浏览阅读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
文章浏览阅读412次。报(Unsupported Media Type)异常主要原因为,前端工具请求接口的类型和后端服务器定义的类型不一致造成,一般工具请求类型和后端保持一致后,即可正常请求。解决:在POSTMAIN工具添加headerkey:Content-Type value:application/json..._postmn 415 unsupported media type
文章浏览阅读386次,点赞3次,收藏4次。W25Q64JVZPIQ 3V 64M-位串行闪存 双通道、四通道 SPI NOR FLASH 存储器_双通道 spi flash
文章浏览阅读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);
文章浏览阅读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不打日志
文章浏览阅读1.7k次。广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!nonetype表示该值是一个空对象,空值是python里一个特殊的值,用none表示。 none不能理解为0,因为0是有意义的,而none是一个特殊的空值。 可以将none赋值给任何变量,也可以给none值变量赋值in: type()out: str知识点扩展:在python中,n..._python中表示空的是
文章浏览阅读513次。1. 概述Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。本文概述介绍Protocol Buffers,以及开始如何开始Protoco_google protocol buffers
文章浏览阅读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删除异常值
文章浏览阅读380次。逆向_[actf新生赛2020]usualcrypt