Python中调用Linux命令并获取返回值
方法一、使用os模块的system方法:os.system(cmd),其返回值是shell指令运行后返回的状态码,int类型,0表示shell指令成功执行,256/512表示未找到,该方法适用于shell命令不需要输出内容的场景。
os.system(cmd)会启动子进程,在子进程中执行cmd,如果cmd有执行内容,会在标准输出显示。
举例说明:
1. 列举当前目录下的所有文件。
import os
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),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。
举栗:
import os
os.popen('ls -l')
输出:<open file 'ls -l', mode 'r' at 0x7f46af044930>
os.popen('ls -l').read() #返回字符串类型的结果
输出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n'
os.popen('ls -l').readlines() #返回一个list类型的结果
输出:['total 0\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n', '-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt\n'] val=os.popen('ls -al')
for i in val.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,不建议使用此方法
import commands
aa=commands.getstatusoutput('ls -l')
输出:(0, 'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt')
#返回一个元组,对比os.popen(cmd)的返回结果,发现output中不包含尾部的换行符
bb=commands.getoutput('ls -l') #只返回执行结果
输出:'total 0\n-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 a.txt\n-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来完成
使用举栗:
import shlex
import subprocess
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:09 a.txt
-rw-rw-r-- 1 roaddb roaddb 0 Dec 11 10:09 b.txt #在该处需要点击换行符才会结束
aa=subprocess.call('ls -l',shell=True) #其返回值为shell命令的执行返回码
输出: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 #直接返回
后续还需要继续学习: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
p.p1 { margin: 0; font: 16px Menlo; color: rgba(0, 0, 0, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }
p.p1 { margin: 0; font: 12px "Helvetica Neue" }
p.p2 { margin: 0; font: 12px "Helvetica Neue"; min-height: 14px }
span.s1 { font: 12px ".PingFang SC" }
p.p1 { margin: 0; font: 12px "Helvetica Neue" }
p.p2 { margin: 0; font: 12px "Helvetica Neue"; min-height: 14px }
p.p3 { margin: 0; font: 12px ".PingFang SC" }
span.s1 { font: 12px ".PingFang SC" }
span.s2 { font: 12px "Helvetica Neue" }
p.p1 { margin: 0; font: 12px "Helvetica Neue" }
p.p2 { margin: 0; font: 12px "Helvetica Neue"; min-height: 14px }
span.s1 { font: 12px ".PingFang SC" }
p.p1 { margin: 0; font: 16px Menlo; color: rgba(0, 0, 0, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }
p.p1 { margin: 0; font: 16px Menlo; color: rgba(0, 0, 0, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }
p.p1 { margin: 0; font: 20px Monaco }
span.s1 { text-decoration: underline }
Python中调用Linux命令并获取返回值的更多相关文章
- C++调用linux命令并获取返回值
qt中封装了相关的方法, 但是因为我的命令中用到了管道命令, 出现了非预期结果, 所有改用了linux系统原生的方法. 下边是一个判断某进程是否存在的例子. 当前存在一个问题,当linux返回多行时, ...
- (21) 树莓派使用python调用命令行 python中调用linux命令及os.system的返回值
cmd = "sudo shutdown -h now"; os.system(cmd)
- JAVA中执行JavaScript代码并获取返回值
JAVA中执行JavaScript代码并获取返回值 场景描述 实现思路 技术要点 代码实现 测试方法 运行结果 改进空间 场景描述 今天在CSDN上偶然看到一个帖子对于一段字符串 “var p=‘xx ...
- python 利用python的subprocess模块执行外部命令,获取返回值
有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...
- 自己遇到的ajax调用ashx文件无法获取返回值的一种情况
无法获取返回值的ashx文件大致如下: public void ProcessRequest (HttpContext context) { context.Response.ContentType ...
- python 中调用shell命令
subprocess模块 根据Python官方文档说明,subprocess模块用于取代上面这些模块.有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用sub ...
- 如何在java程序中调用linux命令或者shell脚本
转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...
- java程序中调用Linux命令Windows命令
目前总结的方法: 调用Linux简单的命令行,设置文件夹权限755 String scriptDir = "/home/wenf"; String cmd = "chmo ...
- 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件
在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...
随机推荐
- 8.12-14 df 、mkswap、swapon、swapoff、sync
8.12 df:报告文件系统磁盘空间的使用情况 -a 显示所有文件系统 -h 以容易理解的格式显示磁盘的使用情况端 -i 显示文件系统的inode信息迷 -t 显示指定类型 ...
- 在 Ubuntu 上安装 .NET SDK 或 .NET 运行时
在wsl Ubuntu 20.04上面安装dotnet链接 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu Ubun ...
- IDEA 快速上手指南(全配置)(Day_23)
Idea快速入门指南 1.安装 1.1.安装 我们使用的是2017.3.4版本: 双击打开, 选择一个目录,最好不要中文和空格: 然后选择桌面快捷方式,请选择64位: 然后选择安装: 开始安装: 然后 ...
- 从Lombok到JSR-269
前言 Lombok的出现帮助开发人员在开发工程中消除了大部分冗余代码:繁琐的get.set方法甚至建造者模式. Lombok的实现方式是什么呢? 新建一个测试类使用Lombok的Getter和Sett ...
- Linux(CentOS7)下配置多个tomcat
记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...
- 死磕nginx系列
死磕nginx系列 死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统--nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕 ...
- 华为计算平台MDC810发布量产
华为计算平台MDC810发布量产 塞力斯的发布会刚刚结束,会上塞力斯SF5自由远征版也确实让人眼前一亮. 全球首款4S级加速能力.1000+km续航新能源作为这款车的卖点. 续航1000+km成了最近 ...
- PyTorch 图像分类
PyTorch 图像分类 如何定义神经网络,计算损失值和网络里权重的更新. 应该怎么处理数据? 通常来说,处理图像,文本,语音或者视频数据时,可以使用标准 python 包将数据加载成 numpy 数 ...
- HLS后端示例
HLS后端示例 TVM支持带有SDAccel的Xilinx FPGA板.这是有关如何将TVM部署到AWS F1 FPGA实例的文档. 此功能仍处于试验阶段.暂时无法使用SDAccel部署端到端神经网络 ...
- 【VBA】列号与字母(列名)的相互转换 (自定义函数)
1. '列号转字母(列名) Function Num2Name(ByVal ColumnNum As Long) As String On Error Resume Next Num2Name = & ...