前言
运维使用python还是很多的,用python实现运维自动化也比较多,ansible和saltStack也是用python写的,自动化测试基本上也是使用python。
今天我们来说python怎么调用linux命令,python执行linux命令可以使用os.system、os.popen、subprocess.popen
在这里我使用的是python3.7,至于它的安装见《0基础自学linux运维-1.1-Centos7安装Python3.7》
建立测试数据
mkdir -pv /disk1/t1
echo 'this is a.txt'>/disk1/t1/a.txt
echo 'this is b.txt'>/disk1/t1/b.txt
echo 'this is c1.txt 1'>/disk1/t1/c.txt
echo 'this is c1.txt 2'>>/disk1/t1/c.txt
echo 'this is c1.txt 3'>>/disk1/t1/c.txt
一、python中os.system、os.popen、subprocess.popen的区别
1.1 os.system
链接https://docs.python.org/3.7/library/os.html?highlight=os%20system#os.system
该函数返回命令执行结果的返回值,system()函数在执行过程中进行了以下三步操作:
1.fork一个子进程;
2.在子进程中调用exec函数去执行命令;
3.在父进程中调用wait(阻塞)去等待子进程结束。
对于fork失败,system()函数返回-1。
由于使用该函数经常会莫名其妙地出现错误,但是直接执行命令并没有问题,所以一般建议不要使用。
1.2 os.popen
链接 https://docs.python.org/3.7/library/os.html?highlight=os%20popen#os.popen
os.popen(cmd, mode='r', buffering=-1)
popen() 创建一个管道,通过fork一个子进程,然后该子进程执行命令。返回值在标准IO流中,该管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数(w或r)。通过popen函数读取命令执行过程中的输出示例如下:
#!/usr/local/bin/python3
import os
p=os.popen('ssh 192.168.3.76 ls -l /disk1/t1/')
x=p.read()
print(x)
p.close()
1.3 subprocess模块
subprocess代替了一些旧的函数如下:
Replacing /bin/sh shell backquote
Replacing shell pipeline
Replacing os.system()
Replacing the os.spawn family
Replacing os.popen(), os.popen2(), os.popen3()
Replacing functions from the popen2 module
使用参数
二、例子
#1. 其中subprocess.call用于代替os.system,示例:
[root@vm76 ~]# cd ~
[root@vm76 ~]# cat t1.py
#!/usr/local/bin/python3
print("hello")
起个名字叫ossys.py,代码如下:
import subprocess
returnCode = subprocess.call('/root/t1.py')
print(returnCode)
#2. subprocess.check_output
#3. subprocess.Popen的使用
import subprocess
cmd ="/root/t1.py"
fhandle =open(r"/disk1/t1/aa.txt", "w")
pipe = subprocess.Popen(cmd, shell=True, stdout=fhandle).stdout
fhandle.close()
pipe=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE).stdout
print(pipe.read())
运行结果为:b'hello\n'
如果不知道b是什么意思,请看《python字符串前面加u,r,b的含义》
#4.commands.getstatusoutput()
使用commands.getstatusoutput() 方法就可以获得到返回值和输出:
import subprocess
(status, output) = subprocess.getstatusoutput('cat /disk1/t1/c.txt')
print(status, output)
运行结果: