0基础自学linux运维-5.11-python调用linux命令

前言

          运维使用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(cmdmode='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()

0基础自学linux运维-5.11-python调用linux命令_第1张图片

1.3 subprocess模块

根据subprocess模块官网说明

0基础自学linux运维-5.11-python调用linux命令_第2张图片

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

使用参数

0基础自学linux运维-5.11-python调用linux命令_第3张图片
具体可以看官网

二、例子

#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)

0基础自学linux运维-5.11-python调用linux命令_第4张图片

#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)

运行结果:

你可能感兴趣的:(0基础自学linux运维-5.11-python调用linux命令)