python 执行shell命令

注:python3.X模块中以废弃commands该模块,使用subprocess模块在本文下面增加解说

本篇介绍如何使用python在cmd上执行shell命令
用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果

一:通过os模块
第一种,只执行命令,但是没有返回值:运用os模块

import os
os.system("命令")

这种只执行系统命令,,但是不获取返回值,不是很推荐

可以获取到返回值:

result = os.popen('命令')
res = result.read()
for line in res.splitlines():
    print line

二:通过commands的函数
需要先引入commands模块
1.commands.getouput(‘shell command’)
执行shell命令,返回结果(string类型)

cmd = "curl -s \"127.0.0.1:7070/api/v3/column/m.id,m.ip?m.sr.id=sls-backend-server.FuxiServiceSlsShennongWorker%23\"|grep m.ip|head -n 1 |awk '{print $2}'"
dockervm_ip = commands.getoutput(cmd)
print(dockervm_ip)

结果:

python 获取c返回值 python 获取命令行返回值_shell命令


getoutput直接返回命令的结果,建议使用该命令

2.commands.getstatus(‘命令’)
执行shell命令,该命令返回的的是元组tuple,包含两个元素(status,result),status为int类型,result为string类型
status表示统计的状态,result表示命令的结果数据

cmd="curl -s \"127.0.0.1:7070/api/v3/column/m.id,m.ip?m.sr.id=sls-backend-server.FuxiServiceSlsShennongWorker%23\""
dockervm_ip = commands.getstatusoutput(cmd)
print dockervm_ip

结果:

python 获取c返回值 python 获取命令行返回值_python_02


从结果中可以看出,返回了统计的数据status,还有python中的换行符号等,若是有需求可以使用这条命令

= = = = = = = = = = = = = = = = = = 分割线 = = = = = = = = = == = = = = = = = = = = = = = =

subprocess

本次更新2020.09.11号,
之前使用commands的时候是在我们公司内网线上环境使用的,我们公司内网默认使用的是python2.x版本,所以可以正常使用commands模块,但是前两天我使用自己本地环境(python3.x)时,发现没有commands这个模块,去查了下才发现已经被subprocess模块替代了。
suborocess模块中常用的函数:

函数

描述

subprocess.run()

Python 3.5中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。

subprocess.call()

执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd)。

subprocess.check_call()

Python 2.5中新增的函数。 执行指定的命令,如果执行成功则返回状态码,否则抛出异常。其功能等价于subprocess.run(…, check=True)。

subprocess.check_output()

Python 2.7中新增的的函数。执行指定的命令,如果执行状态码为0则返回命令执行结果,否则抛出异常。

subprocess.getoutput(cmd)

接收字符串格式的命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。

subprocess.getstatusoutput(cmd)

执行cmd命令,返回一个元组(命令执行状态, 命令执行结果输出),其功能类似于commands.getstatusoutput()。

subprocess.getoutput()和subprocess.getstatusoutput()函数是来自Python 2.x的commands模块的两个遗留函数。它们隐式的调用系统shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外,它们从Python 3.3.4开始才支持Windows平台。

subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。相关的介绍可以看下菜鸟