Python中调用Linux命令并获取返回值

摘要:
方法一、使用os模块的system方法:os.system,其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于shell命令不需要输出内容的场景。os.system或os.popen,前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。subprocess.run():python3.5中新增的函数,执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。subprocess.check_call():python2.5中新增的函数,执行指定的命令,如果执行成功则返回状态码,否则抛出异常。

方法一、使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于shell命令不需要输出内容的场景

os.system(cmd)会启动子进程,在子进程中执行cmd,如果cmd有执行内容,会在标准输出显示。

举例说明:

1. 列举当前目录下的所有文件。

importos
val = os.system('ls -al')
print val #输出为0
val = os.system('ls -al non_exist_folder')
print val #输出为512
val = os.system('ls -al|grep non_exist_val')
print val #输出为256

方法二、使用os.popen(),该方法以文件的形式返回shell指令运行后的结果需要获取内容时可使用read()或readlines()方法。

os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

举栗:

importos
os.popen('ls -l')
输出:<open file 'ls -l', mode 'r' at 0x7f46af044930>os.popen('ls -l').read() #返回字符串类型的结果
输出:'total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt
'os.popen('ls -l').readlines() #返回一个list类型的结果
输出:['total 0
', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt
']

val=os.popen('ls -al')
for i inval.readlines():
    print i 

方法三、使用commands模块,有三个方法可以使用:

(1)commands.getstatusoutput(cmd),其以元组(status,output)的形式返回命令执行后的返回状态和执行结果。其中,对cmd的执行实际上是按照{cmd;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息,output中不包含尾部的换行符。

(2)commands.getoutput(cmd),返回cmd的输出结果。

(3)commands.getstatus(file),返回ls -l file的执行结果字符串,调用了getoutput,不建议使用此方法

importcommands
aa=commands.getstatusoutput('ls -l')
输出:(0, 'total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt') 
#返回一个元组,对比os.popen(cmd)的返回结果,发现output中不包含尾部的换行符
bb=commands.getoutput('ls -l')  #只返回执行结果
输出:'total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt'cc=commands.getstatus('a.txt')  #查询某个文件的状态
输出:'-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt'dd=commands.getstatusoutput('ls -l non_exist_folder')  #执行结果中包含控制台输出信息或者错误信息
输出:(512, "ls: cannot access 'non_exist_folder': No such file or directory")

os.popen(cmd)返回的是一个类文件对象,commands.getoutput(cmd)返回了字符串类型的输出结果,很多情况下用起来要更方便些。

方法四、subprocess模块,允许创建很多子进程,创建的时候能指定子进程和子进程的输入、输出、错误输出管道,执行后能获取输出结果和执行状态。

(1)subprocess.run():python3.5中新增的函数, 执行指定的命令, 等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。

(2)subprocess.call():执行指定的命令, 返回命令执行状态, 功能类似os.system(cmd)

(3)subprocess.check_call():python2.5中新增的函数, 执行指定的命令, 如果执行成功则返回状态码, 否则抛出异常。

说明:subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)

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

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

args:表示shell指令,若以字符串形式给出shell指令,如"ls -l "则需要使shell = Ture。否则默认以数组形式表示shell变量,如"ls","-l"。

当使用比较复杂的shell语句时,可以先使用shlex模块的shlex.split()方法来帮助格式化命令,然后在传递给run()方法或Popen。

subprocess.run()、subprocess.call()、subprocess.check_call()、subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成

使用举栗:

importshlex
importsubprocess
command='ls -l'args=shlex.split('ls -l')
bb=subprocess.Popen(args) #bb是一个Popen的对象,该对象不能通过read()或readlines()来读取
输出:total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09b.txt #在该处需要点击换行符才会结束
aa=subprocess.call('ls -l',shell=True) #其返回值为shell命令的执行返回码
输出:total 0
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09b.txt #直接返回

后续还需要继续学习:https://www.cnblogs.com/lincappu/p/8270709.html

在Python3中的情况

期望:想要在Python3中执行curl命令并返回执行结果,返回结果时json体

分析:

cmd='curl -s "http://127.0.0.1:8080/xxxxx"'

1)使用os.system(cmd) 无法获取输出内容

2)使用os.popen(cmd).read()可以获取到返回的json体${aa},通过json.loads(${aa})可以将json体转为字典样式

3)commands模块在Python3.0中被废弃了

4)subprocess.getstatusoutput(cmd)输出结果类似于python2中的commands.getstatusoutput(cmd),返回一个元组,元组的第2个值是执行结果${aa},通过json.loads(${aa})可以将json体转为字典样式。

参考:https://www.cnblogs.com/pengpp/p/9833349.html

免责声明:文章转载自《Python中调用Linux命令并获取返回值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何在CentOS里切换操作系统所用的语言,中英文切换uni-App 去掉顶部导航栏下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux xen 网桥配置

0.必须明白网桥工作在数据链路层,在eth0与eth1等之下,网桥收到数据包后根据MAC地址转发到与该网桥相连接的1或多个网卡,也就是说,如果网桥不正常工作机器就断网了(如果存在网桥的情况下) 1.XEN中的默认启动的网桥是xenbr0, 如果想更改成你自己创建的网桥,在/etc/xen/xend-config.sxp文件里更改,添加一行:(network...

编译 FFmpeg h263 decoder出现编译错误undefined reference to `ff_find_pix_fmt'

FFmpeg 源代码使用 RockPlayer 提供的代码和编译脚本,点击这里下载。 configure 仅保留 h263 相关的 parser demuxer decoder 以及libswscale --enable-decoder=h263 \ --enable-parser=h263 \ --enable-demuxer=h263 \ 编译出现如...

Linux中的端口占用问题

本文将会阐述两种解决端口占用的方法。 本文会用到的服务器端的程序如下: 1 #include "unp.h" 2 #include <time.h> 3 4 int main(int argc, char **argv) 5 { 6 intlistenfd, connfd; 7 socklen_t len; 8 struct...

教你阅读 Cpython 的源码(一)

目录 第一部分-介绍 Cpython 源代码中有什么?如何编译 Cpython 代码编译器能做什么?为什么 Cpython 是用 C 语言而是 Python 编写的?Python 语言的规范Cpython 中的内存管理机制结论 第二部分-Python 解释器进程 建立运行时配置读取文件/输入词法解析和句法解析抽象语法树结论 第三部分- Cpython 的编...

Linux系统编程——水平触发和边沿触发

事件模型 Edge Triggered (ET) 边缘触发只有数据到来,才触发,不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发只要有数据都会触发。 首先介绍一下LT工作模式: LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符...

Linux下查看Nginx的并发连接数和连接状态-乾颐堂

Linux下查看Nginx等的并发连接数和连接状态。 1、查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态:  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 或者: netstat -n | awk '/^tcp/ {++state[$NF...